package org.societies.android.platform.androidutils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.util.Log; public class RawXmlProvider implements IQProvider, PacketExtensionProvider { private static final String LOG_TAG = RawXmlProvider.class.getName(); public IQ parseIQ(XmlPullParser parser) throws Exception { // Log.d(LOG_TAG, "parseIQ"); final XmlElement element = parseRootElement(parser); return new IQ() { @Override public String getChildElementXML() { return element.childElementXml; } }; } public PacketExtension parseExtension(XmlPullParser parser) throws Exception { // Log.d(LOG_TAG, "parseExtension"); final XmlElement element = parseRootElement(parser); return new PacketExtension() { public String toXML() { return element.childElementXml; } public String getNamespace() { return element.nameSpace; } public String getElementName() { return element.name; } }; } private XmlElement parseRootElement(XmlPullParser parser) throws XmlPullParserException, IOException { // Log.d(LOG_TAG, "parseRootElement"); List<String> prefixes = new ArrayList<String>(); String rootElementName = parser.getName(); String rootNS = parser.getNamespace(); StringBuilder sb = new StringBuilder(getText(parser,prefixes)); String text = null; do { parser.next(); text = getText(parser,prefixes); sb.append(text); } while (!atRootEndTag(parser, rootElementName)); return new XmlElement(rootElementName, rootNS, sb.toString()); } private boolean atRootEndTag(XmlPullParser parser,String rootElementName) throws XmlPullParserException { // Log.d(LOG_TAG, "atRootEndTag"); return parser.getEventType() == XmlPullParser.END_TAG && parser.getName() != null && parser.getName().equals(rootElementName); } private String getText(XmlPullParser parser, List<String> prefixes) throws XmlPullParserException { // Log.d(LOG_TAG, "getText"); String returnValue = parser.getText(); if (returnValue!=null) return returnValue; int event = parser.getEventType(); String prefix = parser.getPrefix(); if (prefix==null) prefix = ""; else prefix = prefix+":"; String prefixDeclaration = ""; if (!prefixes.contains(prefix)) { prefixDeclaration = " xmlns:"+parser.getPrefix()+"=\""+parser.getNamespace()+"\""; prefixes.add(prefix); } if (event==XmlPullParser.START_TAG) { StringBuilder attributes = new StringBuilder(); for (int i=0; i<parser.getAttributeCount(); i++) { attributes.append(" "+parser.getAttributeName(i)+"=\""+parser.getAttributeValue(i)+"\""); } if(parser.getNamespace()!="") returnValue = "<"+prefix+parser.getName()+prefixDeclaration+" xmlns=\""+parser.getNamespace()+"\" "+attributes.toString()+">"; else returnValue = "<"+prefix+parser.getName()+prefixDeclaration+attributes.toString()+">"; } if (event==XmlPullParser.END_TAG) { returnValue = "</"+prefix+parser.getName()+">"; } return returnValue; } private static class XmlElement { public final String childElementXml; public final String name; public final String nameSpace; public XmlElement(String name, String nameSpace, String childElementXml) { this.childElementXml = childElementXml; this.name = name; this.nameSpace = nameSpace; } } }