// BinLogAnalyse.cpp : 实现文件
//
#include "stdafx.h"
#include "TestOLC.h"
#include "BinLogAnalyse.h"
#include "TOcpASRA.h"
#include "TOcpCCRA.h"
#include "TOcpCERA.h"
#include "TOcpDPRA.h"
#include "TOcpDWRA.h"
#include "TOcpRARA.h"
#include "TOcpSTRA.h"
const char *CBinLogAnalyse::pLogType[7] =
{
"0:Send message to OCS!",
"1:Send message to client!",
"2:Receive message from client!",
"3:Receive message from OCS!",
"4:Received CCA message from OCS!",
"5:Above is received ASR/RAR message from OCS!",
""
};
// CBinLogAnalyse 对话框
IMPLEMENT_DYNAMIC(CBinLogAnalyse, CDialog)
CBinLogAnalyse::CBinLogAnalyse(CWnd* pParent /*=NULL*/)
: CDialog(CBinLogAnalyse::IDD, pParent)
, m_percent(_T(""))
, m_sLogFile(_T(""))
, m_bLimitOutFileMaxSize(FALSE)
, m_iOutFileMaxSize(0)
{
}
CBinLogAnalyse::~CBinLogAnalyse()
{
Clear();
}
BOOL CBinLogAnalyse::OnInitDialog()
{
CDialog::OnInitDialog();
m_bLimitOutFileMaxSize = FALSE;
m_iOutFileMaxSize = 10;
UpdateData(false);
return TRUE;
}
void CBinLogAnalyse::Clear()
{
std::map<std::string, TOcpBase*>::iterator Iter = m_OcpObjectList.begin();
TOcpBase *pOcpObj = NULL;
for (Iter; Iter != m_OcpObjectList.end(); ++Iter)
{
pOcpObj = Iter->second;
if (NULL != pOcpObj)
{
delete pOcpObj;
pOcpObj = NULL;
}
}
std::map<std::string, TBaseObject*>::iterator Iter2 = m_BaseObjectList.begin();
TBaseObject *pObj = NULL;
for (Iter2; Iter2 != m_BaseObjectList.end(); ++Iter2)
{
pObj = Iter2->second;
if (NULL != pObj)
{
delete pObj;
pObj = NULL;
}
}
}
void CBinLogAnalyse::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SENDMSG, m_process);
DDX_Control(pDX, IDC_STATIC_Process, m_proccessLayer);
DDX_Text(pDX, IDC_STATIC_Percent, m_percent);
DDX_Text(pDX, IDC_EDIT_LogFile, m_sLogFile);
DDX_Check(pDX, IDC_CHECK1, m_bLimitOutFileMaxSize);
DDX_Text(pDX, IDC_EDIT1, m_iOutFileMaxSize);
}
BEGIN_MESSAGE_MAP(CBinLogAnalyse, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CBinLogAnalyse::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CBinLogAnalyse::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON4, &CBinLogAnalyse::OnBnClickedButton4)
ON_MESSAGE(WM_UPDATEDATA, &CBinLogAnalyse::OnUpdateData)
ON_MESSAGE(WM_OPENFILE, &CBinLogAnalyse::OnOpenFile)
END_MESSAGE_MAP()
// CBinLogAnalyse 消息处理程序
LRESULT CBinLogAnalyse::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
int iTmp = (int)wParam;
m_process.SetPos(iTmp);
char sTmp[10];
sprintf(sTmp, "%d%c\0", iTmp, 0x25);
m_percent = sTmp;
UpdateData(false);
return 0;
}
LRESULT CBinLogAnalyse::OnOpenFile(WPARAM wParam, LPARAM lParam)
{
char *pTmp;
pTmp = (char*)wParam;
ShellExecute(NULL, "open", pTmp, NULL, NULL, SW_SHOW);
return 0;
}
void CBinLogAnalyse::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
// 打开所支持的二进制日志格式说明文件
char sTmpBuf[MAXPATH];
memset(sTmpBuf, 0, MAXPATH);
char sFilePath[MAXPATH];
memset(sFilePath, 0, MAXPATH);
GetCurrentDirectory(MAXPATH, sTmpBuf);
_snprintf(sFilePath, MAXPATH, "%s%cdoc%c%s", sTmpBuf, PATH_CHARACTOR, PATH_CHARACTOR, BINLOGHELPFILE);
//如果不存在,尝试Debug目录
if (!IsExist(sFilePath))
{
_snprintf(sFilePath, MAXPATH, "%s%cDebug%cdoc%c%s", sTmpBuf, PATH_CHARACTOR, PATH_CHARACTOR, PATH_CHARACTOR, BINLOGHELPFILE);
}
//如果Debug目录也不存在,尝试Release目录
if (!IsExist(sFilePath))
{
_snprintf(sFilePath, MAXPATH, "%s%cRelease%cdoc%c%s", sTmpBuf, PATH_CHARACTOR, PATH_CHARACTOR, PATH_CHARACTOR, BINLOGHELPFILE);
}
if (!IsExist(sFilePath))
{
//MessageBox("很抱歉,帮助文件不存在!");
MessageBox("消息头长度为4:\n\t第一个字节固定为0xBA\n\t第二个自己为日志类型(0-5)\n\t第3、4个字节为日志的长度,高字节在前低字节在后\n消息体为Diameter日志的二进制内容",
"帮助信息", MB_OK);
return;
}
ShellExecute(NULL, "open", sFilePath, NULL, NULL, SW_SHOW);
//使用嵌入的资源
}
void CBinLogAnalyse::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
// 选择日志文件
char szFileFilter[]=
"Bin File(*.bin)|*.bin|"
"Log File(*.log)|*.log|"
"Dat File(*.dat)|*.dat|"
"All File(*.*)|*.*||";//文件类型过滤
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
m_sLogFile=dlg.GetPathName();
m_iOutFileMaxSize = 10;
m_bLimitOutFileMaxSize = FALSE;
UpdateData(false);
setProccessVisiable(false);
}
}
void CBinLogAnalyse::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
// 转换日志文件
if (strlen(m_sLogFile) <= 0)
{
MessageBox("请选择要分析的二进制日志文件");
return;
}
char buf[1024];
memset(buf, 0, 1024);
GetDlgItem(IDC_EDIT1)->GetWindowText(buf, 1024);
if (m_bLimitOutFileMaxSize &&
(!IsNumStr(buf) || m_iOutFileMaxSize < 1 || m_iOutFileMaxSize > 1024))
{
MessageBox("输出文件大小必须在【1】到【1024】M之间", "错误", MB_OK);
return;
}
if (MessageBox("转换日志可能需要很长时间,是否继续?", NULL, MB_OKCANCEL) != IDOK)
{
setProccessVisiable(false);
return;
}
DisableButton();
m_pMyThread = AfxBeginThread(MyThread, this);
m_pMyThread = NULL;
EnableButton();
}
bool CBinLogAnalyse::IsNumStr(const char* str)
{
if (NULL == str)
{
return false;
}
int iLen = strlen(str);
for (int i = 0; i < iLen; i++)
{
if (str[i] < '0' || str[i] > '9')
{
return false;
}
}
return true;
}
UINT CBinLogAnalyse::MyThread(LPVOID pParam)
{
CBinLogAnalyse *pDlg = (CBinLogAnalyse *)pParam;
//这里添加计算过程
pDlg->setProccessVisiable();
memset(pDlg->m_sSaveFile, 0, MAXPATH);
pDlg->getSaveFileFullPath(pDlg->m_sSaveFile, MAXPATH);
if (NULL == pDlg->m_sSaveFile)
{
return 0;
}
char sRtnMsgBuf[MAXPATH];
memset(sRtnMsgBuf, 0, MAXPATH);
int iRec = pDlg->ProcessLogFile(pDlg->m_sSaveFile, sRtnMsgBuf, MAXPATH);
if (-1 == iRec)
{
pDlg->MessageBox(sRtnMsgBuf);
}
else
{
char sTmp[2 * MAXCHAR];
//sprintf(sTmp, "成功转换了【%d】字节的日志,保存在%s文件中\n是否查看转换结果?\0", iRec, pDlg->m_sSaveFile);
sprintf(sTmp, "成功转换了【%d】字节的日志\n保存在%s文件中\0", iRec, pDlg->m_sSaveFile);
pDlg->MessageBox(sTmp, "转换结果", MB_OK);
//if (pDlg->MessageBox(sTmp, "转换结果", MB_OKCANCEL) == IDOK)
//{
// pDlg->PostMessage(WM_OPENFILE, (WPARAM)pDlg->m_sSaveFile);
//}
}
return 0;
}
void CBinLogAnalyse::setProcess(int value)
{
SendMessage(WM_UPDATEDATA, value);
}
void CBinLogAnalyse::setProccessVisiable(bool isVisiable)
{
if (isVisiable)
{
m_process.SetRange(1, 100);
setProcess(0);
GetDlgItem(IDC_STATIC_Process)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_SENDMSG)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_Percent)->ShowWindow(SW_SHOW);
}
else
{
GetDlgItem(IDC_STATIC_Process)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_SENDMSG)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_Percent)->ShowWindow(SW_HIDE);
}
}
int CBinLogAnalyse::ProcessLogFile(const char *pSaveFile, char *pRtnMsgBuf, int ibufLen)
{
if (NULL == pSaveFile)
{
return