⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucontact.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
int st_expired_ucontact(ucontact_t* _c){	     /* There is no need to change contact	      * state, because the contact will	      * be deleted anyway	      */	switch(_c->state) {	case CS_NEW:		     /* Contact is not in the database		      * yet, remove it from memory only		      */		return 0;	case CS_SYNC:	case CS_DIRTY:		     /* Remove from database here */		return 1;	}	return 0; /* Makes gcc happy */}/* * Called when the timer is about flushing the contact, * updates contact state and returns 1 if the contact * should be inserted, 2 if update , 3 if delete  * from memory, 4 if delete from database and 0 otherwise */int st_flush_ucontact(ucontact_t* _c){	switch(_c->state) {	case CS_NEW:		     /* Contact is new and is not in		      * the database yet so we have		      * to insert it		      */		_c->state = CS_SYNC;		return 1;	case CS_SYNC:		     /* Contact is synchronized, do		      * nothing		      */		return 0;	case CS_DIRTY:		     /* Contact has been modified and		      * is in the db already so we		      * have to update it		      */		_c->state = CS_SYNC;		return 2;	}	return 0; /* Makes gcc happy */}/* ============== Database related functions ================ *//* * Insert contact into the database */int db_insert_ucontact(ucontact_t* _c){	char b[256];	char* dom;	db_key_t keys[10];	db_val_t vals[10];		if (_c->flags & FL_MEM) {		return 0;	}	keys[0] = user_col.s;	keys[1] = contact_col.s;	keys[2] = expires_col.s;	keys[3] = q_col.s;	keys[4] = callid_col.s;	keys[5] = cseq_col.s;	keys[6] = flags_col.s;	keys[7] = user_agent_col.s;	keys[8] = received_col.s;	keys[9] = domain_col.s;	vals[0].type = DB_STR;	vals[0].nul = 0;	vals[0].val.str_val.s = _c->aor->s;	vals[0].val.str_val.len = _c->aor->len;	vals[1].type = DB_STR;	vals[1].nul = 0;	vals[1].val.str_val.s = _c->c.s; 	vals[1].val.str_val.len = _c->c.len;	vals[2].type = DB_DATETIME;	vals[2].nul = 0;	vals[2].val.time_val = _c->expires;	vals[3].type = DB_DOUBLE;	vals[3].nul = 0;	vals[3].val.double_val = q2double(_c->q);	vals[4].type = DB_STR;	vals[4].nul = 0;	vals[4].val.str_val.s = _c->callid.s;	vals[4].val.str_val.len = _c->callid.len;	vals[5].type = DB_INT;	vals[5].nul = 0;	vals[5].val.int_val = _c->cseq;	vals[6].type = DB_INT;	vals[6].nul = 0;	vals[6].val.bitmap_val = _c->flags;	vals[7].type = DB_STR;	vals[7].nul = 0;	vals[7].val.str_val.s = _c->user_agent.s;	vals[7].val.str_val.len = _c->user_agent.len;	vals[8].type = DB_STR;	if (_c->received.s == 0) {		vals[8].nul = 1;	} else {		vals[8].nul = 0;		vals[8].val.str_val.s = _c->received.s;		vals[8].val.str_val.len = _c->received.len;	}	if (use_domain) {		dom = q_memchr(_c->aor->s, '@', _c->aor->len);		vals[0].val.str_val.len = dom - _c->aor->s;		vals[9].type = DB_STR;		vals[9].nul = 0;		vals[9].val.str_val.s = dom + 1;		vals[9].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;	}	     /* FIXME */	memcpy(b, _c->domain->s, _c->domain->len);	b[_c->domain->len] = '\0';	if (ul_dbf.use_table(ul_dbh, b) < 0) {		LOG(L_ERR, "db_insert_ucontact(): Error in use_table\n");		return -1;	}	if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? 10 : 9) < 0) {		LOG(L_ERR, "db_insert_ucontact(): Error while inserting contact\n");		return -1;	}	return 0;}/* * Update contact in the database */int db_update_ucontact(ucontact_t* _c){	char b[256];	char* dom;	db_key_t keys1[3];	db_val_t vals1[3];	db_key_t keys2[7];	db_val_t vals2[7];	if (_c->flags & FL_MEM) {		return 0;	}	keys1[0] = user_col.s;	keys1[1] = contact_col.s;	keys1[2] = domain_col.s;	keys2[0] = expires_col.s;	keys2[1] = q_col.s;	keys2[2] = callid_col.s;	keys2[3] = cseq_col.s;	keys2[4] = flags_col.s;	keys2[5] = user_agent_col.s;	keys2[6] = received_col.s;		vals1[0].type = DB_STR;	vals1[0].nul = 0;	vals1[0].val.str_val = *_c->aor;	vals1[1].type = DB_STR;	vals1[1].nul = 0;	vals1[1].val.str_val = _c->c;	vals2[0].type = DB_DATETIME;	vals2[0].nul = 0;	vals2[0].val.time_val = _c->expires;	vals2[1].type = DB_DOUBLE;	vals2[1].nul = 0;	vals2[1].val.double_val = q2double(_c->q);	vals2[2].type = DB_STR;	vals2[2].nul = 0;	vals2[2].val.str_val = _c->callid;	vals2[3].type = DB_INT;	vals2[3].nul = 0;	vals2[3].val.int_val = _c->cseq;	vals2[4].type = DB_INT;	vals2[4].nul = 0;	vals2[4].val.bitmap_val = _c->flags;	vals2[5].type = DB_STR;	vals2[5].nul = 0;	vals2[5].val.str_val = _c->user_agent;	vals2[6].type = DB_STR;	if (_c->received.s == 0) {		vals2[6].nul = 1;	} else {		vals2[6].nul = 0;		vals2[6].val.str_val = _c->received;	}	if (use_domain) {		dom = q_memchr(_c->aor->s, '@', _c->aor->len);		vals1[0].val.str_val.len = dom - _c->aor->s;		vals1[2].type = DB_STR;		vals1[2].nul = 0;		vals1[2].val.str_val.s = dom + 1;		vals1[2].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;	}	     /* FIXME */	memcpy(b, _c->domain->s, _c->domain->len);	b[_c->domain->len] = '\0';	if (ul_dbf.use_table(ul_dbh, b) < 0) {		LOG(L_ERR, "db_upd_ucontact(): Error in use_table\n");		return -1;	}	if (ul_dbf.update(ul_dbh, keys1, 0, vals1, keys2, vals2, (use_domain) ? 3 : 2, 7) < 0) {		LOG(L_ERR, "db_upd_ucontact(): Error while updating database\n");		return -1;	}	return 0;}/* * Delete contact from the database */int db_delete_ucontact(ucontact_t* _c){	char b[256];	char* dom;	db_key_t keys[3];	db_val_t vals[3];	if (_c->flags & FL_MEM) {		return 0;	}	keys[0] = user_col.s;	keys[1] = contact_col.s;	keys[2] = domain_col.s;	vals[0].type = DB_STR;	vals[0].nul = 0;	vals[0].val.str_val = *_c->aor;	vals[1].type = DB_STR;	vals[1].nul = 0;	vals[1].val.str_val = _c->c;	if (use_domain) {		dom = q_memchr(_c->aor->s, '@', _c->aor->len);		vals[0].val.str_val.len = dom - _c->aor->s;		vals[2].type = DB_STR;		vals[2].nul = 0;		vals[2].val.str_val.s = dom + 1;		vals[2].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;	}	     /* FIXME */	memcpy(b, _c->domain->s, _c->domain->len);	b[_c->domain->len] = '\0';	if (ul_dbf.use_table(ul_dbh, b) < 0) {		LOG(L_ERR, "db_del_ucontact: Error in use_table\n");		return -1;	}	if (ul_dbf.delete(ul_dbh, keys, 0, vals, (use_domain) ? (3) : (2)) < 0) {		LOG(L_ERR, "db_del_ucontact(): Error while deleting from database\n");		return -1;	}	return 0;}/* * Update ucontact with new values */int update_ucontact(ucontact_t* _c, time_t _e, qvalue_t _q, str* _cid, int _cs,		    unsigned int _set, unsigned int _res, str* _ua, str* _recv){	/* run callbacks for UPDATE event */	if (exists_ulcb_type(UL_CONTACT_UPDATE)) {		run_ul_callbacks( UL_CONTACT_UPDATE, _c);	}	/* we have to update memory in any case, but database directly	 * only in db_mode 1 */	if (mem_update_ucontact(_c, _e, _q, _cid, _cs, _set, _res, _ua, _recv) < 0) {		LOG(L_ERR, "update_ucontact(): Error while updating\n");		return -1;	}	st_update_ucontact(_c);	if (db_mode == WRITE_THROUGH) {		if (db_update_ucontact(_c) < 0) {			LOG(L_ERR, "update_ucontact(): Error while updating database\n");		}	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -