📄 excall_api.c
字号:
} transaction = NULL; if (0 == osip_strcasecmp (method, "INVITE")) { transaction = eXosip_find_last_invite (jc, jd); } else /* OPTIONS, UPDATE, INFO, REFER, ?... */ { transaction = eXosip_find_last_transaction (jc, jd, method); } if (transaction != NULL) { if (0 != osip_strcasecmp (method, "INVITE")) { if (transaction->state != NICT_TERMINATED && transaction->state != NIST_TERMINATED && transaction->state != NICT_COMPLETED && transaction->state != NIST_COMPLETED) return OSIP_WRONG_STATE; } else { if (transaction->state != ICT_TERMINATED && transaction->state != IST_TERMINATED && transaction->state != IST_CONFIRMED && transaction->state != ICT_COMPLETED) return OSIP_WRONG_STATE; } } i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog, eXosip.transport); if (i != 0) return i; eXosip_add_authentication_information (*request, NULL); return OSIP_SUCCESS;}inteXosip_call_send_request (int jid, osip_message_t * request){ eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *transaction; osip_event_t *sipevent; int i; if (request == NULL) return OSIP_BADPARAMETER; if (jid <= 0) { osip_message_free (request); return OSIP_BADPARAMETER; } if (request->sip_method == NULL) { osip_message_free (request); return OSIP_BADPARAMETER; } if (jid > 0) { eXosip_call_dialog_find (jid, &jc, &jd); } if (jd == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here?\n")); osip_message_free (request); return OSIP_NOTFOUND; } transaction = NULL; if (0 == osip_strcasecmp (request->sip_method, "INVITE")) { transaction = eXosip_find_last_invite (jc, jd); } else /* OPTIONS, UPDATE, INFO, REFER, ?... */ { transaction = eXosip_find_last_transaction (jc, jd, request->sip_method); } if (transaction != NULL) { if (0 != osip_strcasecmp (request->sip_method, "INVITE")) { if (transaction->state != NICT_TERMINATED && transaction->state != NIST_TERMINATED && transaction->state != NICT_COMPLETED && transaction->state != NIST_COMPLETED) { osip_message_free (request); return OSIP_WRONG_STATE; } } else { if (transaction->state != ICT_TERMINATED && transaction->state != IST_TERMINATED && transaction->state != IST_CONFIRMED && transaction->state != ICT_COMPLETED) { osip_message_free (request); return OSIP_WRONG_STATE; } } } transaction = NULL; if (0 != osip_strcasecmp (request->sip_method, "INVITE")) { i = _eXosip_transaction_init (&transaction, NICT, eXosip.j_osip, request); } else { i = _eXosip_transaction_init (&transaction, ICT, eXosip.j_osip, request); } if (i != 0) { osip_message_free (request); return i; } osip_list_add (jd->d_out_trs, transaction, 0); sipevent = osip_new_outgoing_sipmessage (request); sipevent->transactionid = transaction->transactionid;#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_transaction_add_event (transaction, sipevent); __eXosip_wakeup (); return OSIP_SUCCESS;}#ifndef MINISIZEinteXosip_call_build_refer (int did, const char *refer_to, osip_message_t ** request){ int i; *request = NULL; i = eXosip_call_build_request (did, "REFER", request); if (i != 0) return i; if (refer_to == NULL || refer_to[0] == '\0') return OSIP_SUCCESS; osip_message_set_header (*request, "Refer-to", refer_to); return OSIP_SUCCESS;}inteXosip_call_build_options (int did, osip_message_t ** request){ int i; *request = NULL; i = eXosip_call_build_request (did, "OPTIONS", request); if (i != 0) return i; return OSIP_SUCCESS;}inteXosip_call_build_info (int did, osip_message_t ** request){ int i; *request = NULL; i = eXosip_call_build_request (did, "INFO", request); if (i != 0) return i; return OSIP_SUCCESS;}inteXosip_call_build_update (int did, osip_message_t ** request){ int i; *request = NULL; i = eXosip_call_build_request (did, "UPDATE", request); if (i != 0) return i; return OSIP_SUCCESS;}inteXosip_call_build_notify (int did, int subscription_status, osip_message_t ** request){ char subscription_state[50]; char *tmp; int i; *request = NULL; i = eXosip_call_build_request (did, "NOTIFY", request); if (i != 0) return i; if (subscription_status == EXOSIP_SUBCRSTATE_PENDING) osip_strncpy (subscription_state, "pending;expires=", 16); else if (subscription_status == EXOSIP_SUBCRSTATE_ACTIVE) osip_strncpy (subscription_state, "active;expires=", 15); else if (subscription_status == EXOSIP_SUBCRSTATE_TERMINATED) { int reason = NORESOURCE; if (reason == DEACTIVATED) osip_strncpy (subscription_state, "terminated;reason=deactivated", 29); else if (reason == PROBATION) osip_strncpy (subscription_state, "terminated;reason=probation", 27); else if (reason == REJECTED) osip_strncpy (subscription_state, "terminated;reason=rejected", 26); else if (reason == TIMEOUT) osip_strncpy (subscription_state, "terminated;reason=timeout", 25); else if (reason == GIVEUP) osip_strncpy (subscription_state, "terminated;reason=giveup", 24); else if (reason == NORESOURCE) osip_strncpy (subscription_state, "terminated;reason=noresource", 29); } tmp = subscription_state + strlen (subscription_state); if (subscription_status != EXOSIP_SUBCRSTATE_TERMINATED) sprintf (tmp, "%i", 180); osip_message_set_header (*request, "Subscription-State", subscription_state); return OSIP_SUCCESS;}#endifinteXosip_call_build_answer (int tid, int status, osip_message_t ** answer){ int i = -1; eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr = NULL; *answer = NULL; if (tid < 0) return OSIP_BADPARAMETER; if (status <= 100) return OSIP_BADPARAMETER; if (status > 699) return OSIP_BADPARAMETER; if (tid > 0) { _eXosip_call_transaction_find (tid, &jc, &jd, &tr); } if (tr == NULL || jd == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here?\n")); return OSIP_NOTFOUND; } if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) { i = _eXosip_answer_invite_123456xx (jc, jd, status, answer, 0); } else { if (jd != NULL) i = _eXosip_build_response_default (answer, jd->d_dialog, status, tr->orig_request); else i = _eXosip_build_response_default (answer, NULL, status, tr->orig_request); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "ERROR: Could not create response for %s\n", tr->orig_request->sip_method)); return i; } if (status > 100 && status < 300) i = complete_answer_that_establish_a_dialog (*answer, tr->orig_request); } if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "ERROR: Could not create response for %s\n", tr->orig_request->sip_method)); return i; } return OSIP_SUCCESS;}inteXosip_call_send_answer (int tid, int status, osip_message_t * answer){ eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr = NULL; osip_event_t *evt_answer; if (tid < 0) { osip_message_free (answer); return OSIP_BADPARAMETER; } if (status <= 100) { osip_message_free (answer); return OSIP_BADPARAMETER; } if (status > 699) { osip_message_free (answer); return OSIP_BADPARAMETER; } if (tid > 0) { _eXosip_call_transaction_find (tid, &jc, &jd, &tr); } if (jd == NULL || tr == NULL || tr->orig_request == NULL || tr->orig_request->sip_method == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here or no transaction for call\n")); osip_message_free (answer); return OSIP_NOTFOUND; } if (answer == NULL) { if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) { if (status >= 200 && status <= 299) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: Wrong parameter?\n")); osip_message_free (answer); return OSIP_BADPARAMETER; } } } /* is the transaction already answered? */ if (tr->state == IST_COMPLETED || tr->state == IST_CONFIRMED || tr->state == IST_TERMINATED || tr->state == NIST_COMPLETED || tr->state == NIST_TERMINATED) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: transaction already answered\n")); osip_message_free (answer); return OSIP_WRONG_STATE; } if (answer == NULL) { if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) { osip_message_t *response; return _eXosip_answer_invite_123456xx (jc, jd, status, &response, 1); } osip_message_free (answer); return OSIP_BADPARAMETER; } if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) { if (MSG_IS_STATUS_2XX (answer) && jd != NULL) { if (status >= 200 && status < 300 && jd != NULL) { eXosip_dialog_set_200ok (jd, answer); /* wait for a ACK */ osip_dialog_set_state (jd->d_dialog, DIALOG_CONFIRMED); } } } evt_answer = osip_new_outgoing_sipmessage (answer); evt_answer->transactionid = tr->transactionid; osip_transaction_add_event (tr, evt_answer); eXosip_update (); __eXosip_wakeup (); return OSIP_SUCCESS;}inteXosip_call_terminate (int cid, int did){ int i; osip_transaction_t *tr; osip_message_t *request = NULL; eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; if (did <= 0 && cid <= 0) return OSIP_BADPARAMETER; if (did > 0) { eXosip_call_dialog_find (did, &jc, &jd); if (jd == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here?\n")); return OSIP_NOTFOUND; } } else { eXosip_call_find (cid, &jc); } if (jc == NULL) { return OSIP_NOTFOUND; } tr = eXosip_find_last_out_invite (jc, jd); if (jd != NULL && jd->d_dialog != NULL && jd->d_dialog->state == DIALOG_CONFIRMED) { /* don't send CANCEL on re-INVITE: send BYE instead */ } else if (tr != NULL && tr->last_response != NULL && MSG_IS_STATUS_1XX (tr->last_response)) { i = generating_cancel (&request, tr->orig_request); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot terminate this call!\n")); return i; } i = eXosip_create_cancel_transaction (jc, jd, request); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot initiate SIP transaction!\n")); return i; } if (jd != NULL) { osip_dialog_free (jd->d_dialog); jd->d_dialog = NULL; eXosip_update (); /* AMD 30/09/05 */ } return OSIP_SUCCESS; } if (jd == NULL || jd->d_dialog == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No established dialog!\n")); return OSIP_WRONG_STATE; } if (tr == NULL) { /*this may not be enough if it's a re-INVITE! */ tr = eXosip_find_last_inc_invite (jc, jd); if (tr != NULL && tr->last_response != NULL && MSG_IS_STATUS_1XX (tr->last_response)) { /* answer with 603 */ osip_generic_param_t *to_tag; osip_from_param_get_byname (tr->orig_request->to, "tag", &to_tag); i = eXosip_call_send_answer (tr->transactionid, 603, NULL); if (to_tag == NULL) return i; } } if (jd->d_dialog == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot terminate this call!\n")); return OSIP_WRONG_STATE; } i = generating_bye (&request, jd->d_dialog, eXosip.transport); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot terminate this call!\n")); return i; } eXosip_add_authentication_information (request, NULL); i = eXosip_create_transaction (jc, jd, request); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: cannot initiate SIP transaction!\n")); return i; } osip_dialog_free (jd->d_dialog); jd->d_dialog = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -