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

📄 excall_api.c

📁 libosip2-3版本的osip源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
                   "eXosip: cannot terminate this call!\n"));      return -2;    }  if (jc->response_auth != NULL)    eXosip_add_authentication_information (request, jc->response_auth);  i = eXosip_create_transaction (jc, jd, request);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot initiate SIP transaction!\n"));      return -2;    }  osip_dialog_free (jd->d_dialog);  jd->d_dialog = NULL;  eXosip_update ();             /* AMD 30/09/05 */  return 0;}inteXosip_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)    {      _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 -1;    }  if (0 != osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))    return -1;  /* PRACK are only send in the PROCEEDING state */  if (tr->state != ICT_PROCEEDING)    return -1;  if (tr->orig_request->cseq == NULL      || tr->orig_request->cseq->number == NULL      || tr->orig_request->cseq->method == NULL)    return -1;  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 -2;  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 0;}inteXosip_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 (prack == NULL)    return -1;  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 -1;    }  if (0 != osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))    {      osip_message_free (prack);      return -1;    }  /* PRACK are only send in the PROCEEDING state */  if (tr->state != ICT_PROCEEDING)    {      osip_message_free (prack);      return -1;    }  tr = NULL;  i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, prack);  if (i != 0)    {      osip_message_free (prack);      return -2;    }  osip_list_add (jd->d_out_trs, tr, 0);  sipevent = osip_new_outgoing_sipmessage (prack);  sipevent->transactionid = tr->transactionid;  osip_transaction_set_your_instance (tr, __eXosip_new_jinfo (jc, jd, NULL, NULL));  osip_transaction_add_event (tr, sipevent);  __eXosip_wakeup ();  return 0;}int_eXosip_call_redirect_request (eXosip_call_t * jc,                               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;  osip_contact_t *co;  int pos;  int i;  int protocol = IPPROTO_UDP;  if (jc == NULL)    return -1;  if (jd != NULL)    {      if (jd->d_out_trs == NULL)        return -1;    }  if (out_tr == NULL      || out_tr->orig_request == NULL || out_tr->last_response == NULL)    return -1;  osip_message_clone (out_tr->orig_request, &msg);  if (msg == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: could not clone msg for authentication\n"));      return -1;    }  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 -1;    }  co = NULL;  pos = 0;  while (!osip_list_eol (&out_tr->last_response->contacts, pos))    {      co = (osip_contact_t *) osip_list_get (&out_tr->last_response->contacts, pos);      if (co != NULL && co->url != NULL)        {          /* check tranport? Only allow UDP, right now */          osip_uri_param_t *u_param;          int pos2;          u_param = NULL;          pos2 = 0;          while (!osip_list_eol (&co->url->url_params, pos2))            {              u_param =                (osip_uri_param_t *) osip_list_get (&co->url->url_params, pos2);              if (u_param == NULL || u_param->gname == NULL                  || u_param->gvalue == NULL)                {                  u_param = NULL;                  /* skip */              } else if (0 == osip_strcasecmp (u_param->gvalue, "transport"))                {                  if (0 == osip_strcasecmp (u_param->gvalue, "udp"))                    {#if 0                      /* remove the UDP parameter */                      osip_list_remove (co->url->url_params, pos2);                      osip_uri_param_free (u_param);#endif                      u_param = NULL;                      protocol = IPPROTO_UDP;                      break;    /* ok */                  } else if (0 == osip_strcasecmp (u_param->gvalue, "tcp"))                    {#if 0                      osip_list_remove (co->url->url_params, pos2);                      osip_uri_param_free (u_param);#endif                      protocol = IPPROTO_TCP;                      u_param = NULL;                    }                  break;                }              pos2++;            }          if (u_param == NULL || u_param->gname == NULL || u_param->gvalue == NULL)            {              break;            /* default is udp! */            }        }      pos++;      co = NULL;    }  if (co == NULL || co->url == NULL)    {      osip_message_free (msg);      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: contact header\n"));      return -1;    }  /* TODO:     remove extra parameter from new request-uri     check usual parameter like "transport"   */  /* replace request-uri with NEW contact address */  osip_uri_free (msg->req_uri);  msg->req_uri = NULL;  osip_uri_clone (co->url, &msg->req_uri);  /* increment cseq */  cseq = atoi (msg->cseq->number);  osip_free (msg->cseq->number);  msg->cseq->number = strdup_printf ("%i", cseq + 1);  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 -1;    }  eXosip_add_authentication_information (msg, out_tr->last_response);  osip_message_force_update (msg);  if (0 != osip_strcasecmp (msg->sip_method, "INVITE"))    {      i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, msg);  } else    {      i = _eXosip_transaction_init (&tr, ICT, eXosip.j_osip, msg);    }  if (i != 0)    {      osip_message_free (msg);      return -1;    }  if (out_tr == jc->c_out_tr)    {      /* replace with the new tr */      osip_list_add (eXosip.j_transactions, jc->c_out_tr, 0);      jc->c_out_tr = tr;      /* fix dialog issue */      if (jd != NULL)        {          REMOVE_ELEMENT (jc->c_dialogs, jd);          eXosip_dialog_free (jd);          jd = NULL;        }  } else    {      /* 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 (jc, jd, NULL, NULL));  osip_transaction_add_event (tr, sipevent);  eXosip_update ();             /* fixed? */  __eXosip_wakeup ();  return 0;}int_eXosip_call_send_request_with_credential (eXosip_call_t * jc,                                           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;  int pos;  if (jc == NULL)    return -1;  if (jd != NULL)    {      if (jd->d_out_trs == NULL)        return -1;    }  if (out_tr == NULL      || out_tr->orig_request == NULL || out_tr->last_response == NULL)    return -1;  osip_message_clone (out_tr->orig_request, &msg);  if (msg == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: could not clone msg for authentication\n"));      return -1;    }  /* remove all previous authentication headers */  pos = 0;  while (!osip_list_eol (&msg->authorizations, pos))    {      osip_authorization_t *auth;      auth = (osip_authorization_t *) osip_list_get (&msg->authorizations, pos);      osip_list_remove (&msg->authorizations, pos);      osip_authorization_free (auth);      pos++;    }  pos = 0;  while (!osip_list_eol (&msg->proxy_authorizations, pos))    {      osip_proxy_authorization_t *auth;      auth =        (osip_proxy_authorization_t *) osip_list_get (&msg->                                                      proxy_authorizations, pos);      osip_list_remove (&msg->proxy_authorizations, pos);      osip_authorization_free (auth);      pos++;    }  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 -1;    }  /* increment cseq */  cseq = atoi (msg->cseq->number);  osip_free (msg->cseq->number);  msg->cseq->number = strdup_printf ("%i", cseq + 1);  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 -1;    }  eXosip_add_authentication_information (msg, out_tr->last_response);  osip_message_force_update (msg);  if (0 != osip_strcasecmp (msg->sip_method, "INVITE"))    {      i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, msg);  } else    {      i = _eXosip_transaction_init (&tr, ICT, eXosip.j_osip, msg);    }  if (i != 0)    {      osip_message_free (msg);      return -1;    }  if (out_tr == jc->c_out_tr)    {      /* replace with the new tr */      osip_list_add (eXosip.j_transactions, jc->c_out_tr, 0);      jc->c_out_tr = tr;      /* fix dialog issue */      if (jd != NULL)        {          REMOVE_ELEMENT (jc->c_dialogs, jd);          eXosip_dialog_free (jd);          jd = NULL;        }  } else    {      /* 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 (jc, jd, NULL, NULL));  osip_transaction_add_event (tr, sipevent);  eXosip_update ();             /* fixed? */  __eXosip_wakeup ();  return 0;}inteXosip_call_get_referto(int did, char *refer_to, size_t refer_to_len){  eXosip_dialog_t *jd = NULL;  eXosip_call_t *jc = NULL;  osip_transaction_t *tr = NULL;  osip_uri_t *referto_uri;  char atmp[256];  char *referto_tmp=NULL;  int i;  eXosip_call_dialog_find (did, &jc, &jd);  if (jc == NULL || jd == NULL || jd->d_dialog == NULL)    {      OSIP_TRACE (osip_trace		  (__FILE__, __LINE__, OSIP_ERROR, NULL,		   "eXosip: No call here?\n"));      return -1;    }  tr = eXosip_find_last_invite (jc, jd);  if (tr == NULL || tr->orig_request == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No transaction for call?\n"));      return -1;    }  i = osip_uri_clone(jd->d_dialog->remote_uri->url, &referto_uri);  if (i!=0)    return -1;  if (jd->d_dialog->type == CALLER)    {      snprintf(atmp, sizeof(atmp), "%s;to-tag=%s;from-tag=%s",	       jd->d_dialog->call_id,	       jd->d_dialog->remote_tag,	       jd->d_dialog->local_tag);          }  else    {      snprintf(atmp, sizeof(atmp), "%s;to-tag=%s;from-tag=%s",	       jd->d_dialog->call_id,	       jd->d_dialog->local_tag,	       jd->d_dialog->remote_tag);    }  osip_uri_uheader_add(referto_uri, osip_strdup("Replaces"), osip_strdup(atmp));  i = osip_uri_to_str(referto_uri, &referto_tmp);  if (i!=0)    {      osip_uri_free(referto_uri);            return -1;    }  snprintf(refer_to, refer_to_len, "%s", referto_tmp);  osip_uri_free(referto_uri);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -