Beispiel #1
0
  public ClientTransaction preProcessInvite(SipRequest sipRequest) throws SipUriSyntaxException {

    // 8.1.2
    SipHeaders requestHeaders = sipRequest.getSipHeaders();
    SipURI destinationUri = RequestManager.getDestinationUri(sipRequest, logger);

    // TODO if header route is present, addrspec = toproute.nameaddress.addrspec

    String transport = RFC3261.TRANSPORT_UDP;
    Hashtable<String, String> params = destinationUri.getUriParameters();
    if (params != null) {
      String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT);
      if (reqUriTransport != null) {
        transport = reqUriTransport;
      }
    }
    int port = destinationUri.getPort();
    if (port == SipURI.DEFAULT_PORT) {
      port = RFC3261.TRANSPORT_DEFAULT_PORT;
    }
    SipURI sipUri = userAgent.getConfig().getOutboundProxy();
    if (sipUri == null) {
      sipUri = destinationUri;
    }
    InetAddress inetAddress;
    try {
      inetAddress = InetAddress.getByName(sipUri.getHost());
    } catch (UnknownHostException e) {
      throw new SipUriSyntaxException("unknown host: " + sipUri.getHost(), e);
    }
    ClientTransaction clientTransaction =
        transactionManager.createClientTransaction(
            sipRequest, inetAddress, port, transport, null, this);
    DatagramSocket datagramSocket;
    synchronized (this) {
      datagramSocket = getDatagramSocket();
    }
    try {
      SessionDescription sessionDescription =
          sdpManager.createSessionDescription(null, datagramSocket.getLocalPort());
      sipRequest.setBody(sessionDescription.toString().getBytes());
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }
    requestHeaders.add(
        new SipHeaderFieldName(RFC3261.HDR_CONTENT_TYPE),
        new SipHeaderFieldValue(RFC3261.CONTENT_TYPE_SDP));
    return clientTransaction;
  }
Beispiel #2
0
  public void successResponseReceived(SipResponse sipResponse, Transaction transaction) {
    SipHeaders responseHeaders = sipResponse.getSipHeaders();
    String cseq = responseHeaders.get(new SipHeaderFieldName(RFC3261.HDR_CSEQ)).getValue();
    String method = cseq.substring(cseq.trim().lastIndexOf(' ') + 1);
    if (!RFC3261.METHOD_INVITE.equals(method)) {
      return;
    }

    challenged = false;

    // 13.2.2.4

    List<String> peers = userAgent.getPeers();
    String responseTo = responseHeaders.get(new SipHeaderFieldName(RFC3261.HDR_TO)).getValue();
    if (!peers.contains(responseTo)) {
      peers.add(responseTo);
      // timer used to purge dialogs which are not confirmed
      // after a given time
      ackTimer.schedule(new AckTimerTask(responseTo), 64 * RFC3261.TIMER_T1);
    }

    Dialog dialog = dialogManager.getDialog(sipResponse);

    if (dialog != null) {
      // dialog already created with a 180 for example
      dialog.setRouteSet(computeRouteSet(sipResponse.getSipHeaders()));
    }
    dialog = buildOrUpdateDialogForUac(sipResponse, transaction);

    SipListener sipListener = userAgent.getSipListener();
    if (sipListener != null) {
      sipListener.calleePickup(sipResponse);
    }

    // added for media
    SessionDescription sessionDescription = sdpManager.parse(sipResponse.getBody());
    try {
      mediaDestination = sdpManager.getMediaDestination(sessionDescription);
    } catch (NoCodecException e) {
      logger.error(e.getMessage(), e);
    }
    String remoteAddress = mediaDestination.getDestination();
    int remotePort = mediaDestination.getPort();
    Codec codec = mediaDestination.getCodec();
    String localAddress = userAgent.getConfig().getLocalInetAddress().getHostAddress();

    userAgent
        .getMediaManager()
        .successResponseReceived(localAddress, remoteAddress, remotePort, codec);

    // switch to confirmed state
    dialog.receivedOrSent2xx();

    // generate ack
    // p. 82 §3
    SipRequest ack = dialog.buildSubsequentRequest(RFC3261.METHOD_ACK);

    // update CSeq

    SipHeaders ackHeaders = ack.getSipHeaders();
    SipHeaderFieldName cseqName = new SipHeaderFieldName(RFC3261.HDR_CSEQ);
    SipHeaderFieldValue ackCseq = ackHeaders.get(cseqName);

    SipRequest request = transaction.getRequest();
    SipHeaders requestHeaders = request.getSipHeaders();
    SipHeaderFieldValue requestCseq = requestHeaders.get(cseqName);

    ackCseq.setValue(requestCseq.toString().replace(RFC3261.METHOD_INVITE, RFC3261.METHOD_ACK));

    // add Via with only the branchid parameter

    SipHeaderFieldValue via = new SipHeaderFieldValue("");
    SipHeaderParamName branchIdName = new SipHeaderParamName(RFC3261.PARAM_BRANCH);
    via.addParam(branchIdName, Utils.generateBranchId());

    ackHeaders.add(new SipHeaderFieldName(RFC3261.HDR_VIA), via, 0);

    // TODO authentication headers

    if (request.getBody() == null && sipResponse.getBody() != null) {
      // TODO add a real SDP answer
      ack.setBody(sipResponse.getBody());
    }

    // TODO check if sdp is acceptable

    SipURI destinationUri = RequestManager.getDestinationUri(ack, logger);
    challengeManager.postProcess(ack);

    // TODO if header route is present, addrspec = toproute.nameaddress.addrspec

    String transport = RFC3261.TRANSPORT_UDP;
    Hashtable<String, String> params = destinationUri.getUriParameters();
    if (params != null) {
      String reqUriTransport = params.get(RFC3261.PARAM_TRANSPORT);
      if (reqUriTransport != null) {
        transport = reqUriTransport;
      }
    }
    int port = destinationUri.getPort();
    if (port == SipURI.DEFAULT_PORT) {
      port = RFC3261.TRANSPORT_DEFAULT_PORT;
    }

    SipURI sipUri = userAgent.getConfig().getOutboundProxy();
    if (sipUri == null) {
      sipUri = destinationUri;
    }
    InetAddress inetAddress;
    try {
      inetAddress = InetAddress.getByName(sipUri.getHost());
    } catch (UnknownHostException e) {
      logger.error("unknown host: " + sipUri.getHost(), e);
      return;
    }
    try {
      MessageSender sender =
          transportManager.createClientTransport(ack, inetAddress, port, transport);
      sender.sendMessage(ack);
    } catch (IOException e) {
      logger.error("input/output error", e);
    }

    List<String> guiClosedCallIds = userAgent.getUac().getGuiClosedCallIds();
    String callId = Utils.getMessageCallId(sipResponse);
    if (guiClosedCallIds.contains(callId)) {
      userAgent.terminate(request);
    }
  }