package com.connectsdk.service.upnp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; 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 DLNANotifyParser { private static final String ns = null; public JSONArray 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 readPropertySet(parser); } finally { in.close(); } } private JSONArray readPropertySet(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONArray propertyset = new JSONArray(); parser.require(XmlPullParser.START_TAG, ns, "e:propertyset"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("e:property")) { propertyset.put(readProperty(parser)); } else { skip(parser); } } return propertyset; } private JSONObject readProperty(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONObject property = new JSONObject(); parser.require(XmlPullParser.START_TAG, ns, "e:property"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("LastChange")) { String eventStr = readText(parser); JSONObject event; InputStream stream = null; try { stream = new ByteArrayInputStream(eventStr.getBytes("UTF-8")); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } DLNAEventParser eventParser = new DLNAEventParser(); event = eventParser.parse(stream); property.put("LastChange", event); } else { property = readPropertyData(name, parser); } } return property; } private JSONObject readPropertyData(String target, XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { JSONObject data = new JSONObject(); String value; parser.require(XmlPullParser.START_TAG, ns, target); value = readText(parser); data.put(target, value); parser.require(XmlPullParser.END_TAG, ns, target); return data; } private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { String result = ""; if (parser.next() == XmlPullParser.TEXT) { result = parser.getText(); parser.nextTag(); } return result; } 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; } } } }