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

📄 xjab_util.c

📁 性能优秀的SIP Proxy
💻 C
字号:
/* * $Id: xjab_util.c,v 1.1.1.1 2005/06/13 16:47:39 bogdan_iancu Exp $ * * eXtended JABber module - Jabber connections pool * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of openser, a free SIP server. * * openser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * openser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <string.h>#include <unistd.h>#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include "../../dprint.h"#include "../../mem/mem.h"#include "../../mem/shm_mem.h"#include "../../timer.h"#include "xjab_util.h"#include "xjab_jcon.h"#include "mdefines.h"/** * init a jc_pool structure * - size : maximum number of the open connection to Jabber * - jlen : maximum size of messages queue * #return : pointer to the structure or NULL on error */xj_jcon_pool xj_jcon_pool_init(int size, int jlen, int ch){	xj_jcon_pool jcp = (xj_jcon_pool)_M_MALLOC(sizeof(t_xj_jcon_pool));	if(jcp == NULL)		return NULL;	jcp->len = size;	jcp->ojc = (xj_jcon*)_M_MALLOC(size*sizeof(xj_jcon));	if(jcp->ojc == NULL)	{		_M_FREE(jcp);		return NULL;	}	memset( jcp->ojc , 0, size*sizeof(xj_jcon) );	jcp->jmqueue.len = jlen;	jcp->jmqueue.size = 0;	jcp->jmqueue.cache = (ch>0)?ch:90;	jcp->jmqueue.expire = (int*)_M_MALLOC(jlen*sizeof(int));	if(jcp->jmqueue.expire == NULL)	{		_M_FREE(jcp->ojc);		_M_FREE(jcp);		return NULL;	}	jcp->jmqueue.jsm=(xj_sipmsg*)_M_MALLOC(jlen*sizeof(xj_sipmsg));	if(jcp->jmqueue.jsm == NULL)	{		_M_FREE(jcp->jmqueue.expire);		_M_FREE(jcp->ojc);		_M_FREE(jcp);		return NULL;	}	jcp->jmqueue.ojc = (xj_jcon*)_M_MALLOC(jlen*sizeof(xj_jcon));	if(jcp->jmqueue.ojc == NULL)	{		_M_FREE(jcp->jmqueue.expire);		_M_FREE(jcp->jmqueue.jsm);		_M_FREE(jcp->ojc);		_M_FREE(jcp);		return NULL;	}	memset( jcp->jmqueue.expire , 0, jlen*sizeof(int) );	memset( jcp->jmqueue.jsm , 0, jlen*sizeof(xj_sipmsg) );	memset( jcp->jmqueue.ojc , 0, jlen*sizeof(xj_jcon) );	return jcp;}/** * add a new element in messages queue * - jcp : pointer to the Jabber connections pool structure * - _jsm : pointer to the message * - _ojc : pointer to the Jabber connection that will be used for this message * #return : 0 on success or <0 on error */int xj_jcon_pool_add_jmsg(xj_jcon_pool jcp, xj_sipmsg _jsm, xj_jcon _ojc){	int i;		if(jcp == NULL)		return -1;	if(jcp->jmqueue.size == jcp->jmqueue.len)		return -2;#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_jcon_pool_add_jmsg: add msg into the pool\n");#endif	for(i = 0; i<jcp->jmqueue.len; i++)	{		if(jcp->jmqueue.jsm[i] == NULL || jcp->jmqueue.ojc[i] == NULL)		{			jcp->jmqueue.size++;			jcp->jmqueue.expire[i] = get_ticks() + jcp->jmqueue.cache;			jcp->jmqueue.jsm[i] = _jsm;			jcp->jmqueue.ojc[i] = _ojc;			return 0;		}	}	return -2;}/** * delete first element from messages queue * - jcp : pointer to the Jabber connections pool structure * #return : 0 on success or <0 on error */int xj_jcon_pool_del_jmsg(xj_jcon_pool jcp, int idx){	if(jcp == NULL)		return -1;	if(jcp->jmqueue.size <= 0)		return -2;	jcp->jmqueue.size--;	jcp->jmqueue.jsm[idx] = NULL;	jcp->jmqueue.ojc[idx] = NULL;		return 0;}/** * add a new connection in pool * - jcp : pointer to the Jabber connections pool structure * #return : 0 on success or <0 on error */int xj_jcon_pool_add(xj_jcon_pool jcp, xj_jcon jc){	int i = 0;		if(jcp == NULL)		return -1;#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_jcon_pool_add: add connection into the pool\n");#endif		while(i < jcp->len && jcp->ojc[i] != NULL)		i++;	if(i >= jcp->len)		return -1;	jcp->ojc[i] = jc;		return 0;}/** * get the jabber connection associated with 'id' * - jcp : pointer to the Jabber connections pool structure * - id : id of the Jabber connection * #return : pointer to the open connection to Jabber structure or NULL on error */xj_jcon xj_jcon_pool_get(xj_jcon_pool jcp, xj_jkey jkey){	int i = 0;	xj_jcon _ojc;		if(jcp==NULL || jkey==NULL || jkey->id==NULL || jkey->id->s==NULL)		return NULL;#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_jcon_pool_get: looking for the connection of <%.*s>"		" into the pool\n", jkey->id->len, jkey->id->s);#endif	while(i < jcp->len)	{	 	if((jcp->ojc[i]!=NULL) && jcp->ojc[i]->jkey->hash==jkey->hash && 			(!strncmp(jcp->ojc[i]->jkey->id->s, jkey->id->s, jkey->id->len)))	 	{	 		_ojc = jcp->ojc[i];	 		//jcp->ojc[i] = NULL;	 		return _ojc;	 	}		i++;	}	return NULL;}/** * remove the connection associated with 'id' from pool * - jcp : pointer to the Jabber connections pool structure * - id : id of the Jabber connection * #return : 0 on success or <0 on error */int xj_jcon_pool_del(xj_jcon_pool jcp, xj_jkey jkey){	int i = 0;		if(jcp==NULL || jkey==NULL || jkey->id==NULL || jkey->id->s==NULL)		return -1;#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_jcon_pool_del: removing a connection from the pool\n");#endif	while(i < jcp->len)	{	 	if((jcp->ojc[i]!=NULL) && jcp->ojc[i]->jkey->hash==jkey->hash && 			(!strncmp(jcp->ojc[i]->jkey->id->s,jkey->id->s,jkey->id->len)))	 	{	 		xj_jcon_free(jcp->ojc[i]);	 		jcp->ojc[i] = NULL;	 		break;	 	}		i++;	}	return 0;}/** * free a Jabber connections pool structure * - jcp : pointer to the Jabber connections pool structure */void xj_jcon_pool_free(xj_jcon_pool jcp){	int i;	if(jcp == NULL)		return;#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_jcon_pool_free: -----START-----\n");#endif	if(jcp->ojc != NULL)	{		for(i=0; i<jcp->len; i++)		{			if(jcp->ojc[i] != NULL)				xj_jcon_free(jcp->ojc[i]);		}		_M_FREE(jcp->ojc);	}	if(jcp->jmqueue.jsm != NULL)		_M_FREE(jcp->jmqueue.jsm);	if(jcp->jmqueue.ojc != NULL)		_M_FREE(jcp->jmqueue.ojc);	if(jcp->jmqueue.expire != NULL)		_M_FREE(jcp->jmqueue.expire);			_M_FREE(jcp);}

⌨️ 快捷键说明

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