docs: 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;
          }
      }