mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-21 19:42:05 +01:00
Merge branch '4.2'
This commit is contained in:
commit
3c4225d167
72 changed files with 203 additions and 223 deletions
|
@ -178,8 +178,7 @@ allprojects {
|
|||
// since the one paramater addStringOption doesn't seem to
|
||||
// work, we extra add '-quiet', which is added anyway by
|
||||
// gradle.
|
||||
// TODO enable all doclints, see SMACK-650
|
||||
options.addStringOption('Xdoclint:all,-html', '-quiet')
|
||||
options.addStringOption('Xdoclint:all', '-quiet')
|
||||
}
|
||||
}
|
||||
tasks.withType(Javadoc) {
|
||||
|
@ -193,6 +192,10 @@ allprojects {
|
|||
configurations.errorprone {
|
||||
resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.18'
|
||||
}
|
||||
|
||||
// Make all project's 'test' target depend on javadoc, so that
|
||||
// javadoc is also linted.
|
||||
test { dependsOn javadoc }
|
||||
}
|
||||
|
||||
gradle.taskGraph.whenReady { taskGraph ->
|
||||
|
|
|
@ -50,6 +50,7 @@ import android.os.SystemClock;
|
|||
* counted towards the scheduled delay time</li>
|
||||
* <li>the scheduled Runnable is not run while the system is in deep sleep.</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* That is the reason Android comes with an API to schedule those tasks: AlarmManager. Which this
|
||||
* class uses to determine every 30 minutes if a server ping is necessary. The interval of 30
|
||||
* minutes is the ideal trade-off between reliability and low resource (battery) consumption.
|
||||
|
|
|
@ -68,7 +68,6 @@ public final class SmackConfiguration {
|
|||
* <li> Server Traffic -- raw XML traffic sent by the server to the client.
|
||||
* <li> Interpreted Packets -- shows XML packets from the server as parsed by Smack.
|
||||
* </ul>
|
||||
* <p/>
|
||||
* Debugging can be enabled by setting this field to true, or by setting the Java system
|
||||
* property <tt>smack.debugEnabled</tt> to true. The system property can be set on the
|
||||
* command line such as "java SomeApp -Dsmack.debugEnabled=true".
|
||||
|
|
|
@ -34,7 +34,6 @@ import org.jxmpp.jid.EntityFullJid;
|
|||
* implements shared methods which are used by the different types of connections (e.g.
|
||||
* <code>XMPPTCPConnection</code> or <code>XMPPBOSHConnection</code>). To create a connection to an XMPP server
|
||||
* a simple usage of this API might look like the following:
|
||||
* <p>
|
||||
*
|
||||
* <pre>
|
||||
* // Create a connection to the igniterealtime.org XMPP server.
|
||||
|
@ -54,7 +53,6 @@ import org.jxmpp.jid.EntityFullJid;
|
|||
* // Disconnect from the server
|
||||
* con.disconnect();
|
||||
* </pre>
|
||||
* </p>
|
||||
* <p>
|
||||
* Note that the XMPPConnection interface does intentionally not declare any methods that manipulate
|
||||
* the connection state, e.g. <code>connect()</code>, <code>disconnect()</code>. You should use the
|
||||
|
|
|
@ -34,8 +34,8 @@ import java.util.zip.InflaterInputStream;
|
|||
* <p>
|
||||
* See also:
|
||||
* <ul>
|
||||
* <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/zip/Deflater.html#deflate(byte[], int, int, int)">The required deflate() method (Java7)</a>
|
||||
* <li><a href="http://developer.android.com/reference/java/util/zip/Deflater.html#deflate(byte[], int, int, int)">The required deflate() method (Android)</a>
|
||||
* <li><a href="http://docs.oracle.com/javase/7/docs/api/java/util/zip/Deflater.html#deflate(byte[],%20int,%20int,%20int)">The required deflate() method (Java7)</a>
|
||||
* <li><a href="http://developer.android.com/reference/java/util/zip/Deflater.html#deflate(byte[],%20int,%20int,%20int)">The required deflate() method (Android)</a>
|
||||
* </ul>
|
||||
*
|
||||
* @author Florian Schmaus
|
||||
|
|
|
@ -26,11 +26,12 @@ import org.jivesoftware.smack.XMPPConnection;
|
|||
/**
|
||||
* Very simple debugger that prints to the console (stdout) the sent and received stanzas. Use
|
||||
* this debugger with caution since printing to the console is an expensive operation that may
|
||||
* even block the thread since only one thread may print at a time.<p>
|
||||
* <p/>
|
||||
* even block the thread since only one thread may print at a time.
|
||||
* <p>
|
||||
* It is possible to not only print the raw sent and received stanzas but also the interpreted
|
||||
* packets by Smack. By default interpreted packets won't be printed. To enable this feature
|
||||
* just change the <tt>printInterpreted</tt> static variable to <tt>true</tt>.
|
||||
* </p>
|
||||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
|
|
|
@ -24,11 +24,12 @@ import org.jivesoftware.smack.XMPPConnection;
|
|||
/**
|
||||
* Very simple debugger that prints to the console (stdout) the sent and received stanzas. Use
|
||||
* this debugger with caution since printing to the console is an expensive operation that may
|
||||
* even block the thread since only one thread may print at a time.<p>
|
||||
* <p/>
|
||||
* even block the thread since only one thread may print at a time.
|
||||
* <p>
|
||||
* It is possible to not only print the raw sent and received stanzas but also the interpreted
|
||||
* packets by Smack. By default interpreted packets won't be printed. To enable this feature
|
||||
* just change the <tt>printInterpreted</tt> static variable to <tt>true</tt>.
|
||||
* </p>
|
||||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
|
|
|
@ -25,7 +25,7 @@ public class ErrorIQ extends SimpleIQ {
|
|||
/**
|
||||
* Constructs a new error IQ.
|
||||
* <p>
|
||||
* According to RFC 6120 § 8.3.1 "4. An error stanza MUST contain an <error/> child element.", so the xmppError argument is mandatory.
|
||||
* According to RFC 6120 § 8.3.1 "4. An error stanza MUST contain an <error/> child element.", so the xmppError argument is mandatory.
|
||||
* </p>
|
||||
* @param xmppErrorBuilder the XMPPError builder (required).
|
||||
*/
|
||||
|
|
|
@ -135,7 +135,7 @@ public interface Packet extends TopLevelStreamElement {
|
|||
List<ExtensionElement> getExtensions();
|
||||
|
||||
/**
|
||||
* Return a set of all extensions with the given element name <emph>and</emph> namespace.
|
||||
* Return a set of all extensions with the given element name <i>and</i> namespace.
|
||||
* <p>
|
||||
* Changes to the returned set will update the stanza(/packet) extensions, if the returned set is not the empty set.
|
||||
* </p>
|
||||
|
|
|
@ -70,7 +70,7 @@ public abstract class Stanza implements TopLevelStreamElement {
|
|||
* Such an attribute is defined for all stanza types. For IQ, see for
|
||||
* example XEP-50 3.7:
|
||||
* "The requester SHOULD provide its locale information using the "xml:lang
|
||||
* " attribute on either the <iq/> (RECOMMENDED) or <command/> element."
|
||||
* " attribute on either the <iq/> (RECOMMENDED) or <command/> element."
|
||||
* </p>
|
||||
*/
|
||||
protected String language;
|
||||
|
|
|
@ -33,7 +33,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*
|
||||
* <table border=1>
|
||||
* <caption>XMPP Errors</caption>
|
||||
* <hr><td><b>XMPP Error Condition</b></td><td><b>Type</b></td><td><b>RFC 6120 Section</b></td></hr>
|
||||
* <tr><th>XMPP Error Condition</th><th>Type</th><th>RFC 6120 Section</th></tr>
|
||||
* <tr><td>bad-request</td><td>MODIFY</td><td>8.3.3.1</td></tr>
|
||||
* <tr><td>conflict</td><td>CANCEL</td><td>8.3.3.2</td></tr>
|
||||
* <tr><td>feature-not-implemented</td><td>CANCEL</td><td>8.3.3.3</td></tr>
|
||||
|
|
|
@ -35,6 +35,7 @@ import org.jxmpp.jid.EntityBareJid;
|
|||
/**
|
||||
* Base class for SASL mechanisms.
|
||||
* Subclasses will likely want to implement their own versions of these methods:
|
||||
* <ul>
|
||||
* <li>{@link #authenticate(String, String, DomainBareJid, String, EntityBareJid, SSLSession)} -- Initiate authentication stanza using the
|
||||
* deprecated method.</li>
|
||||
* <li>{@link #authenticate(String, DomainBareJid, CallbackHandler, EntityBareJid, SSLSession)} -- Initiate authentication stanza
|
||||
|
|
|
@ -86,10 +86,11 @@ import org.jxmpp.jid.Jid;
|
|||
|
||||
/**
|
||||
* The EnhancedDebugger is a debugger that allows to debug sent, received and interpreted messages
|
||||
* but also provides the ability to send ad-hoc messages composed by the user.<p>
|
||||
* <p/>
|
||||
* but also provides the ability to send ad-hoc messages composed by the user.
|
||||
* <p>
|
||||
* A new EnhancedDebugger will be created for each connection to debug. All the EnhancedDebuggers
|
||||
* will be shown in the same debug window provided by the class EnhancedDebuggerWindow.
|
||||
* </p>
|
||||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
|
|
|
@ -49,10 +49,11 @@ import org.jivesoftware.smack.provider.ProviderManager;
|
|||
/**
|
||||
* The EnhancedDebuggerWindow is the main debug window that will show all the EnhancedDebuggers.
|
||||
* For each connection to debug there will be an EnhancedDebugger that will be shown in the
|
||||
* EnhancedDebuggerWindow.<p>
|
||||
* <p/>
|
||||
* EnhancedDebuggerWindow.
|
||||
* <p>
|
||||
* This class also provides information about Smack like for example the Smack version and the
|
||||
* installed providers.
|
||||
* </p>
|
||||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
|
|
|
@ -418,7 +418,7 @@ public final class MamManager extends Manager {
|
|||
/**
|
||||
* Obtain page before the first message saved (specific chat).
|
||||
* <p>
|
||||
* Note that the messageUid is the XEP-0313 UID and <b>not</> the stanza ID of the message.
|
||||
* Note that the messageUid is the XEP-0313 UID and <b>not</b> the stanza ID of the message.
|
||||
* </p>
|
||||
*
|
||||
* @param chatJid
|
||||
|
@ -442,7 +442,7 @@ public final class MamManager extends Manager {
|
|||
/**
|
||||
* Obtain page after the last message saved (specific chat).
|
||||
* <p>
|
||||
* Note that the messageUid is the XEP-0313 UID and <b>not</> the stanza ID of the message.
|
||||
* Note that the messageUid is the XEP-0313 UID and <b>not</b> the stanza ID of the message.
|
||||
* </p>
|
||||
*
|
||||
* @param chatJid
|
||||
|
|
|
@ -238,9 +238,9 @@ public class AMPExtension implements ExtensionElement {
|
|||
**/
|
||||
public enum Action {
|
||||
/**
|
||||
* The "alert" action triggers a reply <message/> stanza to the sending entity.
|
||||
* This <message/> stanza MUST contain the element <amp status='alert'/>,
|
||||
* which itself contains the <rule/> that triggered this action. In all other respects,
|
||||
* The "alert" action triggers a reply <message/> stanza to the sending entity.
|
||||
* This <message/> stanza MUST contain the element <amp status='alert'/>,
|
||||
* which itself contains the <rule/> that triggered this action. In all other respects,
|
||||
* this action behaves as "drop".
|
||||
*/
|
||||
alert,
|
||||
|
@ -251,16 +251,16 @@ public class AMPExtension implements ExtensionElement {
|
|||
*/
|
||||
drop,
|
||||
/**
|
||||
* The "error" action triggers a reply <message/> stanza of type "error" to the sending entity.
|
||||
* The <message/> stanza's <error/> child MUST contain a
|
||||
* <failed-rules xmlns='http://jabber.org/protocol/amp#errors'/> error condition,
|
||||
* The "error" action triggers a reply <message/> stanza of type "error" to the sending entity.
|
||||
* The <message/> stanza's <error/> child MUST contain a
|
||||
* <failed-rules xmlns='http://jabber.org/protocol/amp#errors'/> error condition,
|
||||
* which itself contains the rules that triggered this action.
|
||||
*/
|
||||
error,
|
||||
/**
|
||||
* The "notify" action triggers a reply <message/> stanza to the sending entity.
|
||||
* This <message/> stanza MUST contain the element <amp status='notify'/>, which itself
|
||||
* contains the <rule/> that triggered this action. Unlike the other actions,
|
||||
* The "notify" action triggers a reply <message/> stanza to the sending entity.
|
||||
* This <message/> stanza MUST contain the element <amp status='notify'/>, which itself
|
||||
* contains the <rule/> that triggered this action. Unlike the other actions,
|
||||
* this action does not override the default behavior for a server.
|
||||
* Instead, the server then executes its default behavior after sending the notify.
|
||||
*/
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.jxmpp.jid.parts.Resourcepart;
|
|||
/**
|
||||
* Provides methods to manage bookmarks in accordance with XEP-0048. Methods for managing URLs and
|
||||
* Conferences are provided.
|
||||
* </p>
|
||||
*
|
||||
* It should be noted that some extensions have been made to the XEP. There is an attribute on URLs
|
||||
* that marks a url as a news feed and also a sub-element can be added to either a URL or conference
|
||||
* indicated that it is shared amongst all users on a server.
|
||||
|
|
|
@ -36,12 +36,10 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
* Bookmark Storage (XEP-0048) defined a protocol for the storage of bookmarks to conference rooms and other entities
|
||||
* in a Jabber user's account.
|
||||
* See the following code sample for saving Bookmarks:
|
||||
* <p/>
|
||||
* <pre>
|
||||
* XMPPConnection con = new XMPPTCPConnection("jabber.org");
|
||||
* con.login("john", "doe");
|
||||
* Bookmarks bookmarks = new Bookmarks();
|
||||
* <p/>
|
||||
* // Bookmark a URL
|
||||
* BookmarkedURL url = new BookmarkedURL();
|
||||
* url.setName("Google");
|
||||
|
@ -56,8 +54,6 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
* // Save Bookmarks using PrivateDataManager.
|
||||
* PrivateDataManager manager = new PrivateDataManager(con);
|
||||
* manager.setPrivateData(bookmarks);
|
||||
* <p/>
|
||||
* <p/>
|
||||
* LastActivity activity = LastActivity.getLastActivity(con, "xray@jabber.org");
|
||||
* </pre>
|
||||
*
|
||||
|
|
|
@ -73,7 +73,7 @@ public interface BytestreamSession {
|
|||
* read() call on the input stream associated with this session will block for only this amount
|
||||
* of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the
|
||||
* session is still valid. The option must be enabled prior to entering the blocking operation
|
||||
* to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite
|
||||
* to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite
|
||||
* timeout. Default is 0.
|
||||
*
|
||||
* @param timeout the specified timeout, in milliseconds
|
||||
|
|
|
@ -61,10 +61,10 @@ public class CapsExtension implements ExtensionElement {
|
|||
* {@inheritDoc}.
|
||||
*
|
||||
* <pre>
|
||||
* <c xmlns='http://jabber.org/protocol/caps'
|
||||
* <c xmlns='http://jabber.org/protocol/caps'
|
||||
* hash='sha-1'
|
||||
* node='http://code.google.com/p/exodus'
|
||||
* ver='QgayPKawpkPSDYmwT/WM94uAlu0='/>
|
||||
* ver='QgayPKawpkPSDYmwT/WM94uAlu0='/>
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -38,6 +38,7 @@ import org.jxmpp.jid.Jid;
|
|||
* <code>getForm</code> method retrieves a form with all the users.
|
||||
* <p>
|
||||
* Each command has a <tt>node</tt> that should be unique within a given JID.
|
||||
* </p>
|
||||
* <p>
|
||||
* Commands may have zero or more stages. Each stage is usually used for
|
||||
* gathering information required for the command execution. Users are able to
|
||||
|
@ -49,21 +50,22 @@ import org.jxmpp.jid.Jid;
|
|||
* have to provide the data forms the user must complete in each stage and the
|
||||
* allowed actions the user might perform during each stage (e.g. go to the
|
||||
* previous stage or go to the next stage).
|
||||
* <p>
|
||||
* </p>
|
||||
* All the actions may throw an XMPPException if there is a problem executing
|
||||
* them. The <code>XMPPError</code> of that exception may have some specific
|
||||
* information about the problem. The possible extensions are:
|
||||
*
|
||||
* <ul>
|
||||
* <li><i>malformed-action</i>. Extension of a <i>bad-request</i> error.</li>
|
||||
* <li><i>bad-action</i>. Extension of a <i>bad-request</i> error.</li>
|
||||
* <li><i>bad-locale</i>. Extension of a <i>bad-request</i> error.</li>
|
||||
* <li><i>bad-payload</i>. Extension of a <i>bad-request</i> error.</li>
|
||||
* <li><i>bad-sessionid</i>. Extension of a <i>bad-request</i> error.</li>
|
||||
* <li><i>session-expired</i>. Extension of a <i>not-allowed</i> error.</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* See the <code>SpecificErrorCondition</code> class for detailed description
|
||||
* of each one.
|
||||
* <p>
|
||||
* </p>
|
||||
* Use the <code>getSpecificErrorConditionFrom</code> to obtain the specific
|
||||
* information from an <code>XMPPError</code>.
|
||||
*
|
||||
|
|
|
@ -31,7 +31,7 @@ import org.jxmpp.jid.Jid;
|
|||
* <li>Current Stage</li>
|
||||
* <li>Available actions</li>
|
||||
* <li>Default action</li>
|
||||
* </ul><p/>
|
||||
* </ul>
|
||||
* To implement a new command extend this class and implement all the abstract
|
||||
* methods. When implementing the actions remember that they could be invoked
|
||||
* several times, and that you must use the current stage number to know what to
|
||||
|
|
|
@ -269,7 +269,7 @@ public final class FileTransferNegotiator extends Manager {
|
|||
* Send a request to another user to send them a file. The other user has
|
||||
* the option of, accepting, rejecting, or not responding to a received file
|
||||
* transfer request.
|
||||
* <p/>
|
||||
* <p>
|
||||
* If they accept, the stanza(/packet) will contain the other user's chosen stream
|
||||
* type to send the file across. The two choices this implementation
|
||||
* provides to the other user for file transfer are <a
|
||||
|
@ -277,11 +277,12 @@ public final class FileTransferNegotiator extends Manager {
|
|||
* which is the preferred method of transfer, and <a
|
||||
* href="http://www.xmpp.org/extensions/jep-0047.html">In-Band Bytestreams</a>,
|
||||
* which is the fallback mechanism.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* The other user may choose to decline the file request if they do not
|
||||
* desire the file, their client does not support XEP-0096, or if there are
|
||||
* no acceptable means to transfer the file.
|
||||
* <p/>
|
||||
* </p>
|
||||
* Finally, if the other user does not respond this method will return null
|
||||
* after the specified timeout.
|
||||
*
|
||||
|
|
|
@ -122,7 +122,7 @@ public class FileTransferRequest {
|
|||
/**
|
||||
* Accepts this file transfer and creates the incoming file transfer.
|
||||
*
|
||||
* @return Returns the <b><i>IncomingFileTransfer</b></i> on which the
|
||||
* @return Returns the IncomingFileTransfer on which the
|
||||
* file transfer can be carried out.
|
||||
*/
|
||||
public IncomingFileTransfer accept() {
|
||||
|
|
|
@ -42,12 +42,12 @@ import org.jivesoftware.smack.XMPPException.XMPPErrorException;
|
|||
* user on the jabber network. There are two stages of the file transfer to be
|
||||
* concerned with and they can be handled in different ways depending upon the
|
||||
* method that is invoked on this class.
|
||||
* <p/>
|
||||
*
|
||||
* The first way that a file is received is by calling the
|
||||
* {@link #receiveFile()} method. This method, negotiates the appropriate stream
|
||||
* method and then returns the <b><i>InputStream</b></i> to read the file
|
||||
* method and then returns the InputStream to read the file
|
||||
* data from.
|
||||
* <p/>
|
||||
*
|
||||
* The second way that a file can be received through this class is by invoking
|
||||
* the {@link #receiveFile(File)} method. This method returns immediately and
|
||||
* takes as its parameter a file on the local file system where the file
|
||||
|
@ -98,14 +98,14 @@ public class IncomingFileTransfer extends FileTransfer {
|
|||
/**
|
||||
* This method negotiates the stream and then transfer's the file over the negotiated stream.
|
||||
* The transferred file will be saved at the provided location.
|
||||
* <p/>
|
||||
*
|
||||
* This method will return immediately, file transfer progress can be monitored through several
|
||||
* methods:
|
||||
* <p/>
|
||||
*
|
||||
* <UL>
|
||||
* <LI>{@link FileTransfer#getStatus()}
|
||||
* <LI>{@link FileTransfer#getProgress()}
|
||||
* <LI>{@link FileTransfer#isDone()}
|
||||
* <LI>{@link FileTransfer#getStatus()}</LI>
|
||||
* <LI>{@link FileTransfer#getProgress()}</LI>
|
||||
* <LI>{@link FileTransfer#isDone()}</LI>
|
||||
* </UL>
|
||||
*
|
||||
* @param file The location to save the file.
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
import org.jivesoftware.smackx.delay.packet.DelayInformation;
|
||||
|
||||
/**
|
||||
* Stanza(/Packet) extension for >XEP-0297: Stanza Forwarding.
|
||||
* Stanza extension for XEP-0297: Stanza Forwarding.
|
||||
*
|
||||
* @author Georg Lukas
|
||||
* @see <a href="http://xmpp.org/extensions/xep-0297.html">XEP-0297: Stanza Forwarding</a>
|
||||
|
|
|
@ -48,7 +48,6 @@ import org.jxmpp.jid.Jid;
|
|||
* associated with a Jabber ID. A manager handles incoming LastActivity requests
|
||||
* of existing Connections. It also allows to request last activity information
|
||||
* of other users.
|
||||
* <p>
|
||||
*
|
||||
* LastActivity (XEP-0012) based on the sending JID's type allows for retrieval
|
||||
* of:
|
||||
|
@ -58,11 +57,9 @@ import org.jxmpp.jid.Jid;
|
|||
* specified when doing so.
|
||||
* <li>How long a host has been up.
|
||||
* </ol>
|
||||
* <p/>
|
||||
*
|
||||
* For example to get the idle time of a user logged in a resource, simple send
|
||||
* the LastActivity stanza(/packet) to them, as in the following code:
|
||||
* <p>
|
||||
*
|
||||
* <pre>
|
||||
* XMPPConnection con = new XMPPTCPConnection("jabber.org");
|
||||
|
|
|
@ -105,7 +105,7 @@ public final class Jingle extends IQ {
|
|||
/**
|
||||
* Returns the session ID related to the session. The session ID is a unique identifier generated by the initiator.
|
||||
* This should match the XML Nmtoken production so that XML character escaping is not needed for characters such as
|
||||
* &.
|
||||
* &.
|
||||
*
|
||||
* @return Returns the session ID related to the session.
|
||||
*/
|
||||
|
|
|
@ -34,9 +34,10 @@ public class JivePropertiesManager {
|
|||
* you are sure that you understand the potential security implications it can cause.
|
||||
* <p>
|
||||
* See also:
|
||||
* </p>
|
||||
* <ul>
|
||||
* <li> <a href="http://stackoverflow.com/questions/19054460/">"What is the security impact of deserializing untrusted data in Java?" on Stackoverflow<a>
|
||||
* <ul>
|
||||
* <li> <a href="http://stackoverflow.com/questions/19054460/">"What is the security impact of deserializing untrusted data in Java?" on Stackoverflow</a>
|
||||
* </ul>
|
||||
* @param enabled true to enable Java object deserialization
|
||||
*/
|
||||
public static void setJavaObjectEnabled(boolean enabled) {
|
||||
|
|
|
@ -28,8 +28,8 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
* the XEP for more implementation guidelines.
|
||||
*
|
||||
* @author Fernando Ramirez, f.e.ramirez94@gmail.com
|
||||
* @see <a href="http://xmpp.org/extensions/xep-0308.html">XEP-0308: Last&
|
||||
* nbsp;Message Correction</a>
|
||||
* @see <a href="http://xmpp.org/extensions/xep-0308.html">XEP-0308: Last
|
||||
* Message Correction</a>
|
||||
*/
|
||||
public class MessageCorrectExtension implements ExtensionElement {
|
||||
|
||||
|
|
|
@ -28,11 +28,11 @@ import org.jivesoftware.smackx.muc.packet.MUCInitialPresence;
|
|||
*
|
||||
* You can use some or all of these variable to control the amount of history to receive:
|
||||
* <ul>
|
||||
* <li>maxchars -> total number of characters to receive in the history.
|
||||
* <li>maxstanzas -> total number of messages to receive in the history.
|
||||
* <li>seconds -> only the messages received in the last "X" seconds will be included in the
|
||||
* <li>maxchars -> total number of characters to receive in the history.
|
||||
* <li>maxstanzas -> total number of messages to receive in the history.
|
||||
* <li>seconds -> only the messages received in the last "X" seconds will be included in the
|
||||
* history.
|
||||
* <li>since -> only the messages received since the datetime specified will be included in
|
||||
* <li>since -> only the messages received since the datetime specified will be included in
|
||||
* the history.
|
||||
* </ul>
|
||||
*
|
||||
|
|
|
@ -130,7 +130,7 @@ public class MUCItem implements NamedElement {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the <room@service/nick> by which an occupant is identified within the context of a
|
||||
* Returns the <room@service/nick> by which an occupant is identified within the context of a
|
||||
* room. If the room is non-anonymous, the JID will be included in the item.
|
||||
*
|
||||
* @return the room JID by which an occupant is identified within the room.
|
||||
|
|
|
@ -29,7 +29,7 @@ import org.jivesoftware.smack.packet.IQ;
|
|||
* and {@link org.jivesoftware.smackx.privacy.provider.PrivacyProvider} to allow and block
|
||||
* communications from other users. It contains the appropriate structure to suit
|
||||
* user-defined privacy lists. Different configured Privacy packages are used in the
|
||||
* server & manager communication in order to:
|
||||
* server and manager communication in order to:
|
||||
* <ul>
|
||||
* <li>Retrieving one's privacy lists.
|
||||
* <li>Adding, removing, and editing one's privacy lists.
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.xmlpull.v1.XmlPullParser;
|
|||
* has been used mainly to search for people who have registered with user directories (e.g., the "Jabber User Directory" hosted at users.jabber.org).
|
||||
* However, the jabber:iq:search protocol is not limited to user directories, and could be used to search other Jabber information repositories
|
||||
* (such as chatroom directories) or even to provide a Jabber interface to conventional search engines.
|
||||
* <p/>
|
||||
*
|
||||
* The basic functionality is to query an information repository regarding the possible search fields, to send a search query, and to receive search results.
|
||||
*
|
||||
* @author Derek DeMoro
|
||||
|
|
|
@ -51,7 +51,7 @@ public class StreamInitiation extends IQ {
|
|||
/**
|
||||
* The "id" attribute is an opaque identifier. This attribute MUST be
|
||||
* present on type='set', and MUST be a valid string. This SHOULD NOT be
|
||||
* sent back on type='result', since the <iq/> "id" attribute provides the
|
||||
* sent back on type='result', since the <iq/> "id" attribute provides the
|
||||
* only context needed. This value is generated by the Sender, and the same
|
||||
* value MUST be used throughout a session when talking to the Receiver.
|
||||
*
|
||||
|
@ -75,7 +75,7 @@ public class StreamInitiation extends IQ {
|
|||
* The "mime-type" attribute identifies the MIME-type for the data across
|
||||
* the stream. This attribute MUST be a valid MIME-type as registered with
|
||||
* the Internet Assigned Numbers Authority (IANA) [3] (specifically, as
|
||||
* listed at <http://www.iana.org/assignments/media-types>). During
|
||||
* listed at <http://www.iana.org/assignments/media-types>). During
|
||||
* negotiation, this attribute SHOULD be present, and is otherwise not
|
||||
* required. If not included during negotiation, its value is assumed to be
|
||||
* "binary/octet-stream".
|
||||
|
@ -168,26 +168,23 @@ public class StreamInitiation extends IQ {
|
|||
* using the DateTime profile as described in Jabber Date and Time Profiles.</li>
|
||||
* <li>hash: The MD5 sum of the file contents.</li>
|
||||
* </ul>
|
||||
* <p/>
|
||||
* <p/>
|
||||
* <p>
|
||||
* <desc> is used to provide a sender-generated description of the
|
||||
* file so the receiver can better understand what is being sent. It MUST
|
||||
* NOT be sent in the result.
|
||||
* <p/>
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* When <range> is sent in the offer, it should have no attributes.
|
||||
* This signifies that the sender can do ranged transfers. When a Stream
|
||||
* Initiation result is sent with the <range> element, it uses these
|
||||
* Initiation result is sent with the <range> element, it uses these
|
||||
* attributes:
|
||||
* <p/>
|
||||
* </p>
|
||||
* <ul>
|
||||
* <li>offset: Specifies the position, in bytes, to start transferring the
|
||||
* file data from. This defaults to zero (0) if not specified.</li>
|
||||
* <li>length - Specifies the number of bytes to retrieve starting at
|
||||
* offset. This defaults to the length of the file from offset to the end.</li>
|
||||
* </ul>
|
||||
* <p/>
|
||||
* <p/>
|
||||
* Both attributes are OPTIONAL on the <range> element. Sending no
|
||||
* attributes is synonymous with not sending the <range> element. When
|
||||
* no <range> element is sent in the Stream Initiation result, the
|
||||
|
|
|
@ -47,19 +47,19 @@ import org.jxmpp.jid.EntityBareJid;
|
|||
/**
|
||||
* A VCard class for use with the
|
||||
* <a href="http://www.jivesoftware.org/smack/" target="_blank">SMACK jabber library</a>.<p>
|
||||
* <p/>
|
||||
*
|
||||
* You should refer to the
|
||||
* <a href="http://www.xmpp.org/extensions/jep-0054.html" target="_blank">XEP-54 documentation</a>.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Please note that this class is incomplete but it does provide the most commonly found
|
||||
* information in vCards. Also remember that VCard transfer is not a standard, and the protocol
|
||||
* may change or be replaced.<p>
|
||||
* <p/>
|
||||
*
|
||||
* <b>Usage:</b>
|
||||
* <pre>
|
||||
* <p/>
|
||||
*
|
||||
* // To save VCard:
|
||||
* <p/>
|
||||
*
|
||||
* VCard vCard = new VCard();
|
||||
* vCard.setFirstName("kir");
|
||||
* vCard.setLastName("max");
|
||||
|
@ -67,16 +67,16 @@ import org.jxmpp.jid.EntityBareJid;
|
|||
* vCard.setJabberId("jabber@id.org");
|
||||
* vCard.setOrganization("Jetbrains, s.r.o");
|
||||
* vCard.setNickName("KIR");
|
||||
* <p/>
|
||||
*
|
||||
* vCard.setField("TITLE", "Mr");
|
||||
* vCard.setAddressFieldHome("STREET", "Some street");
|
||||
* vCard.setAddressFieldWork("CTRY", "US");
|
||||
* vCard.setPhoneWork("FAX", "3443233");
|
||||
* <p/>
|
||||
*
|
||||
* vCard.save(connection);
|
||||
* <p/>
|
||||
*
|
||||
* // To load VCard:
|
||||
* <p/>
|
||||
*
|
||||
* VCard vCard = new VCard();
|
||||
* vCard.load(conn); // load own VCard
|
||||
* vCard.load(conn, "joe@foo.bar"); // load someone's VCard
|
||||
|
@ -441,10 +441,10 @@ public class VCard extends IQ {
|
|||
* <pre>
|
||||
* // Load Avatar from VCard
|
||||
* byte[] avatarBytes = vCard.getAvatar();
|
||||
* <p/>
|
||||
*
|
||||
* // To create an ImageIcon for Swing applications
|
||||
* ImageIcon icon = new ImageIcon(avatar);
|
||||
* <p/>
|
||||
*
|
||||
* // To create just an image object from the bytes
|
||||
* ByteArrayInputStream bais = new ByteArrayInputStream(avatar);
|
||||
* try {
|
||||
|
|
|
@ -93,7 +93,7 @@ public class DataForm implements ExtensionElement {
|
|||
|
||||
/**
|
||||
* Returns the description of the data. It is similar to the title on a web page or an X
|
||||
* window. You can put a <title/> on either a form to fill out, or a set of data results.
|
||||
* window. You can put a <title/> on either a form to fill out, or a set of data results.
|
||||
*
|
||||
* @return description of the data.
|
||||
*/
|
||||
|
@ -184,7 +184,7 @@ public class DataForm implements ExtensionElement {
|
|||
|
||||
/**
|
||||
* Sets the description of the data. It is similar to the title on a web page or an X window.
|
||||
* You can put a <title/> on either a form to fill out, or a set of data results.
|
||||
* You can put a <title/> on either a form to fill out, or a set of data results.
|
||||
*
|
||||
* @param title description of the data.
|
||||
*/
|
||||
|
|
|
@ -380,7 +380,7 @@ public abstract class ValidateElement implements ExtensionElement {
|
|||
}
|
||||
|
||||
/**
|
||||
* The <list-range/> element SHOULD be included only when the <field/> is of type "list-multi" and SHOULD be ignored
|
||||
* The >list-range/< element SHOULD be included only when the <field/> is of type "list-multi" and SHOULD be ignored
|
||||
* otherwise.
|
||||
*
|
||||
* @param formField
|
||||
|
|
|
@ -79,14 +79,13 @@ import org.jxmpp.util.cache.LruCache;
|
|||
/**
|
||||
* Represents a user's roster, which is the collection of users a person receives
|
||||
* presence updates for. Roster items are categorized into groups for easier management.
|
||||
* <p>
|
||||
*
|
||||
* Others users may attempt to subscribe to this user using a subscription request. Three
|
||||
* modes are supported for handling these requests: <ul>
|
||||
* <li>{@link SubscriptionMode#accept_all accept_all} -- accept all subscription requests.</li>
|
||||
* <li>{@link SubscriptionMode#reject_all reject_all} -- reject all subscription requests.</li>
|
||||
* <li>{@link SubscriptionMode#manual manual} -- manually process all subscription requests.</li>
|
||||
* </ul>
|
||||
* </p>
|
||||
*
|
||||
* @author Matt Tucker
|
||||
* @see #getInstanceFor(XMPPConnection)
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.jivesoftware.smackx.jingleold.packet.JingleError;
|
|||
/**
|
||||
* A Jingle exception.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public class JingleException extends XMPPException {
|
||||
private static final long serialVersionUID = -1521230401958103382L;
|
||||
|
|
|
@ -56,34 +56,41 @@ import org.jxmpp.jid.Jid;
|
|||
* Jingle is a session establishment protocol defined in (XEP-0166).
|
||||
* It defines a framework for negotiating and managing out-of-band ( data that is send and receive through other connection than XMPP connection) data sessions over XMPP.
|
||||
* With this protocol you can setup VOIP Calls, Video Streaming, File transfers and whatever out-of-band session based transmission.
|
||||
* <p/>
|
||||
* <p>
|
||||
* To create a Jingle Session you need a Transport method and a Payload type.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* A transport method is how it will transmit and receive network packets. Transport MUST have one or more candidates.
|
||||
* A transport candidate is an IP Address with a defined port, that other party must send data to.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* A supported payload type, is the data encoding format that the jmf will be transmitted.
|
||||
* For instance an Audio Payload "GSM".
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* A Jingle session negotiates a payload type and a pair of transport candidates.
|
||||
* Which means that when a Jingle Session is established you will have two defined transport candidates with addresses
|
||||
* and a defined Payload type.
|
||||
* In other words, you will have two IP address with their respective ports, and a Codec type defined.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* The JingleManager is a facade built upon Jabber Jingle (XEP-166) to allow the
|
||||
* use of Jingle. This implementation allows the user to simply
|
||||
* use this class for setting the Jingle parameters, create and receive Jingle Sessions.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* In order to use the Jingle, the user must provide a
|
||||
* TransportManager that will handle the resolution of potential IP addresses that can be used to transport the streaming (jmf).
|
||||
* This TransportManager can be initialized with several default resolvers,
|
||||
* including a fixed solver that can be used when the address and port are know
|
||||
* in advance.
|
||||
* This API have ready to use Transport Managers, for instance: BasicTransportManager, STUNTransportManager, BridgedTransportManager.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* You should also specify a JingleMediaManager if you want that JingleManager assume Media control
|
||||
* Using a JingleMediaManager implementation is the easier way to implement a Jingle Application.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* Otherwise before creating an outgoing connection, the user must create jingle session
|
||||
* listeners that will be called when different events happen. The most
|
||||
* important event is <i>sessionEstablished()</i>, that will be called when all
|
||||
|
@ -91,85 +98,60 @@ import org.jxmpp.jid.Jid;
|
|||
* transmission as well as the remote and local addresses and ports for the
|
||||
* communication. See JingleSessionListener for a complete list of events that can be
|
||||
* observed.
|
||||
* <p/>
|
||||
* </p>
|
||||
* This is an example of how to use the JingleManager:
|
||||
* <i>This example implements a Jingle VOIP Call between two users.</i>
|
||||
* <p/>
|
||||
* <pre>
|
||||
* <p/>
|
||||
* To wait for an Incoming Jingle Session:
|
||||
* <p/>
|
||||
* try {
|
||||
* <p/>
|
||||
* // Connect to an XMPP Server
|
||||
* XMPPConnection x1 = new XMPPTCPConnection("xmpp.com");
|
||||
* x1.connect();
|
||||
* x1.login("juliet", "juliet");
|
||||
* <p/>
|
||||
* // Create a JingleManager using a BasicResolver
|
||||
* final JingleManager jm1 = new JingleManager(
|
||||
* x1, new BasicTransportManager());
|
||||
* <p/>
|
||||
* // Create a JingleMediaManager. In this case using Jingle Audio Media API
|
||||
* JingleMediaManager jingleMediaManager = new AudioMediaManager();
|
||||
* <p/>
|
||||
* // Set the JingleMediaManager
|
||||
* jm1.setMediaManager(jingleMediaManager);
|
||||
* <p/>
|
||||
* // Listen for incoming calls
|
||||
* jm1.addJingleSessionRequestListener(new JingleSessionRequestListener() {
|
||||
* public void sessionRequested(JingleSessionRequest request) {
|
||||
* <p/>
|
||||
* try {
|
||||
* // Accept the call
|
||||
* IncomingJingleSession session = request.accept();
|
||||
* <p/>
|
||||
* <p/>
|
||||
* // Start the call
|
||||
* session.start();
|
||||
* } catch (XMPPException e) {
|
||||
* LOGGER.log(Level.WARNING, "exception", e);
|
||||
* }
|
||||
* <p/>
|
||||
* }
|
||||
* });
|
||||
* <p/>
|
||||
* Thread.sleep(15000);
|
||||
* <p/>
|
||||
* } catch (Exception e) {
|
||||
* LOGGER.log(Level.WARNING, "exception", e);
|
||||
* }
|
||||
* <p/>
|
||||
* To create an Outgoing Jingle Session:
|
||||
* <p/>
|
||||
* try {
|
||||
* <p/>
|
||||
* // Connect to an XMPP Server
|
||||
* XMPPConnection x0 = new XMPPTCPConnection("xmpp.com");
|
||||
* x0.connect();
|
||||
* x0.login("romeo", "romeo");
|
||||
* <p/>
|
||||
* // Create a JingleManager using a BasicResolver
|
||||
* final JingleManager jm0 = new JingleManager(
|
||||
* x0, new BasicTransportManager());
|
||||
* <p/>
|
||||
* // Create a JingleMediaManager. In this case using Jingle Audio Media API
|
||||
* JingleMediaManager jingleMediaManager = new AudioMediaManager(); // Using Jingle Media API
|
||||
* <p/>
|
||||
* // Set the JingleMediaManager
|
||||
* jm0.setMediaManager(jingleMediaManager);
|
||||
* <p/>
|
||||
* // Create a new Jingle Call with a full JID
|
||||
* OutgoingJingleSession js0 = jm0.createOutgoingJingleSession("juliet@xmpp.com/Smack");
|
||||
* <p/>
|
||||
* // Start the call
|
||||
* js0.start();
|
||||
* <p/>
|
||||
* Thread.sleep(10000);
|
||||
* js0.terminate();
|
||||
* <p/>
|
||||
* Thread.sleep(3000);
|
||||
* <p/>
|
||||
* } catch (Exception e) {
|
||||
* LOGGER.log(Level.WARNING, "exception", e);
|
||||
* }
|
||||
|
@ -279,11 +261,11 @@ public class JingleManager implements JingleSessionListener {
|
|||
|
||||
/**
|
||||
* Enables or disables the Jingle support on a given connection.
|
||||
* <p/>
|
||||
* <p/>
|
||||
* <p>
|
||||
* Before starting any Jingle jmf session, check that the user can handle
|
||||
* it. Enable the Jingle support to indicate that this client handles Jingle
|
||||
* messages.
|
||||
* </p>
|
||||
*
|
||||
* @param connection the connection where the service will be enabled or
|
||||
* disabled
|
||||
|
|
|
@ -29,13 +29,10 @@ import org.jivesoftware.smackx.jingleold.listeners.JingleListener;
|
|||
|
||||
/**
|
||||
* Basic Jingle negotiator.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p/>
|
||||
* <p>
|
||||
* JingleNegotiator implements some basic behavior for every Jingle negotiation.
|
||||
* It implements a "state" pattern: each stage should process Jingle packets and
|
||||
* act depending on the current state in the negotiation...
|
||||
* <p/>
|
||||
* </p>
|
||||
*
|
||||
* @author Alvaro Saurin
|
||||
|
@ -215,18 +212,18 @@ public abstract class JingleNegotiator {
|
|||
* Media Negotiator
|
||||
* Transport Negotiator
|
||||
*
|
||||
* <jingle>
|
||||
* <content>
|
||||
* <description>
|
||||
* <transport>
|
||||
* <content>
|
||||
* <description>
|
||||
* <transport>
|
||||
* <jingle>
|
||||
* <content>
|
||||
* <description>
|
||||
* <transport>
|
||||
* <content>
|
||||
* <description>
|
||||
* <transport>
|
||||
*
|
||||
* This way, each segment of a Jingle stanza(/packet) has a corresponding negotiator that know how to deal with that
|
||||
* part of the Jingle packet. It also allows us to support Jingle packets of arbitraty complexity.
|
||||
*
|
||||
* Each parent calls dispatchIncomingPacket for each of its children. The children then pass back a List<> of
|
||||
* Each parent calls dispatchIncomingPacket for each of its children. The children then pass back a List of
|
||||
* results that will get sent when we reach the top level negotiator (JingleSession).
|
||||
*
|
||||
* @param iq the stanza(/packet) received
|
||||
|
|
|
@ -55,7 +55,7 @@ import org.jivesoftware.smackx.jingleold.packet.JingleError;
|
|||
import org.jxmpp.jid.Jid;
|
||||
|
||||
/**
|
||||
* An abstract Jingle session. <p/> This class contains some basic properties of
|
||||
* An abstract Jingle session. This class contains some basic properties of
|
||||
* every Jingle session. However, the concrete implementation can be found in
|
||||
* subclasses.
|
||||
*
|
||||
|
@ -270,7 +270,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList
|
|||
// ----------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Process and respond to an incoming packet. <p/> This method is called
|
||||
* Process and respond to an incoming packet. This method is called
|
||||
* from the stanza(/packet) listener dispatcher when a new stanza(/packet) has arrived. The
|
||||
* method is responsible for recognizing the stanza(/packet) type and, depending on
|
||||
* the current state, delivering it to the right event handler and wait for
|
||||
|
@ -394,7 +394,7 @@ public class JingleSession extends JingleNegotiator implements MediaReceivedList
|
|||
}
|
||||
|
||||
/**
|
||||
* Add a new content negotiator on behalf of a <content> section received.
|
||||
* Add a new content negotiator on behalf of a <content/> section received.
|
||||
*/
|
||||
public void addContentNegotiator(ContentNegotiator inContentNegotiator) {
|
||||
contentNegotiators.add(inContentNegotiator);
|
||||
|
|
|
@ -28,7 +28,7 @@ import org.jxmpp.jid.Jid;
|
|||
|
||||
/**
|
||||
* A Jingle session request.
|
||||
* <p/>
|
||||
*
|
||||
* This class is a facade of a received Jingle request. The user can have direct
|
||||
* access to the Jingle stanza(/packet) (<i>JingleSessionRequest.getJingle() </i>) of
|
||||
* the request or can use the convenience methods provided by this class.
|
||||
|
@ -107,7 +107,7 @@ public class JingleSessionRequest {
|
|||
/**
|
||||
* Accepts this request and creates the incoming Jingle session.
|
||||
*
|
||||
* @return Returns the <b><i>IncomingJingleSession</b></i> on which the
|
||||
* @return Returns the IncomingJingleSession on which the
|
||||
* negotiation can be carried out.
|
||||
* @throws SmackException
|
||||
* @throws InterruptedException
|
||||
|
|
|
@ -22,14 +22,14 @@ import java.util.Locale;
|
|||
* Content info. Content info messages are complementary messages that can be
|
||||
* transmitted for informing of events like "busy", "ringtone", etc.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class ContentInfo {
|
||||
|
||||
/**
|
||||
* Audio content info messages.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public static class Audio extends ContentInfo {
|
||||
|
||||
|
|
|
@ -25,10 +25,11 @@ import org.jivesoftware.smackx.jingleold.nat.TransportCandidate;
|
|||
|
||||
/**
|
||||
* This class provides necessary Jingle Session jmf methods and behavior.
|
||||
* <p/>
|
||||
* <p>
|
||||
* The goal of this class is to provide a flexible way to make JingleManager control jmf streaming APIs without implement them.
|
||||
* For instance you can implement a file transfer using java sockets or a VOIP Media Manager using JMF.
|
||||
* You can implement many JingleMediaManager according to you necessity.
|
||||
* </p>
|
||||
*
|
||||
* @author Thiago Camargo
|
||||
*/
|
||||
|
|
|
@ -24,11 +24,11 @@ import org.jivesoftware.smackx.jingleold.nat.TransportCandidate;
|
|||
|
||||
/**
|
||||
* Public Abstract Class provides a clear interface between Media Session and Jingle API.
|
||||
* <p/>
|
||||
* <p>
|
||||
* When a Jingle Session is fully stablished, we will have a Payload Type and two transport candidates defined for it.
|
||||
* Smack Jingle API don't implement Media Transmit and Receive methods.
|
||||
* But provides an interface to let the user implements it using another API. For instance: JMF.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <i>The Class that implements this one, must have the support to transmit and receive the jmf.</i>
|
||||
* <i>This interface let the user choose his own jmf API.</i>
|
||||
*
|
||||
|
|
|
@ -38,7 +38,7 @@ import org.jivesoftware.smackx.jingleold.packet.JingleDescription;
|
|||
import org.jivesoftware.smackx.jingleold.packet.JingleError;
|
||||
|
||||
/**
|
||||
* Manager for jmf descriptor negotiation. <p/> <p/> This class is responsible
|
||||
* Manager for jmf descriptor negotiation. This class is responsible
|
||||
* for managing the descriptor negotiation process, handling all the xmpp
|
||||
* packets interchange and the stage control. handling all the xmpp packets
|
||||
* interchange and the stage control.
|
||||
|
|
|
@ -54,15 +54,17 @@ import org.jivesoftware.smackx.jingleold.media.JingleMediaSession;
|
|||
* It sends and receives jmf for and from desired IPs and ports.
|
||||
* Also has a rport Symetric behavior for better NAT Traversal.
|
||||
* It send data from a defined port and receive data in the same port, making NAT binds easier.
|
||||
* <p/>
|
||||
* <p>
|
||||
* Send from portA to portB and receive from portB in portA.
|
||||
* <p/>
|
||||
* </p>
|
||||
* <p>
|
||||
* Sending
|
||||
* portA ---> portB
|
||||
* <p/>
|
||||
* portA ---> portB
|
||||
* </p>
|
||||
* <p>
|
||||
* Receiving
|
||||
* portB ---> portA
|
||||
* <p/>
|
||||
* portB ---> portA
|
||||
* </p>
|
||||
* <i>Transmit and Receive are interdependence. To receive you MUST transmit. </i>
|
||||
*
|
||||
* @author Thiago Camargo
|
||||
|
|
|
@ -45,7 +45,7 @@ public class BasicResolver extends TransportResolver {
|
|||
|
||||
/**
|
||||
* Resolve the IP address.
|
||||
* <p/>
|
||||
*
|
||||
* The BasicResolver takes the IP addresses of the interfaces and uses the
|
||||
* first non-loopback, non-linklocal and non-sitelocal address.
|
||||
* @throws NotConnectedException
|
||||
|
|
|
@ -36,7 +36,7 @@ import org.jivesoftware.smackx.jingleold.JingleSession;
|
|||
/**
|
||||
* Bridged Resolver use a RTPBridge Service to add a relayed candidate.
|
||||
* A very reliable solution for NAT Traversal.
|
||||
* <p/>
|
||||
*
|
||||
* The resolver verify is the XMPP Server that the client is connected offer this service.
|
||||
* If the server supports, a candidate is requested from the service.
|
||||
* The resolver adds this candidate
|
||||
|
@ -61,7 +61,7 @@ public class BridgedResolver extends TransportResolver {
|
|||
|
||||
/**1
|
||||
* Resolve Bridged Candidate.
|
||||
* <p/>
|
||||
*
|
||||
* The BridgedResolver takes the IP address and ports of a jmf proxy service.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.jivesoftware.smackx.jingleold.JingleSession;
|
|||
* the external address and port are previously known when the object is
|
||||
* initialized.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public class FixedResolver extends TransportResolver {
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ import java.util.logging.Logger;
|
|||
|
||||
/**
|
||||
* ICE Transport candidate.
|
||||
* <p/>
|
||||
*
|
||||
* A candidate represents the possible transport for data interchange between
|
||||
* the two endpoints.
|
||||
*
|
||||
|
@ -216,7 +216,7 @@ public class ICECandidate extends TransportCandidate implements Comparable<ICECa
|
|||
* Check if a transport candidate is usable. The transport resolver should
|
||||
* check if the transport candidate the other endpoint has provided is
|
||||
* usable.
|
||||
* <p/>
|
||||
*
|
||||
* ICE Candidate can check connectivity using UDP echo Test.
|
||||
*/
|
||||
@Override
|
||||
|
|
|
@ -45,9 +45,9 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
* RTPBridge IQ Stanza(/Packet) used to request and retrieve a RTPBridge Candidates that can be used for a Jingle Media Transmission between two parties that are behind NAT.
|
||||
* This Jingle Bridge has all the needed information to establish a full UDP Channel (Send and Receive) between two parties.
|
||||
* <i>This transport method should be used only if other transport methods are not allowed. Or if you want a more reliable transport.</i>
|
||||
* <p/>
|
||||
*
|
||||
* High Level Usage Example:
|
||||
* <p/>
|
||||
*
|
||||
* RTPBridge rtpBridge = RTPBridge.getRTPBridge(connection, sessionID);
|
||||
*
|
||||
* @author Thiago Camargo
|
||||
|
|
|
@ -39,9 +39,9 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
|
||||
/**
|
||||
* STUN IQ Stanza(/Packet) used to request and retrieve a STUN server and port to make p2p connections easier. STUN is usually used by Jingle Media Transmission between two parties that are behind NAT.
|
||||
* <p/>
|
||||
*
|
||||
* High Level Usage Example:
|
||||
* <p/>
|
||||
*
|
||||
* STUN stun = STUN.getSTUNServer(connection);
|
||||
*
|
||||
* @author Thiago Camargo
|
||||
|
|
|
@ -199,7 +199,7 @@ public class STUNResolver extends TransportResolver {
|
|||
/**
|
||||
* Load a list of services: STUN servers and ports. Some public STUN servers
|
||||
* are:
|
||||
* <p/>
|
||||
*
|
||||
* <pre>
|
||||
* iphone-stun.freenet.de:3478
|
||||
* larry.gloo.net:3478
|
||||
|
@ -212,7 +212,7 @@ public class STUNResolver extends TransportResolver {
|
|||
* stun.voxgratia.org (no DNS SRV record)
|
||||
* stun.noc.ams-ix.net
|
||||
* </pre>
|
||||
* <p/>
|
||||
*
|
||||
* This list should be contained in a file in the "META-INF" directory
|
||||
*
|
||||
* @return a list of services
|
||||
|
@ -494,7 +494,7 @@ public class STUNResolver extends TransportResolver {
|
|||
|
||||
/**
|
||||
* Check a binding with the STUN currentServer.
|
||||
* <p/>
|
||||
*
|
||||
* Note: this function blocks for some time, waiting for a response.
|
||||
*
|
||||
* @return true if the currentServer is usable.
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.jxmpp.jid.Jid;
|
|||
|
||||
/**
|
||||
* Transport candidate.
|
||||
* <p/>
|
||||
*
|
||||
* A candidate represents the possible transport for data interchange between
|
||||
* the two endpoints.
|
||||
*
|
||||
|
@ -346,7 +346,7 @@ public abstract class TransportCandidate {
|
|||
* Check if a transport candidate is usable. The transport resolver should
|
||||
* check if the transport candidate the other endpoint has provided is
|
||||
* usable.
|
||||
* <p/>
|
||||
*
|
||||
* Subclasses should provide better methods if they can...
|
||||
*/
|
||||
public void check(final List<TransportCandidate> localCandidates) {
|
||||
|
|
|
@ -45,12 +45,11 @@ import org.jivesoftware.smackx.jingleold.packet.JingleTransport.JingleTransportC
|
|||
|
||||
/**
|
||||
* Transport negotiator.
|
||||
* <p/>
|
||||
* <p/>
|
||||
*
|
||||
* This class is responsible for managing the transport negotiation process,
|
||||
* handling all the stanza(/packet) interchange and the stage control.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class TransportNegotiator extends JingleNegotiator {
|
||||
|
||||
|
@ -829,7 +828,7 @@ public abstract class TransportNegotiator extends JingleNegotiator {
|
|||
/**
|
||||
* Raw-UDP transport negotiator.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public static final class RawUdp extends TransportNegotiator {
|
||||
|
||||
|
@ -884,7 +883,7 @@ public abstract class TransportNegotiator extends JingleNegotiator {
|
|||
/**
|
||||
* Ice transport negotiator.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public static final class Ice extends TransportNegotiator {
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ import org.jivesoftware.smackx.jingleold.JingleSession;
|
|||
* It is called candidate, because it can be elected or not.
|
||||
*
|
||||
* @author Thiago Camargo
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class TransportResolver {
|
||||
|
||||
|
|
|
@ -30,11 +30,11 @@ import org.jxmpp.jid.Jid;
|
|||
|
||||
/**
|
||||
* An Jingle sub-packet, which is used by XMPP clients to exchange info like
|
||||
* descriptions and transports. <p/> The following link summarizes the
|
||||
* descriptions and transports. The following link summarizes the
|
||||
* requirements of Jingle IM: <a
|
||||
* href="http://www.xmpp.org/extensions/jep-0166.html">Valid tags</a>.
|
||||
* <p/>
|
||||
* <p/> Warning: this is an non-standard protocol documented by <a
|
||||
*
|
||||
* Warning: this is an non-standard protocol documented by <a
|
||||
* href="http://www.xmpp.org/extensions/jep-0166.html">XEP-166</a>. Because this is
|
||||
* a non-standard protocol, it is subject to change.
|
||||
*
|
||||
|
@ -156,7 +156,7 @@ public class Jingle extends IQ {
|
|||
* Set the session ID related to this session. The session ID is a unique
|
||||
* identifier generated by the initiator. This should match the XML Nmtoken
|
||||
* production so that XML character escaping is not needed for characters
|
||||
* such as &.
|
||||
* such as &.
|
||||
*
|
||||
* @param sid the session ID
|
||||
*/
|
||||
|
@ -168,7 +168,7 @@ public class Jingle extends IQ {
|
|||
* Returns the session ID related to the session. The session ID is a unique
|
||||
* identifier generated by the initiator. This should match the XML Nmtoken
|
||||
* production so that XML character escaping is not needed for characters
|
||||
* such as &.
|
||||
* such as &.
|
||||
*
|
||||
* @return Returns the session ID related to the session.
|
||||
* @see #setSid(String)
|
||||
|
|
|
@ -28,7 +28,7 @@ import org.jivesoftware.smackx.jingleold.media.PayloadType;
|
|||
/**
|
||||
* Jingle content description.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class JingleContentDescription implements ExtensionElement {
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.jivesoftware.smackx.jingleold.media.ContentInfo;
|
|||
/**
|
||||
* Jingle content info.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public class JingleContentInfo implements ExtensionElement {
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ import org.jivesoftware.smackx.jingleold.media.PayloadType;
|
|||
/**
|
||||
* Jingle content description.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class JingleDescription implements ExtensionElement {
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ import org.jivesoftware.smackx.jingleold.nat.TransportCandidate;
|
|||
/**
|
||||
* A jingle transport extension.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public class JingleTransport implements ExtensionElement {
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
/**
|
||||
* Parser for a Jingle description.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class JingleContentDescriptionProvider extends ExtensionElementProvider<JingleContentDescription> {
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.jivesoftware.smackx.jingleold.packet.JingleContent;
|
|||
import org.xmlpull.v1.XmlPullParser;
|
||||
|
||||
/**
|
||||
* Jingle <content> provider.
|
||||
* Jingle <content> provider.
|
||||
*
|
||||
* @author Jeff Williams
|
||||
*/
|
||||
|
|
|
@ -30,7 +30,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
/**
|
||||
* Parser for a Jingle description.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class JingleDescriptionProvider extends ExtensionElementProvider<JingleDescription> {
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
/**
|
||||
* Provider for a Jingle transport element.
|
||||
*
|
||||
* @author Alvaro Saurin <alvaro.saurin@gmail.com>
|
||||
* @author Alvaro Saurin
|
||||
*/
|
||||
public abstract class JingleTransportProvider extends ExtensionElementProvider<JingleTransport> {
|
||||
|
||||
|
|
|
@ -363,14 +363,14 @@ public class AgentSession {
|
|||
* Sets the agent's current status with the workgroup. The presence mode affects
|
||||
* how offers are routed to the agent. The possible presence modes with their
|
||||
* meanings are as follows:<ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>Presence.Mode.AVAILABLE -- (Default) the agent is available for more chats
|
||||
* (equivalent to Presence.Mode.CHAT).
|
||||
* <li>Presence.Mode.DO_NOT_DISTURB -- the agent is busy and should not be disturbed.
|
||||
* However, special case, or extreme urgency chats may still be offered to the agent.
|
||||
* <li>Presence.Mode.AWAY -- the agent is not available and should not
|
||||
* have a chat routed to them (equivalent to Presence.Mode.EXTENDED_AWAY).</ul>
|
||||
* <p/>
|
||||
*
|
||||
* The max chats value is the maximum number of chats the agent is willing to have
|
||||
* routed to them at once. Some servers may be configured to only accept max chat
|
||||
* values in a certain range; for example, between two and five. In that case, the
|
||||
|
@ -391,14 +391,14 @@ public class AgentSession {
|
|||
/**
|
||||
* Sets the agent's current status with the workgroup. The presence mode affects how offers
|
||||
* are routed to the agent. The possible presence modes with their meanings are as follows:<ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>Presence.Mode.AVAILABLE -- (Default) the agent is available for more chats
|
||||
* (equivalent to Presence.Mode.CHAT).
|
||||
* <li>Presence.Mode.DO_NOT_DISTURB -- the agent is busy and should not be disturbed.
|
||||
* However, special case, or extreme urgency chats may still be offered to the agent.
|
||||
* <li>Presence.Mode.AWAY -- the agent is not available and should not
|
||||
* have a chat routed to them (equivalent to Presence.Mode.EXTENDED_AWAY).</ul>
|
||||
* <p/>
|
||||
*
|
||||
* The max chats value is the maximum number of chats the agent is willing to have routed to
|
||||
* them at once. Some servers may be configured to only accept max chat values in a certain
|
||||
* range; for example, between two and five. In that case, the maxChats value the agent sends
|
||||
|
@ -450,7 +450,7 @@ public class AgentSession {
|
|||
/**
|
||||
* Sets the agent's current status with the workgroup. The presence mode affects how offers
|
||||
* are routed to the agent. The possible presence modes with their meanings are as follows:<ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>Presence.Mode.AVAILABLE -- (Default) the agent is available for more chats
|
||||
* (equivalent to Presence.Mode.CHAT).
|
||||
* <li>Presence.Mode.DO_NOT_DISTURB -- the agent is busy and should not be disturbed.
|
||||
|
@ -493,7 +493,7 @@ public class AgentSession {
|
|||
|
||||
/**
|
||||
* Removes a user from the workgroup queue. This is an administrative action that the
|
||||
* <p/>
|
||||
*
|
||||
* The agent is not guaranteed of having privileges to perform this action; an exception
|
||||
* denying the request may be thrown.
|
||||
*
|
||||
|
|
|
@ -68,7 +68,7 @@ import org.jxmpp.jid.Jid;
|
|||
* Provides workgroup services for users. Users can join the workgroup queue, depart the
|
||||
* queue, find status information about their placement in the queue, and register to
|
||||
* be notified when they are routed to an agent.<p>
|
||||
* <p/>
|
||||
*
|
||||
* This class only provides a users perspective into a workgroup and is not intended
|
||||
* for use by agents.
|
||||
*
|
||||
|
@ -232,20 +232,20 @@ public class Workgroup {
|
|||
* the queue, queue status events will be sent to indicate the user's position and
|
||||
* estimated time left in the queue. Once joining the queue, there are three ways
|
||||
* the user can leave the queue: <ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>The user is routed to an agent, which triggers a GroupChat invitation.
|
||||
* <li>The user asks to leave the queue by calling the {@link #departQueue} method.
|
||||
* <li>A server error occurs, or an administrator explicitly removes the user
|
||||
* from the queue.
|
||||
* </ul>
|
||||
* <p/>
|
||||
*
|
||||
* A user cannot request to join the queue again if already in the queue. Therefore,
|
||||
* this method will throw an IllegalStateException if the user is already in the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Some servers may be configured to require certain meta-data in order to
|
||||
* join the queue. In that case, the {@link #joinQueue(Form)} method should be
|
||||
* used instead of this method so that meta-data may be passed in.<p>
|
||||
* <p/>
|
||||
*
|
||||
* The server tracks the conversations that a user has with agents over time. By
|
||||
* default, that tracking is done using the user's JID. However, this is not always
|
||||
* possible. For example, when the user is logged in anonymously using a web client.
|
||||
|
@ -271,19 +271,19 @@ public class Workgroup {
|
|||
* the queue, queue status events will be sent to indicate the user's position and
|
||||
* estimated time left in the queue. Once joining the queue, there are three ways
|
||||
* the user can leave the queue: <ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>The user is routed to an agent, which triggers a GroupChat invitation.
|
||||
* <li>The user asks to leave the queue by calling the {@link #departQueue} method.
|
||||
* <li>A server error occurs, or an administrator explicitly removes the user
|
||||
* from the queue.
|
||||
* </ul>
|
||||
* <p/>
|
||||
*
|
||||
* A user cannot request to join the queue again if already in the queue. Therefore,
|
||||
* this method will throw an IllegalStateException if the user is already in the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Some servers may be configured to require certain meta-data in order to
|
||||
* join the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* The server tracks the conversations that a user has with agents over time. By
|
||||
* default, that tracking is done using the user's JID. However, this is not always
|
||||
* possible. For example, when the user is logged in anonymously using a web client.
|
||||
|
@ -310,19 +310,19 @@ public class Workgroup {
|
|||
* the queue, queue status events will be sent to indicate the user's position and
|
||||
* estimated time left in the queue. Once joining the queue, there are three ways
|
||||
* the user can leave the queue: <ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>The user is routed to an agent, which triggers a GroupChat invitation.
|
||||
* <li>The user asks to leave the queue by calling the {@link #departQueue} method.
|
||||
* <li>A server error occurs, or an administrator explicitly removes the user
|
||||
* from the queue.
|
||||
* </ul>
|
||||
* <p/>
|
||||
*
|
||||
* A user cannot request to join the queue again if already in the queue. Therefore,
|
||||
* this method will throw an IllegalStateException if the user is already in the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Some servers may be configured to require certain meta-data in order to
|
||||
* join the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* The server tracks the conversations that a user has with agents over time. By
|
||||
* default, that tracking is done using the user's JID. However, this is not always
|
||||
* possible. For example, when the user is logged in anonymously using a web client.
|
||||
|
@ -359,19 +359,19 @@ public class Workgroup {
|
|||
* the queue, queue status events will be sent to indicate the user's position and
|
||||
* estimated time left in the queue. Once joining the queue, there are three ways
|
||||
* the user can leave the queue: <ul>
|
||||
* <p/>
|
||||
*
|
||||
* <li>The user is routed to an agent, which triggers a GroupChat invitation.
|
||||
* <li>The user asks to leave the queue by calling the {@link #departQueue} method.
|
||||
* <li>A server error occurs, or an administrator explicitly removes the user
|
||||
* from the queue.
|
||||
* </ul>
|
||||
* <p/>
|
||||
*
|
||||
* A user cannot request to join the queue again if already in the queue. Therefore,
|
||||
* this method will throw an IllegalStateException if the user is already in the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Some servers may be configured to require certain meta-data in order to
|
||||
* join the queue.<p>
|
||||
* <p/>
|
||||
*
|
||||
* The server tracks the conversations that a user has with agents over time. By
|
||||
* default, that tracking is done using the user's JID. However, this is not always
|
||||
* possible. For example, when the user is logged in anonymously using a web client.
|
||||
|
@ -413,7 +413,7 @@ public class Workgroup {
|
|||
/**
|
||||
* Departs the workgroup queue. If the user is not currently in the queue, this
|
||||
* method will do nothing.<p>
|
||||
* <p/>
|
||||
*
|
||||
* Normally, the user would not manually leave the queue. However, they may wish to
|
||||
* under certain circumstances -- for example, if they no longer wish to be routed
|
||||
* to an agent because they've been waiting too long.
|
||||
|
|
|
@ -84,7 +84,7 @@ public class MetaDataUtils {
|
|||
/**
|
||||
* Serializes a Map of String name/value pairs into the meta-data XML format.
|
||||
*
|
||||
* @param metaData the Map of meta-data as Map<String,List<String>>
|
||||
* @param metaData the Map of meta-data as Map<String,List<String>>
|
||||
* @return the meta-data values in XML form.
|
||||
*/
|
||||
public static String serializeMetaData(Map<String, List<String>> metaData) {
|
||||
|
|
|
@ -1662,8 +1662,8 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
|
|||
* Send a unconditional Stream Management acknowledgment to the server.
|
||||
* <p>
|
||||
* See <a href="http://xmpp.org/extensions/xep-0198.html#acking">XEP-198: Stream Management § 4. Acks</a>:
|
||||
* "Either party MAY send an <a/> element at any time (e.g., after it has received a certain number of stanzas,
|
||||
* or after a certain period of time), even if it has not received an <r/> element from the other party."
|
||||
* "Either party MAY send an <a/> element at any time (e.g., after it has received a certain number of stanzas,
|
||||
* or after a certain period of time), even if it has not received an <r/> element from the other party."
|
||||
* </p>
|
||||
*
|
||||
* @throws StreamManagementNotEnabledException if Stream Management is not enabled.
|
||||
|
|
Loading…
Reference in a new issue