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

📄 excall_api.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
    }  transaction = NULL;  if (0 == osip_strcasecmp (method, "INVITE"))    {      transaction = eXosip_find_last_invite (jc, jd);  } else                        /* OPTIONS, UPDATE, INFO, REFER, ?... */    {      transaction = eXosip_find_last_transaction (jc, jd, method);    }  if (transaction != NULL)    {      if (0 != osip_strcasecmp (method, "INVITE"))        {          if (transaction->state != NICT_TERMINATED &&              transaction->state != NIST_TERMINATED &&              transaction->state != NICT_COMPLETED &&              transaction->state != NIST_COMPLETED)            return OSIP_WRONG_STATE;      } else        {          if (transaction->state != ICT_TERMINATED &&              transaction->state != IST_TERMINATED &&              transaction->state != IST_CONFIRMED &&              transaction->state != ICT_COMPLETED)            return OSIP_WRONG_STATE;        }    }  i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog,                                           eXosip.transport);  if (i != 0)    return i;  eXosip_add_authentication_information (*request, NULL);  return OSIP_SUCCESS;}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 OSIP_BADPARAMETER;  if (jid <= 0)    {      osip_message_free (request);      return OSIP_BADPARAMETER;    }  if (request->sip_method == NULL)    {      osip_message_free (request);      return OSIP_BADPARAMETER;    }  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 OSIP_NOTFOUND;    }  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 OSIP_WRONG_STATE;            }      } else        {          if (transaction->state != ICT_TERMINATED &&              transaction->state != IST_TERMINATED &&              transaction->state != IST_CONFIRMED &&              transaction->state != ICT_COMPLETED)            {              osip_message_free (request);              return OSIP_WRONG_STATE;            }        }    }  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 i;    }  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 OSIP_SUCCESS;}#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 i;  if (refer_to == NULL || refer_to[0] == '\0')    return OSIP_SUCCESS;  osip_message_set_header (*request, "Refer-to", refer_to);  return OSIP_SUCCESS;}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 i;  return OSIP_SUCCESS;}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 i;  return OSIP_SUCCESS;}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 i;  return OSIP_SUCCESS;}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 i;  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 OSIP_SUCCESS;}#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)    return OSIP_BADPARAMETER;  if (status <= 100)    return OSIP_BADPARAMETER;  if (status > 699)    return OSIP_BADPARAMETER;  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 OSIP_NOTFOUND;    }  if (0 == osip_strcasecmp (tr->orig_request->sip_method, "INVITE"))    {      i = _eXosip_answer_invite_123456xx (jc, jd, status, answer, 0);  } 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 (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 i;        }      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 i;    }  return OSIP_SUCCESS;}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)    {      osip_message_free (answer);      return OSIP_BADPARAMETER;    }  if (status <= 100)    {      osip_message_free (answer);      return OSIP_BADPARAMETER;    }  if (status > 699)    {      osip_message_free (answer);      return OSIP_BADPARAMETER;    }  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 OSIP_NOTFOUND;    }  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"));              osip_message_free (answer);              return OSIP_BADPARAMETER;            }        }    }  /* 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 OSIP_WRONG_STATE;    }  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);        }      osip_message_free (answer);      return OSIP_BADPARAMETER;    }  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 OSIP_SUCCESS;}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 && cid <= 0)    return OSIP_BADPARAMETER;  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 OSIP_NOTFOUND;        }  } else    {      eXosip_call_find (cid, &jc);    }  if (jc == NULL)    {      return OSIP_NOTFOUND;    }  tr = eXosip_find_last_out_invite (jc, jd);  if (jd != NULL && jd->d_dialog != NULL      && jd->d_dialog->state == DIALOG_CONFIRMED)    {      /* don't send CANCEL on re-INVITE: send BYE instead */  } else 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 i;        }      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 OSIP_SUCCESS;    }  if (jd == NULL || jd->d_dialog == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No established dialog!\n"));      return OSIP_WRONG_STATE;    }  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;        }    }  if (jd->d_dialog == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: cannot terminate this call!\n"));      return OSIP_WRONG_STATE;    }  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 i;    }  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 i;    }  osip_dialog_free (jd->d_dialog);  jd->d_dialog = NULL;

⌨️ 快捷键说明

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