diff --git a/src/com/limelight/nvstream/NvApp.java b/src/com/limelight/nvstream/NvApp.java new file mode 100644 index 00000000..e30c7820 --- /dev/null +++ b/src/com/limelight/nvstream/NvApp.java @@ -0,0 +1,31 @@ +package com.limelight.nvstream; + +public class NvApp { + private String appName; + private int appId; + private boolean isRunning; + + public void setAppName(String appName) { + this.appName = appName; + } + + public void setAppId(String appId) { + this.appId = Integer.parseInt(appId); + } + + public void setIsRunning(String isRunning) { + this.isRunning = isRunning.equals("1"); + } + + public String getAppName() { + return this.appName; + } + + public int getAppId() { + return this.appId; + } + + public boolean getIsRunning() { + return this.isRunning; + } +} diff --git a/src/com/limelight/nvstream/NvHTTP.java b/src/com/limelight/nvstream/NvHTTP.java index 534e22b5..2dff7d14 100644 --- a/src/com/limelight/nvstream/NvHTTP.java +++ b/src/com/limelight/nvstream/NvHTTP.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import java.util.LinkedList; import java.util.Stack; import org.xmlpull.v1.XmlPullParser; @@ -11,89 +12,126 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; public class NvHTTP { - private String host; private String macAddress; - - public static final int PORT = 47989; - - public NvHTTP(String host, String macAddress) - { - this.host = host; - this.macAddress = macAddress; - } - - private String getXmlString(InputStream in, String attribute) throws XmlPullParserException, IOException - { - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); - XmlPullParser xpp = factory.newPullParser(); - - xpp.setInput(new InputStreamReader(in)); - int eventType = xpp.getEventType(); - Stack currentTag = new Stack(); - while (eventType != XmlPullParser.END_DOCUMENT) - { - if (eventType == XmlPullParser.START_TAG) { - currentTag.push(xpp.getName()); - for (int i = 0; i < xpp.getAttributeCount(); i++) - { - if (xpp.getAttributeName(i).equals(attribute)) - return xpp.getAttributeValue(i); - } - } else if (eventType == XmlPullParser.END_TAG) { - currentTag.pop(); - } else if (eventType == XmlPullParser.TEXT) { - if (currentTag.peek().equals(attribute)) { - return xpp.getText(); - } - } - eventType = xpp.next(); - } - - return null; + public static final int PORT = 47989; + public String baseUrl; + + public NvHTTP(String host, String macAddress) { + this.macAddress = macAddress; + this.baseUrl = "http://" + host + ":" + PORT; } - - private InputStream openHttpConnection(String url) throws IOException - { + + private String getXmlString(InputStream in, String tagname) + throws XmlPullParserException, IOException { + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + XmlPullParser xpp = factory.newPullParser(); + + xpp.setInput(new InputStreamReader(in)); + int eventType = xpp.getEventType(); + Stack currentTag = new Stack(); + + while (eventType != XmlPullParser.END_DOCUMENT) { + switch (eventType) { + case (XmlPullParser.START_TAG): + currentTag.push(xpp.getName()); + break; + case (XmlPullParser.END_TAG): + currentTag.pop(); + break; + case (XmlPullParser.TEXT): + if (currentTag.peek().equals(tagname)) { + return xpp.getText(); + } + break; + } + eventType = xpp.next(); + } + + return null; + } + + private InputStream openHttpConnection(String url) throws IOException { return new URL(url).openConnection().getInputStream(); } - - public String getAppVersion() throws XmlPullParserException, IOException - { - InputStream in = openHttpConnection("http://"+host+":"+PORT+"/appversion"); + + public String getAppVersion() throws XmlPullParserException, IOException { + InputStream in = openHttpConnection(baseUrl + "/appversion"); return getXmlString(in, "appversion"); } - - public boolean getPairState() throws IOException, XmlPullParserException - { - InputStream in = openHttpConnection("http://"+host+":"+PORT+"/pairstate?mac="+macAddress); + + public boolean getPairState() throws IOException, XmlPullParserException { + InputStream in = openHttpConnection(baseUrl + "/pairstate?mac=" + macAddress); String paired = getXmlString(in, "paired"); return Integer.valueOf(paired) != 0; } - - public int getSessionId() throws IOException, XmlPullParserException - { + + public int getSessionId() throws IOException, XmlPullParserException { /* Pass the model (minus spaces) as the device name */ String deviceName = android.os.Build.MODEL; deviceName = deviceName.replace(" ", ""); - InputStream in = openHttpConnection("http://"+host+":"+PORT+"/pair?mac="+macAddress+"&devicename="+deviceName); + InputStream in = openHttpConnection(baseUrl + "/pair?mac=" + macAddress + + "&devicename=" + deviceName); String sessionId = getXmlString(in, "sessionid"); - return Integer.valueOf(sessionId); + return Integer.parseInt(sessionId); + } + + public int getSteamAppId(int sessionId) throws IOException, + XmlPullParserException { + LinkedList appList = getAppList(sessionId); + for (NvApp app : appList) { + if (app.getAppName().equals("Steam")) { + return app.getAppId(); + } + } + return 0; } - public int getSteamAppId(int sessionId) throws IOException, XmlPullParserException - { - InputStream in = openHttpConnection("http://"+host+":"+PORT+"/applist?session="+sessionId); - String appId = getXmlString(in, "ID"); - return Integer.valueOf(appId); + public LinkedList getAppList(int sessionId) throws IOException, XmlPullParserException { + InputStream in = openHttpConnection(baseUrl + "/applist?session=" + sessionId); + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + XmlPullParser xpp = factory.newPullParser(); + + xpp.setInput(new InputStreamReader(in)); + int eventType = xpp.getEventType(); + LinkedList appList = new LinkedList(); + Stack currentTag = new Stack(); + + while (eventType != XmlPullParser.END_DOCUMENT) { + switch (eventType) { + case (XmlPullParser.START_TAG): + currentTag.push(xpp.getName()); + if (xpp.getName().equals("App")) { + appList.addLast(new NvApp()); + } + break; + case (XmlPullParser.END_TAG): + currentTag.pop(); + break; + case (XmlPullParser.TEXT): + NvApp app = appList.getLast(); + if (currentTag.peek().equals("AppTitle")) { + app.setAppName(xpp.getText()); + } else if (currentTag.peek().equals("ID")) { + app.setAppId(xpp.getText()); + } else if (currentTag.peek().equals("IsRunning")) { + app.setIsRunning(xpp.getText()); + } + break; + } + eventType = xpp.next(); + } + return appList; } - + // Returns gameSession XML attribute - public int launchApp(int sessionId, int appId) throws IOException, XmlPullParserException - { - InputStream in = openHttpConnection("http://"+host+":"+PORT+"/launch?session="+sessionId+"&appid="+appId); + public int launchApp(int sessionId, int appId) throws IOException, + XmlPullParserException { + InputStream in = openHttpConnection(baseUrl + "/launch?session=" + + sessionId + "&appid=" + appId); String gameSession = getXmlString(in, "gamesession"); - return Integer.valueOf(gameSession); + return Integer.parseInt(gameSession); } }