📄 cmppmessage.cpp
字号:
#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 *)≪
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 + -