📄 jrequest.c
字号:
if (i != 0) return i; i = osip_message_set_route (request, last_route); osip_free (last_route); if (i != 0) { return i; } /* route header and req_uri set */ return OSIP_SUCCESS;}int_eXosip_build_request_within_dialog (osip_message_t ** dest, const char *method, osip_dialog_t * dialog, const char *transport){ int i; osip_message_t *request; char locip[65]; char firewall_ip[65]; char firewall_port[10]; *dest = NULL; if (dialog == NULL) return OSIP_BADPARAMETER; if (eXosip.eXtl == NULL) return OSIP_NO_NETWORK; firewall_ip[0] = '\0'; firewall_port[0] = '\0'; if (eXosip.eXtl->tl_get_masquerade_contact != NULL) { eXosip.eXtl->tl_get_masquerade_contact (firewall_ip, sizeof (firewall_ip), firewall_port, sizeof (firewall_port)); } i = osip_message_init (&request); if (i != 0) return i; if (dialog->remote_contact_uri == NULL) { /* this dialog is probably not established! or the remote UA is not compliant with the latest RFC */ osip_message_free (request); return OSIP_SYNTAXERROR; } memset (locip, '\0', sizeof (locip)); eXosip_guess_ip_for_via (eXosip.eXtl->proto_family, locip, 49); if (locip[0] == '\0') { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, "eXosip: no default interface defined\n")); osip_message_free (request); return OSIP_NO_NETWORK; } /* prepare the request-line */ request->sip_method = osip_strdup (method); if (request->sip_method == NULL) { osip_message_free (request); return OSIP_NOMEM; } request->sip_version = osip_strdup ("SIP/2.0"); if (request->sip_version == NULL) { osip_message_free (request); return OSIP_NOMEM; } request->status_code = 0; request->reason_phrase = NULL; /* and the request uri???? */ if (osip_list_eol (&dialog->route_set, 0)) { /* The UAC must put the remote target URI (to field) in the req_uri */ i = osip_uri_clone (dialog->remote_contact_uri->url, &(request->req_uri)); if (i != 0) { osip_message_free (request); return i; } } else { /* fill the request-uri, and the route headers. */ i = dialog_fill_route_set (dialog, request); if (i != 0) { osip_message_free (request); return i; } } /* To and From already contains the proper tag! */ i = osip_to_clone (dialog->remote_uri, &(request->to)); if (i != 0) { osip_message_free (request); return i; } i = osip_from_clone (dialog->local_uri, &(request->from)); if (i != 0) { osip_message_free (request); return i; } /* set the cseq and call_id header */ osip_message_set_call_id (request, dialog->call_id); if (0 == strcmp ("ACK", method)) { osip_cseq_t *cseq; char *tmp; i = osip_cseq_init (&cseq); if (i != 0) { osip_message_free (request); return i; } tmp = osip_malloc (20); if (tmp == NULL) { osip_message_free (request); return OSIP_NOMEM; } sprintf (tmp, "%i", dialog->local_cseq); osip_cseq_set_number (cseq, tmp); osip_cseq_set_method (cseq, osip_strdup (method)); request->cseq = cseq; } else { osip_cseq_t *cseq; char *tmp; i = osip_cseq_init (&cseq); if (i != 0) { osip_message_free (request); return i; } dialog->local_cseq++; /* we should we do that?? */ tmp = osip_malloc (20); if (tmp == NULL) { osip_message_free (request); return OSIP_NOMEM; } sprintf (tmp, "%i", dialog->local_cseq); osip_cseq_set_number (cseq, tmp); osip_cseq_set_method (cseq, osip_strdup (method)); request->cseq = cseq; } /* always add the Max-Forward header */ osip_message_set_max_forwards (request, "70"); /* a UA should start a request with 70 */ i = _eXosip_request_add_via (request, transport, locip); if (i != 0) { osip_message_free (request); return i; } /* add specific headers for each kind of request... */ { char contact[200]; if (firewall_ip[0] != '\0') { char *c_address = request->req_uri->host; struct addrinfo *addrinfo; struct __eXosip_sockaddr addr; i = eXosip_get_addrinfo (&addrinfo, request->req_uri->host, 5060, IPPROTO_UDP); if (i == 0) { memcpy (&addr, addrinfo->ai_addr, addrinfo->ai_addrlen); eXosip_freeaddrinfo (addrinfo); c_address = inet_ntoa (((struct sockaddr_in *) &addr)->sin_addr); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO1, NULL, "eXosip: here is the resolved destination host=%s\n", c_address)); } if (eXosip_is_public_address (c_address)) { sprintf (contact, "<sip:%s@%s:%s>", dialog->local_uri->url->username, firewall_ip, firewall_port); } else { sprintf (contact, "<sip:%s@%s:%s>", dialog->local_uri->url->username, locip, firewall_port); } } else { sprintf (contact, "<sip:%s@%s:%s>", dialog->local_uri->url->username, locip, firewall_port); } osip_message_set_contact (request, contact); /* Here we'll add the supported header if it's needed! */ /* the require header must be added by the upper layer if needed */ } if (0 == strcmp ("NOTIFY", method)) { } else if (0 == strcmp ("INFO", method)) { } else if (0 == strcmp ("OPTIONS", method)) { osip_message_set_accept (request, "application/sdp"); } else if (0 == strcmp ("ACK", method)) { /* The ACK MUST contains the same credential than the INVITE!! */ /* TODO... */ } osip_message_set_user_agent (request, eXosip.user_agent); /* else if ... */ *dest = request; return OSIP_SUCCESS;}/* this request is only build within a dialog!! */intgenerating_bye (osip_message_t ** bye, osip_dialog_t * dialog, char *transport){ int i; i = _eXosip_build_request_within_dialog (bye, "BYE", dialog, transport); if (i != 0) return i; return OSIP_SUCCESS;}/* It is RECOMMENDED to only cancel INVITE request */intgenerating_cancel (osip_message_t ** dest, osip_message_t * request_cancelled){ int i; osip_message_t *request; i = osip_message_init (&request); if (i != 0) return i; /* prepare the request-line */ osip_message_set_method (request, osip_strdup ("CANCEL")); osip_message_set_version (request, osip_strdup ("SIP/2.0")); osip_message_set_status_code (request, 0); osip_message_set_reason_phrase (request, NULL); i = osip_uri_clone (request_cancelled->req_uri, &(request->req_uri)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_to_clone (request_cancelled->to, &(request->to)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_from_clone (request_cancelled->from, &(request->from)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } /* set the cseq and call_id header */ i = osip_call_id_clone (request_cancelled->call_id, &(request->call_id)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_cseq_clone (request_cancelled->cseq, &(request->cseq)); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_free (request->cseq->method); request->cseq->method = osip_strdup ("CANCEL"); if (request->cseq->method == NULL) { osip_message_free (request); *dest = NULL; return OSIP_NOMEM; } /* copy ONLY the top most Via Field (this method is also used by proxy) */ { osip_via_t *via; osip_via_t *via2; i = osip_message_get_via (request_cancelled, 0, &via); if (i < 0) { osip_message_free (request); *dest = NULL; return i; } i = osip_via_clone (via, &via2); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_list_add (&request->vias, via2, -1); } /* add the same route-set than in the previous request */ { int pos = 0; osip_route_t *route; osip_route_t *route2; while (!osip_list_eol (&request_cancelled->routes, pos)) { route = (osip_route_t *) osip_list_get (&request_cancelled->routes, pos); i = osip_route_clone (route, &route2); if (i != 0) { osip_message_free (request); *dest = NULL; return i; } osip_list_add (&request->routes, route2, -1); pos++; } } osip_message_set_max_forwards (request, "70"); /* a UA should start a request with 70 */ osip_message_set_user_agent (request, eXosip.user_agent); *dest = request; return OSIP_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -