📄 mgcp_scm.c
字号:
/* 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 + -