static void find_and_delete_dialog(ua_pres_t *dialog, int hash_code) { ua_pres_t *presentity; if (dbmode == PUA_DB_ONLY) { delete_dialog_puadb(dialog); } else { lock_get(&HashT->p_records[hash_code].lock); presentity= get_dialog(dialog, hash_code); if (presentity == NULL) { presentity = get_temporary_dialog(dialog, hash_code); if(presentity== NULL) { LM_ERR("no record found\n"); lock_release(&HashT->p_records[hash_code].lock); return; } } delete_htable(presentity, hash_code); lock_release(&HashT->p_records[hash_code].lock); } }
/** * return -1 on not found, 0 on established dialog, 1 on temporary dialog */ int is_dialog(ua_pres_t* dialog) { int ret_code= 0; unsigned int hash_code; if (dbmode==PUA_DB_ONLY) { return( is_dialog_puadb(dialog) ); } hash_code= core_hash(dialog->pres_uri, dialog->watcher_uri, HASH_SIZE); lock_get(&HashT->p_records[hash_code].lock); if(get_dialog(dialog, hash_code)==NULL) { if(get_temporary_dialog(dialog, hash_code)==NULL) ret_code= -1; else ret_code= 1; } else { ret_code= 0; } lock_release(&HashT->p_records[hash_code].lock); return ret_code; }
int get_record_id(ua_pres_t* dialog, str** rec_id) { unsigned int hash_code; ua_pres_t* rec; str* id; if (dbmode==PUA_DB_ONLY) { return( get_record_id_puadb( dialog, rec_id ) ); } *rec_id= NULL; hash_code= core_hash(dialog->pres_uri, dialog->watcher_uri, HASH_SIZE); lock_get(&HashT->p_records[hash_code].lock); rec= get_dialog(dialog, hash_code); if(rec== NULL) { LM_DBG("Record not found - looking for temporary\n"); rec = get_temporary_dialog(dialog, hash_code); if (rec == NULL) { LM_DBG("Temporary record not found\n"); lock_release(&HashT->p_records[hash_code].lock); return 0; } } id= (str*)pkg_malloc(sizeof(str)); if(id== NULL) { LM_ERR("No more memory\n"); lock_release(&HashT->p_records[hash_code].lock); return -1; } id->s= (char*)pkg_malloc(rec->id.len* sizeof(char)); if(id->s== NULL) { LM_ERR("No more memory\n"); pkg_free(id); lock_release(&HashT->p_records[hash_code].lock); return -1; } memcpy(id->s, rec->id.s, rec->id.len); id->len= rec->id.len; lock_release(&HashT->p_records[hash_code].lock); LM_DBG("rec did= %.*s\n", id->len, id->s); *rec_id= id; return 0; }
int convert_temporary_dialog(ua_pres_t *dialog) { ua_pres_t *temp_dialog; unsigned int hash_code; hash_code= core_hash(dialog->pres_uri,dialog->watcher_uri, HASH_SIZE); lock_get(&HashT->p_records[hash_code].lock); temp_dialog = get_temporary_dialog(dialog, hash_code); if (temp_dialog) delete_htable(temp_dialog, hash_code); else return -1; insert_htable(dialog, hash_code); lock_release(&HashT->p_records[hash_code].lock); return 1; }