void eXosip_dialog_free (eXosip_dialog_t * jd) { while (!osip_list_eol (jd->d_inc_trs, 0)) { osip_transaction_t *tr; tr = (osip_transaction_t *) osip_list_get (jd->d_inc_trs, 0); osip_list_remove (jd->d_inc_trs, 0); __eXosip_delete_jinfo (tr); osip_list_add (eXosip.j_transactions, tr, 0); } while (!osip_list_eol (jd->d_out_trs, 0)) { osip_transaction_t *tr; tr = (osip_transaction_t *) osip_list_get (jd->d_out_trs, 0); osip_list_remove (jd->d_out_trs, 0); __eXosip_delete_jinfo (tr); osip_list_add (eXosip.j_transactions, tr, 0); } osip_message_free (jd->d_200Ok); osip_message_free (jd->d_ack); osip_dialog_free (jd->d_dialog); osip_free (jd->d_out_trs); osip_free (jd->d_inc_trs); osip_free (jd); eXosip_update (); }
void eXosip_subscribe_free (eXosip_subscribe_t * js) { /* ... */ eXosip_dialog_t *jd; if (js->s_inc_tr != NULL && js->s_inc_tr->orig_request != NULL && js->s_inc_tr->orig_request->call_id != NULL && js->s_inc_tr->orig_request->call_id->number != NULL) _eXosip_delete_nonce (js->s_inc_tr->orig_request->call_id->number); else if (js->s_out_tr != NULL && js->s_out_tr->orig_request != NULL && js->s_out_tr->orig_request->call_id != NULL && js->s_out_tr->orig_request->call_id->number != NULL) _eXosip_delete_nonce (js->s_out_tr->orig_request->call_id->number); for (jd = js->s_dialogs; jd != NULL; jd = js->s_dialogs) { REMOVE_ELEMENT (js->s_dialogs, jd); eXosip_dialog_free (jd); } __eXosip_delete_jinfo (js->s_inc_tr); __eXosip_delete_jinfo (js->s_out_tr); if (js->s_inc_tr != NULL) osip_list_add (&eXosip.j_transactions, js->s_inc_tr, 0); if (js->s_out_tr != NULL) osip_list_add (&eXosip.j_transactions, js->s_out_tr, 0); osip_free (js); }
void eXosip_reg_free(eXosip_reg_t * jreg) { osip_free(jreg->r_aor); osip_free(jreg->r_contact); osip_free(jreg->r_registrar); if (jreg->r_last_tr != NULL) { if (jreg->r_last_tr != NULL && jreg->r_last_tr->orig_request != NULL && jreg->r_last_tr->orig_request->call_id != NULL && jreg->r_last_tr->orig_request->call_id->number != NULL) _eXosip_delete_nonce(jreg->r_last_tr->orig_request->call_id->number); if (jreg->r_last_tr->state == IST_TERMINATED || jreg->r_last_tr->state == ICT_TERMINATED || jreg->r_last_tr->state == NICT_TERMINATED || jreg->r_last_tr->state == NIST_TERMINATED) { OSIP_TRACE(osip_trace(__FILE__, __LINE__, OSIP_INFO1, NULL, "Release a terminated transaction\n")); __eXosip_delete_jinfo(jreg->r_last_tr); if (jreg->r_last_tr != NULL) osip_list_add(&eXosip.j_transactions, jreg->r_last_tr, 0); } else { OSIP_TRACE(osip_trace(__FILE__, __LINE__, OSIP_INFO1, NULL, "Release a non-terminated transaction\n")); __eXosip_delete_jinfo(jreg->r_last_tr); if (jreg->r_last_tr != NULL) osip_list_add(&eXosip.j_transactions, jreg->r_last_tr, 0); } } osip_free(jreg); }
void eXosip_call_free(eXosip_call_t *jc) { /* ... */ eXosip_dialog_t *jd; for (jd = jc->c_dialogs; jd!=NULL; jd=jc->c_dialogs) { REMOVE_ELEMENT(jc->c_dialogs, jd); eXosip_dialog_free(jd); } __eXosip_delete_jinfo(jc->c_inc_tr); __eXosip_delete_jinfo(jc->c_out_tr); if (jc->c_inc_tr!=NULL) osip_list_add_nodup(eXosip.j_transactions, jc->c_inc_tr, 0); if (jc->c_out_tr!=NULL) osip_list_add_nodup(eXosip.j_transactions, jc->c_out_tr, 0); __eXosip_delete_jinfo(jc->c_inc_options_tr); __eXosip_delete_jinfo(jc->c_out_options_tr); if (jc->c_inc_options_tr!=NULL) osip_list_add_nodup(eXosip.j_transactions, jc->c_inc_options_tr, 0); if (jc->c_out_options_tr!=NULL) osip_list_add_nodup(eXosip.j_transactions, jc->c_out_options_tr, 0); osip_negotiation_ctx_free(jc->c_ctx); osip_free(jc); }
void eXosip_reg_free(eXosip_reg_t *jreg) { osip_free(jreg->r_aor); osip_free(jreg->r_contact); osip_free(jreg->r_registrar); #if 0 osip_free(jreg->r_realms); #endif if (jreg->r_last_tr != NULL) { if (jreg->r_last_tr->state==IST_TERMINATED || jreg->r_last_tr->state==ICT_TERMINATED || jreg->r_last_tr->state== NICT_TERMINATED || jreg->r_last_tr->state==NIST_TERMINATED) { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_INFO1,NULL, "Release a terminated transaction\n")); __eXosip_delete_jinfo(jreg->r_last_tr); if (jreg->r_last_tr!=NULL) osip_list_add(eXosip.j_transactions, jreg->r_last_tr, 0); } else { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_INFO1,NULL, "Release a non-terminated transaction\n")); __eXosip_delete_jinfo(jreg->r_last_tr); if (jreg->r_last_tr!=NULL) osip_list_add(eXosip.j_transactions, jreg->r_last_tr, 0); } } osip_free(jreg); }
void eXosip_msg_free(eXosip_msg_t *jm) { __eXosip_delete_jinfo(jm->m_last_tr); if (jm->m_last_tr!=NULL) owsip_list_add_nodup(eXosip.j_transactions, jm->m_last_tr, 0); osip_free(jm); }
void eXosip_transaction_free(osip_transaction_t *tr) { eXosip_list_remove_element(eXosip.j_transactions, tr); __eXosip_delete_jinfo(tr); osip_remove_transaction(eXosip.j_osip, tr); osip_transaction_free2(tr); }
void eXosip_notify_free (eXosip_notify_t * jn) { /* ... */ eXosip_dialog_t *jd; for (jd = jn->n_dialogs; jd != NULL; jd = jn->n_dialogs) { REMOVE_ELEMENT (jn->n_dialogs, jd); eXosip_dialog_free (jd); } __eXosip_delete_jinfo (jn->n_inc_tr); __eXosip_delete_jinfo (jn->n_out_tr); if (jn->n_inc_tr != NULL) osip_list_add (eXosip.j_transactions, jn->n_inc_tr, 0); if (jn->n_out_tr != NULL) osip_list_add (eXosip.j_transactions, jn->n_out_tr, 0); osip_free (jn); }
void eXosip_subscribe_free(eXosip_subscribe_t *js) { /* ... */ eXosip_dialog_t *jd; for (jd = js->s_dialogs; jd!=NULL; jd=js->s_dialogs) { REMOVE_ELEMENT(js->s_dialogs, jd); eXosip_dialog_free(jd); } __eXosip_delete_jinfo(js->s_inc_tr); __eXosip_delete_jinfo(js->s_out_tr); if (js->s_inc_tr!=NULL) osip_list_add(eXosip.j_transactions, js->s_inc_tr, 0); if (js->s_out_tr!=NULL) osip_list_add(eXosip.j_transactions, js->s_out_tr, 0); osip_free(js); }
static int _eXosip_register_build_register (eXosip_reg_t * jr, osip_message_t ** _reg) { osip_message_t *reg = NULL; int i; reg = NULL; *_reg = NULL; if (jr->r_last_tr != NULL) { if (jr->r_last_tr->state != NICT_TERMINATED && jr->r_last_tr->state != NICT_COMPLETED) return -1; else { osip_message_t *last_response = NULL; osip_transaction_t *tr; osip_message_clone (jr->r_last_tr->orig_request, ®); if (reg == NULL) return -1; /* reg = jr->r_last_tr->orig_request; */ if (jr->r_last_tr->last_response != NULL) { osip_message_clone (jr->r_last_tr->last_response, &last_response); if (last_response == NULL) { osip_message_free (reg); return -1; } } __eXosip_delete_jinfo (jr->r_last_tr); tr = jr->r_last_tr; jr->r_last_tr = NULL; osip_list_add (eXosip.j_transactions, tr, 0); /* modify the REGISTER request */ { int osip_cseq_num = osip_atoi (reg->cseq->number); int length = strlen (reg->cseq->number); osip_list_special_free(®->authorizations, (void *(*)(void *)) &osip_authorization_free); osip_list_special_free(®->proxy_authorizations, (void *(*)(void *)) &osip_proxy_authorization_free); if (-1 == eXosip_update_top_via (reg)) { osip_message_free (reg); if (last_response != NULL) osip_message_free (last_response); return -1; } osip_cseq_num++; osip_free (reg->cseq->number); reg->cseq->number = (char *) osip_malloc (length + 2); /* +2 like for 9 to 10 */ sprintf (reg->cseq->number, "%i", osip_cseq_num); { osip_header_t *exp; osip_message_header_get_byname (reg, "expires", 0, &exp); if (exp!=NULL) { if (exp->hvalue!=NULL) osip_free (exp->hvalue); exp->hvalue = (char *) osip_malloc (10); snprintf (exp->hvalue, 9, "%i", jr->r_reg_period); } } osip_message_force_update (reg); } if (last_response != NULL) { if (last_response->status_code==401 || last_response->status_code==407) { eXosip_add_authentication_information (reg, last_response); } else eXosip_add_authentication_information (reg, NULL); osip_message_free (last_response); } } } if (reg == NULL) { i = generating_register (jr, ®, eXosip.transport, jr->r_aor, jr->r_registrar, jr->r_contact, jr->r_reg_period); if (i != 0) { return -2; } } *_reg = reg; return 0; }
static int _eXosip_register_build_register(eXosip_reg_t * jr, osip_message_t ** _reg) { osip_message_t *reg = NULL; int i; *_reg = NULL; if (jr == NULL) return OSIP_BADPARAMETER; if (jr->r_last_tr != NULL) { if (jr->r_last_tr->state != NICT_TERMINATED && jr->r_last_tr->state != NICT_COMPLETED) return OSIP_WRONG_STATE; else { osip_message_t *last_response = NULL; osip_transaction_t *tr; i = osip_message_clone(jr->r_last_tr->orig_request, ®); if (i != 0) return i; if (jr->r_last_tr->last_response != NULL) { i = osip_message_clone(jr->r_last_tr->last_response, &last_response); if (i != 0) { osip_message_free(reg); return i; } } __eXosip_delete_jinfo(jr->r_last_tr); tr = jr->r_last_tr; jr->r_last_tr = NULL; osip_list_add(&eXosip.j_transactions, tr, 0); /* modify the REGISTER request */ { int osip_cseq_num = osip_atoi(reg->cseq->number); int length = strlen(reg->cseq->number); osip_list_special_free(®->authorizations, (void (*)(void *)) &osip_authorization_free); osip_list_special_free(®->proxy_authorizations, (void (*)(void *)) &osip_proxy_authorization_free); i = eXosip_update_top_via(reg); if (i != 0) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return i; } osip_cseq_num++; osip_free(reg->cseq->number); reg->cseq->number = (char *) osip_malloc(length + 2); /* +2 like for 9 to 10 */ if (reg->cseq->number == NULL) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return OSIP_NOMEM; } snprintf(reg->cseq->number, length + 2, "%i", osip_cseq_num); if (last_response != NULL && last_response->status_code == 423) { /* increase expires value to "min-expires" value */ osip_header_t *exp; osip_header_t *min_exp; osip_message_header_get_byname(reg, "expires", 0, &exp); osip_message_header_get_byname(last_response, "min-expires", 0, &min_exp); if (exp != NULL && exp->hvalue != NULL && min_exp != NULL && min_exp->hvalue != NULL) { osip_free(exp->hvalue); exp->hvalue = osip_strdup(min_exp->hvalue); jr->r_reg_period = atoi(min_exp->hvalue); } else { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); OSIP_TRACE(osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: missing Min-Expires or Expires in REGISTER\n")); return OSIP_SYNTAXERROR; } } else { osip_header_t *exp; osip_message_header_get_byname(reg, "expires", 0, &exp); if (exp != NULL) { if (exp->hvalue != NULL) osip_free(exp->hvalue); exp->hvalue = (char *) osip_malloc(10); if (exp->hvalue == NULL) { osip_message_free(reg); if (last_response != NULL) osip_message_free(last_response); return OSIP_NOMEM; } snprintf(exp->hvalue, 9, "%i", jr->r_reg_period); } } osip_message_force_update(reg); } if (last_response != NULL) { if (last_response->status_code == 401 || last_response->status_code == 407) { eXosip_add_authentication_information(reg, last_response); } else eXosip_add_authentication_information(reg, NULL); osip_message_free(last_response); } } } if (reg == NULL) { i = generating_register(jr, ®, eXosip.transport, jr->r_aor, jr->r_registrar, jr->r_contact, jr->r_reg_period); if (i != 0) return i; } *_reg = reg; return OSIP_SUCCESS; }