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

📄 filerecorder.cpp

📁 手机开发环境BREW实例
💻 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 + -