📄 udp.c
字号:
{ /* 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 + -