static int _eXosip_retry_invite_with_auth (eXosip_event_t * je) { eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; int *retry = NULL; osip_transaction_t *tr=NULL; _eXosip_call_transaction_find (je->tid, &jc, &jd, &tr); if (jc==NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: call dialog not found\n")); return -1; } if (jd && jd->d_dialog) retry = &jd->d_retry; else retry = &jc->c_retry; if (*retry < 3) { (*retry)++; return _eXosip_call_retry_request(jc, jd, tr); } return -1; }
int eXosip_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; }
static int _eXosip_redirect_invite (eXosip_event_t * je) { eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr=NULL; _eXosip_call_transaction_find (je->tid, &jc, &jd, &tr); if (jc==NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: call dialog not found\n")); return -1; } return _eXosip_call_retry_request (jc, jd, tr); }
sdp_message_t * eXosip_get_local_sdp_from_tid (struct eXosip_t * excontext, int tid) { eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr = NULL; if (tid > 0) { _eXosip_call_transaction_find (excontext, tid, &jc, &jd, &tr); } if (jc == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No call here?\n")); return NULL; } if (tr == NULL) return NULL; return _eXosip_get_local_sdp (tr); }
int eXosip_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; }
int eXosip_call_send_prack (int tid, osip_message_t * prack) { eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr = NULL; osip_event_t *sipevent; int i; if (tid < 0) return OSIP_BADPARAMETER; if (prack == NULL) return OSIP_BADPARAMETER; if (tid > 0) { _eXosip_call_transaction_find (tid, &jc, &jd, &tr); } if (jc == NULL || jd == NULL || jd->d_dialog == 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 (prack); return OSIP_NOTFOUND; } if (0 != osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) { osip_message_free (prack); return OSIP_BADPARAMETER; } /* PRACK are only send in the PROCEEDING state */ if (tr->state != ICT_PROCEEDING) { osip_message_free (prack); return OSIP_WRONG_STATE; } tr = NULL; i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, prack); if (i != 0) { osip_message_free (prack); return i; } jd->d_mincseq++; osip_list_add (jd->d_out_trs, tr, 0); sipevent = osip_new_outgoing_sipmessage (prack); sipevent->transactionid = tr->transactionid; #ifndef MINISIZE osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (jc, jd, NULL, NULL)); #else osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (jc, jd)); #endif osip_transaction_add_event (tr, sipevent); __eXosip_wakeup (); return OSIP_SUCCESS; }
int eXosip_call_build_prack (int tid, osip_message_t ** prack) { eXosip_dialog_t *jd = NULL; eXosip_call_t *jc = NULL; osip_transaction_t *tr = NULL; osip_header_t *rseq; char *transport; int i; *prack = NULL; if (tid < 0) return OSIP_BADPARAMETER; if (tid > 0) { _eXosip_call_transaction_find (tid, &jc, &jd, &tr); } if (jc == NULL || jd == NULL || jd->d_dialog == 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")); return OSIP_NOTFOUND; } if (0 != osip_strcasecmp (tr->orig_request->sip_method, "INVITE")) return OSIP_BADPARAMETER; /* PRACK are only send in the PROCEEDING state */ if (tr->state != ICT_PROCEEDING) return OSIP_WRONG_STATE; if (tr->orig_request->cseq == NULL || tr->orig_request->cseq->number == NULL || tr->orig_request->cseq->method == NULL) return OSIP_SYNTAXERROR; transport = NULL; if (tr != NULL && tr->orig_request != NULL) transport = _eXosip_transport_protocol (tr->orig_request); if (transport == NULL) i = _eXosip_build_request_within_dialog (prack, "PRACK", jd->d_dialog, "UDP"); else i = _eXosip_build_request_within_dialog (prack, "PRACK", jd->d_dialog, transport); if (i != 0) return i; osip_message_header_get_byname (tr->last_response, "RSeq", 0, &rseq); if (rseq != NULL && rseq->hvalue != NULL) { char tmp[128]; memset (tmp, '\0', sizeof (tmp)); snprintf (tmp, 127, "%s %s %s", rseq->hvalue, tr->orig_request->cseq->number, tr->orig_request->cseq->method); osip_message_set_header (*prack, "RAck", tmp); } return OSIP_SUCCESS; }