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

📄 excall_api.c

📁 libeXosip2-3.0.3.tar.gz
💻 C
📖 第 1 页 / 共 3 页
字号:
              transaction->state != NIST_COMPLETED)            return -1;      } else        {          if (transaction->state != ICT_TERMINATED &&              transaction->state != IST_TERMINATED &&              transaction->state != IST_CONFIRMED &&              transaction->state != ICT_COMPLETED)            return -1;        }    }  i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog,                                           eXosip.transport);  if (i != 0)    return -2;  if (jc->response_auth != NULL)    eXosip_add_authentication_information (*request, jc->response_auth);  else	eXosip_add_authentication_information(*request, NULL);  return 0;}inteXosip_call_send_request (int jid, osip_message_t * request){  eXosip_dialog_t *jd = NULL;  eXosip_call_t *jc = NULL;  osip_transaction_t *transaction;  osip_event_t *sipevent;  int i;  if (request == NULL)    return -1;  if (request->sip_method == NULL)    {      osip_message_free (request);      return -1;    }  if (jid > 0)    {      eXosip_call_dialog_find (jid, &jc, &jd);    }  if (jd == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No call here?\n"));      osip_message_free (request);      return -1;    }  transaction = NULL;  if (0 == osip_strcasecmp (request->sip_method, "INVITE"))    {      transaction = eXosip_find_last_invite (jc, jd);  } else                        /* OPTIONS, UPDATE, INFO, REFER, ?... */    {      transaction = eXosip_find_last_transaction (jc, jd, request->sip_method);    }  if (transaction != NULL)    {      if (0 != osip_strcasecmp (request->sip_method, "INVITE"))        {          if (transaction->state != NICT_TERMINATED &&              transaction->state != NIST_TERMINATED &&              transaction->state != NICT_COMPLETED &&              transaction->state != NIST_COMPLETED)            {              osip_message_free (request);              return -1;            }      } else        {          if (transaction->state != ICT_TERMINATED &&              transaction->state != IST_TERMINATED &&              transaction->state != IST_CONFIRMED &&              transaction->state != ICT_COMPLETED)            {              osip_message_free (request);              return -1;            }        }    }  transaction = NULL;  if (0 != osip_strcasecmp (request->sip_method, "INVITE"))    {      i = _eXosip_transaction_init (&transaction, NICT, eXosip.j_osip, request);  } else    {      i = _eXosip_transaction_init (&transaction, ICT, eXosip.j_osip, request);    }  if (i != 0)    {      osip_message_free (request);      return -2;    }  osip_list_add (jd->d_out_trs, transaction, 0);  sipevent = osip_new_outgoing_sipmessage (request);  sipevent->transactionid = transaction->transactionid;#ifndef MINISIZE  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd, NULL, NULL));#else  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (jc, jd));#endif  osip_transaction_add_event (transaction, sipevent);  __eXosip_wakeup ();  return 0;}#ifndef MINISIZEinteXosip_call_build_refer (int did, const char *refer_to, osip_message_t ** request){  int i;  *request = NULL;  i = eXosip_call_build_request (did, "REFER", request);  if (i != 0)    return -1;  if (refer_to == NULL || refer_to[0] == '\0')    return 0;  osip_message_set_header (*request, "Refer-to", refer_to);  return 0;}inteXosip_call_build_options (int did, osip_message_t ** request){  int i;  *request = NULL;  i = eXosip_call_build_request (did, "OPTIONS", request);  if (i != 0)    return -1;  return 0;}inteXosip_call_build_info (int did, osip_message_t ** request){  int i;  *request = NULL;  i = eXosip_call_build_request (did, "INFO", request);  if (i != 0)    return -1;  return 0;}inteXosip_call_build_update (int did, osip_message_t ** request){  int i;  *request = NULL;  i = eXosip_call_build_request (did, "UPDATE", request);  if (i != 0)    return -1;  return 0;}inteXosip_call_build_notify (int did, int subscription_status,                          osip_message_t ** request){  char subscription_state[50];  char *tmp;  int i;  *request = NULL;  i = eXosip_call_build_request (did, "NOTIFY", request);  if (i != 0)    return -1;  if (subscription_status == EXOSIP_SUBCRSTATE_PENDING)    osip_strncpy (subscription_state, "pending;expires=", 16);  else if (subscription_status == EXOSIP_SUBCRSTATE_ACTIVE)    osip_strncpy (subscription_state, "active;expires=", 15);  else if (subscription_status == EXOSIP_SUBCRSTATE_TERMINATED)    {      int reason = NORESOURCE;      if (reason == DEACTIVATED)        osip_strncpy (subscription_state, "terminated;reason=deactivated", 29);      else if (reason == PROBATION)        osip_strncpy (subscription_state, "terminated;reason=probation", 27);      else if (reason == REJECTED)        osip_strncpy (subscription_state, "terminated;reason=rejected", 26);      else if (reason == TIMEOUT)        osip_strncpy (subscription_state, "terminated;reason=timeout", 25);      else if (reason == GIVEUP)        osip_strncpy (subscription_state, "terminated;reason=giveup", 24);      else if (reason == NORESOURCE)        osip_strncpy (subscription_state, "terminated;reason=noresource", 29);    }  tmp = subscription_state + strlen (subscription_state);  if (subscription_status != EXOSIP_SUBCRSTATE_TERMINATED)    sprintf (tmp, "%i", 180);  osip_message_set_header (*request, "Subscription-State", subscription_state);  return 0;}#endifinteXosip_call_build_answer (int tid, int status, osip_message_t ** answer){  int i = -1;  eXosip_dialog_t *jd = NULL;  eXosip_call_t *jc = NULL;  osip_transaction_t *tr = NULL;  *answer = NULL;  if (tid > 0)    {      _eXosip_call_transaction_find (tid, &jc, &jd, &tr);    }  if (tr == NULL || jd == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No call here?\n"));      return -1;    }  if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))    {      if (status > 100 && status <= 699)        {          i = _eXosip_answer_invite_123456xx (jc, jd, status, answer, 0);      } else        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: wrong status code (101<status<=699)\n"));          return -1;        }  } else    {      if (jd != NULL)        {          i =            _eXosip_build_response_default (answer, jd->d_dialog, status,                                            tr->orig_request);      } else        {          i =            _eXosip_build_response_default (answer, NULL, status,                                            tr->orig_request);        }      if (status > 100 && status < 300)        i = complete_answer_that_establish_a_dialog (*answer, tr->orig_request);    }  if (i != 0)    {      OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL,                              "ERROR: Could not create response for %s\n",                              tr->orig_request->sip_method));      return -1;    }  return 0;}inteXosip_call_send_answer (int tid, int status, osip_message_t * answer){  eXosip_dialog_t *jd = NULL;  eXosip_call_t *jc = NULL;  osip_transaction_t *tr = NULL;  osip_event_t *evt_answer;  if (tid > 0)    {      _eXosip_call_transaction_find (tid, &jc, &jd, &tr);    }  if (jd == 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 (answer);      return -1;    }  if (answer == NULL)    {      if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))        {          if (status >= 200 && status <= 299)            {              OSIP_TRACE (osip_trace                          (__FILE__, __LINE__, OSIP_ERROR, NULL,                           "eXosip: Wrong parameter?\n"));              return -1;            }        }    }  /* is the transaction already answered? */  if (tr->state == IST_COMPLETED      || tr->state == IST_CONFIRMED      || tr->state == IST_TERMINATED      || tr->state == NIST_COMPLETED || tr->state == NIST_TERMINATED)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: transaction already answered\n"));      osip_message_free (answer);      return -1;    }  if (answer == NULL)    {      if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))        {	  osip_message_t *response;          return _eXosip_answer_invite_123456xx (jc, jd, status, &response, 1);	}      return -1;  }    if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))    {      if (MSG_IS_STATUS_2XX (answer) && jd!=NULL)	{	  if (status >= 200 && status <300 && jd!=NULL)	    {	      eXosip_dialog_set_200ok (jd, answer);	      /* wait for a ACK */	      osip_dialog_set_state (jd->d_dialog, DIALOG_CONFIRMED);	    }	}    }  evt_answer = osip_new_outgoing_sipmessage (answer);  evt_answer->transactionid = tr->transactionid;  osip_transaction_add_event (tr, evt_answer);  eXosip_update ();  __eXosip_wakeup ();  return 0;}inteXosip_call_terminate (int cid, int did){  int i;  osip_transaction_t *tr;  osip_message_t *request = NULL;  eXosip_dialog_t *jd = NULL;  eXosip_call_t *jc = NULL;  if (did > 0)    {      eXosip_call_dialog_find (did, &jc, &jd);      if (jd == NULL)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: No call here?\n"));          return -1;        }  } else    {      eXosip_call_find (cid, &jc);    }  if (jc == NULL)    {      return -1;    }  tr = eXosip_find_last_out_invite (jc, jd);  if (tr != NULL && tr->last_response != NULL      && MSG_IS_STATUS_1XX (tr->last_response))    {      i = generating_cancel (&request, tr->orig_request);      if (i != 0)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: cannot terminate this call!\n"));          return -2;        }      i = eXosip_create_cancel_transaction (jc, jd, request);      if (i != 0)        {          OSIP_TRACE (osip_trace                      (__FILE__, __LINE__, OSIP_ERROR, NULL,                       "eXosip: cannot initiate SIP transaction!\n"));          return i;        }      if (jd != NULL)        {          osip_dialog_free (jd->d_dialog);          jd->d_dialog = NULL;          eXosip_update ();     /* AMD 30/09/05 */        }      return 0;    }  if (jd == NULL || jd->d_dialog == NULL)    {      /* Check if some dialog exists */      if (jd != NULL && jd->d_dialog != NULL)        {	  i = generating_bye (&request, jd->d_dialog, eXosip.transport);          if (i != 0)            {              OSIP_TRACE (osip_trace                          (__FILE__, __LINE__, OSIP_ERROR, NULL,                           "eXosip: cannot terminate this call!\n"));              return -2;            }          if (jc->response_auth != NULL)            eXosip_add_authentication_information (request, jc->response_auth);		  else            eXosip_add_authentication_information (request, NULL);          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;        }      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No established dialog!\n"));      return -1;    }  if (tr == NULL)    {      /*this may not be enough if it's a re-INVITE! */      tr = eXosip_find_last_inc_invite (jc, jd);      if (tr != NULL && tr->last_response != NULL &&          MSG_IS_STATUS_1XX (tr->last_response))        {                       /* answer with 603 */		  osip_generic_param_t *to_tag;		  osip_from_param_get_byname (tr->orig_request->to, "tag", &to_tag);          i = eXosip_call_send_answer (tr->transactionid, 603, NULL);		  if (to_tag==NULL)			  return i;        }    }  i = generating_bye (&request, jd->d_dialog, eXosip.transport);  if (i != 0)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot terminate this call!\n"));      return -2;    }  if (jc->response_auth != NULL)    eXosip_add_authentication_information (request, jc->response_auth);  else    eXosip_add_authentication_information (request, NULL);  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;    }

⌨️ 快捷键说明

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