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 + -
显示快捷键?