⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jrequest.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -