package com.connectsdk.service.upnp; import java.io.IOException; import java.io.InputStream; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.util.Xml; public class DLNAEventParser { private static final String ns = null; public JSONObject parse(InputStream in) throws XmlPullParserException, IOException, JSONException { try { XmlPullParser parser = Xml.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(in, null); parser.nextTag(); return readEvent(parser); } finally { in.close(); } } private JSONObject readEvent(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONObject event = new JSONObject(); JSONArray instanceIDs = new JSONArray(); JSONArray queueIDs = new JSONArray(); parser.require(XmlPullParser.START_TAG, ns, "Event"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("InstanceID")) { instanceIDs.put(readInstanceID(parser)); } else if (name.equals("QueueID")) { queueIDs.put(readQueueID(parser)); } else { skip(parser); } } if (instanceIDs.length() > 0) event.put("InstanceID", instanceIDs); if (queueIDs.length() > 0) event.put("QueueID", queueIDs); return event; } private JSONArray readInstanceID(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONArray instanceIDs = new JSONArray(); JSONObject data = new JSONObject(); parser.require(XmlPullParser.START_TAG, ns, "InstanceID"); data.put("value", parser.getAttributeValue(null, "val")); instanceIDs.put(data); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); instanceIDs.put(readEntry(name, parser)); } return instanceIDs; } private JSONArray readQueueID(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONArray queueIDs = new JSONArray(); JSONObject data = new JSONObject(); parser.require(XmlPullParser.START_TAG, ns, "QueueID"); data.put("value", parser.getAttributeValue(null, "val")); queueIDs.put(data); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); queueIDs.put(readEntry(name, parser)); } return queueIDs; } private JSONObject readEntry(String target, XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { parser.require(XmlPullParser.START_TAG, ns, target); String value = parser.getAttributeValue(null, "val"); String channel = parser.getAttributeValue(null, "channel"); parser.nextTag(); parser.require(XmlPullParser.END_TAG, ns, target); JSONObject data = new JSONObject(); data.put(target, value); if (channel!=null) data.put("channel", channel); return data; } private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException(); } int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; } } } }