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

📄 watcher.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
	       query_cols[n_query_cols] = "expires";	       query_vals[n_query_cols].type = DB_INT;	       query_vals[n_query_cols].nul = 0;	       query_vals[n_query_cols].val.int_val = watcher->expires;	       n_query_cols++;	       /* insert new record into database */	       LOG(L_INFO, "new_watcher: inserting %d cols into table\n", n_query_cols);	       if (pa_dbf.insert(pa_db, query_cols, query_vals, n_query_cols)				   < 0) {		    LOG(L_ERR, "new_watcher: Error while inserting tuple\n");		    return -1;	       }	  }	  if (res)	       pa_dbf.free_result(pa_db, res);     }     return 0;}/* * Read watcherinfo table from database for presentity _p */int db_read_watcherinfo(presentity_t *_p){     if (use_db) {	  db_key_t query_cols[5];	  db_op_t query_ops[5];	  db_val_t query_vals[5];	  db_key_t result_cols[9];	  db_res_t *res;	  int n_query_cols = 1;	  int n_result_cols = 0;	  int w_uri_col, s_id_col, event_package_col, status_col, watcher_event_col, display_name_col, accepts_col, expires_col;	  // LOG(L_ERR, "db_read_watcherinfo starting\n");	  query_cols[0] = "r_uri";	  query_ops[0] = OP_EQ;	  query_vals[0].type = DB_STRING;	  query_vals[0].nul = 0;	  query_vals[0].val.string_val = _p->uri.s;	  LOG(L_ERR, "db_read_watcherinfo:  _p->uri='%s'\n", _p->uri.s);	  result_cols[w_uri_col = n_result_cols++] = "w_uri";	  result_cols[s_id_col = n_result_cols++] = "s_id";	  result_cols[event_package_col = n_result_cols++] = "package";	  result_cols[status_col = n_result_cols++] = "status";	  result_cols[display_name_col = n_result_cols++] = "display_name";	  result_cols[accepts_col = n_result_cols++] = "accepts";	  result_cols[expires_col = n_result_cols++] = "expires";	  result_cols[watcher_event_col = n_result_cols++] = "event";			  if (pa_dbf.use_table(pa_db, watcherinfo_table) < 0) {		  LOG(L_ERR, "db_read_watcherinfo: Error in use_table\n");		  return -1;	  }	  if (pa_dbf.query (pa_db, query_cols, query_ops, query_vals,			result_cols, n_query_cols, n_result_cols, 0, &res) < 0) {	       LOG(L_ERR, "db_read_watcherinfo(): Error while querying watcherinfo\n");	       return -1;	  }	  if (res && res->n > 0) {	       /* fill in tuple structure from database query result */	       int i;	       for (i = 0; i < res->n; i++) {		    db_row_t *row = &res->rows[i];		    db_val_t *row_vals = ROW_VALUES(row);		    str w_uri = { 0, 0 };		    str s_id = { 0, 0 };		    str event_package_str = { 0, 0 };		    int event_package = EVENT_PRESENCE;		    str watcher_event_str = { 0, 0 };		    watcher_event_t watcher_event = WE_SUBSCRIBE;		    int accepts = row_vals[accepts_col].val.int_val;		    int expires = row_vals[expires_col].val.int_val;		    str status = { 0, 0 };		    str display_name = { 0, 0 };		    watcher_t *watcher = NULL;		    if (!row_vals[w_uri_col].nul) {			 w_uri.s = (char*)row_vals[w_uri_col].val.string_val;			 w_uri.len = strlen(w_uri.s);		    }		    if (!row_vals[s_id_col].nul) {			 s_id.s = (char*)row_vals[s_id_col].val.string_val;			 s_id.len = strlen(s_id.s);		    }		    if (!row_vals[event_package_col].nul) {			 event_package_str.s = (char*)								row_vals[event_package_col].val.string_val;			 event_package_str.len = strlen(event_package_str.s);			 event_package = event_package_from_string(&event_package_str);		    }		    if (!row_vals[status_col].nul) {			 status.s = (char*)row_vals[status_col].val.string_val;			 status.len = strlen(status.s);		    }		    if (!row_vals[watcher_event_col].nul) {			 watcher_event_str.s = (char*)									row_vals[watcher_event_col].val.string_val;			 watcher_event_str.len = strlen(watcher_event_str.s);			 watcher_event = watcher_event_from_string(&watcher_event_str);		    }		    if (!row_vals[display_name_col].nul) {			 display_name.s = (char*)row_vals[display_name_col].val.string_val;			 display_name.len = strlen(display_name.s);		    }		    if (find_watcher(_p, &w_uri, event_package, &watcher) != 0) {			 new_watcher_no_wb(_p, &w_uri, expires, event_package, accepts, NULL, &display_name, &watcher);		    }		    if (watcher) {			 watcher_status_t ws = watcher_status_from_string(&status);			 if (watcher->status != ws)			      watcher->flags |= WFLAG_SUBSCRIPTION_CHANGED;			 watcher->status = ws;			 watcher->event = watcher_event;			     			 if (s_id.s) {			      strncpy(watcher->s_id.s, s_id.s, S_ID_LEN);			      watcher->s_id.len = strlen(s_id.s);			 }		    }	       }	  }	  pa_dbf.free_result(pa_db, res);	  LOG(L_ERR, "db_read_watcherinfo:  _p->uri='%s' done\n", _p->uri.s);     }     return 0;}/* * Release a watcher structure */void free_watcher(watcher_t* _w){	tmb.free_dlg(_w->dialog);	shm_free(_w);	}/* * Print contact, for debugging purposes only */void print_watcher(FILE* _f, watcher_t* _w){	fprintf(_f, "---Watcher---\n");	fprintf(_f, "uri    : '%.*s'\n", _w->uri.len, ZSW(_w->uri.s));	fprintf(_f, "expires: %d\n", (int)(_w->expires - time(0)));	fprintf(_f, "accept : %s\n", doctype_name[_w->accept]);	fprintf(_f, "next   : %p\n", _w->next);	tmb.print_dlg(_f, _w->dialog);	fprintf(_f, "---/Watcher---\n");}/* * Update a watcher structure */int update_watcher(watcher_t* _w, time_t _e){	_w->expires = _e;	return 0;}#define CRLF "\r\n"#define CRLF_L (sizeof(CRLF) - 1)#define PUBLIC_ID "//IETF//DTD RFCxxxx PIDF 1.0//EN"#define PUBLIC_ID_L (sizeof(PUBLIC_ID) - 1)#define XML_VERSION "<?xml version=\"1.0\"?>"#define XML_VERSION_L (sizeof(XML_VERSION) - 1)#define WATCHERINFO_STAG "<watcherinfo xmlns=\"urn:ietf:params:xml:ns:watcherinfo\" version=\"0\" state=\"partial\">"#define WATCHERINFO_STAG_L (sizeof(WATCHERINFO_STAG) - 1)#define WATCHERINFO_ETAG "</watcherinfo>"#define WATCHERINFO_ETAG_L (sizeof(WATCHERINFO_ETAG) - 1)#define WATCHERLIST_START "  <watcher-list resource=\"sip:"#define WATCHERLIST_START_L (sizeof(WATCHERLIST_START) - 1)#define WATCHERLIST_ETAG "  </watcher-list>"#define WATCHERLIST_ETAG_L (sizeof(WATCHERLIST_ETAG) - 1)#define WATCHER_START "    <watcher"#define WATCHER_START_L (sizeof(WATCHER_START) - 1)#define STATUS_START " status=\""#define STATUS_START_L (sizeof(STATUS_START) - 1)#define EVENT_START "\" event=\""#define EVENT_START_L (sizeof(EVENT_START) - 1)#define SID_START "\" id=\""#define SID_START_L (sizeof(SID_START) - 1)#define DISPLAY_NAME_START "\" display_name=\""#define DISPLAY_NAME_START_L (sizeof(DISPLAY_NAME_START) - 1)#define URI_START "\">"#define URI_START_L (sizeof(URI_START) - 1)#define WATCHER_ETAG "</watcher>"#define WATCHER_ETAG_L (sizeof(WATCHER_ETAG) - 1)#define PACKAGE_START "\" package=\""#define PACKAGE_START_L (sizeof(PACKAGE_START) - 1)#define PACKAGE_END "\">"#define PACKAGE_END_L (sizeof(PACKAGE_END) - 1)void escape_str(str *unescaped){     int i;     char *s = unescaped->s;     for (i = 0; i < unescaped->len; i++) {	  if (s[i] == '<' || s[i] == '>') {	       s[i] = ' ';	  }     }}/* * Add a watcher information */int winfo_add_watcher(str* _b, int _l, watcher_t *watcher){	str strs[20];	int n_strs = 0;	int i;	int len = 0;	int status = watcher->status;#define add_string(_s, _l) ((strs[n_strs].s = (_s)), (strs[n_strs].len = (_l)), (len += _l), n_strs++)#define add_str(_s) (strs[n_strs].s = (_s.s), strs[n_strs].len = (_s.len), len += _s.len, n_strs++)#define add_pstr(_s) (strs[n_strs].s = (_s->s), strs[n_strs].len = (_s->len), len += _s->len, n_strs++)	add_string(WATCHER_START, WATCHER_START_L);	add_string(STATUS_START, STATUS_START_L);	add_str(watcher_status_names[status]);	add_string(EVENT_START, EVENT_START_L);	add_str(watcher_event_names[watcher->event]);	add_string(SID_START, SID_START_L);	add_str(watcher->s_id);	if (watcher->display_name.len > 0) {	  add_string(DISPLAY_NAME_START, DISPLAY_NAME_START_L);	  escape_str(&watcher->display_name);	  add_str(watcher->display_name);	}	add_string(URI_START, URI_START_L);	add_str(watcher->uri);	add_string(WATCHER_ETAG, WATCHER_ETAG_L);	add_string(CRLF, CRLF_L);	if (_l < len) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "winfo_add_watcher(): Buffer too small\n");		return -1;	}	for (i = 0; i < n_strs; i++)		str_append(_b, strs[i].s, strs[i].len);	return 0;}/* * Create start of winfo document */int start_winfo_doc(str* _b, int _l){	str strs[10];	int n_strs = 0;	int i;	int len = 0;	if ((XML_VERSION_L + 	     CRLF_L	    ) > _l) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "start_pidf_doc(): Buffer too small\n");		return -1;	}	add_string(XML_VERSION, XML_VERSION_L);	add_string(CRLF, CRLF_L);	add_string(WATCHERINFO_STAG, WATCHERINFO_STAG_L);	add_string(CRLF, CRLF_L);	if (_l < len) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "winfo_add_resource(): Buffer too small\n");		return -1;	}	for (i = 0; i < n_strs; i++)		str_append(_b, strs[i].s, strs[i].len);	return 0;}/* * Start a resource in a winfo document */int winfo_start_resource(str* _b, int _l, str* _uri, watcher_t *watcher){	str strs[10];	int n_strs = 0;	int i;	int len = 0;	add_string(WATCHERLIST_START, WATCHERLIST_START_L);	add_pstr(_uri);	add_string(PACKAGE_START, PACKAGE_START_L);	add_string(event_package_name[watcher->event_package], strlen(event_package_name[watcher->event_package]));	add_string(PACKAGE_END, PACKAGE_END_L);	add_string(CRLF, CRLF_L);	if (_l < len) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "winfo_add_resource(): Buffer too small\n");		return -1;	}	for (i = 0; i < n_strs; i++)		str_append(_b, strs[i].s, strs[i].len);	return 0;}/* * End a resource in a winfo document */int winfo_end_resource(str *_b, int _l){	str strs[10];	int n_strs = 0;	int i;	int len = 0;	add_string(WATCHERLIST_ETAG, WATCHERLIST_ETAG_L);	add_string(CRLF, CRLF_L);	if (_l < len) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "winfo_add_resource(): Buffer too small\n");		return -1;	}	for (i = 0; i < n_strs; i++)		str_append(_b, strs[i].s, strs[i].len);	return 0;}/* * End a winfo document */int end_winfo_doc(str* _b, int _l){	if (_l < (WATCHERINFO_ETAG_L + CRLF_L)) {		paerrno = PA_SMALL_BUFFER;		LOG(L_ERR, "end_pidf_doc(): Buffer too small\n");		return -1;	}	str_append(_b, WATCHERINFO_ETAG CRLF, WATCHERINFO_ETAG_L + CRLF_L);	return 0;}

⌨️ 快捷键说明

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