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; }
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, ®); 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; }
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; }
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; }