/** * Creates a file transfer manager to initiate and receive file transfers. * * @param connection * The XMPPConnection that the file transfers will use. */ private FileTransferManager(XMPPConnection connection) { super(connection); this.fileTransferNegotiator = FileTransferNegotiator .getInstanceFor(connection); connection.registerIQRequestHandler(new AbstractIqRequestHandler(StreamInitiation.ELEMENT, StreamInitiation.NAMESPACE, IQ.Type.set, Mode.async) { @Override public IQ handleIQRequest(IQ packet) { StreamInitiation si = (StreamInitiation) packet; final FileTransferRequest request = new FileTransferRequest(FileTransferManager.this, si); for (final FileTransferListener listener : listeners) { listener.fileTransferRequest(request); } return null; } }); }
@Test public void verifyForm() throws Exception { FileTransferNegotiator fileNeg = FileTransferNegotiator.getInstanceFor(connection); try { fileNeg.negotiateOutgoingTransfer(JidTestUtil.DUMMY_AT_EXAMPLE_ORG, "streamid", "file", 1024, null, 10); } catch (NoResponseException e) { // We do not expect an answer. This unit test only checks the request sent. } Stanza packet = connection.getSentPacket(); String xml = packet.toXML(null).toString(); assertTrue(xml.indexOf("var='stream-method' type='list-single'") != -1); } }
/** * Returns the file transfer negotiator related to a particular connection. * When this class is requested on a particular connection the file transfer * service is automatically enabled. * * @param connection The connection for which the transfer manager is desired * @return The FileTransferNegotiator */ public static synchronized FileTransferNegotiator getInstanceFor( final XMPPConnection connection) { FileTransferNegotiator fileTransferNegotiator = INSTANCES.get(connection); if (fileTransferNegotiator == null) { fileTransferNegotiator = new FileTransferNegotiator(connection); INSTANCES.put(connection, fileTransferNegotiator); } return fileTransferNegotiator; }
FileTransferRequest request) throws NotConnectedException, NoStreamMethodsOfferedException, NoAcceptableTransferMechanisms, InterruptedException { StreamInitiation si = request.getStreamInitiation(); FormField streamMethodField = getStreamMethodField(si .getFeatureNegotiationForm()); StanzaError.Builder error = StanzaError.from(StanzaError.Condition.bad_request, errorMessage); IQ iqPacket = IQ.createErrorResponse(si, error); connection().sendStanza(iqPacket); throw new FileTransferException.NoStreamMethodsOfferedException(); selectedStreamNegotiator = getNegotiator(streamMethodField); connection().sendStanza(iqPacket); throw e;
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 (iqResponse.getType().equals(IQ.Type.result)) { StreamInitiation response = (StreamInitiation) siResponse; return getOutgoingNegotiator(getStreamMethodField(response .getFeatureNegotiationForm()));
si.setFile(siFile); si.setFeatureNegotiationForm(createDefaultInitiationForm()); if (iqResponse.getType().equals(IQ.Type.RESULT)) { StreamInitiation response = (StreamInitiation) siResponse; return getOutgoingNegotiator(getStreamMethodField(response .getFeatureNegotiationForm()));
FileTransferRequest request) throws XMPPException { StreamInitiation si = request.getStreamInitiation(); FormField streamMethodField = getStreamMethodField(si .getFeatureNegotiationForm()); String errorMessage = "No stream methods contained in packet."; XMPPError error = new XMPPError(XMPPError.Condition.bad_request, errorMessage); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(error); selectedStreamNegotiator = getNegotiator(streamMethodField); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(e.getXMPPError());
/** * Returns the file transfer negotiator related to a particular connection. * When this class is requested on a particular connection the file transfer * service is automatically enabled. * * @param connection The connection for which the transfer manager is desired * @return The IMFileTransferManager */ public static FileTransferNegotiator getInstanceFor( final XMPPConnection connection) { if (connection == null) { throw new IllegalArgumentException("Connection cannot be null"); } if (!connection.isConnected()) { return null; } if (transferObject.containsKey(connection)) { return (FileTransferNegotiator) transferObject.get(connection); } else { FileTransferNegotiator transfer = new FileTransferNegotiator( connection); setServiceEnabled(connection, true); transferObject.put(connection, transfer); return transfer; } }
private OutputStream negotiateStream(String fileName, long fileSize, String description) throws SmackException, XMPPException, InterruptedException { // Negotiate the file transfer profile if (!updateStatus(Status.initial, Status.negotiating_transfer)) { throw new IllegalStateChangeException(); } StreamNegotiator streamNegotiator = negotiator.negotiateOutgoingTransfer( getPeer(), streamID, fileName, fileSize, description, RESPONSE_TIMEOUT); // Negotiate the stream if (!updateStatus(Status.negotiating_transfer, Status.negotiating_stream)) { throw new IllegalStateChangeException(); } outputStream = streamNegotiator.createOutgoingStream(streamID, initiator, getPeer()); if (!updateStatus(Status.negotiating_stream, Status.negotiated)) { throw new IllegalStateChangeException(); } return outputStream; }
/** * Creates an OutgoingFileTransfer to send a file to another user. * * @param userID * The fully qualified jabber ID (i.e. full JID) with resource of the user to * send the file to. * @return The send file object on which the negotiated transfer can be run. * @exception IllegalArgumentException if userID is null or not a full JID */ public OutgoingFileTransfer createOutgoingFileTransfer(EntityFullJid userID) { // We need to create outgoing file transfers with a full JID since this method will later // use XEP-0095 to negotiate the stream. This is done with IQ stanzas that need to be addressed to a full JID // in order to reach an client entity. if (userID == null) { throw new IllegalArgumentException("userID was null"); } return new OutgoingFileTransfer(connection().getUser(), userID, FileTransferNegotiator.getNextStreamID(), fileTransferNegotiator); }
private InputStream negotiateStream() throws SmackException, XMPPErrorException, InterruptedException { setStatus(Status.negotiating_transfer); final StreamNegotiator streamNegotiator = negotiator .selectStreamNegotiator(receiveRequest); setStatus(Status.negotiating_stream); FutureTask<InputStream> streamNegotiatorTask = new FutureTask<>(
private FileTransferNegotiator(final XMPPConnection connection) { super(connection); byteStreamTransferManager = new Socks5TransferNegotiator(connection); inbandTransferManager = new IBBTransferNegotiator(connection); setServiceEnabled(connection, true); }
si.setFile(siFile); si.setFeatureNegotiationForm(createDefaultInitiationForm()); if (iqResponse.getType().equals(IQ.Type.RESULT)) { StreamInitiation response = (StreamInitiation) siResponse; return getOutgoingNegotiator(getStreamMethodField(response .getFeatureNegotiationForm()));
FileTransferRequest request) throws XMPPException { StreamInitiation si = request.getStreamInitiation(); FormField streamMethodField = getStreamMethodField(si .getFeatureNegotiationForm()); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(error); selectedStreamNegotiator = getNegotiator(streamMethodField); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(e.getXMPPError());
/** * Returns the file transfer negotiator related to a particular connection. * When this class is requested on a particular connection the file transfer * service is automatically enabled. * * @param connection The connection for which the transfer manager is desired * @return The IMFileTransferManager */ public static FileTransferNegotiator getInstanceFor( final Connection connection) { if (connection == null) { throw new IllegalArgumentException("Connection cannot be null"); } if (!connection.isConnected()) { return null; } if (transferObject.containsKey(connection)) { return transferObject.get(connection); } else { FileTransferNegotiator transfer = new FileTransferNegotiator( connection); setServiceEnabled(connection, true); transferObject.put(connection, transfer); return transfer; } }
private OutputStream negotiateStream(String fileName, long fileSize, String description) throws XMPPException { // Negotiate the file transfer profile setStatus(Status.NEGOTIATING_TRANSFER); StreamNegotiator streamNegotiator = negotiator.negotiateOutgoingTransfer( getPeer(), streamID, fileName, fileSize, description, RESPONSE_TIMEOUT); if (streamNegotiator == null) { setStatus(Status.ERROR); setError(Error.NO_RESPONSE); return null; } if (!getStatus().equals(Status.NEGOTIATING_TRANSFER)) { return null; } // Negotiate the stream setStatus(Status.NEGOTIATING_STREAM); outputStream = streamNegotiator.createOutgoingStream(streamID, initiator, getPeer()); if (!getStatus().equals(Status.NEGOTIATING_STREAM)) { return null; } setStatus(Status.NEGOTIATED); return outputStream; }
/** * Creates an OutgoingFileTransfer to send a file to another user. * * @param userID * The fully qualified jabber ID with resource of the user to * send the file to. * @return The send file object on which the negotiated transfer can be run. */ public OutgoingFileTransfer createOutgoingFileTransfer(String userID) { // Why is this only accepting fully qualified JID? // if (userID == null || StringUtils.parseName(userID).length() <= 0 // || StringUtils.parseServer(userID).length() <= 0 // || StringUtils.parseResource(userID).length() <= 0) { // throw new IllegalArgumentException( // "The provided user id was not fully qualified"); // } return new OutgoingFileTransfer(connection.getUser(), userID, fileTransferNegotiator.getNextStreamID(), fileTransferNegotiator); }
private InputStream negotiateStream() throws XMPPException { setStatus(Status.negotiating_transfer); final StreamNegotiator streamNegotiator = negotiator .selectStreamNegotiator(recieveRequest); setStatus(Status.negotiating_stream); FutureTask<InputStream> streamNegotiatorTask = new FutureTask<InputStream>(
si.setFile(siFile); si.setFeatureNegotiationForm(createDefaultInitiationForm()); if (iqResponse.getType().equals(IQ.Type.RESULT)) { StreamInitiation response = (StreamInitiation) siResponse; return getOutgoingNegotiator(getStreamMethodField(response .getFeatureNegotiationForm()));
FileTransferRequest request) throws XMPPException { StreamInitiation si = request.getStreamInitiation(); FormField streamMethodField = getStreamMethodField(si .getFeatureNegotiationForm()); String errorMessage = "No stream methods contained in packet."; XMPPError error = new XMPPError(XMPPError.Condition.bad_request, errorMessage); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(error); selectedStreamNegotiator = getNegotiator(streamMethodField); IQ iqPacket = createIQ(si.getPacketID(), si.getFrom(), si.getTo(), IQ.Type.ERROR); iqPacket.setError(e.getXMPPError());