Search in sources :

Example 6 with StreamInitiation

use of org.jivesoftware.smackx.si.packet.StreamInitiation in project Smack by igniterealtime.

the class FileTransferNegotiator method negotiateOutgoingTransfer.

/**
 * 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>
 * If they accept, the stanza 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
 * href="http://www.xmpp.org/extensions/jep-0065.html">SOCKS5 Bytestreams</a>,
 * 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>
 * 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>
 * Finally, if the other user does not respond this method will return null
 * after the specified timeout.
 *
 * @param userID          The userID of the user to whom the file will be sent.
 * @param streamID        The unique identifier for this file transfer.
 * @param fileName        The name of this file. Preferably it should include an
 *                        extension as it is used to determine what type of file it is.
 * @param size            The size, in bytes, of the file.
 * @param desc            A description of the file.
 * @param responseTimeout The amount of time, in milliseconds, to wait for the remote
 *                        user to respond. If they do not respond in time, this
 * @return Returns the stream negotiator selected by the peer.
 * @throws XMPPErrorException Thrown if there is an error negotiating the file transfer.
 * @throws NotConnectedException if the XMPP connection is not connected.
 * @throws NoResponseException if there was no response from the remote entity.
 * @throws NoAcceptableTransferMechanisms if no acceptable transfer mechanisms are available
 * @throws InterruptedException if the calling thread was interrupted.
 */
public StreamNegotiator negotiateOutgoingTransfer(final Jid userID, final String streamID, final String fileName, final long size, final String desc, int responseTimeout) throws XMPPErrorException, NotConnectedException, NoResponseException, NoAcceptableTransferMechanisms, InterruptedException {
    StreamInitiation si = new StreamInitiation();
    si.setSessionID(streamID);
    si.setMimeType(URLConnection.guessContentTypeFromName(fileName));
    StreamInitiation.File siFile = new StreamInitiation.File(fileName, size);
    siFile.setDesc(desc);
    si.setFile(siFile);
    si.setFeatureNegotiationForm(createDefaultInitiationForm());
    si.setFrom(connection().getUser());
    si.setTo(userID);
    si.setType(IQ.Type.set);
    Stanza siResponse = connection().createStanzaCollectorAndSend(si).nextResultOrThrow(responseTimeout);
    if (siResponse instanceof IQ) {
        IQ iqResponse = (IQ) siResponse;
        if (iqResponse.getType().equals(IQ.Type.result)) {
            StreamInitiation response = (StreamInitiation) siResponse;
            return getOutgoingNegotiator(getStreamMethodField(response.getFeatureNegotiationForm()));
        } else {
            throw new XMPPErrorException(iqResponse, iqResponse.getError());
        }
    } else {
        return null;
    }
}
Also used : StreamInitiation(org.jivesoftware.smackx.si.packet.StreamInitiation) XMPPErrorException(org.jivesoftware.smack.XMPPException.XMPPErrorException) Stanza(org.jivesoftware.smack.packet.Stanza) IQ(org.jivesoftware.smack.packet.IQ)

Example 7 with StreamInitiation

use of org.jivesoftware.smackx.si.packet.StreamInitiation in project Smack by igniterealtime.

the class FileTransferNegotiator method selectStreamNegotiator.

/**
 * Selects an appropriate stream negotiator after examining the incoming file transfer request.
 *
 * @param request The related file transfer request.
 * @return The file transfer object that handles the transfer
 * @throws NoStreamMethodsOfferedException If there are either no stream methods contained in the packet, or
 *                       there is not an appropriate stream method.
 * @throws NotConnectedException if the XMPP connection is not connected.
 * @throws NoAcceptableTransferMechanisms if no acceptable transfer mechanisms are available
 * @throws InterruptedException if the calling thread was interrupted.
 */
public StreamNegotiator selectStreamNegotiator(FileTransferRequest request) throws NotConnectedException, NoStreamMethodsOfferedException, NoAcceptableTransferMechanisms, InterruptedException {
    StreamInitiation si = request.getStreamInitiation();
    ListSingleFormField streamMethodField = getStreamMethodField(si.getFeatureNegotiationForm());
    if (streamMethodField == null) {
        String errorMessage = "No stream methods contained in stanza.";
        StanzaError error = StanzaError.from(StanzaError.Condition.bad_request, errorMessage).build();
        IQ iqPacket = IQ.createErrorResponse(si, error);
        connection().sendStanza(iqPacket);
        throw new FileTransferException.NoStreamMethodsOfferedException();
    }
    // select the appropriate protocol
    StreamNegotiator selectedStreamNegotiator;
    try {
        selectedStreamNegotiator = getNegotiator(streamMethodField);
    } catch (NoAcceptableTransferMechanisms e) {
        IQ iqPacket = IQ.createErrorResponse(si, StanzaError.from(StanzaError.Condition.bad_request, "No acceptable transfer mechanism").build());
        connection().sendStanza(iqPacket);
        throw e;
    }
    return selectedStreamNegotiator;
}
Also used : StreamInitiation(org.jivesoftware.smackx.si.packet.StreamInitiation) NoStreamMethodsOfferedException(org.jivesoftware.smackx.filetransfer.FileTransferException.NoStreamMethodsOfferedException) ListSingleFormField(org.jivesoftware.smackx.xdata.ListSingleFormField) IQ(org.jivesoftware.smack.packet.IQ) NoAcceptableTransferMechanisms(org.jivesoftware.smackx.filetransfer.FileTransferException.NoAcceptableTransferMechanisms) StanzaError(org.jivesoftware.smack.packet.StanzaError)

Example 8 with StreamInitiation

use of org.jivesoftware.smackx.si.packet.StreamInitiation in project Smack by igniterealtime.

the class FileTransferManager method rejectIncomingFileTransfer.

/**
 * Reject an incoming file transfer.
 * <p>
 * Specified in XEP-95 4.2 and 3.2 Example 8
 * </p>
 * @param request TODO javadoc me please
 * @throws NotConnectedException if the XMPP connection is not connected.
 * @throws InterruptedException if the calling thread was interrupted.
 */
void rejectIncomingFileTransfer(FileTransferRequest request) throws NotConnectedException, InterruptedException {
    StreamInitiation initiation = request.getStreamInitiation();
    // Reject as specified in XEP-95 4.2. Note that this is not to be confused with the Socks 5
    // Bytestream rejection as specified in XEP-65 5.3.1 Example 13, which says that
    // 'not-acceptable' should be returned. This is done by Smack in
    // Socks5BytestreamManager.replyRejectPacket(IQ).
    IQ rejection = IQ.createErrorResponse(initiation, StanzaError.getBuilder(StanzaError.Condition.forbidden).build());
    connection().sendStanza(rejection);
}
Also used : StreamInitiation(org.jivesoftware.smackx.si.packet.StreamInitiation) IQ(org.jivesoftware.smack.packet.IQ)

Aggregations

StreamInitiation (org.jivesoftware.smackx.si.packet.StreamInitiation)8 IQ (org.jivesoftware.smack.packet.IQ)4 DataForm (org.jivesoftware.smackx.xdata.packet.DataForm)4 ParseException (java.text.ParseException)2 Date (java.util.Date)2 File (org.jivesoftware.smackx.si.packet.StreamInitiation.File)2 ListSingleFormField (org.jivesoftware.smackx.xdata.ListSingleFormField)2 DataFormProvider (org.jivesoftware.smackx.xdata.provider.DataFormProvider)2 XMPPErrorException (org.jivesoftware.smack.XMPPException.XMPPErrorException)1 Stanza (org.jivesoftware.smack.packet.Stanza)1 StanzaError (org.jivesoftware.smack.packet.StanzaError)1 NoAcceptableTransferMechanisms (org.jivesoftware.smackx.filetransfer.FileTransferException.NoAcceptableTransferMechanisms)1 NoStreamMethodsOfferedException (org.jivesoftware.smackx.filetransfer.FileTransferException.NoStreamMethodsOfferedException)1 FormField (org.jivesoftware.smackx.xdata.FormField)1