jresponse.c

来自「libosip2-3版本的osip源代码」· C语言 代码 · 共 742 行 · 第 1/2 页

C
742
字号
  return 0;g2atii_error_1:  osip_message_free (*answer);  return -1;}int_eXosip_answer_invite_3456xx (eXosip_call_t * jc, eXosip_dialog_t * jd,                              int code, osip_message_t ** answer){  int i;  osip_transaction_t *tr;  *answer = NULL;  tr = eXosip_find_last_inc_invite (jc, jd);  if (tr == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer"));      return -1;    }  /* is the transaction already answered? */  if (tr->state == IST_COMPLETED      || tr->state == IST_CONFIRMED || tr->state == IST_TERMINATED)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: transaction already answered\n"));      return -1;    }  i =    _eXosip_build_response_default (answer, jd->d_dialog, code, tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO1, NULL,                   "ERROR: Could not create response for invite\n"));      return -1;    }  if ((300 <= code) && (code <= 399))    {      /* Should add contact fields */      /* ... */    }  osip_message_set_content_length (*answer, "0");  /*  send message to transaction layer */  return 0;}int_eXosip_default_answer_invite_1xx (eXosip_call_t * jc, eXosip_dialog_t * jd,                                   int code){  osip_event_t *evt_answer;  osip_message_t *response;  int i;  osip_transaction_t *tr;  tr = eXosip_find_last_inc_invite (jc, jd);  if (tr == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer"));      return -1;    }  /* is the transaction already answered? */  if (tr->state == IST_COMPLETED      || tr->state == IST_CONFIRMED || tr->state == IST_TERMINATED)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: transaction already answered\n"));      return -1;    }  if (jd == NULL)    i = _eXosip_build_response_default (&response, NULL, code, tr->orig_request);  else    i =      _eXosip_build_response_default (&response, jd->d_dialog, code,                                      tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "ERROR: Could not create response for invite\n"));      return -2;    }  osip_message_set_content_length (response, "0");  /*  send message to transaction layer */  if (code > 100)    {      /* request that estabish a dialog: */      /* 12.1.1 UAS Behavior */      i = complete_answer_that_establish_a_dialog (response, tr->orig_request);      if (jd == NULL)        {          i = eXosip_dialog_init_as_uas (&jd, tr->orig_request, response);          if (i != 0)            {              OSIP_TRACE (osip_trace                          (__FILE__, __LINE__, OSIP_ERROR, NULL,                           "eXosip: cannot create dialog!\n"));          } else            {              ADD_ELEMENT (jc->c_dialogs, jd);            }        }    }  evt_answer = osip_new_outgoing_sipmessage (response);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  __eXosip_wakeup ();  return 0;}int_eXosip_default_answer_invite_3456xx (eXosip_call_t * jc,                                      eXosip_dialog_t * jd, int code){  osip_event_t *evt_answer;  osip_message_t *response;  int i;  osip_transaction_t *tr;  tr = eXosip_find_last_inc_invite (jc, jd);  if (tr == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer"));      return -1;    }  /* is the transaction already answered? */  if (tr->state == IST_COMPLETED      || tr->state == IST_CONFIRMED || tr->state == IST_TERMINATED)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: transaction already answered\n"));      return -1;    }  i =    _eXosip_build_response_default (&response, jd->d_dialog, code,                                    tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO1, NULL,                   "ERROR: Could not create response for invite\n"));      return -1;    }  osip_message_set_content_length (response, "0");  /*  send message to transaction layer */  evt_answer = osip_new_outgoing_sipmessage (response);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  __eXosip_wakeup ();  return 0;}int_eXosip_insubscription_answer_1xx (eXosip_notify_t * jn, eXosip_dialog_t * jd,                                   int code){  osip_event_t *evt_answer;  osip_message_t *response;  int i;  osip_transaction_t *tr;  tr = eXosip_find_last_inc_subscribe (jn, jd);  if (tr == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer"));      return -1;    }  if (jd == NULL)    i = _eXosip_build_response_default (&response, NULL, code, tr->orig_request);  else    i =      _eXosip_build_response_default (&response, jd->d_dialog, code,                                      tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "ERROR: Could not create response for subscribe\n"));      return -1;    }  if (code > 100)    {      /* request that estabish a dialog: */      /* 12.1.1 UAS Behavior */      i = complete_answer_that_establish_a_dialog (response, tr->orig_request);      if (jd == NULL)        {          i = eXosip_dialog_init_as_uas (&jd, tr->orig_request, response);          if (i != 0)            {              OSIP_TRACE (osip_trace                          (__FILE__, __LINE__, OSIP_ERROR, NULL,                           "eXosip: cannot create dialog!\n"));            }          ADD_ELEMENT (jn->n_dialogs, jd);        }    }  evt_answer = osip_new_outgoing_sipmessage (response);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  __eXosip_wakeup ();  return 0;}#if 0int_eXosip_insubscription_answer_2xx (eXosip_notify_t * jn, eXosip_dialog_t * jd,                                   int code){  osip_event_t *evt_answer;  osip_message_t *response;  int i;  osip_transaction_t *tr;  tr = eXosip_find_last_inc_subscribe (jn, jd);  if (tr == NULL || tr->orig_request == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer\n"));      return -1;    }  if (jd != NULL && jd->d_dialog == NULL)    {                           /* element previously removed, this is a no hop! */      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot answer this closed transaction\n"));      return -1;    }  if (jd == NULL)    i = _eXosip_build_response_default (&response, NULL, code, tr->orig_request);  else    i =      _eXosip_build_response_default (&response, jd->d_dialog, code,                                      tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO1, NULL,                   "ERROR: Could not create response for subscribe\n"));      code = 500;               /* ? which code to use? */      return -1;    }  /* request that estabish a dialog: */  /* 12.1.1 UAS Behavior */  {    i = complete_answer_that_establish_a_dialog (response, tr->orig_request);    if (i != 0)      goto g2atii_error_1;;     /* ?? */  }  /* THIS RESPONSE MUST BE SENT RELIABILY until the final ACK is received !! */  /* this response must be stored at the upper layer!!! (it will be destroyed */  /* right after being sent! */  if (jd == NULL)    {      i = eXosip_dialog_init_as_uas (&jd, tr->orig_request, response);      if (i != 0)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: cannot create dialog!\n"));          return -1;        }      ADD_ELEMENT (jn->n_dialogs, jd);    }  eXosip_dialog_set_200ok (jd, response);  evt_answer = osip_new_outgoing_sipmessage (response);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  __eXosip_wakeup ();  osip_dialog_set_state (jd->d_dialog, DIALOG_CONFIRMED);  return 0;g2atii_error_1:  osip_message_free (response);  return -1;}#endifint_eXosip_insubscription_answer_3456xx (eXosip_notify_t * jn,                                      eXosip_dialog_t * jd, int code){  osip_event_t *evt_answer;  osip_message_t *response;  int i;  osip_transaction_t *tr;  tr = eXosip_find_last_inc_subscribe (jn, jd);  if (tr == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot find transaction to answer"));      return -1;    }  if (jd == NULL)    i = _eXosip_build_response_default (&response, NULL, code, tr->orig_request);  else    i =      _eXosip_build_response_default (&response, jd->d_dialog, code,                                      tr->orig_request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO1, NULL,                   "ERROR: Could not create response for subscribe\n"));      return -1;    }  if ((300 <= code) && (code <= 399))    {      /* Should add contact fields */      /* ... */    }  evt_answer = osip_new_outgoing_sipmessage (response);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  __eXosip_wakeup ();  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?