public final class InBandBytestreamManager extends Manager implements BytestreamManager
The In-Band Bytestreams (IBB) enables two entities to establish a virtual bytestream over which they can exchange Base64-encoded chunks of data over XMPP itself. It is the fall-back mechanism in case the Socks5 bytestream method of transferring data is not available.
There are two ways to send data over an In-Band Bytestream. It could either use IQ stanzas to
send data packets or message stanzas. If IQ stanzas are used every data stanza is acknowledged by
the receiver. This is the recommended way to avoid possible rate-limiting penalties. Message
stanzas are not acknowledged because most XMPP server implementation don't support stanza
flow-control method like Advanced Message
Processing. To set the stanza that should be used invoke setStanza(StanzaType)
.
To establish an In-Band Bytestream invoke the establishSession(Jid)
method. This will
negotiate an in-band bytestream with the given target JID and return a session.
If a session ID for the In-Band Bytestream was already negotiated (e.g. while negotiating a file
transfer) invoke establishSession(Jid, String)
.
To handle incoming In-Band Bytestream requests add an InBandBytestreamListener
to the
manager. There are two ways to add this listener. If you want to be informed about incoming
In-Band Bytestreams from a specific user add the listener by invoking
addIncomingBytestreamListener(BytestreamListener, Jid)
. If the listener should
respond to all In-Band Bytestream requests invoke
addIncomingBytestreamListener(BytestreamListener)
.
Note that the registered InBandBytestreamListener
will NOT be notified on incoming
In-Band bytestream requests sent in the context of XEP-0096 file transfer. (See
FileTransferManager
)
If no InBandBytestreamListener
s are registered, all incoming In-Band bytestream requests
will be rejected by returning a <not-acceptable/> error to the initiator.
Modifier and Type | Class and Description |
---|---|
static class |
InBandBytestreamManager.StanzaType
Stanzas that can be used to encapsulate In-Band Bytestream data packets.
|
Modifier and Type | Field and Description |
---|---|
static int |
MAXIMUM_BLOCK_SIZE
Maximum block size that is allowed for In-Band Bytestreams.
|
Modifier and Type | Method and Description |
---|---|
void |
addIncomingBytestreamListener(BytestreamListener listener)
Adds InBandBytestreamListener that is called for every incoming in-band bytestream request
unless there is a user specific InBandBytestreamListener registered.
|
void |
addIncomingBytestreamListener(BytestreamListener listener,
org.jxmpp.jid.Jid initiatorJID)
Adds InBandBytestreamListener that is called for every incoming in-band bytestream request
from the given user.
|
InBandBytestreamSession |
establishSession(org.jxmpp.jid.Jid targetJID)
Establishes an In-Band Bytestream with the given user and returns the session to send/receive
data to/from the user.
|
InBandBytestreamSession |
establishSession(org.jxmpp.jid.Jid targetJID,
String sessionID)
Establishes an In-Band Bytestream with the given user using the given session ID and returns
the session to send/receive data to/from the user.
|
protected List<BytestreamListener> |
getAllRequestListeners()
Returns a list of
InBandBytestreamListener that are informed if there are no
listeners for a specific initiator. |
static InBandBytestreamManager |
getByteStreamManager(XMPPConnection connection)
Returns the InBandBytestreamManager to handle In-Band Bytestreams for a given
XMPPConnection . |
protected XMPPConnection |
getConnection()
Returns the XMPP connection.
|
int |
getDefaultBlockSize()
Returns the default block size that is used for all outgoing in-band bytestreams for this
connection.
|
protected List<String> |
getIgnoredBytestreamRequests()
Returns the list of session IDs that should be ignored by the InitialtionListener
|
int |
getMaximumBlockSize()
Returns the maximum block size that is allowed for In-Band Bytestreams for this connection.
|
protected Map<String,InBandBytestreamSession> |
getSessions()
Returns the sessions map.
|
InBandBytestreamManager.StanzaType |
getStanza()
Returns the stanza used to send data packets.
|
protected BytestreamListener |
getUserListener(org.jxmpp.jid.Jid initiator)
Returns the
InBandBytestreamListener that should be informed if a In-Band Bytestream
request from the given initiator JID is received. |
void |
ignoreBytestreamRequestOnce(String sessionID)
Use this method to ignore the next incoming In-Band Bytestream request containing the given
session ID.
|
void |
removeIncomingBytestreamListener(BytestreamListener listener)
Removes the given listener from the list of listeners for all incoming In-Band Bytestream
requests.
|
void |
removeIncomingBytestreamListener(org.jxmpp.jid.Jid initiatorJID)
Removes the listener for the given user.
|
protected void |
replyItemNotFoundPacket(IQ request)
Responses to the given IQ packet's sender with an XMPP error that an In-Band Bytestream
session could not be found.
|
protected void |
replyRejectPacket(IQ request)
Responses to the given IQ packet's sender with an XMPP error that an In-Band Bytestream is
not accepted.
|
protected void |
replyResourceConstraintPacket(IQ request)
Responses to the given IQ packet's sender with an XMPP error that an In-Band Bytestream open
request is rejected because its block size is greater than the maximum allowed block size.
|
void |
setDefaultBlockSize(int defaultBlockSize)
Sets the default block size that is used for all outgoing in-band bytestreams for this
connection.
|
void |
setMaximumBlockSize(int maximumBlockSize)
Sets the maximum block size that is allowed for In-Band Bytestreams for this connection.
|
void |
setStanza(InBandBytestreamManager.StanzaType stanza)
Sets the stanza used to send data packets.
|
connection, getAuthenticatedConnectionOrThrow, schedule
public static final int MAXIMUM_BLOCK_SIZE
public static InBandBytestreamManager getByteStreamManager(XMPPConnection connection)
XMPPConnection
.connection
- the XMPP connectionpublic void addIncomingBytestreamListener(BytestreamListener listener)
If no listeners are registered all In-Band Bytestream request are rejected with a <not-acceptable/> error.
Note that the registered InBandBytestreamListener
will NOT be notified on incoming
Socks5 bytestream requests sent in the context of XEP-0096 file transfer. (See
FileTransferManager
)
addIncomingBytestreamListener
in interface BytestreamManager
listener
- the listener to registerpublic void removeIncomingBytestreamListener(BytestreamListener listener)
removeIncomingBytestreamListener
in interface BytestreamManager
listener
- the listener to removepublic void addIncomingBytestreamListener(BytestreamListener listener, org.jxmpp.jid.Jid initiatorJID)
Use this method if you are awaiting an incoming Socks5 bytestream request from a specific user.
If no listeners are registered all In-Band Bytestream request are rejected with a <not-acceptable/> error.
Note that the registered InBandBytestreamListener
will NOT be notified on incoming
Socks5 bytestream requests sent in the context of XEP-0096 file transfer. (See
FileTransferManager
)
addIncomingBytestreamListener
in interface BytestreamManager
listener
- the listener to registerinitiatorJID
- the JID of the user that wants to establish an In-Band Bytestreampublic void removeIncomingBytestreamListener(org.jxmpp.jid.Jid initiatorJID)
removeIncomingBytestreamListener
in interface BytestreamManager
initiatorJID
- the JID of the user the listener should be removedpublic void ignoreBytestreamRequestOnce(String sessionID)
This method should be used if you are awaiting an In-Band Bytestream request as a reply to another stanza (e.g. file transfer).
sessionID
- to be ignoredpublic int getDefaultBlockSize()
The recommended default block size is 4096 bytes. See XEP-0047 Section 5.
public void setDefaultBlockSize(int defaultBlockSize)
The default block size must be between 1 and 65535 bytes. The recommended default block size is 4096 bytes. See XEP-0047 Section 5.
defaultBlockSize
- the default block size to setpublic int getMaximumBlockSize()
Incoming In-Band Bytestream open request will be rejected with an <resource-constraint/> error if the block size is greater then the maximum allowed block size.
The default maximum block size is 65535 bytes.
public void setMaximumBlockSize(int maximumBlockSize)
The maximum block size must be between 1 and 65535 bytes.
Incoming In-Band Bytestream open request will be rejected with an <resource-constraint/> error if the block size is greater then the maximum allowed block size.
maximumBlockSize
- the maximum block size to setpublic InBandBytestreamManager.StanzaType getStanza()
Default is InBandBytestreamManager.StanzaType.IQ
. See XEP-0047 Section 4.
public void setStanza(InBandBytestreamManager.StanzaType stanza)
The use of InBandBytestreamManager.StanzaType.IQ
is recommended. See XEP-0047 Section 4.
stanza
- the stanza to setpublic InBandBytestreamSession establishSession(org.jxmpp.jid.Jid targetJID) throws XMPPException, SmackException, InterruptedException
Use this method to establish In-Band Bytestreams to users accepting all incoming In-Band Bytestream requests since this method doesn't provide a way to tell the user something about the data to be sent.
To establish an In-Band Bytestream after negotiation the kind of data to be sent (e.g. file
transfer) use establishSession(Jid, String)
.
establishSession
in interface BytestreamManager
targetJID
- the JID of the user an In-Band Bytestream should be establishedXMPPException
- if the user doesn't support or accept in-band bytestreams, or if the
user prefers smaller block sizesSmackException
- if there was no response from the server.InterruptedException
public InBandBytestreamSession establishSession(org.jxmpp.jid.Jid targetJID, String sessionID) throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException
establishSession
in interface BytestreamManager
targetJID
- the JID of the user an In-Band Bytestream should be establishedsessionID
- the session ID for the In-Band Bytestream requestXMPPException.XMPPErrorException
- if the user doesn't support or accept in-band bytestreams, or if the
user prefers smaller block sizesSmackException.NoResponseException
- if there was no response from the server.SmackException.NotConnectedException
InterruptedException
protected void replyRejectPacket(IQ request) throws SmackException.NotConnectedException, InterruptedException
request
- IQ stanza that should be answered with a not-acceptable errorSmackException.NotConnectedException
InterruptedException
protected void replyResourceConstraintPacket(IQ request) throws SmackException.NotConnectedException, InterruptedException
request
- IQ stanza that should be answered with a resource-constraint errorSmackException.NotConnectedException
InterruptedException
protected void replyItemNotFoundPacket(IQ request) throws SmackException.NotConnectedException, InterruptedException
request
- IQ stanza that should be answered with a item-not-found errorSmackException.NotConnectedException
InterruptedException
protected XMPPConnection getConnection()
protected BytestreamListener getUserListener(org.jxmpp.jid.Jid initiator)
InBandBytestreamListener
that should be informed if a In-Band Bytestream
request from the given initiator JID is received.initiator
- the initiator's JIDprotected List<BytestreamListener> getAllRequestListeners()
InBandBytestreamListener
that are informed if there are no
listeners for a specific initiator.protected Map<String,InBandBytestreamSession> getSessions()
protected List<String> getIgnoredBytestreamRequests()