int
eXosip_register_build_initial_register_withqvalue(const char *from, const char *proxy,
									   const char *contact, int expires,
									   const char *qvalue,
									   osip_message_t ** reg)
{
	eXosip_reg_t *jr = NULL;
	int i;

	*reg = NULL;

	if (from == NULL || proxy == NULL)
		return OSIP_BADPARAMETER;

#ifdef REJECT_DOUBLE_REGISTRATION
	/* Avoid adding the same registration info twice to prevent mem leaks */
	for (jr = eXosip.j_reg; jr != NULL; jr = jr->next) {
		if (strcmp(jr->r_aor, from) == 0 && strcmp(jr->r_registrar, proxy) == 0) {
			REMOVE_ELEMENT(eXosip.j_reg, jr);
			eXosip_reg_free(jr);
			jr = NULL;
			break;
		}
	}
#endif

	if (jr == NULL) {
		/* Add new registration info */
		i = eXosip_reg_init(&jr, from, proxy, contact);
		if (i != 0) {
			OSIP_TRACE(osip_trace
					   (__FILE__, __LINE__, OSIP_ERROR, NULL,
						"eXosip: cannot register! "));
			return i;
		}
		ADD_ELEMENT(eXosip.j_reg, jr);
	}

	/* build register */
	jr->r_reg_period = expires;
	if (jr->r_reg_period <= 0)	/* too low */
		jr->r_reg_period = 0;
	else if (jr->r_reg_period < 30)	/* too low */
		jr->r_reg_period = 30;

	if(qvalue)
		osip_strncpy(jr->r_qvalue, qvalue, sizeof(jr->r_qvalue));

	i = _eXosip_register_build_register(jr, reg);
	if (i != 0) {
		OSIP_TRACE(osip_trace
				   (__FILE__, __LINE__, OSIP_ERROR, NULL,
					"eXosip: cannot build REGISTER!\n"));
		*reg = NULL;
		return i;
	}

	return jr->r_id;
}
Beispiel #2
0
int
eXosip_register_send_register (int rid, osip_message_t * reg)
{
    osip_transaction_t *transaction;
    osip_event_t *sipevent;
    eXosip_reg_t *jr;
    int i;

    jr = eXosip_reg_find (rid);
    if (jr == NULL)
    {
        osip_message_free (reg);
        return -1;
    }

    if (jr->r_last_tr != NULL)
    {
        if (jr->r_last_tr->state != NICT_TERMINATED
                && jr->r_last_tr->state != NICT_COMPLETED)
        {
            osip_message_free (reg);
            return -1;
        }
    }

    if (reg == NULL)
    {
        i = _eXosip_register_build_register (jr, &reg);
        if (i != 0)
        {
            OSIP_TRACE (osip_trace
                        (__FILE__, __LINE__, OSIP_ERROR, NULL,
                         "eXosip: cannot build REGISTER!"));
            return i;
        }
    }

    i = _eXosip_transaction_init (&transaction, NICT, eXosip.j_osip, reg);
    if (i != 0)
    {
        /* TODO: release the j_call.. */

        osip_message_free (reg);
        return -2;
    }

    jr->r_last_tr = transaction;

    /* send REGISTER */
    sipevent = osip_new_outgoing_sipmessage (reg);
    sipevent->transactionid = transaction->transactionid;
    osip_message_force_update (reg);

    osip_transaction_add_event (transaction, sipevent);
    __eXosip_wakeup ();
    return 0;
}
Beispiel #3
0
int
eXosip_register_build_initial_register (const char *from, const char *proxy,
                                        const char *contact, int expires,
                                        osip_message_t ** reg)
{
    eXosip_reg_t *jr = NULL;
    int i;

    *reg = NULL;

    /* Avoid adding the same registration info twice to prevent mem leaks */
    for (jr = eXosip.j_reg; jr != NULL; jr = jr->next)
    {
        if (strcmp (jr->r_aor, from) == 0 && strcmp (jr->r_registrar, proxy) == 0)
        {
            REMOVE_ELEMENT (eXosip.j_reg, jr);
            eXosip_reg_free (jr);
            jr=NULL;
            break;
        }
    }
    if (jr == NULL)
    {
        /* Add new registration info */
        i = eXosip_reg_init (&jr, from, proxy, contact);
        if (i != 0)
        {
            OSIP_TRACE (osip_trace
                        (__FILE__, __LINE__, OSIP_ERROR, NULL,
                         "eXosip: cannot register! "));
            return i;
        }
        ADD_ELEMENT (eXosip.j_reg, jr);
    }

    /* build register */
    jr->r_reg_period = expires;
    if (jr->r_reg_period <= 0)      /* too low */
        jr->r_reg_period = 0;
    else if (jr->r_reg_period < 100)      /* too low */
        jr->r_reg_period = 100;

    i = _eXosip_register_build_register (jr, reg);
    if (i != 0)
    {
        OSIP_TRACE (osip_trace
                    (__FILE__, __LINE__, OSIP_ERROR, NULL,
                     "eXosip: cannot build REGISTER!\n"));
        *reg = NULL;
        return i;
    }

    return jr->r_id;
}
Beispiel #4
0
int
eXosip_register_build_register (int rid, int expires, osip_message_t ** reg)
{
    eXosip_reg_t *jr;
    int i;

    *reg = NULL;
    jr = eXosip_reg_find (rid);
    if (jr == NULL)
    {
        /* fprintf(stderr, "eXosip: no registration info saved!\n"); */
        return -1;
    }
    jr->r_reg_period = expires;
    if (jr->r_reg_period == 0)
    {
    } /* unregistration */
    else if (jr->r_reg_period > 3600)
        jr->r_reg_period = 3600;
    else if (jr->r_reg_period < 100)      /* too low */
        jr->r_reg_period = 100;

    if (jr->r_last_tr != NULL)
    {
        if (jr->r_last_tr->state != NICT_TERMINATED
                && jr->r_last_tr->state != NICT_COMPLETED)
        {
            /* fprintf(stderr, "eXosip: a registration is already pending!\n"); */
            return -1;
        }
    }

    i = _eXosip_register_build_register (jr, reg);
    if (i != 0)
    {
        OSIP_TRACE (osip_trace
                    (__FILE__, __LINE__, OSIP_ERROR, NULL,
                     "eXosip: cannot build REGISTER!"));
        *reg = NULL;
        return i;
    }
    return 0;
}
int
eXosip_register_build_register (int rid, int expires, osip_message_t ** reg)
{
  eXosip_reg_t *jr;
  int i;

  *reg = NULL;

  if (rid <= 0)
    return OSIP_BADPARAMETER;

  jr = eXosip_reg_find (rid);
  if (jr == NULL)
    return OSIP_NOTFOUND;
  jr->r_reg_period = expires;
  if (jr->r_reg_period == 0)
    {
    } /* unregistration */
  else if (jr->r_reg_period > 3600)
    jr->r_reg_period = 3600;
  else if (jr->r_reg_period < 100)      /* too low */
    jr->r_reg_period = 100;

  if (jr->r_last_tr != NULL)
    {
      if (jr->r_last_tr->state != NICT_TERMINATED
          && jr->r_last_tr->state != NICT_COMPLETED)
        {
          return OSIP_WRONG_STATE;
        }
    }

  i = _eXosip_register_build_register (jr, reg);
  if (i != 0)
    {
      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_ERROR, NULL,
                   "eXosip: cannot build REGISTER!"));
      *reg = NULL;
      return i;
    }
  return OSIP_SUCCESS;
}