⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
    {      /* 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 voideXosip_process_reinvite (eXosip_call_t * jc, eXosip_dialog_t * jd,                         osip_transaction_t * transaction, osip_event_t * evt){#ifndef MINISIZE  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));#else  osip_transaction_set_your_instance (transaction, __eXosip_new_jinfo (jc, jd));#endif  osip_list_add (jd->d_inc_trs, transaction, 0);  osip_ist_execute (eXosip.j_osip);  report_call_event (EXOSIP_CALL_REINVITE, jc, jd, transaction);}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;  osip_generic_param_t *to_tag = NULL;  if (evt->sip != NULL && evt->sip->to != NULL)    osip_from_param_get_byname (evt->sip->to, "tag", &to_tag);  if (to_tag != NULL)    {      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: Existing To-Tag in new INVITE -> reject with 481\n"));      i = _eXosip_build_response_default (&answer, NULL, 481, evt->sip);      if (i == 0)        {          evt_answer = osip_new_outgoing_sipmessage (answer);          evt_answer->transactionid = transaction->transactionid;          eXosip_update ();          osip_transaction_add_event (transaction, evt_answer);          return;        }      osip_message_set_content_length (answer, "0");      osip_list_add (&eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      return;    }  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);#ifndef MINISIZE  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));#else  osip_transaction_set_your_instance (transaction, __eXosip_new_jinfo (jc, jd));#endif  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 ();}#ifndef MINISIZEstatic 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;  osip_generic_param_t *to_tag = NULL;  if (evt->sip != NULL && evt->sip->to != NULL)    osip_from_param_get_byname (evt->sip->to, "tag", &to_tag);  if (to_tag != NULL)    {      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: Existing To-Tag in new SUBSCRIBE -> reject with 481\n"));      i = _eXosip_build_response_default (&answer, NULL, 481, evt->sip);      if (i == 0)        {          evt_answer = osip_new_outgoing_sipmessage (answer);          evt_answer->transactionid = transaction->transactionid;          eXosip_update ();          osip_message_set_content_length (answer, "0");          osip_transaction_add_event (transaction, evt_answer);        }      osip_list_add (&eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      return;    }  i = eXosip_notify_init (&jn, evt->sip);  if (i != 0)    {      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: missing contact or memory\n"));      i = _eXosip_build_response_default (&answer, NULL, 400, evt->sip);      if (i == 0)        {          evt_answer = osip_new_outgoing_sipmessage (answer);          evt_answer->transactionid = transaction->transactionid;          eXosip_update ();          osip_message_set_content_length (answer, "0");          osip_transaction_add_event (transaction, evt_answer);        }      osip_list_add (&eXosip.j_transactions, transaction, 0);      osip_transaction_set_your_instance (transaction, NULL);      return;    }  _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);  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (NULL, jd, NULL, jn));  evt_answer = osip_new_outgoing_sipmessage (answer);  evt_answer->transactionid = transaction->transactionid;  osip_transaction_add_event (transaction, evt_answer);  ADD_ELEMENT (eXosip.j_notifies, jn);  __eXosip_wakeup ();  jn->n_inc_tr = transaction;  eXosip_update ();  __eXosip_wakeup ();}static voideXosip_process_subscribe_within_call (eXosip_notify_t * jn,                                      eXosip_dialog_t * jd,                                      osip_transaction_t * transaction,                                      osip_event_t * evt){  _eXosip_notify_set_refresh_interval (jn, evt->sip);  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (NULL, jd, NULL, jn));  /* if subscribe request contains expires="0", close the subscription */  {    time_t now = time (NULL);    if (jn->n_ss_expires - now <= 0)      {        jn->n_ss_status = EXOSIP_SUBCRSTATE_TERMINATED;        jn->n_ss_reason = TIMEOUT;      }  }  osip_list_add (jd->d_inc_trs, transaction, 0);  __eXosip_wakeup ();  return;}static voideXosip_process_notify_within_dialog (eXosip_subscribe_t * js,                                     eXosip_dialog_t * jd,                                     osip_transaction_t * transaction,                                     osip_event_t * evt){  osip_message_t *answer;  osip_event_t *sipevent;  osip_header_t *sub_state;#ifdef SUPPORT_MSN  osip_header_t *expires;#endif  int i;  if (jd == NULL)    {      osip_list_add (&eXosip.j_transactions, transaction, 0);      eXosip_send_default_answer (jd, transaction, evt, 500,                                  "Internal SIP Error",                                  "No dialog for this NOTIFY", __LINE__);      return;    }  /* if subscription-state has a reason state set to terminated,     we close the dialog */#ifndef SUPPORT_MSN  osip_message_header_get_byname (evt->sip, "subscription-state", 0, &sub_state);  if (sub_state == NULL || sub_state->hvalue == NULL)    {      osip_list_add (&eXosip.j_transactions, transaction, 0);      eXosip_send_default_answer (jd, transaction, evt, 400, NULL, NULL, __LINE__);      return;    }#endif  i = _eXosip_build_response_default (&answer, jd->d_dialog, 200, 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 NOTIFY", __LINE__);      return;    }#ifdef SUPPORT_MSN  osip_message_header_get_byname (evt->sip, "expires", 0, &expires);  if (expires != NULL && expires->hvalue != NULL      && 0 == osip_strcasecmp (expires->hvalue, "0"))    {      /* delete the dialog! */      js->s_ss_status = EXOSIP_SUBCRSTATE_TERMINATED;      {        eXosip_event_t *je;        je = eXosip_event_init_for_subscribe (EXOSIP_SUBSCRIPTION_NOTIFY, js, jd);        eXosip_event_add (je);      }      sipevent = osip_new_outgoing_sipmessage (answer);      sipevent->transactionid = transaction->transactionid;      osip_transaction_add_event (transaction, sipevent);

⌨️ 快捷键说明

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