Ejemplo n.º 1
0
  public void provResponseReceived(SipResponse sipResponse, Transaction transaction) {
    // dialog may have already been created if a previous 1xx has
    // already been received
    Dialog dialog = dialogManager.getDialog(sipResponse);
    boolean isFirstProvRespWithToTag = false;
    if (dialog == null) {
      SipHeaderFieldValue to =
          sipResponse.getSipHeaders().get(new SipHeaderFieldName(RFC3261.HDR_TO));
      String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG));
      if (toTag != null) {
        dialog = dialogManager.createDialog(sipResponse);
        isFirstProvRespWithToTag = true;
      } else {
        // TODO maybe stop retransmissions
      }
    }

    if (dialog != null) {
      buildOrUpdateDialogForUac(sipResponse, transaction);
    }

    //
    //        if (dialog == null && sipResponse.getStatusCode() != RFC3261.CODE_100_TRYING) {
    //            logger.debug("dialog not found for prov response");
    //            isFirstProvRespWithToTag = true;
    //            SipHeaderFieldValue to = sipResponse.getSipHeaders()
    //                .get(new SipHeaderFieldName(RFC3261.HDR_TO));
    //            String toTag = to.getParam(new SipHeaderParamName(RFC3261.PARAM_TAG));
    //            if (toTag != null) {
    //                dialog = buildOrUpdateDialogForUac(sipResponse, transaction);
    //            }
    //        }
    // TODO this notification is probably useless because dialog state modification
    //     thereafter always notify dialog observers
    if (isFirstProvRespWithToTag) {
      SipListener sipListener = userAgent.getSipListener();
      if (sipListener != null) {
        sipListener.ringing(sipResponse);
      }
      dialog.receivedOrSent1xx();
    }
    List<String> guiClosedCallIds = userAgent.getUac().getGuiClosedCallIds();
    String callId = Utils.getMessageCallId(sipResponse);
    if (guiClosedCallIds.contains(callId)) {
      SipRequest sipRequest = transaction.getRequest();
      logger.debug(
          "cancel after prov response: sipRequest " + sipRequest + ", sipResponse " + sipResponse);
      userAgent.terminate(sipRequest);
    }
  }