📄 fileopr.cpp
字号:
/********************************************************************** FileName : FileOpr.cpp Description : 文件操作类 Version : 1.0 Date : 2003年6月17日 Author : 刘荣辉 Other : ***********************************************************************/#include "FileOpr.h"//==========================================================================//==============================构造,析构函数==============================//==========================================================================FileOpr::FileOpr(){ char buf[20]; getDate(buf); CurrentDate = atol(buf); memset(m_szReadBuf,0,MAXARRAY*MAXBUF*sizeof(char)); m_bRead = true; sem_init(&SemMutex,0,1);}FileOpr::~FileOpr(){ sem_destroy(&SemMutex);}//==========================================================================//=========================将接收队列单元导出到文件=========================//==========================================================================int FileOpr::RecvQ_Backup(RecvQUnit *RUnit){ char str[MAXBYTE*2];//转换后的字符串 char mem[MAXBYTE]; //存贮内存中16进制的字符串 char *pos; int memsize = 0; pos=mem; //取得RUnit->Pack包的长度 int len = ntohl(*(int *)(RUnit->Pack)); //将结构体的字段值依次以16进制形式赋给mem字符串 memcpy(pos,&RUnit->RecvTime,sizeof(RUnit->RecvTime)); memsize += sizeof(RUnit->RecvTime); pos += sizeof(RUnit->RecvTime); memcpy(pos,&RUnit->MsgId_Echo,sizeof(RUnit->MsgId_Echo)); memsize += sizeof(RUnit->MsgId_Echo); pos += sizeof(RUnit->MsgId_Echo); memcpy(pos,RUnit->Pack,len); memsize += len ; //将16进制的字符串mem转换为字符串(长度增加一倍) CFunc::HexToStr(mem,memsize,str); //printf("\nstr=%s\n",str); if(strlen(str)!=0) outFile << str << endl; //写文件 else { printf("\n RecvQ_Backup: The struct is null, failed!\n"); return 1; } return 0;}//==========================================================================//=======================将发送队列单元导出到文件===========================//==========================================================================int FileOpr::SendQ_Backup(SendQUnit *SUnit){ char str[MAXBYTE*2]; //转换后的字符串 char mem[MAXBYTE]; //存贮内存中16进制的字符串 int memsize = 0; char *pos; pos=mem; //取得RUnit->Pack包的长度 int len = ntohl(*(int *)SUnit->Pack); //将结构体的字段值依次以16进制形式赋给mem字符串 memcpy(pos,&SUnit->SrcRecvTime,sizeof(SUnit->SrcRecvTime)); memsize +=sizeof(SUnit->SrcRecvTime); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->SrcRecvTime); memcpy(pos,&SUnit->SrcNode,sizeof(SUnit->SrcNode)); memsize +=sizeof(SUnit->SrcNode); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->SrcNode); memcpy(pos,&SUnit->ID_Relate,sizeof(SUnit->ID_Relate)); memsize +=sizeof(SUnit->ID_Relate); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->ID_Relate); memcpy(pos,&SUnit->SendTime,sizeof(SUnit->SendTime)); memsize +=sizeof(SUnit->SendTime); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->SendTime); memcpy(pos,&SUnit->iResent,sizeof(SUnit->iResent)); memsize +=sizeof(SUnit->iResent); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->iResent); memcpy(pos,&SUnit->RelayTimes,sizeof(SUnit->RelayTimes)); memsize +=sizeof(SUnit->RelayTimes); //printf("\nmemsize=%d\n",memsize); pos+=sizeof(SUnit->RelayTimes); memcpy(pos,SUnit->Pack,len); memsize += len ; //printf("\nmemsize=%d\n",memsize); /*printf("\n-----------\n"); for(int i=0;i<memsize;i++) printf("%02x ",(unsigned char)mem[i]); printf("\n-------------\n");*/ CFunc::HexToStr(mem,memsize,str); //printf("\n%s------------\n",str); if(strlen(str)) outFile << str << endl; //写文件 else { printf("\n SendQ_Backup: The struct is null, failed!\n"); return 1; } return 0;}//==========================================================================//========================从文件中导入接收队列单元==========================//==========================================================================//*GotNum为实际获得的记录行数RecvQUnit * FileOpr::RecvQ_Restore(char *FileName, int *GotNum){ int LineNum; //统计出的文件的行数 int ReadNum; //实际读取的行数 char *pos; unsigned char memBuf[MAXBYTE];//转换后的16进制的字符串 char strBuf[MAXBYTE*2]; //从文件中读取的字符串 char *UnitPointers; //指向存放队列单元的空间 RecvQUnit *pUnit; FILE *fp; if((fp=fopen(FileName,"r"))==NULL) { //printf("\n Warning: Failed to open '%s'.\n",FileName); *GotNum=0; return (RecvQUnit *)NULL; } LineNum=0; while(fgets(strBuf,MAXBYTE,fp)) LineNum++; if(!LineNum) //文件为空则直接返回 { *GotNum=0; return (RecvQUnit *)NULL; } //printf("\nRecvQ_Restore LineNum=%d",LineNum); UnitPointers = (char *) malloc(LineNum * sizeof(RecvQUnit));//分配存放队列单元的空间 rewind(fp); ReadNum=0; //从文件中分行读取信息 while(fgets(strBuf,MAXBYTE,fp)) { strBuf[strlen(strBuf)-1]='\0'; //去掉结尾的回车换行符0AH if(ReadNum>=LineNum) break; //防止实际读出的行数大于上面的统计值而导致内存溢出 CFunc::StrToHex(strBuf,(unsigned char *)memBuf);//将字符串转换为16进制的字符 pUnit = (RecvQUnit *)( UnitPointers + ReadNum*sizeof(RecvQUnit));//将内存块转换为结构体类型 //printf("\n RecvQ_Restore: pUnit[%d]=%d ,sizeof(RecvQUnit)=%d. \n",ReadNum, pUnit, sizeof(RecvQUnit)); ReadNum++; //将读出的一行数据赋给结构体 pos=(char *)memBuf; memcpy(&pUnit->RecvTime,pos,sizeof(pUnit->RecvTime)); pos+=sizeof(pUnit->RecvTime); //printf("\npUnit->RecvTime=%d",(int)pUnit->RecvTime); memcpy(&pUnit->MsgId_Echo,pos,sizeof(pUnit->MsgId_Echo)); pos+=sizeof(pUnit->MsgId_Echo); //printf("\npUnit->MsgId_Echo=%lld",pUnit->MsgId_Echo); int len = ntohl(*(int *)pos); //取出pUnit->Pack的长度 pUnit->Pack = (char *)malloc(len); //为数据包分配空间 memcpy(pUnit->Pack,pos,len); memset(strBuf,0,sizeof(strBuf)); //将strBuf清空 } fclose(fp); if(unlink(FileName)==-1)//删除文件 { printf("\nError! Failed to delete '%s'.\n",FileName); } *GotNum = ReadNum; //实际获取的记录行数 return (RecvQUnit *)UnitPointers;}//==========================================================================//========================从文件中导入发送队列单元==========================//==========================================================================SendQUnit * FileOpr::SendQ_Restore(char *FileName,int *GotNum){ int LineNum; //统计出的文件的行数 int ReadNum; //实际读取的行数 char *pos; unsigned char memBuf[MAXBYTE];//转换后的16进制的字符串 char strBuf[MAXBYTE*2]; //从文件中读取的字符串 char *UnitPointers; //指向存放队列单元的空间 SendQUnit *pUnit; FILE *fp; if((fp=fopen(FileName,"r"))==NULL) { //printf("\n Warning: Failed to open '%s'.\n",FileName); *GotNum=0; return (SendQUnit *)NULL; } LineNum=0; while(fgets(strBuf,MAXBYTE,fp)) LineNum++; if(!LineNum) //文件为空则直接返回 { *GotNum=0; return (SendQUnit *)NULL; } //printf("\nSendQ_Restore LineNum=%d",LineNum); UnitPointers = (char *) malloc(LineNum * sizeof(SendQUnit));//分配存放队列单元的空间 rewind(fp); ReadNum=0; //从文件中分行读取信息 while(fgets(strBuf,MAXBYTE,fp)) { strBuf[strlen(strBuf)-1]='\0'; //去掉结尾的回车换行符0AH if(ReadNum>=LineNum) break; //防止实际读出的行数大于上面的统计值而导致内存溢出 CFunc::StrToHex(strBuf,memBuf);//将字符串转换为16进制的字符 pUnit = (SendQUnit *)( UnitPointers + ReadNum*sizeof(SendQUnit)); ReadNum++; //将读出的一行数据赋给结构体 pos=(char *)memBuf; memcpy(&pUnit->SrcRecvTime,pos,sizeof(pUnit->SrcRecvTime)); pos+=sizeof(pUnit->SrcRecvTime); memcpy(&pUnit->SrcNode,pos,sizeof(pUnit->SrcNode)); pos+=sizeof(pUnit->SrcNode); memcpy(&pUnit->ID_Relate,pos,sizeof(pUnit->ID_Relate)); pos+=sizeof(pUnit->ID_Relate); memcpy(&pUnit->SendTime,pos,sizeof(pUnit->SendTime)); pos+=sizeof(pUnit->SendTime); memcpy(&pUnit->iResent,pos,sizeof(pUnit->iResent)); pos+=sizeof(pUnit->iResent); memcpy(&pUnit->RelayTimes,pos,sizeof(pUnit->RelayTimes)); pos+=sizeof(pUnit->RelayTimes); int len = ntohl(*(int *)pos); pUnit->Pack = (char *)malloc(len); //为数据包分配空间 memcpy(pUnit->Pack,pos,len); } fclose(fp); if(unlink(FileName)==-1)//删除文件 { printf("\nError! Failed to delete '%s'.\n",FileName); } *GotNum = ReadNum; //实际获取的记录行数 return (SendQUnit *)UnitPointers;}//==========================================================================//=========================写上端CMPP_Deliver接收日志文件===================//==========================================================================int FileOpr::WrCMPP_DeliverLog(Cmpp_Deliver_Log *pDeliverLog, char* strBuf){ char Reserved[9]; char *pReserved; char Content[281]; //char MsgId[17]; //获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段! pReserved = (char *)pDeliverLog->Deliver + ntohl(pDeliverLog->Deliver->Head.Total_Length) - 8; memcpy(Reserved,pReserved,8); Reserved[8]='\0'; //CFunc::HexToStr(pDeliverLog->Deliver->Msg_Id,8,MsgId); //将消息体中的引号进行转义 mysql_escape_string(Content, pDeliverLog->Deliver->Deliver_Msg.Msg_Content, pDeliverLog->Deliver->Msg_Length); //sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21lld%-22s%-11s%-4d%-4d%-3d%-22s%-2d%-4d%-141s%-9s%s", //BGNMSG, sprintf(strBuf, \ "Insert into CMPP_DeliverLog(RecvTime,SrcNode,Total_Length,Command_Id,Sequence_Id,Msg_Id,Dest_Id,Service_Id,TP_pid,TP_udhi,Msg_Fmt,Src_terminal_Id,Registered_Delivery,Msg_Length,Msg_Content,Reserved) values('%s','%d','%d','%d','%d','%lld','%s','%s','%d','%d','%d','%s','%d','%d','%s','%s');", \ pDeliverLog->RecvTime, \ pDeliverLog->SrcNode, \ ntohl(pDeliverLog->Deliver->Head.Total_Length), \ ntohl(pDeliverLog->Deliver->Head.Command_Id), \ ntohl(pDeliverLog->Deliver->Head.Sequence_Id), \ pDeliverLog->Deliver->Msg_Id, \ pDeliverLog->Deliver->Dest_Id,\ pDeliverLog->Deliver->Service_Id, \ pDeliverLog->Deliver->TP_pid, \ pDeliverLog->Deliver->TP_udhi, \ pDeliverLog->Deliver->Msg_Fmt, \ pDeliverLog->Deliver->Src_terminal_Id, \ pDeliverLog->Deliver->Registered_Delivery, \ pDeliverLog->Deliver->Msg_Length, \ Content, \ Reserved); //ENDMSG); //printf("\n FileOpr: %s. \n",strBuf); return 0;}//==========================================================================//=======================写上端CMPP_Report接收日志文件======================//==========================================================================int FileOpr::WrCMPP_ReportLog(Cmpp_Deliver_Log *pReportLog, char* strBuf){ char Reserved[9]; char *pReserved; //char MsgId[17]; //char Report_MsgId[17]; //获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段! pReserved = (char *)pReportLog->Deliver + ntohl(pReportLog->Deliver->Head.Total_Length) - 8; memcpy(Reserved,pReserved,8); Reserved[8]='\0'; //CFunc::HexToStr(pReportLog->Deliver->Msg_Id,8,MsgId); //CFunc::HexToStr(pReportLog->Deliver->Deliver_Msg.Report.Msg_ID,8,Report_MsgId); //sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21lld%-22s%-11s%-4d%-4d%-3d%-22s%-2d%-4d%-21lld%-8s%-11s%-11s%-22s%-11d%-9s%s", //BGNMSG, sprintf(strBuf, \ "Insert into CMPP_ReportLog(RecvTime,SrcNode,Total_Length,Command_Id,Sequence_Id,Msg_Id,Dest_Id,Service_Id,TP_pid,TP_udhi,Msg_Fmt,Src_terminal_Id,Registered_Delivery,Msg_Length,Rep_MsgId,Stat,Submit_time,Done_time,Dest_terminal_Id,SMSC_sequence,Reserved) values('%s','%d','%d','%d','%d','%lld','%s','%s','%d','%d','%d','%s','%d','%d','%lld','%s','%s','%s','%s','%d','%s');", \ pReportLog->RecvTime, \ pReportLog->SrcNode, \ ntohl(pReportLog->Deliver->Head.Total_Length), \ ntohl(pReportLog->Deliver->Head.Command_Id), \ ntohl(pReportLog->Deliver->Head.Sequence_Id), \ pReportLog->Deliver->Msg_Id, \ pReportLog->Deliver->Dest_Id,\ pReportLog->Deliver->Service_Id, \ pReportLog->Deliver->TP_pid, \ pReportLog->Deliver->TP_udhi, \ pReportLog->Deliver->Msg_Fmt, \ pReportLog->Deliver->Src_terminal_Id, \ pReportLog->Deliver->Registered_Delivery, \ pReportLog->Deliver->Msg_Length, \ pReportLog->Deliver->Deliver_Msg.Report.Msg_Id, \ pReportLog->Deliver->Deliver_Msg.Report.Stat, \ pReportLog->Deliver->Deliver_Msg.Report.Submit_time, \ pReportLog->Deliver->Deliver_Msg.Report.Done_time, \ pReportLog->Deliver->Deliver_Msg.Report.Dest_terminal_Id, \ pReportLog->Deliver->Deliver_Msg.Report.SMSC_sequence, \ Reserved); //ENDMSG); return 0;}//==========================================================================//========================写下端CMPP_Submit接收日志文件=====================//==========================================================================int FileOpr::WrCMPP_SubmitLog(Cmpp_Submit_Log *pSubmitLog, char* strBuf){ char Msg_src[7]; char FeeType[3]; char FeeCode[7]; //char MsgId[17]; char Content[281]; char Reserved[9]; char *pReserved; //获取所收Deliver包的最后8个字节作为Reserved字段,因为Msg_Content是变长的!故不能用结构体指针指向Reserved字段! pReserved = (char *)pSubmitLog->Submit + ntohl(pSubmitLog->Submit->Head.Total_Length) - 8; memcpy(Reserved,pReserved,8); Reserved[8]='\0'; memcpy(Msg_src,pSubmitLog->Submit->Msg_src,6); Msg_src[6]='\0'; memcpy(FeeType,pSubmitLog->Submit->FeeType,2); FeeType[2]='\0'; memcpy(FeeCode,pSubmitLog->Submit->FeeCode,6); FeeCode[6]='\0'; //CFunc::HexToStr(&pSubmitLog->Submit->Msg_Id,8,MsgId); //将消息体中的引号进行转义 mysql_escape_string(Content, pSubmitLog->Submit->Msg_Content, pSubmitLog->Submit->Msg_Length); //sprintf(strBuf,"%s%-15s%-15s%-11d%-11d%-11d%-17s%-4d%-4d%-2d%-2d%-11s%-2d%-21s%-4d%-4d%-3d%-7s%-3s%-7s%-18s%-18s%-22s%-4d%-22s%-4d%-141s%-9s%s", //BGNMSG, sprintf(strBuf, \ "Insert into CMPP_SubmitLog(RecvTime,SrcNode,MsgId_Echo,Total_Length,Command_Id,Sequence_Id,Msg_Id,Pk_total,Pk_number,Registered_Delivery,Msg_level,Service_Id,Fee_UserType,Fee_terminal_Id,TP_pid,TP_udhi,Msg_Fmt,Msg_src,FeeType,FeeCode,ValId_Time,At_Time,Src_Id,DestUsr_tl,Dest_terminal_Id,Msg_Length,Msg_Content,Reserved) values('%s','%d','%lld','%d','%d','%d','%lld','%d','%d','%d','%d','%s','%d','%s','%d','%d','%d','%s','%s','%s','%s','%s','%s','%d','%s','%d','%s','%s');", \ pSubmitLog->RecvTime, \ pSubmitLog->SrcNode, \ pSubmitLog->MsgId_Echo, \ ntohl(pSubmitLog->Submit->Head.Total_Length), \ ntohl(pSubmitLog->Submit->Head.Command_Id), \ ntohl(pSubmitLog->Submit->Head.Sequence_Id), \ pSubmitLog->Submit->Msg_Id, \ pSubmitLog->Submit->Pk_total,\ pSubmitLog->Submit->Pk_number, \ pSubmitLog->Submit->Registered_Delivery, \ pSubmitLog->Submit->Msg_level, \ pSubmitLog->Submit->Service_Id, \ pSubmitLog->Submit->Fee_UserType, \ pSubmitLog->Submit->Fee_terminal_Id, \ pSubmitLog->Submit->TP_pId, \ pSubmitLog->Submit->TP_udhi, \ pSubmitLog->Submit->Msg_Fmt, \ Msg_src, \ FeeType, \ FeeCode, \ pSubmitLog->Submit->ValId_Time, \ pSubmitLog->Submit->At_Time, \ pSubmitLog->Submit->Src_Id, \ pSubmitLog->Submit->DestUsr_tl, \ pSubmitLog->Submit->Dest_terminal_Id, \ pSubmitLog->Submit->Msg_Length, \ pSubmitLog->Submit->Msg_Content, \ Reserved); //ENDMSG); //printf("\n FileOpr: %s. \n",strBuf); return 0;}//==========================================================================//=========================写上端SMGP_Deliver接收日志文件===================//==========================================================================int FileOpr::WrSMGP_DeliverLog(Smgp_Deliver_Log *pDeliverLog, char* strBuf){ char MsgId[21]; CFunc::HexToStr(pDeliverLog->Deliver->sMsgId,10,MsgId); sprintf(strBuf,"%s%-15s%-11d%-11d%-11d%-21s%-2d%-4d%-15s%-22s%-22s%-4d%-253s%s", BGNMSG, \ pDeliverLog->RecvTime, \ ntohl(pDeliverLog->Deliver->msgHead.nPacketLength), \ ntohl(pDeliverLog->Deliver->msgHead.nRequestId), \ ntohl(pDeliverLog->Deliver->msgHead.nSequenceId), \ MsgId, \ pDeliverLog->Deliver->nIsReport,\ pDeliverLog->Deliver->nMsgFormat, \ pDeliverLog->Deliver->sRecvTime, \ pDeliverLog->Deliver->sSrcTermId, \ pDeliverLog->Deliver->sDestTermId, \ pDeliverLog->Deliver->nMsgLength, \ pDeliverLog->Deliver->Deliver_Msg.sMsgContent, \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -