📄 filerecorder.cpp
字号:
// FileRecorder.cpp: implementation of the CFileRecorder class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FileRecorder.h"
#include "PSgip.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileRecorder::CFileRecorder(const char* pProtocolName)
{
strcpy(m_szProtocolName, pProtocolName);
//文件指针清空
m_pFile = NULL;
}
CFileRecorder::~CFileRecorder()
{
//析构时,如果文件指针有内容,则关闭这个文件
if(m_pFile)
{
fclose(m_pFile);
}
}
/********************************************************************************************************************************\
打开文件为"a"状态
[in] pszSP_ID
传入SP_ID
return
打开文件是否成功
\********************************************************************************************************************************/
BOOL CFileRecorder::Open(const char* pszDebugPath, const char *pszSP_ID)
{
//求出文件名szFileName
char szFileName[MAX_PATH];//文件名
//得到本地时间
SYSTEMTIME sTime;
GetLocalTime(&sTime);
sprintf(szFileName, "%s%s_%s_%d年%d月%d日.txt", pszDebugPath, m_szProtocolName, pszSP_ID, sTime.wYear, sTime.wMonth, sTime.wDay);
//这个文件存在吗
FILE *pFile = fopen(szFileName, "r");
if(pFile)
{//文件存在
//打开文件即可
fclose(pFile);
m_pFile = fopen(szFileName, "a");
}else
{//文件不存在
//打开成"a"状态
m_pFile = fopen(szFileName, "a");
//写入表头
if(m_pFile)
{
static char szTableHead[] = "记录时间 Message Length Command ID Sequence Number.SPID Sequence Number.Time Sequence Number.SequenceNO SPNumber ChargeNumber UserCount UserNumber CorpId ServiceType FeeType FeeValue GivenValue AgentFlag MorelatetoMTFlag Priority ExpireTime ScheduleTime ReportFlag TP_pid sTP_udhi MessageCoding MessageType MessageLength MessageContent(String or HEX) Flag\n";
fwrite(szTableHead, strlen(szTableHead), 1, m_pFile);
}
}
return (m_pFile != NULL);
}
/********************************************************************************************************************************\
关闭文件
\********************************************************************************************************************************/
void CFileRecorder::Close()
{
fclose(m_pFile);
}
/********************************************************************************************************************************\
在文件m_pFile尾部追加字符串(不能含有二进制字节)
[in] pszContent
要写入的字符串(不能含有二进制字节)
\********************************************************************************************************************************/
void CFileRecorder::Append(const char* pszContent)
{
fwrite(pszContent, strlen(pszContent), 1, m_pFile);
}
//从UserNumber字段开始的Submit包体
struct _SGIP_SUBMIT_AFTER_USERNUMBER
{
// char szSPNumber[MAX_LEN_MOBILE_ID + 1];
// char szChargeNumber[MAX_LEN_MOBILE_ID + 1];
// BYTE bUserCount;
// char szUserNumber[(MAX_LEN_MOBILE_ID + 1) * MAX_DEST_USR];
char szCorpID[5];
char szServiceType[10]; //业务类型
BYTE bFeeType;
char szFeeValue[6];
char szGivenValue[6];
BYTE bAgentFlag;
BYTE bMoreLateToMTFlag;
BYTE bPriority; //0~9
char szExpireTime[16]; //存活有效期,格式遵循SGIP3.3协议
char szScheduleTime[16]; //定时发送时间,格式遵循SGIP3.3协议
BYTE bReportFlag; //状态报告标志(0:出错时返回报告,1--需要,2--不需要,3)
BYTE bTPpid;
BYTE bTPudhi;
BYTE bMessageCoding;
BYTE bMessageType;
DWORD dwMessageLength;
BYTE bMessageContent[1];
};
/********************************************************************************************************************************\
当收到Rep时,把这个Submit包转换成字符串追加入文件
[in] pszSP_ID
SP_ID
[in] pbtPack
Submit包内容
[in] nPackLength
pbtPack的长度
[in] iFlag
Rep时的状态
return
成功吗
\********************************************************************************************************************************/
BOOL CFileRecorder::Submit(const char* pszDebugPath, const char *pszSP_ID, const BYTE *pbtPack, UINT nPackLength, int iFlag)
{
BOOL bRet = TRUE;//返回值
//UserNumber下一个字段的地址(即CorpId的地址)
const BYTE* pbtAddrAfterUserNumber = (const BYTE*)(((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.szUserNumber + 21 * ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.bUserCount);
//进入临界区
m_sCS.Lock();
//打开文件
if(!Open(pszDebugPath, pszSP_ID))
{
bRet = FALSE;
goto L_Submit_Exit;
}
//再写入所有字段,中间用\t分隔
char szWrite[8 * 1024];//要写追加入文件的字符串
//记录时间
//得到本地时间
SYSTEMTIME sTime;
GetLocalTime(&sTime);
sprintf(szWrite, "%02d:%02d:%02d %03d", sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Message Length
sprintf(szWrite, "%d", ntohl(((_SGIP*)pbtPack)->sMessageHead.dwCommandLength));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Command ID
sprintf(szWrite, "0x%08X", ntohl(((_SGIP*)pbtPack)->sMessageHead.dwCommandID));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Sequence Number.SPID
sprintf(szWrite, "%d", ntohl(((_SGIP*)pbtPack)->sMessageHead.sMsgID.dwSPID));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Sequence Number.Time
sprintf(szWrite, "%d", ntohl(((_SGIP*)pbtPack)->sMessageHead.sMsgID.dwTime));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Sequence Number.SequenceNO
sprintf(szWrite, "%d", ntohl(((_SGIP*)pbtPack)->sMessageHead.sMsgID.dwSequenceNO));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//SPNumber
memcpy(szWrite, ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.szSPNumber, 21);
szWrite[21] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//ChargeNumber
memcpy(szWrite, ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.szChargeNumber, 21);
szWrite[21] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//UserCount
sprintf(szWrite, "%d", ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.bUserCount);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//UserNumber
szWrite[0] = '\0';
{
for(int i = 0; i < ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.bUserCount; i++)
{
strcat(szWrite, ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.szUserNumber + 21 * i);
strcat(szWrite, " ");
}
}
szWrite[21 * ((_SGIP*)pbtPack)->uMessageBody.sMessageSubmit.bUserCount] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//CorpId
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szCorpID, 5);
szWrite[5] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//ServiceType
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szServiceType, 10);
szWrite[10] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//FeeType
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bFeeType);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//FeeValue
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szFeeValue, 6);
szWrite[6] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//GivenValue
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szGivenValue, 6);
szWrite[6] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//AgentFlag
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bAgentFlag);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//MorelatetoMTFlag
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMoreLateToMTFlag);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//Priority
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bPriority);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//ExpireTime
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szExpireTime, 16);
szWrite[16] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//ScheduleTime
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->szScheduleTime, 16);
szWrite[16] = '\0';
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//ReportFlag
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bReportFlag);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//TP_pid
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bTPpid);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//TP_udhi
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bTPudhi);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//MessageCoding
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageCoding);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//MessageType
sprintf(szWrite, "%d", ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageType);
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//MessageLength
sprintf(szWrite, "%d", ntohl(((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->dwMessageLength));
//追加入文件
Append(szWrite);
//再追加一个\t
Append("\t");
//MessageContent(String or HEX)
if( (((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageCoding == 3) || (((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageCoding == 4) )
{//二进制信息
//追加入文件
for(UINT i = 0; i < ntohl(((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->dwMessageLength); i++)
{
sprintf(szWrite, "%02X ", *(((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageContent + i));
Append(szWrite);
}
}else
{//字符串
memcpy(szWrite, ((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->bMessageContent, ntohl(((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->dwMessageLength));
szWrite[ntohl(((_SGIP_SUBMIT_AFTER_USERNUMBER*)pbtAddrAfterUserNumber)->dwMessageLength)] = '\0';
//追加入文件
Append(szWrite);
}
//再追加一个\t
Append("\t");
//Flag
sprintf(szWrite, "%d\n", iFlag);
//追加入文件
Append(szWrite);
//关闭文件
Close();
L_Submit_Exit:
//退出临界区
m_sCS.UnLock();
return bRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -