📄 jcallback.c
字号:
/* find matching j_reg */ _eXosip_reg_find (&jreg, tr); if (jreg != NULL) { /* update registration interval */ osip_header_t *exp; osip_message_header_get_byname (sip, "expires", 0, &exp); if (exp!=NULL && exp->hvalue!=NULL) { int val = atoi(exp->hvalue); if (val>0) { jreg->r_reg_period=val+60; } } je = eXosip_event_init_for_reg (EXOSIP_REGISTRATION_SUCCESS, jreg, tr); report_event (je, sip); jreg->r_retry = 0; /* reset value */ } return; } if (jinfo == NULL) return; jd = jinfo->jd; jc = jinfo->jc;#ifndef MINISIZE jn = jinfo->jn; js = jinfo->js;#endif if (jd != NULL) jd->d_retry = 0; /* reset marker for authentication */ if (jc != NULL) jc->c_retry = 0; /* reset marker for authentication */#ifndef MINISIZE if (js != NULL) js->s_retry = 0; /* reset marker for authentication */#endif if (MSG_IS_RESPONSE_FOR (sip, "INVITE")) { cb_rcv2xx_4invite (tr, sip); } else if (MSG_IS_RESPONSE_FOR (sip, "BYE")) { if (jd != NULL) jd->d_STATE = JD_TERMINATED; }#ifndef MINISIZE else if (MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { cb_rcv2xx_4subscribe (tr, sip); } else if (MSG_IS_RESPONSE_FOR (sip, "NOTIFY") && jn!=NULL) { eXosip_event_t *je; osip_header_t *sub_state; je = eXosip_event_init_for_notify (EXOSIP_NOTIFICATION_REQUESTFAILURE, jn, jd, tr); report_event (je, sip); osip_message_header_get_byname (tr->orig_request, "subscription-state", 0, &sub_state); if (sub_state == NULL || sub_state->hvalue == NULL) { /* UNCOMPLIANT UA without a subscription-state header */ } else if (0 == osip_strncasecmp (sub_state->hvalue, "terminated", 10)) { /* delete the dialog! */ if (jn != NULL) { REMOVE_ELEMENT (eXosip.j_notifies, jn); eXosip_notify_free (jn); } } }#endif else if (jc != NULL) { report_call_event (EXOSIP_CALL_MESSAGE_ANSWERED, jc, jd, tr); return; }#ifndef MINISIZE else if (jc == NULL && js == NULL && jn == NULL) { eXosip_event_t *je; /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_ANSWERED, tr); report_event (je, sip); return; }#else else if (jc == NULL) { eXosip_event_t *je; /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_ANSWERED, tr); report_event (je, sip); return; }#endif}voideXosip_delete_early_dialog (eXosip_dialog_t * jd){ if (jd == NULL) /* bug? */ return; /* an early dialog was created, but the call is not established */ if (jd->d_dialog != NULL && jd->d_dialog->state == DIALOG_EARLY) { osip_dialog_free (jd->d_dialog); jd->d_dialog = NULL; eXosip_update (); /* AMD 30/09/05 */ eXosip_dialog_set_state (jd, JD_TERMINATED); }}static voidrcvregister_failure (osip_transaction_t * tr, osip_message_t * sip){ eXosip_event_t *je; eXosip_reg_t *jreg = NULL; /* find matching j_reg */ _eXosip_reg_find (&jreg, tr); if (jreg != NULL) { je = eXosip_event_init_for_reg (EXOSIP_REGISTRATION_FAILURE, jreg, tr); report_event (je, sip); }}#ifndef MINISIZEstatic voidcb_rcv3xx (int type, osip_transaction_t * tr, osip_message_t * sip){ eXosip_dialog_t *jd; eXosip_call_t *jc; eXosip_subscribe_t *js; eXosip_notify_t *jn; jinfo_t *jinfo = (jinfo_t *) osip_transaction_get_your_instance (tr); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO3, NULL, "cb_rcv3xx (id=%i)\r\n", tr->transactionid)); udp_tl_learn_port_from_via(sip); if (MSG_IS_RESPONSE_FOR (sip, "PUBLISH")) { eXosip_event_t *je; eXosip_pub_t *pub; int i; i = _eXosip_pub_update (&pub, tr, sip); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "cb_rcv3xx (id=%i) No publication to update\r\n", tr->transactionid)); } je = eXosip_event_init_for_message (EXOSIP_MESSAGE_REDIRECTED, tr); report_event (je, sip); return; } else if (MSG_IS_RESPONSE_FOR (sip, "REGISTER")) { rcvregister_failure (tr, sip); return; } if (jinfo == NULL) return; jd = jinfo->jd; jc = jinfo->jc; jn = jinfo->jn; js = jinfo->js; if (MSG_IS_RESPONSE_FOR (sip, "INVITE")) { report_call_event (EXOSIP_CALL_REDIRECTED, jc, jd, tr); } else if (MSG_IS_RESPONSE_FOR (sip, "NOTIFY") && jn!=NULL) { eXosip_event_t *je; je = eXosip_event_init_for_notify (EXOSIP_NOTIFICATION_REQUESTFAILURE, jn, jd, tr); report_event (je, sip); } else if (MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_event_t *je; je = eXosip_event_init_for_subscribe (EXOSIP_SUBSCRIPTION_REDIRECTED, js, jd, tr); report_event (je, sip); } else if (jc != NULL) { report_call_event (EXOSIP_CALL_MESSAGE_REDIRECTED, jc, jd, tr); return; } else if (jc == NULL && js == NULL && jn == NULL) { eXosip_event_t *je; /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_REDIRECTED, tr); report_event (je, sip); return; } if (jd == NULL) return; if (MSG_IS_RESPONSE_FOR (sip, "INVITE") || MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_delete_early_dialog (jd); if (jd->d_dialog == NULL) jd->d_STATE = JD_REDIRECTED; }}static voidcb_rcv4xx (int type, osip_transaction_t * tr, osip_message_t * sip){ eXosip_dialog_t *jd; eXosip_call_t *jc; eXosip_subscribe_t *js; eXosip_notify_t *jn; jinfo_t *jinfo = (jinfo_t *) osip_transaction_get_your_instance (tr); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO3, NULL, "cb_rcv4xx (id=%i)\r\n", tr->transactionid)); udp_tl_learn_port_from_via(sip); if (MSG_IS_RESPONSE_FOR (sip, "PUBLISH")) { eXosip_pub_t *pub; eXosip_event_t *je; int i; i = _eXosip_pub_update (&pub, tr, sip); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "cb_rcv4xx (id=%i) No publication to update\r\n", tr->transactionid)); } /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_REQUESTFAILURE, tr); report_event (je, sip); return; } else if (MSG_IS_RESPONSE_FOR (sip, "REGISTER")) { rcvregister_failure (tr, sip); return; } if (jinfo == NULL) return; jd = jinfo->jd; jc = jinfo->jc; jn = jinfo->jn; js = jinfo->js; if (MSG_IS_RESPONSE_FOR (sip, "INVITE")) { report_call_event (EXOSIP_CALL_REQUESTFAILURE, jc, jd, tr); } else if (MSG_IS_RESPONSE_FOR (sip, "NOTIFY") && jn!=NULL) { eXosip_event_t *je; je = eXosip_event_init_for_notify (EXOSIP_NOTIFICATION_REQUESTFAILURE, jn, jd, tr); report_event (je, sip); } else if (MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_event_t *je; je = eXosip_event_init_for_subscribe (EXOSIP_SUBSCRIPTION_REQUESTFAILURE, js, jd, tr); report_event (je, sip); } else if (jc != NULL) { report_call_event (EXOSIP_CALL_MESSAGE_REQUESTFAILURE, jc, jd, tr); return; } else if (jc == NULL && js == NULL && jn == NULL) { eXosip_event_t *je; /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_REQUESTFAILURE, tr); report_event (je, sip); return; } if (jc != NULL) { if (MSG_TEST_CODE (sip, 401) || MSG_TEST_CODE (sip, 407)) { if (jc->response_auth != NULL) osip_message_free (jc->response_auth); osip_message_clone (sip, &jc->response_auth); } } if (jd == NULL) return; if (MSG_IS_RESPONSE_FOR (sip, "INVITE") || MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_delete_early_dialog (jd); if (MSG_TEST_CODE (sip, 401) || MSG_TEST_CODE (sip, 407)) jd->d_STATE = JD_AUTH_REQUIRED; else jd->d_STATE = JD_CLIENTERROR; }}static voidcb_rcv5xx (int type, osip_transaction_t * tr, osip_message_t * sip){ eXosip_dialog_t *jd; eXosip_call_t *jc; eXosip_subscribe_t *js; eXosip_notify_t *jn; jinfo_t *jinfo = (jinfo_t *) osip_transaction_get_your_instance (tr); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO3, NULL, "cb_rcv5xx (id=%i)\r\n", tr->transactionid)); udp_tl_learn_port_from_via(sip); if (MSG_IS_RESPONSE_FOR (sip, "PUBLISH")) { eXosip_pub_t *pub; eXosip_event_t *je; int i; i = _eXosip_pub_update (&pub, tr, sip); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "cb_rcv3xx (id=%i) No publication to update\r\n", tr->transactionid)); } je = eXosip_event_init_for_message (EXOSIP_MESSAGE_SERVERFAILURE, tr); report_event (je, sip); return; } else if (MSG_IS_RESPONSE_FOR (sip, "REGISTER")) { rcvregister_failure (tr, sip); return; } if (jinfo == NULL) return; jd = jinfo->jd; jc = jinfo->jc; jn = jinfo->jn; js = jinfo->js; if (MSG_IS_RESPONSE_FOR (sip, "INVITE")) { report_call_event (EXOSIP_CALL_SERVERFAILURE, jc, jd, tr); } else if (MSG_IS_RESPONSE_FOR (sip, "NOTIFY") && jn!=NULL) { eXosip_event_t *je; je = eXosip_event_init_for_notify (EXOSIP_NOTIFICATION_REQUESTFAILURE, jn, jd, tr); report_event (je, sip); } else if (MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_event_t *je; je = eXosip_event_init_for_subscribe (EXOSIP_SUBSCRIPTION_SERVERFAILURE, js, jd, tr); report_event (je, sip); } else if (jc != NULL) { report_call_event (EXOSIP_CALL_MESSAGE_SERVERFAILURE, jc, jd, tr); return; } else if (jc == NULL && js == NULL && jn == NULL) { eXosip_event_t *je; /* For all requests outside of calls */ je = eXosip_event_init_for_message (EXOSIP_MESSAGE_SERVERFAILURE, tr); report_event (je, sip); return; } if (jd == NULL) return; if (MSG_IS_RESPONSE_FOR (sip, "INVITE") || MSG_IS_RESPONSE_FOR (sip, "SUBSCRIBE")) { eXosip_delete_early_dialog (jd); jd->d_STATE = JD_SERVERERROR; }}static voidcb_rcv6xx (int type, osip_transaction_t * tr, osip_message_t * sip){ eXosip_dialog_t *jd; eXosip_call_t *jc; eXosip_subscribe_t *js; eXosip_notify_t *jn; jinfo_t *jinfo = (jinfo_t *) osip_transaction_get_your_instance (tr); udp_tl_learn_port_from_via(sip);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -