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

📄 mgcp_scm.c

📁 一个有关MGCP协议的源程序文件
💻 C
📖 第 1 页 / 共 5 页
字号:
/* header include files (.h) */
#include "envopt.h"        /* environment options */  
#include "envdep.h"        /* environment dependent */
#include "envind.h"        /* environment independent */
#include "gen.h"           /* general layer */
#include "ssi.h"           /* system services */
#include "cm_hash.h"       /* common hash functions */
#include "cm5.h"           /* common timer functions */
#include "cm_llist.h"      /* common linked list */
#include "cm_inet.h"       /* common sockets lib */
#include "cm_tpt.h"        /* common transport */
#include "cm_mblk.h"       /* ASN memory management */
#include "cm_abnf.h"  
#include "cm_tkns.h"       /* common tokens */
#include "cm_dns.h"        /* common DNS library defines */
#include "mgt.h"           /* upper interface */
#include "lmg.h"           /* layer management interface */
#include "cm_sdp.h"        /* SDP related constants */
#include "mg.h"            /* MGCP contol related */
#include "hit.h"           /* TUCL layer */
#include "mg_err.h"        /* MGCP error */
#include "mgcp_scm.h"
#include "mgcp_msg.h"
#include "cm_sql.h"

#include "gen.x"           /* general layer */
#include "ssi.x"           /* system services */
#include "cm_hash.x"       /* hashing functions */
#include "cm5.x"           /* timer functions */
#include "cm_llist.x"      /* common linked list */
#include "cm_lib.x"        /* common lib */
#include "cm_inet.x"       /* common sockets lib */
#include "cm_tpt.x"        /* common transport */
#include "cm_mblk.x"       /* ASN memory management */
#include "cm_abnf.x"  
#include "cm_tkns.x"       /* common tokens */
#include "cm_dns.x"        /* common DNS library defines */
#include "cm_sdp.x"        /* SDP related types */
#include "mgt.x"           /* upper interface */
#include "lmg.x"           /* layer management interface */
#include "mg.x"            /* MGCP contol related */
#include "cm_inet.x"
#include "mgcp_scm.x"
#include "mgc_sm.x"
#include "mgc_tsk.x"
#include "mgcp_ivr.x"
#include <time.h>

#define mgListAdd(pGw) cmHashListInsert(&mgGwHashList, (PTR)pGw, _strlwr(pGw->dName), cmStrlen(pGw->dName))
#define mgListDel(pGw) cmHashListDelete(&mgGwHashList, (PTR)pGw)


/* Gateway Hash List */
PRIVATE CmHashListCp mgGwHashList;
PRIVATE CmHashListCp mgGwHashListId;

/* Active Gateway Hash List */
PRIVATE CmHashListCp mgActiveGwHashList;

/* VPBX Hash List */
PRIVATE CmHashListCp mgVpbxHashList;

/* Area Hash List */
PRIVATE CmHashListCp mgAreaHashList;

/* Endpoint Hash List by telephone number */
PRIVATE CmHashListCp mgPnHashList;

/* MGC genercal configuration */
PUBLIC mgcGenCfg     mgCfg;

typedef struct {
    S32 cfgCmd;
    S8  *cfgWord; 
}cfgCmd;

PRIVATE cfgCmd cfgCmdList[] = {
    {XREG, "reg"},
    {XGAD, "gad"},
    {XGMD, "gmd"},
    {XGDL, "gdl"},
    {XVAD, "vad"},
    {XVMD, "vmd"},
    {XVDL, "vdl"},
    {XEAD, "ead"},
    {XEMD, "emd"},
    {XEDL, "edl"},
    {XHAD, "had"},
    {XHMD, "hmd"},
    {XHDL, "hdl"},
    {XTAD, "tad"},
    {XTMD, "tmd"},
    {XTDL, "tdl"},
    {XPAD, "pad"},
    {XPDL, "pdl"},
    {XPMD, "pmd"},
    {XRBT, "rbt"}
};

PRIVATE Txt * mpStrOnline = "在线";
PRIVATE Txt * mpStrOffline = "离线";

PRIVATE S16 mgScmFindGwById
(
U32 gwid,
mgGateway **ppGw
);

PUBLIC S16 mgScmLoadArea
(
mgArea  *area
);

PUBLIC S16 mgScmUnloadGw
(
mgGateway* gw
);

/*
*
*       Fun:    mgScmInit 
*
*       Desc:   Init Service Control Manager
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  None
*
*       File:   mgc_scm.c
*
*/

PUBLIC S16 mgScmInit
(
void
)
{
    S16 ret;
	PRIVATE Bool called = FALSE;

	if (called) RETVALUE(ROK);

	called = TRUE;

    MGC_TRC(mgScmInit)

    sqlConnPoolOpen();

    ret = cmHashListInit(&mgAreaHashList,
                         32,
                         MG_GET_OFFSET(mgArea, aListCp),
                         FALSE,
                         CM_HASH_KEYTYPE_STR,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    ret = cmHashListInit(&mgVpbxHashList,
                         32,
                         MG_GET_OFFSET(mgVPBX, vList),
                         FALSE,
                         CM_HASH_KEYTYPE_U32MOD,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    ret = cmHashListInit(&mgGwHashList,
                         32,
                         MG_GET_OFFSET(mgGateway, gList),
                         FALSE,
                         CM_HASH_KEYTYPE_STR,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    ret = cmHashListInit(&mgGwHashListId,
                         32,
                         MG_GET_OFFSET(mgGateway, idList),
                         FALSE,
                         CM_HASH_KEYTYPE_U32MOD,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    ret = cmHashListInit(&mgActiveGwHashList,
                         32,
                         MG_GET_OFFSET(mgGateway, aList),
                         FALSE,
                         CM_HASH_KEYTYPE_U32MOD,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    ret = cmHashListInit(&mgPnHashList,
                         64,
                         MG_GET_OFFSET(mgEndpoint, pList),
                         FALSE,
                         CM_HASH_KEYTYPE_STR,
                         MGC_REG,
                         MGC_POOL
                         );
    if (ret != ROK) {
        RETVALUE(RFAILED);
    }

    /* Load VPBX, Gateway, Endpoints from DB */
    if (mgScmLoadElementsFromDb() != ROK) {
        RETVALUE(RFAILED);
    }
	
    RETVALUE(ROK);
}

/*
*
*       Fun:    mgScmGetMgcListenAddr 
*
*       Desc:   Get MGC IP address
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  <NONE>
*
*       File:   mgc_scm.c
*
*/
PUBLIC  mgScmGetMgcListenAddr
(
CmInetIpAddr    *addr,
U16             *port
)
{
    MGC_TRC(mgScmGetMgcListenAddr)
    
    /* Get MGC address and port from configuration data base */
    *port = mgCfg.port;
    if (mgCfg.mgcIpAddr != 0) {
        *addr = mgCfg.mgcIpAddr;
    }
    else {
        CmInetIpAddrTbl addrTbl;
        S8              hostname[255];
        
        /* or use the default value */
        if (gethostname(hostname, 255) != 0) {
            scmPrint(( "gethostname failed\n"));
            RETVALUE(RFAILED);		
        }

        if (cmInetGetHostByName(hostname, &addrTbl) != ROK) {
            scmPrint(( "cmInetGetHostByName failed for (%s)\n", hostname));
            RETVALUE(RFAILED);
        }

        *addr = addrTbl.netAddr[0];
    }

    RETVALUE(ROK);
}

/*
*
*       Fun:    mgScmGetMgcNtfyAddr 
*
*       Desc:   Get MGC notified address
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  <NONE>
*
*       File:   mgc_scm.c
*
*/
PUBLIC  mgScmGetMgcNtfyAddr
(
S8    **host,
U16   *port
)
{        
    MGC_TRC(mgScmGetMgcNtfyAddr)

    /* Get MGC address and port from configuration data base */
    *port = mgCfg.port;
    if (mgCfg.mgcIpAddr != '\0') {
        *host = mgCfg.mgcIpAddrStr;
    }
    else {
        CmInetIpAddrTbl addrTbl;
        S8              hostname[255];
        
        /* or use the default value */
        if (gethostname(hostname, 255) != 0) {
            scmPrint(( "gethostname failed\n"));
            RETVALUE(RFAILED);		
        }

        if (cmInetGetHostByName(hostname, &addrTbl) != ROK) {
            scmPrint(( "cmInetGetHostByName failed for (%s)\n", hostname));
            RETVALUE(RFAILED);
        }

        cmInetNtoa(CM_INET_HTON_U32(addrTbl.netAddr[0]), (S8 **)host);
    }

    RETVALUE(ROK);
}



/*
*
*       Fun:    mgScmLoadVpbxFromDb 
*
*       Desc:   Load a VPBX into memory from databse
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  None
*
*       File:   mgc_scm.c
*
*/
PRIVATE S16 mgScmLoadAreaFromDb
(
)
{
    Txt         szSQL[1024], *stopStr;
    SQL_CONN	*myData;
    SQL_RES	    *res;
    SQL_ROW     row;
    mgArea      area;
    U32         num, i;

    myData = sqlConnGet();
    /* Load Areas */
    sprintf(szSQL, "select id, area_name, country_code, area_code, dgtMap from area");
        
    if (sqlQuery(myData, szSQL, &res) == 0) {    
        
        num = sqlGetNumRows(res);
        for (i = 0; i < num; i++) {
            row = sqlGetRow(res);
            area.id = strtoul(row[0], &stopStr, 10);
            if ((row[1] == NULLP) || (strlen(row[1]) == 0)) {
                area.name[0] = '\0';
            }
            else {
                strcpy(area.name, row[1]);
            }
            if ((row[2] == NULLP) || (strlen(row[2]) == 0)) {
                area.countryCode[0] = '\0';
            }
            else {
                strcpy(area.countryCode, row[2]);
            }
            if ((row[3] == NULLP) || (strlen(row[3]) == 0)) {
                area.areaCode[0] = '\0';
            }
            else {
                strcpy(area.areaCode, row[3]);
            }
            if ((row[4] == NULLP) || (strlen(row[4]) == 0)) {
                area.dgtMap[0] = '\0';
            }
            else {
                strcpy(area.dgtMap, row[4]);
            }
            
            if (mgScmLoadArea(&area) != ROK) {
                scmPrint(( "Failed to load area (%d)\n", area.id));
            }
        }
        sqlClear(res);
    }
    else {
        scmPrint(( "SQL_CONN Error: Couldn't execute %s on the server !\n", szSQL));
    }

    sqlConnPut(myData);

    RETVALUE(ROK);

}

/*
*
*       Fun:    mgScmLoadVpbxFromDb 
*
*       Desc:   Load a VPBX into memory from databse
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  None
*
*       File:   mgc_scm.c
*
*/
PRIVATE S16 mgScmReloadVpbxFromDb
(
U8  *id,
mgVPBX *oldPbx 
)
{
    Txt         szSQL[1024], *stopStr;
    SQL_CONN	*myData;
    SQL_RES	    *res;
    SQL_ROW     row;
    U32         num, i;

    myData = sqlConnGet();
    /* Load VPBXs */
    sprintf(szSQL, "select id, digitmap, ac_code, name, vpbx_code, vpbx_ext_len, trunkgroup_id from vpbx_tbl where id=\'%s\'", 
        id);
        
    if (sqlQuery(myData, szSQL, &res) == 0) {    
        
        num = sqlGetNumRows(res);
        for (i = 0; i < num; i++) {
            row = sqlGetRow(res);
            oldPbx->vPBXid = strtoul(row[0], &stopStr, 10);
            strcpy(oldPbx->dgtMap, row[1]);
            oldPbx->accessCode = row[2][0];
            strcpy(oldPbx->name, row[3]);
            strcpy(oldPbx->vpbxCode, row[4]);
            oldPbx->vpbx_ext_len = atoi(row[5]);
            oldPbx->trunkGroupId = atoi(row[6]);
        }
        sqlClear(res);
    }
    else {
        scmPrint(( "SQL_CONN Error: Couldn't execute %s on the server !\n", szSQL));
    }

    sqlConnPut(myData);

    RETVALUE(ROK);

}

/*
*
*       Fun:    mgScmLoadVpbxFromDb 
*
*       Desc:   Load a VPBX into memory from databse
*
*       Ret:    ROK
*               RFAILED
*
*       Notes:  None
*
*       File:   mgc_scm.c
*
*/
PRIVATE S16 mgScmLoadVpbxFromDb
(
U8  *name
)
{
    Txt         szSQL[1024], *stopStr;
    SQL_CONN	*myData;
    SQL_RES	    *res;
    SQL_ROW     row;
    mgVPBX      vpbx;
    U32         num, i;
/*
	id		            INT  NOT NULL AUTO_INCREMENT,
	name             	char(64)  DEFAULT ''    NOT NULL,
	description      	char(64)  DEFAULT ''    NOT NULL,
	digitmap		    CHAR(255) DEFAULT ''	NOT NULL,
	vpbx_code        	CHAR(8)	  DEFAULT '0'	NOT NULL,
	vpbx_ext_len     	CHAR(1)	  DEFAULT '0'	NOT NULL,
	ac_code	         	CHAR(1)	  DEFAULT '0'	NOT NULL,
*/   
    myData = sqlConnGet();
    /* Load VPBXs */
    if (*name != '*')
        sprintf(szSQL, "select id, digitmap, ac_code, name, vpbx_code, vpbx_ext_len, trunkgroup_id from vpbx_tbl where name = \'%s\'", name);
    else
        sprintf(szSQL, "select id, digitmap, ac_code, name, vpbx_code, vpbx_ext_len, trunkgroup_id from vpbx_tbl");
        
    if (sqlQuery(myData, szSQL, &res) == 0) {    
        
        num = sqlGetNumRows(res);
        for (i = 0; i < num; i++) {
            row = sqlGetRow(res);
            vpbx.vPBXid = strtoul(row[0], &stopStr, 10);
            strcpy(vpbx.dgtMap, row[1]);
            vpbx.accessCode = row[2][0];
            strcpy(vpbx.name, row[3]);
            strcpy(vpbx.vpbxCode, row[4]);
            vpbx.vpbx_ext_len = atoi(row[5]);
            vpbx.trunkGroupId = atoi(row[6]);
            
            if (mgScmLoadVpbx(&vpbx) != ROK) {
                scmPrint(( "Failed to load VPBX (%d)\n", vpbx.vPBXid));
            }
        }
        sqlClear(res);
    }
    else {
        scmPrint(( "SQL_CONN Error: Couldn't execute %s on the server !\n", szSQL));
    }

    sqlConnPut(myData);

    RETVALUE(ROK);

}

⌨️ 快捷键说明

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