📄 exinsubscription_api.c
字号:
transaction = eXosip_find_last_out_notify (jn, jd); if (transaction != NULL) { if (transaction->state != NICT_TERMINATED && transaction->state != NIST_TERMINATED && transaction->state != NICT_COMPLETED && transaction->state != NIST_COMPLETED) return OSIP_WRONG_STATE; } transport = NULL; if (transaction == NULL) transaction = jn->n_inc_tr; if (transaction != NULL && transaction->orig_request != NULL) transport = _eXosip_transport_protocol (transaction->orig_request); transaction = NULL; if (transport == NULL) i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog, "UDP"); else i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog, transport); if (i != 0) return i; return OSIP_SUCCESS;}inteXosip_insubscription_send_request (int did, osip_message_t * request){ eXosip_dialog_t *jd = NULL; eXosip_notify_t *jn = NULL; osip_transaction_t *transaction; osip_event_t *sipevent; int i; if (request == NULL) return OSIP_BADPARAMETER; if (did <= 0) { osip_message_free (request); return OSIP_BADPARAMETER; } if (did > 0) { eXosip_notify_dialog_find (did, &jn, &jd); } if (jd == NULL || jn == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No incoming subscription here?\n")); osip_message_free (request); return OSIP_NOTFOUND; } transaction = NULL; transaction = eXosip_find_last_out_notify (jn, jd); if (transaction != NULL) { 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; } transaction = NULL; } i = _eXosip_transaction_init (&transaction, NICT, 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; osip_transaction_set_your_instance (transaction, __eXosip_new_jinfo (NULL, jd, NULL, jn)); osip_transaction_add_event (transaction, sipevent); __eXosip_wakeup (); return OSIP_SUCCESS;}int_eXosip_insubscription_send_request_with_credential (eXosip_notify_t * jn, eXosip_dialog_t * jd, osip_transaction_t * out_tr){ osip_transaction_t *tr = NULL; osip_message_t *msg = NULL; osip_event_t *sipevent; int cseq; osip_via_t *via; int i; if (jn == NULL) return OSIP_BADPARAMETER; if (jd != NULL) { if (jd->d_out_trs == NULL) return OSIP_BADPARAMETER; } if (out_tr == NULL) { out_tr = eXosip_find_last_out_notify (jn, jd); } if (out_tr == NULL || out_tr->orig_request == NULL || out_tr->last_response == NULL) return OSIP_NOTFOUND; i = osip_message_clone (out_tr->orig_request, &msg); if (i != 0) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: could not clone msg for authentication\n")); return i; } via = (osip_via_t *) osip_list_get (&msg->vias, 0); if (via == NULL || msg->cseq == NULL || msg->cseq->number == NULL) { osip_message_free (msg); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: missing via or cseq header\n")); return OSIP_SYNTAXERROR; } /* increment cseq */ cseq = atoi (msg->cseq->number); osip_free (msg->cseq->number); msg->cseq->number = strdup_printf ("%i", cseq + 1); if (msg->cseq->number == NULL) { osip_message_free (msg); return OSIP_NOMEM; } if (jd != NULL && jd->d_dialog != NULL) { jd->d_dialog->local_cseq++; } i = eXosip_update_top_via (msg); if (i != 0) { osip_message_free (msg); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: unsupported protocol\n")); return i; } if (out_tr->last_response->status_code == 401 || out_tr->last_response->status_code == 407) eXosip_add_authentication_information (msg, out_tr->last_response); else eXosip_add_authentication_information (msg, NULL); osip_message_force_update (msg); i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, msg); if (i != 0) { osip_message_free (msg); return i; } /* add the new tr for the current dialog */ osip_list_add (jd->d_out_trs, tr, 0); sipevent = osip_new_outgoing_sipmessage (msg); osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (NULL, jd, NULL, jn)); osip_transaction_add_event (tr, sipevent); eXosip_update (); /* fixed? */ __eXosip_wakeup (); return OSIP_SUCCESS;}int_eXosip_insubscription_auto_send_notify (int did, int subscription_status, int subscription_reason){ osip_message_t *notify; int i; char xml[4096]; char *entity; eXosip_call_t *jc; eXosip_dialog_t *jd; if (did <= 0) return OSIP_BADPARAMETER; i = eXosip_insubscription_build_notify (did, subscription_status, subscription_reason, ¬ify); if (i != 0) { return i; } /* build dialog xml state */ memset (xml, 0, sizeof (xml)); i = osip_uri_to_str (notify->from->url, &entity); if (i != 0 || entity == NULL) { osip_message_free (notify); return i; } snprintf (xml, sizeof (xml), "<?xml version=\"1.0\"?>" "\r\n" "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\"" "\r\n" " version=\"2\" state=\"full\"" "\r\n" " entity=\"%s\">" "\r\n", entity); osip_free (entity); /* loop over all jc/jd */ for (jc = eXosip.j_calls; jc != NULL; jc = jc->next) { for (jd = jc->c_dialogs; jd != NULL; jd = jd->next) { if (jd->d_dialog == NULL) /* finished call */ { } else { char tmp_dialog[2048]; char direction[20]; char dlg_state[20]; char *remote_uri = NULL; if (jd->d_dialog->type == CALLER) strcpy (direction, "initiator"); else strcpy (direction, "recipient"); if (jd->d_dialog->state == DIALOG_CONFIRMED) strcpy (dlg_state, "confirmed"); else strcpy (dlg_state, "early"); if (jd->d_dialog->remote_uri != NULL && jd->d_dialog->remote_uri->url != NULL) { osip_uri_to_str (jd->d_dialog->remote_uri->url, &remote_uri); } if (remote_uri != NULL) { /* add dialog info */ snprintf (tmp_dialog, sizeof (tmp_dialog), " <dialog id=\"%s\" call-id=\"%s\"" "\r\n" " local-tag=\"%s\" remote-tag=\"%s\"" "\r\n" " direction=\"%s\">" "\r\n" " <state>%s</state>" "\r\n" " <remote>" "\r\n" " <identity>%s</identity>" "\r\n" " </remote>" "\r\n" " </dialog>" "\r\n", jd-> d_dialog-> call_id, jd-> d_dialog-> call_id, jd-> d_dialog-> local_tag, jd-> d_dialog-> remote_tag, direction, dlg_state, remote_uri); strcat (xml, tmp_dialog); } } } } strcat (xml, "</dialog-info>" "\r\n"); osip_message_set_content_type (notify, "application/dialog-info+xml"); osip_message_set_body (notify, xml, strlen (xml)); return eXosip_insubscription_send_request (did, notify);}inteXosip_insubscription_automatic (eXosip_event_t * evt){ eXosip_dialog_t *jd = NULL; eXosip_notify_t *jn = NULL; osip_header_t *event_header; if (evt->did <= 0 || evt->nid <= 0) return OSIP_BADPARAMETER; if (evt->request == NULL) return OSIP_BADPARAMETER; eXosip_notify_dialog_find (evt->did, &jn, &jd); if (jd == NULL || jn == NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: No incoming subscription here?\n")); return OSIP_NOTFOUND; } osip_message_header_get_byname (evt->request, "event", 0, &event_header); if (event_header == NULL || event_header->hvalue == NULL) { eXosip_insubscription_send_answer (evt->tid, 400, NULL); return OSIP_SUCCESS; } /* this event should be handled internally */ if (osip_strcasecmp (event_header->hvalue, "dialog") == 0) { /* send 200 ok to SUBSCRIBEs */ if (evt->type == EXOSIP_IN_SUBSCRIPTION_NEW) { osip_message_t *answer; int i; i = eXosip_insubscription_build_answer (evt->tid, 202, &answer); if (i == 0) { i = eXosip_insubscription_send_answer (evt->tid, 202, answer); } if (i != 0) { i = eXosip_insubscription_send_answer (evt->tid, 400, NULL); return OSIP_SUCCESS; } /* send initial notify */ i = _eXosip_insubscription_auto_send_notify (evt->did, EXOSIP_SUBCRSTATE_ACTIVE, PROBATION); if (i != 0) { /* delete subscription... */ return OSIP_SUCCESS; } } } else { if (evt->type == EXOSIP_IN_SUBSCRIPTION_NEW) { eXosip_insubscription_send_answer (evt->tid, 489, NULL); } } return OSIP_SUCCESS;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -