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