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

📄 exinsubscription_api.c

📁 libosip2-3版本的osip源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
eXosip_insubscription_build_notify (int did, int subscription_status,                                    int subscription_reason,                                    osip_message_t ** request){  eXosip_dialog_t *jd = NULL;  eXosip_notify_t *jn = NULL;  char subscription_state[50];  char *tmp;  time_t now = time (NULL);  int i;  *request = NULL;  if (did > 0)    {      eXosip_notify_dialog_find (did, &jn, &jd);    }  if (jd == NULL || jn == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No incoming subscription here?\n"));      return -1;    }  i = eXosip_insubscription_build_request (did, "NOTIFY", request);  if (i != 0)    {      return i;    }#ifndef SUPPORT_MSN  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)    {      if (subscription_reason == DEACTIVATED)        osip_strncpy (subscription_state, "terminated;reason=deactivated", 29);      else if (subscription_reason == PROBATION)        osip_strncpy (subscription_state, "terminated;reason=probation", 27);      else if (subscription_reason == REJECTED)        osip_strncpy (subscription_state, "terminated;reason=rejected", 26);      else if (subscription_reason == TIMEOUT)        osip_strncpy (subscription_state, "terminated;reason=timeout", 25);      else if (subscription_reason == GIVEUP)        osip_strncpy (subscription_state, "terminated;reason=giveup", 24);      else if (subscription_reason == NORESOURCE)        osip_strncpy (subscription_state, "terminated;reason=noresource", 28);      else        osip_strncpy (subscription_state, "terminated;reason=noresource", 28);  } else    osip_strncpy (subscription_state, "pending;expires=", 16);  tmp = subscription_state + strlen (subscription_state);  if (subscription_status != EXOSIP_SUBCRSTATE_TERMINATED)    sprintf (tmp, "%li", jn->n_ss_expires - now);  osip_message_set_header (*request, "Subscription-State", subscription_state);#endif  return 0;}inteXosip_insubscription_build_request (int did, const char *method,                                     osip_message_t ** request){  eXosip_dialog_t *jd = NULL;  eXosip_notify_t *jn = NULL;  osip_transaction_t *transaction;  char *transport;  int i;  *request = NULL;  if (method == NULL || method[0] == '\0')    return -1;  if (did > 0)    {      eXosip_notify_dialog_find (did, &jn, &jd);    }  if (jd == NULL || jn == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No incoming subscription here?\n"));      return -1;    }  transaction = NULL;  transaction = eXosip_find_last_out_notify (jn, jd);  if (transaction != NULL)    {      if (transaction->state != NICT_TERMINATED &&          transaction->state != NIST_TERMINATED &&          transaction->state != NICT_COMPLETED &&          transaction->state != NIST_COMPLETED)        return -1;    }  transport = NULL;  if (transaction == NULL)    transaction = jn->n_inc_tr;  if (transaction != NULL && transaction->orig_request != NULL)    transport = _eXosip_transport_protocol (transaction->orig_request);  transaction = NULL;  if (transport == NULL)    i = _eXosip_build_request_within_dialog (request, method, jd->d_dialog, "UDP");  else    i =      _eXosip_build_request_within_dialog (request, method, jd->d_dialog,                                           transport);  if (i != 0)    return -2;  return 0;}inteXosip_insubscription_send_request (int did, osip_message_t * request){  eXosip_dialog_t *jd = NULL;  eXosip_notify_t *jn = NULL;  osip_transaction_t *transaction;  osip_event_t *sipevent;  int i;  if (request == NULL)    return -1;  if (did > 0)    {      eXosip_notify_dialog_find (did, &jn, &jd);    }  if (jd == NULL || jn == NULL)    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: No incoming subscription here?\n"));      osip_message_free (request);      return -1;    }  transaction = NULL;  transaction = eXosip_find_last_out_notify (jn, jd);  if (transaction != NULL)    {      if (transaction->state != NICT_TERMINATED &&          transaction->state != NIST_TERMINATED &&          transaction->state != NICT_COMPLETED &&          transaction->state != NIST_COMPLETED)        {          osip_message_free (request);          return -1;        }      transaction = NULL;    }  i = _eXosip_transaction_init (&transaction, NICT, eXosip.j_osip, request);  if (i != 0)    {      osip_message_free (request);      return -1;    }  osip_list_add (jd->d_out_trs, transaction, 0);  sipevent = osip_new_outgoing_sipmessage (request);  sipevent->transactionid = transaction->transactionid;  osip_transaction_set_your_instance (transaction,                                      __eXosip_new_jinfo (NULL, jd, NULL, jn));  osip_transaction_add_event (transaction, sipevent);  __eXosip_wakeup ();  return 0;}int_eXosip_insubscription_send_request_with_credential (eXosip_notify_t * jn,                                                     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;  if (jn == NULL)    return -1;  if (jd != NULL)    {      if (jd->d_out_trs == NULL)        return -1;    }  if (out_tr == NULL)    {      out_tr = eXosip_find_last_out_notify (jn, jd);    }  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;    }  /* 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);  i = _eXosip_transaction_init (&tr, NICT, eXosip.j_osip, msg);  if (i != 0)    {      osip_message_free (msg);      return -1;    }  /* 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 (NULL, jd, NULL, jn));  osip_transaction_add_event (tr, sipevent);  eXosip_update ();             /* fixed? */  __eXosip_wakeup ();  return 0;}

⌨️ 快捷键说明

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