udp.c

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

C
1,949
字号
  je = eXosip_event_init_for_call (EXOSIP_CALL_ACK, jc, jd, NULL);  if (je != NULL)    {      i = osip_message_clone (evt->sip, &je->ack);      if (i != 0)        {          OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                                  "failed to clone ACK for event\n"));      } else        report_event (je, NULL);    }  osip_event_free (evt);}static voideXosip_process_prack (eXosip_call_t * jc, eXosip_dialog_t * jd,                      osip_transaction_t * transaction, osip_event_t * evt){  osip_event_t *evt_answer;  osip_message_t *answer;  int i;  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));  i = _eXosip_build_response_default (&answer, jd->d_dialog, 200, evt->sip);  if (i != 0)    {      osip_list_add (eXosip.j_transactions, transaction, 0);      return;    }  evt_answer = osip_new_outgoing_sipmessage (answer);  evt_answer->transactionid = transaction->transactionid;  osip_list_add (jd->d_inc_trs, transaction, 0);  osip_transaction_add_event (transaction, evt_answer);  __eXosip_wakeup ();}static intcancel_match_invite (osip_transaction_t * invite, osip_message_t * cancel){  osip_generic_param_t *br;  osip_generic_param_t *br2;  osip_via_t *via;  osip_via_param_get_byname (invite->topvia, "branch", &br);  via = osip_list_get (&cancel->vias, 0);  if (via == NULL)    return -1;                  /* request without via??? */  osip_via_param_get_byname (via, "branch", &br2);  if (br != NULL && br2 == NULL)    return -1;  if (br2 != NULL && br == NULL)    return -1;  if (br2 != NULL && br != NULL)        /* compliant UA  :) */    {      if (br->gvalue != NULL && br2->gvalue != NULL &&          0 == strcmp (br->gvalue, br2->gvalue))        return 0;      return -1;    }  /* old backward compatibility mechanism */  if (0 != osip_call_id_match (invite->callid, cancel->call_id))    return -1;  if (0 != osip_to_tag_match (invite->to, cancel->to))    return -1;  if (0 != osip_from_tag_match (invite->from, cancel->from))    return -1;  if (0 != osip_via_match (invite->topvia, via))    return -1;  return 0;}static voideXosip_process_cancel (osip_transaction_t * transaction, osip_event_t * evt){  osip_transaction_t *tr;  osip_event_t *evt_answer;  osip_message_t *answer;  int i;  eXosip_call_t *jc;  eXosip_dialog_t *jd;  tr = NULL;  jd = NULL;  /* first, look for a Dialog in the map of element */  for (jc = eXosip.j_calls; jc != NULL; jc = jc->next)    {      if (jc->c_inc_tr != NULL)        {          i = cancel_match_invite (jc->c_inc_tr, evt->sip);          if (i == 0)            {              tr = jc->c_inc_tr;              /* fixed */              if (jc->c_dialogs != NULL)                jd = jc->c_dialogs;              break;            }        }      tr = NULL;      for (jd = jc->c_dialogs; jd != NULL; jd = jd->next)        {          int pos = 0;          while (!osip_list_eol (jd->d_inc_trs, pos))            {              tr = osip_list_get (jd->d_inc_trs, pos);              i = cancel_match_invite (tr, evt->sip);              if (i == 0)                break;              tr = NULL;              pos++;            }        }      if (jd != NULL)        break;                  /* tr has just been found! */    }  if (tr == NULL)               /* we didn't found the transaction to cancel */    {      i = _eXosip_build_response_default (&answer, NULL, 481, evt->sip);      if (i != 0)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: cannot cancel transaction.\n"));          osip_list_add (eXosip.j_transactions, tr, 0);          osip_transaction_set_your_instance (tr, NULL);          return;        }      osip_message_set_content_length (answer, "0");      evt_answer = osip_new_outgoing_sipmessage (answer);      evt_answer->transactionid = transaction->transactionid;      osip_transaction_add_event (transaction, evt_answer);      osip_list_add (eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      __eXosip_wakeup ();      return;    }  if (tr->state == IST_TERMINATED || tr->state == IST_CONFIRMED      || tr->state == IST_COMPLETED)    {      /* I can't find the status code in the rfc?         (I read I must answer 200? wich I found strange)         I probably misunderstood it... and prefer to send 481         as the transaction has been answered. */      if (jd == NULL)        i = _eXosip_build_response_default (&answer, NULL, 481, evt->sip);      else        i = _eXosip_build_response_default (&answer, jd->d_dialog, 481, evt->sip);      if (i != 0)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: cannot cancel transaction.\n"));          osip_list_add (eXosip.j_transactions, tr, 0);          osip_transaction_set_your_instance (tr, NULL);          return;        }      osip_message_set_content_length (answer, "0");      evt_answer = osip_new_outgoing_sipmessage (answer);      evt_answer->transactionid = transaction->transactionid;      osip_transaction_add_event (transaction, evt_answer);      if (jd != NULL)        osip_list_add (jd->d_inc_trs, transaction, 0);      else        osip_list_add (eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      __eXosip_wakeup ();      return;    }  {    if (jd == NULL)      i = _eXosip_build_response_default (&answer, NULL, 200, evt->sip);    else      i = _eXosip_build_response_default (&answer, jd->d_dialog, 200, evt->sip);    if (i != 0)      {        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_ERROR, NULL,                     "eXosip: cannot cancel transaction.\n"));        osip_list_add (eXosip.j_transactions, tr, 0);        osip_transaction_set_your_instance (tr, NULL);        return;      }    osip_message_set_content_length (answer, "0");    evt_answer = osip_new_outgoing_sipmessage (answer);    evt_answer->transactionid = transaction->transactionid;    osip_transaction_add_event (transaction, evt_answer);    __eXosip_wakeup ();    if (jd != NULL)      osip_list_add (jd->d_inc_trs, transaction, 0);    else      osip_list_add (eXosip.j_transactions, transaction, 0);    osip_transaction_set_your_instance (transaction, NULL);    /* answer transaction to cancel */    if (jd == NULL)      i = _eXosip_build_response_default (&answer, NULL, 487, tr->orig_request);    else      i = _eXosip_build_response_default (&answer, jd->d_dialog, 487,                                          tr->orig_request);    if (i != 0)      {        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_ERROR, NULL,                     "eXosip: cannot cancel transaction.\n"));        osip_list_add (eXosip.j_transactions, tr, 0);        osip_transaction_set_your_instance (tr, NULL);        return;      }    osip_message_set_content_length (answer, "0");    evt_answer = osip_new_outgoing_sipmessage (answer);    evt_answer->transactionid = tr->transactionid;    osip_transaction_add_event (tr, evt_answer);    __eXosip_wakeup ();  }}static osip_event_t *eXosip_process_reinvite (eXosip_call_t * jc, eXosip_dialog_t * jd,                         osip_transaction_t * transaction, osip_event_t * evt){  osip_message_t *answer;  osip_event_t *sipevent;  int i;  i = _eXosip_build_response_default (&answer, jd->d_dialog, 100, evt->sip);  if (i != 0)    {      osip_list_add (eXosip.j_transactions, transaction, 0);      eXosip_send_default_answer (jd, transaction, evt, 500,                                  "Internal SIP Error",                                  "Failed to build Answer for INVITE within call",                                  __LINE__);      return NULL;    }  complete_answer_that_establish_a_dialog (answer, evt->sip);  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));  sipevent = osip_new_outgoing_sipmessage (answer);  sipevent->transactionid = transaction->transactionid;  osip_list_add (jd->d_inc_trs, transaction, 0);  osip_ist_execute (eXosip.j_osip);  report_call_event (EXOSIP_CALL_REINVITE, jc, jd, transaction);  return sipevent;}static voideXosip_process_new_options (osip_transaction_t * transaction, osip_event_t * evt){  osip_list_add (eXosip.j_transactions, transaction, 0);  __eXosip_wakeup ();           /* needed? */}static voideXosip_process_new_invite (osip_transaction_t * transaction, osip_event_t * evt){  osip_event_t *evt_answer;  int i;  eXosip_call_t *jc;  eXosip_dialog_t *jd;  osip_message_t *answer;  eXosip_call_init (&jc);  ADD_ELEMENT (eXosip.j_calls, jc);  i = _eXosip_build_response_default (&answer, NULL, 101, evt->sip);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot create dialog."));      osip_list_add (eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: Could not create response for invite\n"));      return;    }  osip_message_set_content_length (answer, "0");  i = complete_answer_that_establish_a_dialog (answer, evt->sip);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot complete answer!\n"));      osip_list_add (eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      osip_message_free (answer);      return;    }  i = eXosip_dialog_init_as_uas (&jd, evt->sip, answer);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot create dialog!\n"));      osip_list_add (eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      osip_message_free (answer);      return;    }  ADD_ELEMENT (jc->c_dialogs, jd);  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));  evt_answer = osip_new_outgoing_sipmessage (answer);  evt_answer->transactionid = transaction->transactionid;  eXosip_update ();  jc->c_inc_tr = transaction;  osip_transaction_add_event (transaction, evt_answer);  /* be sure the invite will be processed     before any API call on this dialog */  osip_ist_execute (eXosip.j_osip);  if (transaction->orig_request != NULL)    {      report_call_event (EXOSIP_CALL_INVITE, jc, jd, transaction);    }  __eXosip_wakeup ();}static voideXosip_process_new_subscribe (osip_transaction_t * transaction, osip_event_t * evt){  osip_event_t *evt_answer;  eXosip_notify_t *jn;  eXosip_dialog_t *jd;  osip_message_t *answer;  int i;  eXosip_notify_init (&jn, evt->sip);  _eXosip_notify_set_refresh_interval (jn, evt->sip);  i = _eXosip_build_response_default (&answer, NULL, 101, evt->sip);  if (i != 0)    {      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: Could not create response for invite\n"));      osip_list_add (eXosip.j_transactions, transaction, 0);      eXosip_notify_free (jn);      return;    }  i = complete_answer_that_establish_a_dialog (answer, evt->sip);  if (i != 0)    {      osip_message_free (answer);      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot complete answer!\n"));      osip_list_add (eXosip.j_transactions, transaction, 0);      eXosip_notify_free (jn);      return;    }  i = eXosip_dialog_init_as_uas (&jd, evt->sip, answer);  if (i != 0)    {      osip_message_free (answer);      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot create dialog!\n"));      osip_list_add (eXosip.j_transactions, transaction, 0);      eXosip_notify_free (jn);      return;    }  ADD_ELEMENT (jn->n_dialogs, jd);

⌨️ 快捷键说明

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