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

📄 smgmodule.cpp

📁 linux 下的sgip 协议中的数据流部分 .
💻 CPP
字号:
/****************************************************************
Copyright ?, 1989-2002, Hisunsray Tech. Co., Ltd.
File name: SMGModule.cpp
Author: lizhigang
Version:  V3.0.0.0#20030320-1
Date: 2003-03-20
Description:
History:
*****************************************************************/



#include "SMGModule.h"
#include "EMSNgor.h"
#include "PublicDefine.h"
#include "IAlarm.h"
#include "IDBProxy.h"
#include "IGateWayMsg.h"
#include "LBPPingMsg.h"
#include "IMonitor.h"
#include "RTCStime.h"
#include "ISMG.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern void PrintConsole(LPCTSTR ModuleName,char* fmt,...);

TSMGModule::TSMGModule(RTCS_CTstring clientname)
:TBaseService(COH_DataGateway, clientname, 0x01000000 , COH_DataGateway)
{
	logfile = NULL;
	logfile = new RTCS_TraceLog(SMGLogFileName);
	m_AlarmStation = 0;
	char buf[256];
	memset(buf, 0, sizeof(buf));
	GetPrivateProfileString("SMGateway","RTCS_MODULE_NAME","SMGModule",buf,256,"..//ini//smg.ini");
	m_ModuleName = buf;

	GetParam();
}
	
TSMGModule::~TSMGModule()
{
	if(logfile)
	{
		delete logfile;
		logfile = NULL;
	}
}

void TSMGModule::GetParam()
{
	//获取具有告警功能的维护终端的站点号
	m_AlarmStation = GetPrivateProfileInt("SMGateway", "ALARM_TERM_STATION", 0, MSGIniFileName);

	//数据源
	m_DataSourceCount = GetPrivateProfileInt("DBPSource", "DataSourceCount", 0, MSGIniFileName);
	if (m_DataSourceCount>64) m_DataSourceCount = 64;
	logfile->Trace(1, "  DataSourceCount = %d\n", m_DataSourceCount);

	char key[16];
	char buf[64];

	for(RTCS_CTuint i=0; i<m_DataSourceCount; i++)
	{
		sprintf(key, "DataSource%d", i);
		
		GetPrivateProfileString("DBPSource", key, "", buf, sizeof(buf), MSGIniFileName);
		logfile->Trace(1, "  %s = %s\n", key, buf);
		m_DataSourceName[i] = buf;
		m_DataSourceGOR[i] = INVALID_GOR;
	}
}

void TSMGModule::InitAppFlowTable()
{
	RTCS_CTuint FlowCount = 0;
	RTCS_CTuint FlowID = 0;
	RTCS_CTuint CommandID = 0;

	char sFlowName[64] = "";
	char sFlowFile[256] = ""; 
	char sServiceType[20] = "";
	char TempName[128] = "";

	FlowCount = GetPrivateProfileInt("AppFlow", "FlowCount", 0, MSGIniFileName);

	for(RTCS_CTuint i=0; i<FlowCount; i++)
	{
		TempName[0] = '\0';
		sprintf(TempName, "Flow%d", i+1);
		FlowID = GetPrivateProfileInt(TempName, "FlowID", 0, MSGIniFileName);
		CommandID = GetPrivateProfileInt(TempName, "DataAccessID", 0, MSGIniFileName);
		GetPrivateProfileString(TempName, "FlowName", "", sFlowName, 64, MSGIniFileName);
		GetPrivateProfileString(TempName, "FlowFile", "", sFlowFile, 256, MSGIniFileName);
		GetPrivateProfileString(TempName, "Prefix", "", sServiceType, 20, MSGIniFileName);

		if(FlowID>0 && strlen(sFlowFile)>0 && strlen(sServiceType)>0)
		{
			RTCS_CTstring ServiceType = sServiceType;
			RTCS_CTstring FlowName = sFlowName;
			RTCS_CTstring FlowFile = sFlowFile;
			int ret = m_AppFlowTable.AddAppFlow(FlowID, CommandID, ServiceType, FlowName, FlowFile); 
			if(ret == 0)
			{
				char * sFlowFile = (char*)(LPCTSTR)FlowFile;
				RTCS_CTuint load_ret = LoadScriptCode(FlowID , sFlowFile);
				if ( load_ret == RTCS_Error_OK )
				{
					logfile->Trace(0,"加载流程%s成功!\n" , (LPCTSTR)FlowName);
					PrintConsole(m_ModuleName, "加载流程%s成功!" , (LPCTSTR)FlowName);
				}
				else
				{
					logfile->Trace(0,"加载流程%s失败!\n" , (LPCTSTR)FlowName);
					PrintConsole(m_ModuleName, "加载流程%s失败!" , (LPCTSTR)FlowName);
				}
			}
		}
	}
}

int TSMGModule::SysInit()
{
	InitAppFlowTable();
	return RTCS_Error_OK;
}


void TSMGModule::AddHandleCount()
{
}

void TSMGModule::AddPaymentSuccess(RTCS_CTdouble Money)
{
}

RTCS_CTuint TSMGModule::SendAlarm(RTCS_CTuint AlarmLevel, RTCS_CTstring AlarmObject, RTCS_CTstring AlarmDetial)
{
	RTCS_CTpdu AlarmPdu;
	AlarmPdu.messageID = EvtRTCS_IAlarm_AlarmCreated;
	AlarmPdu.sender = GetGOR();
	AlarmPdu.receiver = MAKEGOR(m_AlarmStation, COH_MaintTerminal);

	RTCS_CTime currTime(time(NULL));
	RTCS_CTstring AlarmTime;
	currTime.Format(AlarmTime);

	RTCS_CTstring AlarmModule("SMGModule");

	AlarmPdu.PutUInt(RTCS_IAlarm_AlarmSeruity, AlarmLevel);
	AlarmPdu.PutString(RTCS_IAlarm_AlarmTime, AlarmTime);
	AlarmPdu.PutString(RTCS_IAlarm_AlarmModule, AlarmModule);
	AlarmPdu.PutString(RTCS_IAlarm_AlarmObject, AlarmObject);
	AlarmPdu.PutString(RTCS_IAlarm_AlarmDetail, AlarmDetial);

	logfile->Trace(0, "AlarmLevel=%u, AlarmTime=%s, AlarmModule=%s, AlarmObject=%s, AlarmDetial=%s\n",
		AlarmLevel, (LPCTSTR)AlarmTime, (LPCTSTR)AlarmModule, (LPCTSTR)AlarmObject, (LPCTSTR)AlarmDetial);

	return PostMessage(AlarmPdu);
}


void TSMGModule::Snapshot()
{
	FILE* fp = fopen(SMGSnapshotFile, "wt");
	if(!fp)
	{
		PrintConsole(m_ModuleName, "创建内存快照文件失败!");
		return;
	}

	RTCS_CTime currenttime;
	RTCS_CTstring tmpstring = "";
	currenttime.Format( tmpstring );

	fprintf(fp,"\n 流程解释模块内存快照: [%s], ModuleName:%s\n\n", (LPCTSTR)tmpstring, (LPCTSTR)m_ModuleName);
	fprintf(fp, "\nAlarmStation=%u\n", m_AlarmStation);

	fprintf(fp, "\n流程信息:\n");
	m_AppFlowTable.Snapshot(fp); 

	fprintf(fp, "\n会话对象信息:\n");
	m_SessionObjectTable.Snapshot(fp); 

	fclose(fp);
}

RTCS_CTuint TSMGModule::OnBusInserted()
{
	PrintConsole(m_ModuleName, "应用服务器模块上线");

	Init();

	if( SysInit() != RTCS_Error_OK )
	{
		logfile->Trace(0,"\t<error>TSMGModule sysinit() fail \n");
		PrintConsole(m_ModuleName, "应用服务器模块初始化处理失败");
		return RTCS_Error_FAIL;
	}

	logfile->Trace(0,"\t<error>TSMGModule sysinit() success. \n");
	PrintConsole(m_ModuleName, "应用服务器模块初始化处理成功");

	return RTCS_Error_OK;
}

RTCS_CTuint TSMGModule::OnClientOnline(RTCS_CTstring clientname)
{
	RTCS_CTuint GOR = 0;
	GOR = GetRemoteGOR(clientname);

	if (strcmp((LPCSTR)clientname, "SMAI") == 0)
		m_SMAIGOR = GOR;

	for (RTCS_CTuint i=0; i<m_DataSourceCount; i++) 
	{
		if (clientname == m_DataSourceName[i])
		{
			m_DataSourceGOR[i] = GOR;
			break;
		}
	}

	return RTCS_Error_OK;
}

RTCS_CTuint TSMGModule::OnClientOffline(RTCS_CTstring clientname)
{
	return RTCS_Error_OK;
}

void TSMGModule::InitActions()
{
	TBaseService::InitActions();

    //设置数据库超时时限
	actionTable.AddAction(actions++, "SetDBTimeOut", (SCRIPTFUNC)&TSessionObject::SetDBTimeOut);
	actionTable.AddAction(actions++, "DataAccess", (SCRIPTFUNC)&TSessionObject::DataAccess);
	//SMA动作
	actionTable.AddAction(actions++,"SMACmdBind",(SCRIPTFUNC) &TSessionObject::SMACmdBind);
	actionTable.AddAction(actions++,"SMACmdSubmit",(SCRIPTFUNC) &TSessionObject::SMACmdSubmit);
	actionTable.AddAction(actions++, "SMAGetDeliverData",(SCRIPTFUNC) &TSessionObject::SMAGetDeliverData);
	actionTable.AddAction(actions++,"SMAGetMsgContentLength",(SCRIPTFUNC) &TSessionObject::SMAGetMsgContentLength);
	actionTable.AddAction(actions++,"SMACmdUnbind",(SCRIPTFUNC) &TSessionObject::SMACmdUnbind);
	//数据操作动作
	actionTable.AddAction(actions++,"ParseParam",(SCRIPTFUNC) &TSessionObject::ParseParam);
	actionTable.AddAction(actions++,"StrUpper",(SCRIPTFUNC) &TSessionObject::StrUpper);
	actionTable.AddAction(actions++,"StrLower",(SCRIPTFUNC) &TSessionObject::StrLower);
	actionTable.AddAction(actions++,"SubStr",(SCRIPTFUNC) &TSessionObject::SubStr);
	actionTable.AddAction(actions++,"StrDigital",(SCRIPTFUNC) &TSessionObject::StrDigital);
	actionTable.AddAction(actions++,"StrLen",(SCRIPTFUNC) &TSessionObject::StrLen);
}

void TSMGModule::InitEvents()
{
	TBaseService::InitEvents();

	//失败事件
	eventTable.AddPair(new TKeyNamePair(EvtRTCS_DRIVER_Fail, "EvtFail"));
	//返回事件
	eventTable.AddPair(new TKeyNamePair(EvtRTCS_DRIVER_Return, "EvtReturn"));
	eventTable.AddPair(new TKeyNamePair(RespRTCS_IDBP_DataAccess, "EvtDBReturn"));
	//超时事件
	eventTable.AddPair(new TKeyNamePair(EvtRTCS_IClientBase_Timer, "EvtTimerExpired"));
	//DataAccess 请求
	eventTable.AddPair(new TKeyNamePair(CmdRTCS_IDBP_DataAccess, "EvtDataAccessRequest"));
	//SMA事件
	eventTable.AddPair(new TKeyNamePair(RespRTCS_ISMA_Submit,   "EvtSubmit"));
	eventTable.AddPair(new TKeyNamePair(RespRTCS_ISMA_Bind,   "EvtBind"));
	eventTable.AddPair(new TKeyNamePair(RespRTCS_ISMA_Terminate,   "EvtUnbind"));

	eventTable.AddPair(new TKeyNamePair(CmdRTCS_ISMA_Deliver,   "EvtISMGDeliver"));
}

void TSMGModule::InitSystemVars()
{
	TBaseService::InitSystemVars();

	sysvarTable.AddPair(new TKeyNamePair(_FIELD1,"_Field1"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD2,"_Field2"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD3,"_Field3"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD4,"_Field4"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD5,"_Field5"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD6,"_Field6"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD7,"_Field7"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD8,"_Field8"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD9,"_Field9"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD10,"_Field10"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD11, "_Field11"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD12, "_Field12"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD13, "_Field13"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD14, "_Field14"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD15, "_Field15"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD16, "_Field16"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD17, "_Field17"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD18, "_Field18"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD19, "_Field19"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD20, "_Field20"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD21, "_Field21"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD22, "_Field22"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD23, "_Field23"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD24, "_Field24"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD25, "_Field25"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD26, "_Field26"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD27, "_Field27"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD28, "_Field28"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD29, "_Field29"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD30, "_Field30"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD31, "_Field31"));
	sysvarTable.AddPair(new TKeyNamePair(_FIELD32, "_Field32"));
	sysvarTable.AddPair(new TKeyNamePair(_SessionID,"_SessionID"));
	sysvarTable.AddPair(new TKeyNamePair(_CreateTime,"_CreateTime"));
	sysvarTable.AddPair(new TKeyNamePair(_PacketSender,"_PacketSender"));
	sysvarTable.AddPair(new TKeyNamePair(_PacketSenderObj,"_PacketSenderObj"));
	sysvarTable.AddPair(new TKeyNamePair(_PacketReceiverObj,"_PacketReceiverObj"));
	sysvarTable.AddPair(new TKeyNamePair(_Result,"_Result"));

	sysvarTable.AddPair(new TKeyNamePair(_SMASrcterminalid, "_SMASrcterminalid"));
	sysvarTable.AddPair(new TKeyNamePair(_SMADestUsrtl, "_SMADestUsrtl"));
	sysvarTable.AddPair(new TKeyNamePair(_SMADestterminalid, "_SMADestterminalid"));
	sysvarTable.AddPair(new TKeyNamePair(_SMAMsgLength, "_SMAMsgLength"));
	sysvarTable.AddPair(new TKeyNamePair(_SMAMsgContent, "_SMAMsgContent"));
	sysvarTable.AddPair(new TKeyNamePair(_TempSysStrVar, "_TempSysStrVar"));
}

void TSMGModule::InitMsgAPI()
{
	TBaseService::InitMsgAPI();

	msgAPITable.AddMsgAPI(EvtRTCS_DRIVER_Return, "EvtReturn", (MSGHANDLER)&TSMGModule::OnEvtReturn);
	msgAPITable.AddMsgAPI(EvtRTCS_DRIVER_Fail, "EvtFail", (MSGHANDLER)&TSMGModule::OnEvtFail);
	msgAPITable.AddMsgAPI(EvtRTCS_IClientBase_Timer, "EvtTimerExpired", (MSGHANDLER)&TSMGModule::OnEvtTimerExpired);
	msgAPITable.AddMsgAPI(CmdRTCS_ISMA_Deliver, "EvtISMGDeliver", (MSGHANDLER)&TSMGModule::OnISMGDeliver);
	msgAPITable.AddMsgAPI(RespRTCS_ISMA_Bind, "EvtBind", (MSGHANDLER)&TSMGModule::OnISMGBindResp);
	msgAPITable.AddMsgAPI(RespRTCS_ISMA_Submit, "EvtSubmit", (MSGHANDLER)&TSMGModule::OnISMGSubmitResp);
	msgAPITable.AddMsgAPI(RespRTCS_ISMA_Terminate, "EvtUnBind", (MSGHANDLER)&TSMGModule::OnISMGUnBindResp);

	msgAPITable.AddMsgAPI(RespRTCS_IDBP_DataAccess,"EvtDBReturn",(MSGHANDLER)&TSMGModule::OnDataAccessResp);
}

TRealtimeObject * TSMGModule::HandleExceptionAPI(RTCS_CTpdu & message)
{
	switch(message.messageID)
	{
		case CmdRTCS_IMonitor_CommandRequest:
			OnQueryInfo(message);
			break;
		case CmdRTCS_LBPPing_RequestData:
			OnPing(message);
			break;
		case RespRTCS_IMonitor_CommandRequest:
			OnRespQueryInfoFromDBAccessModule(message);
			break;
		default:
			break;
	}
	return NULL;
}

void TSMGModule::OnObjectIdle(TRealtimeObject * object)
{
	TSessionObject * pSessionobject = (TSessionObject *)object;
	m_SessionObjectTable.DeleteSessionObject(pSessionobject->m_SessionID);  
}

RTCS_CTuint TSMGModule::OnPing(RTCS_CTpdu& pdu)
{
	RTCS_CTpdu RespPdu;
	RespPdu.messageID = RespRTCS_LBPPing_RequestData;
	RespPdu.sender = GetGOR();
	RespPdu.receiver = pdu.sender;
	RespPdu.receiverObj = pdu.senderObj;

	return PostMessage(RespPdu);
}

RTCS_CTuint TSMGModule::OnQueryInfo(RTCS_CTpdu& pdu)
{
	//把消息转换给数据库访问模块,获取队列信息。
	RTCS_CTuint StationNo = GetStationNo();
	RTCS_CTuint Receiver = MAKEGOR(StationNo, COH_DBProxy);

	pdu.senderObj = pdu.sender;
	pdu.sender = GetGOR();
	pdu.receiver = Receiver;

	return PostMessage(pdu);
}

RTCS_CTuint TSMGModule::OnRespQueryInfoFromDBAccessModule(RTCS_CTpdu& pdu)
{
	pdu.sender = GetGOR();
	pdu.receiver = pdu.senderObj;  //请求消息的真正发起者


	return PostMessage(pdu);
}

RTCS_CTint TSMGModule::Report2Exterm(RTCS_CTstring FlowID,
										  RTCS_CTstring CardID,
										  RTCS_CTstring PhoneNumber,
										  RTCS_CTstring FullTime, 
										  RTCS_CTstring FullMoney)
{
	RTCS_CTpdu pdu;
	pdu.sender = GetGOR();
	pdu.receiver = MAKEGOR(m_AlarmStation,COH_MaintTerminal);
	pdu.messageID = EvtRTCS_IMonitor_FlowTrace;

	RTCS_CTstring tmpStr[5];
	tmpStr[0] = FlowID;
	tmpStr[1] = CardID;
	tmpStr[2] = PhoneNumber;
	tmpStr[3] = FullTime;
	tmpStr[4] = FullMoney;

	RTCS_CTstringArray ReportStringArray = tmpStr;
	pdu.PutStringArray(RTCS_IMonitor_TraceData,ReportStringArray,5);

	return PostMessage(pdu);
}

RTCS_CTuint TSMGModule::GetDataSource(RTCS_CTuint index)
{
	if(index >= 0 && index < 64)
		return m_DataSourceGOR[index];
	else
		return 0;
};

⌨️ 快捷键说明

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