📄 protutil.cpp
字号:
#include "stdafx.h"
#include "client.h"
#include "protocol.h"
#include "io.h"
#include "errno.h"
//class Diskbuffer
//this class manages disk buffer which store critical data when network
//communication is unnomal
CDiskBuffer::CDiskBuffer(const char *FileName)
{
m_FileName=FileName;
CFile file;
CFileStatus rStatus;
if(!CFile::GetStatus(m_FileName,rStatus))
m_bHasData=FALSE;
else
m_bHasData=TRUE;
m_HeaderLen=32;
m_FileHeader=new char[m_HeaderLen];
memset(m_FileHeader,0,(int)m_HeaderLen);
}
BOOL CDiskBuffer::SaveData(CCenterDataList *DataList)
{
if(DataList->IsEmpty()){
if(m_bHasData)
CFile::Remove(m_FileName);
m_bHasData=FALSE;
return FALSE;
}
CFile File;
TRY{
File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite);
//save file header first
File.Write(m_FileHeader,(int)m_HeaderLen);
POSITION pos=DataList->GetHeadPosition();
while(pos){
if(!(DataList->GetNext(pos))->SaveToFile(&File))
break;
}
File.Close();
m_bHasData=TRUE;
return TRUE;
}CATCH(CFileException,e ){
if(e->m_cause==CFileException::generic){
AfxMessageBox("Disk save:An unspecified error occurred");
}
else if(e->m_cause==CFileException::badPath)
AfxMessageBox("Disk save:All or part of the path is invalid");
else if(e->m_cause==CFileException::hardIO){
AfxMessageBox("Disk save:hardware Error");
}
else if(e->m_cause==CFileException::diskFull){
AfxMessageBox("Disk save:The disk is full");
if(File.m_hFile!=CFile::hFileNull){
File.Close();
_unlink(m_FileName);
}
}
if(File.m_hFile!=CFile::hFileNull)
File.Close();
return FALSE;
}AND_CATCH(CArchiveException,e){
if(e->m_cause==CArchiveException::generic)
AfxMessageBox("Disk save archive:Unspecified error");
File.Close();
_unlink(m_FileName);
return FALSE;
}END_CATCH
return TRUE;
}
BOOL CDiskBuffer::SaveData(CCServiceDataList *DataList)
{
if(DataList->IsEmpty()){
if(m_bHasData)
CFile::Remove(m_FileName);
m_bHasData=FALSE;
return FALSE;
}
CFile File;
TRY{
File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite);
//save file header first
File.Write(m_FileHeader,(int)m_HeaderLen);
POSITION pos=DataList->GetHeadPosition();
while(pos){
if(!(DataList->GetNext(pos))->SaveToFile(&File))
break;
}
File.Close();
m_bHasData=TRUE;
return TRUE;
}CATCH(CFileException,e ){
if(e->m_cause==CFileException::generic){
AfxMessageBox("Disk save:An unspecified error occurred");
}
else if(e->m_cause==CFileException::badPath)
AfxMessageBox("Disk save:All or part of the path is invalid");
else if(e->m_cause==CFileException::hardIO){
AfxMessageBox("Disk save:hardware Error");
}
else if(e->m_cause==CFileException::diskFull){
AfxMessageBox("Disk save:The disk is full");
if(File.m_hFile!=CFile::hFileNull){
File.Close();
_unlink(m_FileName);
}
}
if(File.m_hFile!=CFile::hFileNull)
File.Close();
return FALSE;
}AND_CATCH(CArchiveException,e){
if(e->m_cause==CArchiveException::generic)
AfxMessageBox("Disk save archive:Unspecified error");
File.Close();
_unlink(m_FileName);
return FALSE;
}END_CATCH
return TRUE;
}
BOOL CDiskBuffer::ReadData(CCenterDataList *DataList)
{
CFile File;
CCenterData *Data;
// if(_dos_findfirst(m_FileName,00)==ENOENT)
// return FALSE;
TRY{
if(!File.Open(m_FileName,CFile::modeRead))
return FALSE;
CArchive ar(&File,CArchive::load);
//read file header
File.Read(m_FileHeader,(int)m_HeaderLen);
ASSERT(m_HeaderLen==(*((UINT32 *)m_FileHeader)));
{
//header length
char *tmpstr=m_FileHeader;
memcpy(&m_HeaderLen,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//toll house
memcpy(&m_TollHouse,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//Lane number
memcpy(&m_LaneNo,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
UINT32 m_DescripLen;
//description length
memcpy(&m_DescripLen,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//description
m_Descrip.Empty();
if(m_DescripLen)
m_Descrip=tmpstr;
}
do{
Data=new CCenterData;
if(Data==NULL){
AfxMessageBox("ReadData:Memory is low!");
break;
}
if(Data->LoadFromFile(&File))
DataList->AddTail(Data);
else{
delete Data;
break;
}
}while(1);
return TRUE;
}CATCH(CFileException,e ){
if(e->m_cause==CFileException::generic){
AfxMessageBox("Disk load:An unspecified error occurred");
}
else if(e->m_cause==CFileException::badPath)
AfxMessageBox("Disk load:All or part of the path is invalid");
else if(e->m_cause==CFileException::hardIO){
AfxMessageBox("Disk load:hardware error");
}
else if(e->m_cause==CFileException::endOfFile){
if(File.m_hFile!=CFile::hFileNull){
File.Close();
return TRUE;
}
}
if(File.m_hFile!=CFile::hFileNull)
File.Close();
return FALSE;
}AND_CATCH(CArchiveException,e){
if(e->m_cause==CArchiveException::generic)
AfxMessageBox("Disk load archive:Unspecified error");
File.Close();
return FALSE;
}END_CATCH
return TRUE;
}
BOOL CDiskBuffer::ReadData(CCServiceDataList *DataList)
{
CFile File;
CCServiceData *Data;
// if(_dos_findfirst(m_FileName,00)==ENOENT)
// return FALSE;
TRY{
if(!File.Open(m_FileName,CFile::modeRead))
return FALSE;
CArchive ar(&File,CArchive::load);
//read file header
File.Read(m_FileHeader,(int)m_HeaderLen);
ASSERT(m_HeaderLen==(*((UINT32 *)m_FileHeader)));
{
//header length
char *tmpstr=m_FileHeader;
memcpy(&m_HeaderLen,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//toll house
memcpy(&m_TollHouse,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//Lane number
memcpy(&m_LaneNo,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
UINT32 m_DescripLen;
//description length
memcpy(&m_DescripLen,tmpstr,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//description
m_Descrip.Empty();
if(m_DescripLen)
m_Descrip=tmpstr;
}
do{
Data=new CCServiceData;
if(Data==NULL){
AfxMessageBox("ReadData:Memory is low!");
break;
}
if(Data->LoadFromFile(&File))
DataList->AddTail(Data);
else{
delete Data;
break;
}
}while(1);
return TRUE;
}CATCH(CFileException,e ){
if(e->m_cause==CFileException::generic){
AfxMessageBox("Disk load:An unspecified error occurred");
}
else if(e->m_cause==CFileException::badPath)
AfxMessageBox("Disk load:All or part of the path is invalid");
else if(e->m_cause==CFileException::hardIO){
AfxMessageBox("Disk load:hardware error");
}
else if(e->m_cause==CFileException::endOfFile){
if(File.m_hFile!=CFile::hFileNull){
File.Close();
return TRUE;
}
}
if(File.m_hFile!=CFile::hFileNull)
File.Close();
return FALSE;
}AND_CATCH(CArchiveException,e){
if(e->m_cause==CArchiveException::generic)
AfxMessageBox("Disk load archive:Unspecified error");
File.Close();
return FALSE;
}END_CATCH
return TRUE;
}
BOOL CDiskBuffer::SaveData(CCServiceData *Data)
{
CFile File;
if(m_bHasData)
File.Open(m_FileName,CFile::modeWrite);
else{
File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite);
//save file header first
File.Write(m_FileHeader,(int)m_HeaderLen);
}
File.SeekToEnd();
Data->SaveToFile(&File);
File.Close();
return TRUE;
}
BOOL CDiskBuffer::SaveData(CCenterData *Data)
{
CFile File;
if(m_bHasData)
File.Open(m_FileName,CFile::modeWrite);
else{
File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite);
//save file header first
File.Write(m_FileHeader,(int)m_HeaderLen);
}
File.SeekToEnd();
Data->SaveToFile(&File);
File.Close();
return TRUE;
}
void CDiskBuffer::SetFileHeader(int LaneNo,int TollHouse,const char *Descrip)
{
m_LaneNo=LaneNo; //车道号
m_TollHouse=TollHouse; //站名
m_Descrip=Descrip; //Description
UINT32 Value;
//header length
Value=m_HeaderLen;
char *tmpstr=m_FileHeader;
memcpy(tmpstr,&Value,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//toll house
Value=TollHouse;
memcpy(tmpstr,&Value,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//Lane number
Value=LaneNo;
memcpy(tmpstr,&Value,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//description length
Value=strlen(Descrip);
memcpy(tmpstr,&Value,sizeof(UINT32));
tmpstr+=sizeof(UINT32);
//description
if(strlen(Descrip))
{
strcpy(tmpstr,Descrip);
tmpstr+=strlen(Descrip);
}
}
IMPLEMENT_SERIAL(CCenterData,CObject,1);
CCenterData::CCenterData(char* buffer,WORD UserId,int TimeOutInterval)
{
memset(destination ,'\0',sizeof(destination ));
memset(source ,'\0',sizeof(source));
memset(oprcode ,'\0',sizeof(oprcode ));
memset(packettype ,'\0',sizeof(packettype ));
memset(requesttype ,'\0',sizeof(requesttype));
memset(sn,'\0',sizeof(sn));
// memset(message ,'\0',sizeof(message));
CopyMemory(packettype,buffer,2);
CopyMemory(sn,buffer+2,10);
CopyMemory(requesttype,buffer+12,2);
CopyMemory(oprcode,buffer+14,6);
CopyMemory(source,buffer+20,4);
CopyMemory(destination ,buffer+24,4);
// memcpy(message ,buffer+28,strlen(buffer)-28);
messagelen=strlen(buffer)-28;
message = new char[messagelen];
memcpy(message ,buffer+28,messagelen);
m_RequestTime=CTime::GetCurrentTime();
m_ReplyTime=m_RequestTime;
m_UserId=UserId;
m_RetryCounter=0;
m_TimeOutInterval=TimeOutInterval;
m_SendPDULen=0; //data of PDU
m_SendPDU=NULL;
}
void CCenterData::SetSequenceNumber(UINT32 SequenceNumber)
{
unsigned long tmpseq;
m_SequenceNumber=SequenceNumber;
//CopyMemory(tmpseq,&m_SequenceNumber,sizeof(m_SequenceNumber));
tmpseq = m_SequenceNumber;
sprintf(sn,"%010u",tmpseq);
}
CCenterData::CCenterData( )
{
memset(destination ,'\0',sizeof(destination ));
memset(source ,'\0',sizeof(source));
memset(oprcode ,'\0',sizeof(oprcode ));
memset(packettype ,'\0',sizeof(packettype ));
memset(requesttype ,'\0',sizeof(requesttype));
memset(sn,'\0',sizeof(sn));
//memset(message ,'\0',sizeof(message));
message=NULL;
messagelen=0;
m_SendPDULen=0; //data of PDU
m_SendPDU=NULL;
m_RetryCounter=0;
m_TimeOutInterval=1000;
m_UserId=0; //Id of Service User, every user has a distinct Id, it should >0
}
CCenterData::~CCenterData()
{
if(message!=NULL)
delete []message;
if(m_SendPDU!=NULL)
delete m_SendPDU;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -