Ejemplo n.º 1
0
int
eXosip_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 = osip_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;
}
Ejemplo n.º 2
0
int
eXosip_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;
}
int
eXosip_insubscription_remove (int did)
{
  eXosip_dialog_t *jd = NULL;
  eXosip_notify_t *jn = NULL;

  if (did <= 0)
    return OSIP_BADPARAMETER;

  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 OSIP_NOTFOUND;
    }
  REMOVE_ELEMENT (eXosip.j_notifies, jn);
  eXosip_notify_free (jn);
  return OSIP_SUCCESS;
}
Ejemplo n.º 4
0
int
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;
}
int
eXosip_insubscription_automatic (eXosip_event_t * evt)
{
  eXosip_dialog_t *jd = NULL;
  eXosip_notify_t *jn = NULL;

  osip_header_t *event_header;
  if (evt->did <= 0 || evt->nid <= 0)
    return OSIP_BADPARAMETER;
  if (evt->request == NULL)
    return OSIP_BADPARAMETER;

  eXosip_notify_dialog_find (evt->did, &jn, &jd);
  if (jd == NULL || jn == NULL)
    {
      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_ERROR, NULL,
                   "eXosip: No incoming subscription here?\n"));
      return OSIP_NOTFOUND;
    }

  osip_message_header_get_byname (evt->request, "event", 0, &event_header);
  if (event_header == NULL || event_header->hvalue == NULL)
    {
      eXosip_insubscription_send_answer (evt->tid, 400, NULL);
      return OSIP_SUCCESS;
    }

  /* this event should be handled internally */
  if (osip_strcasecmp (event_header->hvalue, "dialog") == 0)
    {
      /* send 200 ok to SUBSCRIBEs */

      if (evt->type == EXOSIP_IN_SUBSCRIPTION_NEW)
        {
          osip_message_t *answer;
          int i;

          i = eXosip_insubscription_build_answer (evt->tid, 202, &answer);
          if (i == 0)
            {
              i = eXosip_insubscription_send_answer (evt->tid, 202, answer);
            }
          if (i != 0)
            {
              i = eXosip_insubscription_send_answer (evt->tid, 400, NULL);
              return OSIP_SUCCESS;
            }

          /* send initial notify */
          i =
            _eXosip_insubscription_auto_send_notify (evt->did,
                                                     EXOSIP_SUBCRSTATE_ACTIVE,
                                                     PROBATION);
          if (i != 0)
            {
              /* delete subscription... */
              return OSIP_SUCCESS;
            }
        }
  } else
    {
      if (evt->type == EXOSIP_IN_SUBSCRIPTION_NEW)
        {
          eXosip_insubscription_send_answer (evt->tid, 489, NULL);
        }
    }

  return OSIP_SUCCESS;
}