diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java index 239bd7529..be4cf3c05 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java @@ -609,7 +609,7 @@ public class PacketParserUtils { return iqPacket; } - private static RosterPacket parseRoster(XmlPullParser parser) throws Exception { + public static RosterPacket parseRoster(XmlPullParser parser) throws Exception { RosterPacket roster = new RosterPacket(); boolean done = false; RosterPacket.Item item = null; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java index b0f759c85..d39cbf656 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java @@ -17,6 +17,7 @@ package org.jivesoftware.smackx.xdata.packet; +import org.jivesoftware.smack.packet.Element; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smackx.xdata.FormField; @@ -42,6 +43,7 @@ public class DataForm implements PacketExtension { private ReportedData reportedData; private final List items = new ArrayList(); private final List fields = new ArrayList(); + private final List extensionElements = new ArrayList(); public DataForm(String type) { this.type = type; @@ -195,6 +197,14 @@ public class DataForm implements PacketExtension { } } + public void addExtensionElement(Element element) { + extensionElements.add(element); + } + + public List getExtensionElements() { + return Collections.unmodifiableList(extensionElements); + } + /** * Returns true if this DataForm has at least one FORM_TYPE field which is * hidden. This method is used for sanity checks. @@ -232,6 +242,9 @@ public class DataForm implements PacketExtension { for (FormField field : getFields()) { buf.append(field.toXML()); } + for (Element element : extensionElements) { + buf.append(element.toXML()); + } buf.closeElement(this); return buf; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java index 1f46762f9..04ac1229d 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/provider/DataFormProvider.java @@ -18,7 +18,9 @@ package org.jivesoftware.smackx.xdata.provider; import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.packet.RosterPacket; import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smackx.xdata.FormField; import org.jivesoftware.smackx.xdata.packet.DataForm; import org.xmlpull.v1.XmlPullParser; @@ -61,6 +63,10 @@ public class DataFormProvider implements PacketExtensionProvider { else if (parser.getName().equals("reported")) { dataForm.setReportedData(parseReported(parser)); } + // See XEP-133 Example 32 for a corner case where the data form contains this extension. + else if (parser.getName().equals(RosterPacket.ELEMENT) && parser.getNamespace().equals(RosterPacket.NAMESPACE)) { + dataForm.addExtensionElement(PacketParserUtils.parseRoster(parser)); + } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals(dataForm.getElementName())) { done = true;