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

📄 cmppmessage.cpp

📁 CMPP3.0模拟网关
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include <afxmt.h>
#include "CmppMessage.h"
#include "ut_md5.h"

CCmppMessage::CCmppMessage()
{
	m_nRegisteredDelivery = 0;
	m_nVersion = 0x12;
	m_nUseUnicode = GetPrivateProfileInt("CMPP_CLIENT","UNICODE",0,".\\smsconfig.ini");
}

int  CCmppMessage::FillData(char *dst, const char *src, int cnt) const
{
	if (src == NULL) src = "";
	int len = strlen(src);
	if (len > cnt) len = cnt;
	memcpy(dst, src, len);
	memset(dst + len,0, cnt - len);
	return cnt;
}

bool CCmppMessage::IsReplyMessage() const
{
	return ((m_nCommandID & 0x80000000) != 0);
}

int CCmppMessage::EncodeData(char *out, char c) const
{
	out[0] = c;
	return sizeof(char);
}

int CCmppMessage::EncodeData(char *out, short s) const
{
	s = htons(s);
	memcpy(out, &s, sizeof(short));
	return sizeof(short);
}

int CCmppMessage::EncodeData(char *out, long l) const
{
	l = htonl(l);
	memcpy(out, &l, sizeof(long));
	return sizeof(long);
}

int CCmppMessage::EncodeData(char *out, __int64 ll) const
{
	char *p = (char *)&ll;
	for (int i = 0; i < sizeof(__int64); i++)
		out[i] = p[(sizeof(__int64) - 1) - i];
	return sizeof(__int64);
}

int CCmppMessage::EncodeData(char *out, const char *s, int len) const
{
	if (s == NULL) s = "";
	int len1 = strlen(s);

	if (len1 < len)
	{
		memcpy(out, s, len1);
		memset(out + len1, 0, len - len1);
	}
	else
		memcpy(out, s, len);
	return len;
}

int CCmppMessage::EncodeMessage(char *out) const
{
	// fill message header
	int index = 4;
	index += EncodeData(out + index, (long)m_nCommandID);
	index += EncodeData(out + index, (long)m_nSequenceID);

	// fill message body
	int i;
	memset((void *)reserve, 0, sizeof(reserve));
	switch(m_nCommandID)
	{
	case CMPP_Connect:
		index += EncodeData(out + index, m_sSource_Addr,6);
		index += EncodeData(out + index, m_AuthenticatorICP, 16);
		index += EncodeData(out + index, (char)m_nVersion);
		index += EncodeData(out + index, (long)m_nTimeStamp);
		break;

	case CMPP_Connect_REP:
		index += EncodeData(out + index, (char)m_nStatus);
		index += EncodeData(out + index, m_AuthenticatorISMG, 16);
		index += EncodeData(out + index, (char)m_nVersion);
		break;

	case CMPP_Terminate:
		break;

	case CMPP_Terminate_REP:
		break;

	case CMPP_Submit:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, (char)m_nPKTotal);
		index += EncodeData(out + index, (char)m_nPKNumber);
		index += EncodeData(out + index, (char)m_nRegisteredDelivery);
		index += EncodeData(out + index, (char)m_nMsgLevel);
		index += EncodeData(out + index, m_sServiceID, 10);

		index += EncodeData(out + index, (char)m_nFee_UserType);
		index += EncodeData(out + index, m_sFeeTerminalID, 21);
		index += EncodeData(out + index, (char)m_nTP_pid);
		index += EncodeData(out + index, (char)m_nTP_udhi);

		index += EncodeData(out + index, (char)m_nMsgFmt);
		index += EncodeData(out + index, m_sSource_Addr, 6);
		index += EncodeData(out + index, m_sFeeType,2);
		index += EncodeData(out + index, m_sFeeCode,6);
		index += EncodeData(out + index, m_sValidTime, 17);
		index += EncodeData(out + index, m_sAtTime, 17);
		index += EncodeData(out + index, m_sSrcTerminalID, 21);
		index += EncodeData(out + index, (char)m_nDestUsrTl);
		for (i = 0; i < m_nDestUsrTl; i++)
			index += EncodeData(out + index, m_sDestTerminalIDs[i], 21);
		index += EncodeData(out + index, (char)m_nMsgLength);
		memcpy(out + index, m_sMsgContent, m_nMsgLength);
		index += m_nMsgLength;
		index += EncodeData(out + index, reserve, 8);
		break;

	case CMPP_Submit_REP:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, (char)m_nResult);
		break;

	case CMPP_Query:
		index += EncodeData(out + index, m_sTime, 8);
		index += EncodeData(out + index, (char)m_nQueryType);
		index += EncodeData(out + index, m_sQueryCode, 10);
		index += EncodeData(out + index, reserve, 8);
		break;

	case CMPP_Query_REP:
		index += EncodeData(out + index, m_sTime, 8);
		index += EncodeData(out + index, (char)m_nQueryType);
		index += EncodeData(out + index, m_sQueryCode, 10);
		index += EncodeData(out + index, (long)m_nMT_TLMsg);
		index += EncodeData(out + index, (long)m_nMT_TLUsr);
		index += EncodeData(out + index, (long)m_nMT_Scs);
		index += EncodeData(out + index, (long)m_nMT_WT);
		index += EncodeData(out + index, (long)m_nMT_FL);
		index += EncodeData(out + index, (long)m_nMO_Scs);
		index += EncodeData(out + index, (long)m_nMO_WT);
		index += EncodeData(out + index, (long)m_nMO_FL);
		break;
	case CMPP_Deliver:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, m_sDestnation_id, 21);
		index += EncodeData(out + index, m_sServiceID, 10);
		index += EncodeData(out + index, (char)m_nTP_pid);
		index += EncodeData(out + index, (char)m_nTP_udhi);
		
		index += EncodeData(out + index, (char)m_nMsgFmt);
		index += EncodeData(out + index, m_sSrcTerminalID, 21);
		index += EncodeData(out + index, (char)m_nRegisteredDelivery);
		index += EncodeData(out + index, (char)m_nMsgLength);
		if (m_nRegisteredDelivery == 0)
		{
			// normal MO msg
			index += EncodeData(out + index, m_sMsgContent, m_nMsgLength);
		}
		else
		{
			 // status report
			index += EncodeData(out + index, (__int64)m_nMsgIDForStatus);
			index += EncodeData(out + index, m_sMTStatus, 7);
			index += EncodeData(out + index, m_sSendtime, 10);
			index += EncodeData(out + index, m_sDonetime, 10);
			index += EncodeData(out + index, m_sDest_terminal_id, 21);
			index += EncodeData(out + index, (long)m_nSMSC_sequence);
		}
		index += EncodeData(out + index, reserve, 8);
		break;
	case CMPP_Deliver_REP:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, (char)m_nResult);
		break;
	case CMPP_Cancel:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		break;
	case CMPP_Cancel_REP:
		index += EncodeData(out + index, (char)m_nSuccessID);
		break;
	case CMPP_Active_Test:
		break;
	case CMPP_Active_Test_REP:
		index += EncodeData(out + index, (char)m_nSuccessID);
		break;
	case CMPP_Fwd:
		index += EncodeData(out + index, m_sSourceID, 6);
		index += EncodeData(out + index, m_sDestID, 6);
		index += EncodeData(out + index, (char)m_nNodesCount);
		index += EncodeData(out + index, (char)m_nMsg_Fwd_Type);
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, (char)m_nPKTotal);
		index += EncodeData(out + index, (char)m_nPKNumber);
		index += EncodeData(out + index, (char)m_nRegisteredDelivery);
		index += EncodeData(out + index, (char)m_nMsgLevel);
		index += EncodeData(out + index, m_sServiceID, 10);
		
		index += EncodeData(out + index, (char)m_nFee_UserType);
		index += EncodeData(out + index, m_sFeeTerminalID, 21);
		index += EncodeData(out + index, (char)m_nTP_pid);
		index += EncodeData(out + index, (char)m_nTP_udhi);

		index += EncodeData(out + index, (char)m_nMsgFmt);
		index += EncodeData(out + index, m_sSource_Addr, 6);
		index += EncodeData(out + index, m_sFeeType,2);
		index += EncodeData(out + index, m_sFeeCode,6);
		index += EncodeData(out + index, m_sValidTime, 17);
		index += EncodeData(out + index, m_sAtTime, 17);
		index += EncodeData(out + index, m_sSrcTerminalID, 21);
		index += EncodeData(out + index, (char)m_nDestUsrTl);
		for(i = 0; i < m_nDestUsrTl; i++)
			index += EncodeData(out + index, m_sDestTerminalIDs[i], 21);
		index += EncodeData(out + index, (char)m_nMsgLength);
		index += EncodeData(out + index, m_sMsgContent, m_nMsgLength);
		index += EncodeData(out + index, reserve, 8);
		break;
	case CMPP_Fwd_REP:
		index += EncodeData(out + index, (__int64)m_nMsgID);
		index += EncodeData(out + index, (char)m_nPKTotal);
		index += EncodeData(out + index, (char)m_nPKNumber);
		index += EncodeData(out + index, (char)m_nResult);
		break;
	default:
		return 0;
	}
	EncodeData(out, (long)index);
	return index;
}

int CCmppMessage::DecodeData(const char *in, char &c)
{
	c = in[0];
	return sizeof(char);
}

int CCmppMessage::DecodeData(const char *in, short &s)
{
	memcpy(&s, in, sizeof(short));
	s = ntohs(s);
	return sizeof(short);
}

int CCmppMessage::DecodeData(const char *in, long &l)
{
	memcpy(&l, in, sizeof(long));
	l = ntohl(l);
	return sizeof(long);
}

int CCmppMessage::DecodeData(const char *in, __int64 &ll)
{
	__int64 tmp;
	char *p = (char *)&tmp;
	for (int i = 0; i < sizeof(__int64); i++)
		p[(sizeof(__int64) - 1) - i] = in[i];
	ll = tmp;
	return sizeof(__int64);
}

int CCmppMessage::DecodeData(const char *in, char *s)
{
	memcpy(s, in, strlen(in));
	s[strlen(in)] = '\0';
	return strlen(in);
}

int CCmppMessage::DecodeData(const char *in, char *s, int len)
{
	memcpy(s, in, len);
	s[len] = '\0';
	return len;
}

int CCmppMessage::DecodeMessage(const char *in)
{
	// get message header
	int totallen;
	int index = 4;
	DecodeData(in, (long &)totallen);
	index += DecodeData(in + index, (long &)m_nCommandID);
	index += DecodeData(in + index, (long &)m_nSequenceID);

	// get message body
	int i;
	m_ValidMessage = false;
	switch(m_nCommandID)
	{
	case CMPP_Connect:
		index += DecodeData(in + index, m_sSource_Addr, 6);
		index += DecodeData(in + index, m_AuthenticatorICP, 16);
		index += DecodeData(in + index, (char &)m_nVersion);
		index += DecodeData(in + index, (long &)m_nTimeStamp);
		break;
	case CMPP_Connect_REP:
		index += DecodeData(in + index, (char &)m_nStatus);
		index += DecodeData(in + index, m_AuthenticatorISMG, 16);
		index += DecodeData(in + index, (char &)m_nVersion);
		break;
	case CMPP_Terminate:
		break;
	case CMPP_Terminate_REP:
		break;
	case CMPP_Submit:
		index += DecodeData(in + index, (__int64 &)m_nMsgID);
		index += DecodeData(in + index, (char &)m_nPKTotal);
		index += DecodeData(in + index, (char &)m_nPKNumber);
		index += DecodeData(in + index, (char &)m_nRegisteredDelivery);
		index += DecodeData(in + index, (char &)m_nMsgLevel);
		index += DecodeData(in + index, m_sServiceID, 10);
		
		index += DecodeData(in + index, (char &)m_nFee_UserType);
		index += DecodeData(in + index, m_sFeeTerminalID, 21);
		index += DecodeData(in + index, (char &)m_nTP_pid);
		index += DecodeData(in + index, (char &)m_nTP_udhi);

		index += DecodeData(in + index, (char &)m_nMsgFmt);
		index += DecodeData(in + index, m_sSource_Addr, 6);
		index += DecodeData(in + index, m_sFeeType,2);
		index += DecodeData(in + index, m_sFeeCode,6);
		index += DecodeData(in + index, m_sValidTime, 17);
		index += DecodeData(in + index, m_sAtTime, 17);
		index += DecodeData(in + index, m_sSrcTerminalID, 21);
		index += DecodeData(in + index, (char &)m_nDestUsrTl);
		for (i = 0; i < m_nDestUsrTl; i++)
			index += DecodeData(in + index, m_sDestTerminalIDs[i], 21);
		index += DecodeData(in + index, (char &)m_nMsgLength);
		index += DecodeData(in + index, m_sMsgContent, m_nMsgLength);
		index += DecodeData(in + index, reserve, 8);
		m_sMsgContent[m_nMsgLength] = 0;
		break;
	case CMPP_Submit_REP:
		index += DecodeData(in + index, (__int64 &)m_nMsgID);
		index += DecodeData(in + index, (char &)m_nResult);
		break;
	case CMPP_Query:
		index += DecodeData(in + index, m_sTime, 8);
		index += DecodeData(in + index, (char &)m_nQueryType);
		index += DecodeData(in + index, m_sQueryCode, 10);
		index += DecodeData(in + index, reserve, 8);
		break;
	case CMPP_Query_REP:
		index += DecodeData(in + index, m_sTime, 8);
		index += DecodeData(in + index, (char &)m_nQueryType);
		index += DecodeData(in + index, m_sQueryCode, 10);
		index += DecodeData(in + index, (long &)m_nMT_TLMsg);
		index += DecodeData(in + index, (long &)m_nMT_TLUsr);
		index += DecodeData(in + index, (long &)m_nMT_Scs);
		index += DecodeData(in + index, (long &)m_nMT_WT);
		index += DecodeData(in + index, (long &)m_nMT_FL);
		index += DecodeData(in + index, (long &)m_nMO_Scs);
		index += DecodeData(in + index, (long &)m_nMO_WT);
		index += DecodeData(in + index, (long &)m_nMO_FL);
		break;
	case CMPP_Deliver:		
		index += DecodeData(in + index, (__int64 &)m_nMsgID);

		index += DecodeData(in + index, m_sDestnation_id, 21);
		index += DecodeData(in + index, m_sServiceID, 10);
		index += DecodeData(in + index, (char &)m_nTP_pid);
		index += DecodeData(in + index, (char &)m_nTP_udhi);

		index += DecodeData(in + index, (char &)m_nMsgFmt);
		index += DecodeData(in + index, m_sSrcTerminalID, 21);
		index += DecodeData(in + index, (char &)m_nRegisteredDelivery);
		index += DecodeData(in + index, (char &)m_nMsgLength);
		if (m_nRegisteredDelivery == 0)
		{
			// normal MO msg
			index += DecodeData(in + index, m_sMsgContent, m_nMsgLength);
		}
		else
		{	
			//status report
	
			index += DecodeData(in + index, (__int64 &)m_nMsgIDForStatus);
			index += DecodeData(in + index, m_sMTStatus, 7);
			index += DecodeData(in + index, m_sSendtime, 10);
			index += DecodeData(in + index, m_sDonetime, 10);
			index += DecodeData(in + index, m_sDest_terminal_id, 21);
			index += DecodeData(in + index, (long &)m_nSMSC_sequence);
			if (stricmp(m_sMTStatus, "DELIVRD") == 0) 
				m_nMTStatus = CMPP_STATUS_DELIVERED;
			else if (stricmp(m_sMTStatus, "0000000") == 0)
				m_nMTStatus = CMPP_STATUS_DELIVERED;
			else if (stricmp(m_sMTStatus, "EXPIRED") == 0) 
				m_nMTStatus = CMPP_STATUS_EXPIRED;
			else if (stricmp(m_sMTStatus, "DELETED") == 0) 
				m_nMTStatus = CMPP_STATUS_DELETED;
			else if (stricmp(m_sMTStatus, "UNDELIV") == 0) 
				m_nMTStatus = CMPP_STATUS_UNDELIVERABLE;
			else if (stricmp(m_sMTStatus, "ACCEPTD") == 0) 
				m_nMTStatus = CMPP_STATUS_ACCEPTED;
			else if (stricmp(m_sMTStatus, "UNKNOWN") == 0) 
				m_nMTStatus = CMPP_STATUS_UNKNOWN;
			else if (stricmp(m_sMTStatus, "REJECTD") == 0) 
				m_nMTStatus = CMPP_STATUS_REJECTED;
			else 
				m_nMTStatus = CMPP_STATUS_UNKNOWN;
		}
		index += DecodeData(in + index, reserve, 8);
		m_sMsgContent[m_nMsgLength] = 0;
		break;
	case CMPP_Deliver_REP:
		index += DecodeData(in + index, (__int64 &)m_nMsgID);
		index += DecodeData(in + index, (char &)m_nResult);
		break;
	case CMPP_Cancel:
		index += DecodeData(in + index, (__int64 &)m_nMsgID);
		break;
	case CMPP_Cancel_REP:
		index += DecodeData(in + index, (char &)m_nSuccessID);
		break;
	case CMPP_Active_Test:
		break;
	case CMPP_Active_Test_REP:
		index += DecodeData(in + index, (char &)m_nSuccessID);
		break;
	case CMPP_Fwd:
		index += DecodeData(in + index, m_sSourceID, 6);
		index += DecodeData(in + index, m_sDestID, 6);
		index += DecodeData(in + index, (char &)m_nNodesCount);
		index += DecodeData(in + index, (char &)m_nMsg_Fwd_Type);
		index += DecodeData(in + index, (__int64 &)m_nMsgID);
		index += DecodeData(in + index, (char &)m_nPKTotal);
		index += DecodeData(in + index, (char &)m_nPKNumber);
		index += DecodeData(in + index, (char &)m_nRegisteredDelivery);
		index += DecodeData(in + index, (char &)m_nMsgLevel);
		index += DecodeData(in + index, m_sServiceID, 10);

		index += DecodeData(in + index, (char &)m_nFee_UserType);
		index += DecodeData(in + index, (char &)m_sFeeTerminalID);
		index += DecodeData(in + index, (char &)m_nTP_pid);

⌨️ 快捷键说明

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