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:
parent
a9c798f3bb
commit
9e797c1b17
93 changed files with 1347 additions and 1438 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue