/*! * \brief Add a new contact in memory * * Add a new contact in memory, contacts are ordered by: * 1) q value, 2) descending modification time * \param _r record this contact belongs to * \param _c contact * \param _ci contact information * \return pointer to new created contact on success, 0 on failure */ ucontact_t* mem_insert_scontact(impurecord_t* _r, str* _c, ucontact_info_t* _ci) { ucontact_t* c; int sl; if ((c = new_ucontact(_r->domain, &_r->public_identity, _c, _ci)) == 0) { LM_ERR("failed to create new contact\n"); return 0; } counter_inc(ul_scscf_cnts_h.active_contacts); LM_DBG("Created new contact in memory with AOR: [%.*s] and hash [%d]\n", _c->len, _c->s, c->sl); sl = (c->sl); lock_contact_slot_i(sl); contact_slot_add(&contact_list->slot[sl], c); unlock_contact_slot_i(sl); return c; }
/* * Add a new contact * Contacts are ordered by: 1) q * 2) descending modification time */ int mem_insert_ucontact(urecord_t* _r, str* aor, str* _c, time_t _e, qvalue_t _q, str* _cid, int _cs, unsigned int _flags, struct ucontact** _con, str* _ua, str* _recv, struct socket_info* sock, str* _inst, int sid) { ucontact_t* ptr, *prev = 0; if (new_ucontact(_r->domain, &_r->uid, aor, _c, _e, _q, _cid, _cs, _flags, _con, _ua, _recv, sock, _inst, sid) < 0) { LOG(L_ERR, "mem_insert_ucontact(): Can't create new contact\n"); return -1; } ptr = _r->contacts; if (!desc_time_order) { while(ptr) { if (ptr->q < _q) break; prev = ptr; ptr = ptr->next; } } if (ptr) { if (!ptr->prev) { ptr->prev = *_con; (*_con)->next = ptr; _r->contacts = *_con; } else { (*_con)->next = ptr; (*_con)->prev = ptr->prev; ptr->prev->next = *_con; ptr->prev = *_con; } } else if (prev) { prev->next = *_con; (*_con)->prev = prev; } else { _r->contacts = *_con; } return 0; }
/*! * \brief Add a new contact in memory * * Add a new contact in memory, contacts are ordered by: * 1) q value, 2) descending modification time * \param _r record this contact belongs to * \param _c contact * \param _ci contact information * \return pointer to new created contact on success, 0 on failure */ ucontact_t* mem_insert_ucontact(urecord_t* _r, str* _c, ucontact_info_t* _ci) { ucontact_t* ptr, *prev = 0; ucontact_t* c; if ( (c=new_ucontact(_r->domain, &_r->aor, _c, _ci)) == 0) { LM_ERR("failed to create new contact\n"); return 0; } if_update_stat( _r->slot, _r->slot->d->contacts, 1); ptr = _r->contacts; if (!desc_time_order) { while(ptr) { if (ptr->q < c->q) break; prev = ptr; ptr = ptr->next; } } if (ptr) { if (!ptr->prev) { ptr->prev = c; c->next = ptr; _r->contacts = c; } else { c->next = ptr; c->prev = ptr->prev; ptr->prev->next = c; ptr->prev = c; } } else if (prev) { prev->next = c; c->prev = prev; } else { _r->contacts = c; } return c; }
/*! * \brief Add a new contact in memory * * Add a new contact in memory, contacts are ordered by: * 1) q value, 2) descending modification time * \param _r record this contact belongs to * \param _c contact * \param _ci contact information * \return pointer to new created contact on success, 0 on failure */ ucontact_t* mem_insert_ucontact(impurecord_t* _r, str* _c, ucontact_info_t* _ci) { ucontact_t* ptr, *prev = 0; ucontact_t* c; if ((c = new_ucontact(_r->domain, &_r->public_identity, _c, _ci)) == 0) { LM_ERR("failed to create new contact\n"); return 0; } if_update_stat(_r->slot, _r->slot->d->contacts, 1); ptr = _r->contacts; while (ptr) {//make sure our contacts are ordered oldest(first) to newest(last) if (ptr->expires > c->expires) break; prev = ptr; ptr = ptr->next; } if (ptr) { if (!ptr->prev) { ptr->prev = c; c->next = ptr; _r->contacts = c; } else { c->next = ptr; c->prev = ptr->prev; ptr->prev->next = c; ptr->prev = c; } } else if (prev) { prev->next = c; c->prev = prev; } else { _r->contacts = c; } return c; }