Index: source/org/jivesoftware/smackx/bytestreams/ibb/InitiationListener.java =================================================================== --- source/org/jivesoftware/smackx/bytestreams/ibb/InitiationListener.java (revision 12585) +++ source/org/jivesoftware/smackx/bytestreams/ibb/InitiationListener.java (working copy) @@ -19,11 +19,14 @@ import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.filter.AndFilter; import org.jivesoftware.smack.filter.IQTypeFilter; +import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.PacketFilter; 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.smackx.bytestreams.BytestreamListener; +import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamManager.StanzaType; import org.jivesoftware.smackx.bytestreams.ibb.packet.Open; /** @@ -44,9 +47,13 @@ private final InBandBytestreamManager manager; /* packet filter for all In-Band Bytestream requests */ - private final PacketFilter initFilter = new AndFilter(new PacketTypeFilter(Open.class), + private final PacketFilter initFilterIQ = new AndFilter(new PacketTypeFilter(Open.class), new IQTypeFilter(IQ.Type.SET)); - + /* packet filter for all In-Band Bytestream requests */ + private final PacketFilter initFilterMSG = new AndFilter(new PacketTypeFilter(Open.class), + new MessageTypeFilter(Message.Type.normal)); + private boolean isIQ = true; + /* executor service to process incoming requests concurrently */ private final ExecutorService initiationListenerExecutor; @@ -71,7 +78,8 @@ private void processRequest(Packet packet) { Open ibbRequest = (Open) packet; - + if (ibbRequest.getStanza() == StanzaType.MESSAGE)this.isIQ = false; + // validate that block size is within allowed range if (ibbRequest.getBlockSize() > this.manager.getMaximumBlockSize()) { this.manager.replyResourceConstraintPacket(ibbRequest); @@ -114,7 +122,8 @@ * @return the packet filter for In-Band Bytestream open requests */ protected PacketFilter getFilter() { - return this.initFilter; + if (isIQ)return this.initFilterIQ; + return this.initFilterMSG; } /** Index: source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamSession.java =================================================================== --- source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamSession.java (revision 12585) +++ source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamSession.java (working copy) @@ -594,7 +594,8 @@ * Constructor. */ public IBBOutputStream() { - this.buffer = new byte[byteStreamRequest.getBlockSize()]; + Integer maximumBytesPerPacket = (byteStreamRequest.getBlockSize() / 4) *3; + this.buffer = new byte[maximumBytesPerPacket]; } /** @@ -639,7 +640,13 @@ // "byte" off the first chunk to write out writeOut(b, off, buffer.length); - + // the receiver cant work this fast, so we have to wait between two messages + try { + Thread.sleep(40); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } // recursively call this method with the lesser amount write(b, off + buffer.length, len - buffer.length); } Index: source/org/jivesoftware/smackx/bytestreams/ibb/packet/Open.java =================================================================== --- source/org/jivesoftware/smackx/bytestreams/ibb/packet/Open.java (revision 12585) +++ source/org/jivesoftware/smackx/bytestreams/ibb/packet/Open.java (working copy) @@ -73,7 +73,7 @@ * @param blockSize block size in which the data will be fragmented */ public Open(String sessionID, int blockSize) { - this(sessionID, blockSize, StanzaType.IQ); + this(sessionID, blockSize, StanzaType.MESSAGE); } /** Index: source/org/jivesoftware/smackx/bytestreams/ibb/provider/OpenIQProvider.java =================================================================== --- source/org/jivesoftware/smackx/bytestreams/ibb/provider/OpenIQProvider.java (revision 12585) +++ source/org/jivesoftware/smackx/bytestreams/ibb/provider/OpenIQProvider.java (working copy) @@ -33,7 +33,8 @@ String stanzaValue = parser.getAttributeValue("", "stanza"); StanzaType stanza = null; if (stanzaValue == null) { - stanza = StanzaType.IQ; + // old spark 2.5.8, who work in message mode, wont send the stanza value in open packet + stanza = StanzaType.MESSAGE; } else { stanza = StanzaType.valueOf(stanzaValue.toUpperCase()); Index: source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamManager.java =================================================================== --- source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamManager.java (revision 12585) +++ source/org/jivesoftware/smackx/bytestreams/ibb/InBandBytestreamManager.java (working copy) @@ -165,7 +165,7 @@ private int maximumBlockSize = MAXIMUM_BLOCK_SIZE; /* the stanza used to send data packets */ - private StanzaType stanza = StanzaType.IQ; + private StanzaType stanza = StanzaType.MESSAGE; /* * list containing session IDs of In-Band Bytestream open packets that should be ignored by the Index: source/org/jivesoftware/smackx/filetransfer/FileTransferNegotiator.java =================================================================== --- source/org/jivesoftware/smackx/filetransfer/FileTransferNegotiator.java (revision 12585) +++ source/org/jivesoftware/smackx/filetransfer/FileTransferNegotiator.java (working copy) @@ -474,7 +474,8 @@ private DataForm createDefaultInitiationForm() { DataForm form = new DataForm(Form.TYPE_FORM); FormField field = new FormField(STREAM_DATA_FIELD_NAME); - field.setType(FormField.TYPE_LIST_SINGLE); + // this is needed for initiation with older spark clients (2.5.8) + field.setType(FormField.TYPE_LIST_MULTI); if (!IBB_ONLY) { field.addOption(new FormField.Option(Socks5BytestreamManager.NAMESPACE)); } Index: source/org/jivesoftware/smackx/filetransfer/OutgoingFileTransfer.java =================================================================== --- source/org/jivesoftware/smackx/filetransfer/OutgoingFileTransfer.java (revision 12585) +++ source/org/jivesoftware/smackx/filetransfer/OutgoingFileTransfer.java (working copy) @@ -120,6 +120,7 @@ + " been attempted on this file transfer"); } try { + setFileInfo(fileName, fileSize); this.outputStream = negotiateStream(fileName, fileSize, description); } catch (XMPPException e) { handleXMPPException(e); @@ -159,6 +160,7 @@ "The negotation process has already" + " been attempted for this file transfer"); } + setFileInfo(fileName, fileSize); this.callback = progress; transferThread = new Thread(new Runnable() { public void run() { @@ -274,8 +276,10 @@ public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description){ checkTransferThread(); + setFileInfo(fileName, fileSize); transferThread = new Thread(new Runnable() { public void run() { + setFileInfo(fileName, fileSize); //Create packet filter try { outputStream = negotiateStream(fileName, fileSize, description);