1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-12-12 14:01:08 +01:00

Enable PacketExtensions for IQs

This is actually only part one, i.e. with this commit if the user adds a
PacketExtension to an IQ it will be included in IQ.toXml(). Which was
previously only the case if the IQ subclass explicitly included packet
extensions.

The second part of the change is to change the IQ provider, so that
packet extensions are automatically parsed.

Cases where PacketExtensions are used for Message and IQ are slightly
changed. The IQ sublcass now only has a field with this
PacketExtension (see for example
bytestreams.ibb.packet.DataPacketExtension).

Also changed hoxt API: Removed unnecessary indirection and made the
API more Smack idiomatic.
This commit is contained in:
Florian Schmaus 2014-11-07 21:12:01 +01:00
parent a9c798f3bb
commit 9e797c1b17
93 changed files with 1347 additions and 1438 deletions

View file

@ -33,7 +33,6 @@ import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smack.util.stringencoder.Base64;
import org.jivesoftware.smackx.bytestreams.BytestreamSession;
@ -450,9 +449,7 @@ public class InBandBytestreamSession implements BytestreamSession {
public void processPacket(Packet packet) throws NotConnectedException {
// get data packet extension
DataPacketExtension data = (DataPacketExtension) packet.getExtension(
DataPacketExtension.ELEMENT,
DataPacketExtension.NAMESPACE);
DataPacketExtension data = ((Data) packet).getDataPacketExtension();
/*
* check if sequence was not used already (see XEP-0047 Section 2.2)
@ -562,15 +559,20 @@ public class InBandBytestreamSession implements BytestreamSession {
return false;
}
// stanza contains data packet extension
PacketExtension packetExtension = packet.getExtension(DataPacketExtension.ELEMENT,
DataPacketExtension.NAMESPACE);
if (packetExtension == null || !(packetExtension instanceof DataPacketExtension)) {
return false;
DataPacketExtension data;
if (packet instanceof Data) {
data = ((Data) packet).getDataPacketExtension();
} else {
// stanza contains data packet extension
data = packet.getExtension(
DataPacketExtension.ELEMENT,
DataPacketExtension.NAMESPACE);
if (data == null) {
return false;
}
}
// session ID equals this session ID
DataPacketExtension data = (DataPacketExtension) packetExtension;
if (!data.getSessionID().equals(byteStreamRequest.getSessionID())) {
return false;
}

View file

@ -17,7 +17,6 @@
package org.jivesoftware.smackx.bytestreams.ibb.packet;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.XmlStringBuilder;
/**
* Represents a request to close an In-Band Bytestream.
@ -27,6 +26,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
public class Close extends IQ {
public static final String ELEMENT = "close";
public static final String NAMESPACE = DataPacketExtension.NAMESPACE;
/* unique session ID identifying this In-Band Bytestream */
private final String sessionID;
@ -37,6 +37,7 @@ public class Close extends IQ {
* @param sessionID unique session ID identifying this In-Band Bytestream
*/
public Close(String sessionID) {
super(ELEMENT, NAMESPACE);
if (sessionID == null || "".equals(sessionID)) {
throw new IllegalArgumentException("Session ID must not be null or empty");
}
@ -54,12 +55,9 @@ public class Close extends IQ {
}
@Override
public XmlStringBuilder getChildElementXML() {
XmlStringBuilder xml = new XmlStringBuilder();
xml.halfOpenElement(ELEMENT);
xml.xmlnsAttribute(DataPacketExtension.NAMESPACE);
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("sid", sessionID);
xml.closeEmptyElement();
xml.setEmptyElement();
return xml;
}

View file

@ -17,7 +17,6 @@
package org.jivesoftware.smackx.bytestreams.ibb.packet;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.XmlStringBuilder;
/**
* Represents a chunk of data sent over an In-Band Bytestream encapsulated in an
@ -36,24 +35,17 @@ public class Data extends IQ {
* @param data data packet extension containing the encoded data
*/
public Data(DataPacketExtension data) {
super(DataPacketExtension.ELEMENT, DataPacketExtension.NAMESPACE);
if (data == null) {
throw new IllegalArgumentException("Data must not be null");
}
this.dataPacketExtension = data;
/*
* also set as packet extension so that data packet extension can be
* retrieved from IQ stanza and message stanza in the same way
*/
addExtension(data);
setType(IQ.Type.set);
}
/**
* Returns the data packet extension.
* <p>
* Convenience method for <code>packet.getExtension("data",
* "http://jabber.org/protocol/ibb")</code>.
*
* @return the data packet extension
*/
@ -62,8 +54,8 @@ public class Data extends IQ {
}
@Override
public XmlStringBuilder getChildElementXML() {
return dataPacketExtension.toXML();
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
return dataPacketExtension.getIQChildElementBuilder(xml);
}
}

View file

@ -17,6 +17,7 @@
package org.jivesoftware.smackx.bytestreams.ibb.packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.IQ.IQChildElementXmlStringBuilder;
import org.jivesoftware.smack.util.XmlStringBuilder;
import org.jivesoftware.smack.util.stringencoder.Base64;
@ -135,13 +136,16 @@ public class DataPacketExtension implements PacketExtension {
@Override
public XmlStringBuilder toXML() {
XmlStringBuilder xml = new XmlStringBuilder(this);
xml.attribute("seq", Long.toString(seq));
xml.attribute("sid", sessionID);
xml.rightAngleBracket();
xml.append(data);
XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this));
xml.closeElement(this);
return xml;
}
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("seq", Long.toString(seq));
xml.attribute("sid", sessionID);
xml.rightAngleBracket();
xml.append(data);
return xml;
}
}

View file

@ -19,7 +19,7 @@ package org.jivesoftware.smackx.bytestreams.ibb.packet;
import java.util.Locale;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.XmlStringBuilder;
import org.jivesoftware.smack.packet.IQ.IQChildElementXmlStringBuilder;
import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamManager.StanzaType;
/**
@ -30,6 +30,7 @@ import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamManager.StanzaTyp
public class Open extends IQ {
public static final String ELEMENT = "open";
public static final String NAMESPACE = DataPacketExtension.NAMESPACE;
/* unique session ID identifying this In-Band Bytestream */
private final String sessionID;
@ -54,6 +55,7 @@ public class Open extends IQ {
* @param stanza stanza type used to encapsulate the data
*/
public Open(String sessionID, int blockSize, StanzaType stanza) {
super(ELEMENT, NAMESPACE);
if (sessionID == null || "".equals(sessionID)) {
throw new IllegalArgumentException("Session ID must not be null or empty");
}
@ -111,14 +113,11 @@ public class Open extends IQ {
}
@Override
public XmlStringBuilder getChildElementXML() {
XmlStringBuilder xml = new XmlStringBuilder();
xml.halfOpenElement(ELEMENT);
xml.xmlnsAttribute(DataPacketExtension.NAMESPACE);
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("block-size", Integer.toString(blockSize));
xml.attribute("sid", sessionID);
xml.attribute("stanza", stanza.toString().toLowerCase(Locale.US));
xml.closeEmptyElement();
xml.setEmptyElement();
return xml;
}

View file

@ -49,6 +49,7 @@ public class Bytestream extends IQ {
* The default constructor
*/
public Bytestream() {
super(QUERY_ELEMENT, NAMESPACE);
}
/**
@ -58,6 +59,7 @@ public class Bytestream extends IQ {
* @see #setSessionID(String)
*/
public Bytestream(final String SID) {
this();
setSessionID(SID);
}
@ -215,11 +217,7 @@ public class Bytestream extends IQ {
}
@Override
public XmlStringBuilder getChildElementXML() {
XmlStringBuilder xml = new XmlStringBuilder();
xml.halfOpenElement(QUERY_ELEMENT);
xml.xmlnsAttribute(NAMESPACE);
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
switch(getType()) {
case set:
xml.optAttribute("sid", getSessionID());
@ -236,25 +234,20 @@ public class Bytestream extends IQ {
break;
case result:
xml.rightAngleBracket();
if (getUsedHost() != null) {
xml.append(getUsedHost().toXML());
}
xml.optAppend(getUsedHost());
// TODO Bytestream can include either used host *or* streamHosts. Never both. This should be ensured by the
// constructions mechanisms of Bytestream
// A result from the server can also contain stream hosts
else if (countStreamHosts() > 0) {
for (StreamHost host : streamHosts) {
xml.append(host.toXML());
}
for (StreamHost host : streamHosts) {
xml.append(host.toXML());
}
break;
case get:
xml.closeEmptyElement();
// Return here so that we don't run into the
// closeElement(QUERY_ELEMNT) section
return xml;
xml.setEmptyElement();
break;
default:
throw new IllegalStateException();
}
xml.closeElement(QUERY_ELEMENT);
return xml;
}