www.pudn.com > DSPSample.rar > DSP.h
// DSP.h: interface for the DSP class. ////////////////////////////////////////////////////////////////////// #ifndef _DSP_CLASS #define _DSP_CLASS #include#include #include #include #ifndef AFX_EXT_CLASS #define AFX_EXT_CLASS #endif #include "StdAfx.h" #ifdef UNIX_SYSTEM_ #define TRUE 1 #define FALSE 0 #ifndef BOOL typedef BYTE BOOL; #endif #ifndef DWORD typedef unsigned long DWORD; #endif #ifndef BYTE typedef unsigned char BYTE; #endif #ifndef SOCKET typedef int SOCKET; #endif #endif #define SECT_MAX_SIZE 0xFFF //分段传送时段的最大尺寸 class AFX_EXT_CLASS DSPACT; //在所有的DSPACT派生类的头文件中必需包含的宏定义 #define SELF_SERIALIZE(classid,className,base_className) \ public: \ virtual char* GetClassID() {return classid;} \ virtual bool IsKindOf(char* lpClassName){return (::strcmp(className,lpClassName)==0);}\ protected: \ virtual BYTE GetClassLevel() {return (base_className::GetClassLevel()+1);} \ //返回DSPPACT派生类对象的函数的指针 #define DSPGETOBJFUNC(varN) DSPACT* (*varN)(const std::string& strID) #define CASTDSPGETOBJFUNC DSPACT* (*)(const std::string& strID) //缓冲区分段接收函数的指针 #define DSPSECTRECV(varN) bool (*varN)(const char* const lpBuff,int nBuffLen,bool bLast) #define CASTDSPSECTRECV bool (*)(const char* const lpBuff,int nBuffLen,bool bLast) //缓冲区分段传送函数的指针 #define DSPSECTSEND(varN) bool (*varN)(char** const lpBuff,int& nBuffLen,bool& bContinue) #define CASTDSPSECTSEND bool (*)(char** const lpBuff,int& nBuffLen,bool& bContinue) //压缩函数的指针 #define DSPCOMPRESSFUNC(varN) bool (*varN)(char** const lpBuff,int& nBuffLen) #define CASTDSPCOMPRESSFUNC bool (*)(char** const lpBuff,int& nBuffLen) //解压缩函数的指针 #define DSPUNCOMPRESSFUNC(varN) bool (*varN)(char** const lpBuff,int& nBuffLen,bool bStart) #define CASTDSPUNCOMPRESSFUNC bool (*)(char** const lpBuff,int& nBuffLen,bool bStart) class AFX_EXT_CLASS DSP { public: struct AFX_EXT_CLASS _DSPPACKET; private: DSP(){}; ~DSP(){}; friend struct _DSPPACKET; struct _DSPHEADER; struct _DSPATTRHEADER; struct _DSPVALUEHEADER; struct _DSPACTREG; static std::deque<_DSPACTREG*> dqActReg; static inline DSP::_DSPACTREG* FindClassID(const std::string& strID); static inline DSPACT* GetDSPObject(std::string& strID,DWORD& dwData); static inline WORD CheckSumAttr(const char *lpHead,const char *lpTail); public: enum _DSPERRTYPE { ERR_RECV_HEADER =10000, ERR_FIND_HEADER, ERR_RECV_ATTRHEADER, ERR_VERIFY_ATTRHEADER, ERR_RECV_CLASSID, ERR_NOTGET_DSPACT, ERR_RECV_ATTRSIZE, ERR_SET_ATTR_BUFF, ERR_UNCOMPRESS, ERR_RECV_ATTR_SECT, ERR_RECV_ATTRVALUE, ERR_RECV_PACKETCRC, ERR_RECV_PACKET_CRC, ERR_RECV_NAME, ERR_SEND_HEADER =11000, ERR_SEND_ATTRHEADER, ERR_SEND_CLASSID, ERR_SERIALIZE_ATTR, ERR_SEND_ATTR_SECT, ERR_SEND_ATTRSIZE, ERR_SEND_ATTRVALUE, ERR_SEND_PACKETCRC, ERR_SEND_NAME, ERR_COMPRESS, }; struct AFX_EXT_CLASS _DSPERROR { BYTE byClassLevel; //类深度 DWORD dwAttrNo; //属性个数编号 int nErrorNo; //错误代码 std::string strErrDetail; //错误描述 }; struct AFX_EXT_CLASS _DSPPACKET { //DSP包结构 timeval Timeout; //接收Socket时的超时时间 DWORD dwData; //在注册类时指定的该类的附加数据 bool& bKeepRun; //是否继续运行,通过这个布尔变量,可以随时中止序列化或反序列化过程 private: _DSPERROR LastError; //保存最近一个错误的描述 char chData1[6]; char chData2[2]; char chBuff[sizeof(DWORD)]; //保存临时数据的缓冲区 char* lpAttrBuff; //接收属性的缓冲区的首地址 std::string strClassID; //保存ClassID的值 DWORD dwAttrSize; //当前接收缓冲区的长度 WORD wPacketCRC; //包的总的CRC bool bAttrRecvComplete; //属性是否已经接收完成 bool bCompressAttr; //属性是否被压缩 DSPACT* pDspAct; //保存转换成对象后的基类对象的指针 inline bool FindHeader(); inline bool Recv(SOCKET sock,char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline bool Recv(ifstream& ifs,char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline bool Send(SOCKET sock,const char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline bool Send(ofstream& ofs,const char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline bool Recv(char** const lpUDPBuff,int& nUDPSize,char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline bool Send(char** const lpUDPBuff,int& nUDPSize,const char* const lpBuff,WORD wBuffLen,WORD* pCrc=NULL); inline DSPACT* ReadError(_DSPERRTYPE errNo,BYTE classLevel,BYTE attrNo,DSPACT* pAct); inline bool WriteError(_DSPERRTYPE errNo,BYTE classLevel,BYTE attrNo); inline bool WriteObject(char** const lpUDPBuff,int& nUDPBuffLen,DSPACT& act); inline DSPACT* ReadObjectFromIfs(ifstream& ifs,DSPACT* pAct); inline DSPACT* ReadObjectFromTCP(SOCKET sock,DSPACT* pAct); inline DSPACT* ReadObjectFromUDP(char** lpUDPBuff,int& nUDPBuffLen,DSPACT* pAct); inline DSPACT* ReadObject(char** lpUDPBuff,int& nUDPBuffLen,DSPACT* pAct); inline bool Serialize(SOCKET sock,const char* lpName,BYTE byNameLen,const char* lpValue,WORD usValueLen,bool bSendValueLen); inline bool Serialize(ofstream& ofs,const char* lpName,BYTE byNameLen,const char* lpValue,WORD usValueLen,bool bSendValueLen); public: _DSPPACKET(bool& bRun):bKeepRun(bRun),dwAttrSize(0){Timeout.tv_sec=10;Timeout.tv_usec=0;}; inline void Empty() { pDspAct =NULL; dwAttrSize =0; wPacketCRC =0; }; inline _DSPERROR* const GetLastError(){return &LastError;}; void SetParameter(bool bCompress=false,bool bVerifyCRC=true,BYTE byInitType=0); bool IsVerifyCrc(); bool IsCompress(); DSPACT* ReadObject(char* lpUDPBuff,int nUDPBuffLen,DSPACT* pAct=NULL); DSPACT* ReadObject(SOCKET sock,DSPACT* pAct=NULL); DSPACT* ReadObject(ifstream& ifs,DSPACT* pAct=NULL); bool Read(char& attr); bool Read(BYTE& attr); bool Read(short& attr); bool Read(WORD& attr); bool Read(int& attr); bool Read(DWORD& attr); bool Read(bool& attr); bool Read(std::string& attr,DWORD dwLen); bool Read(char* const pAttr,DWORD dwLen); bool Read(DSPACT& attr); inline bool WriteObject(SOCKET sock,sockaddr_in& to,char* const lpUDPBuff,int nUDPBuffLen,DSPACT& act); bool WriteObject(SOCKET sock,sockaddr_in& to,int nUDPSize,DSPACT& act); bool WriteObject(SOCKET sock,DSPACT& act); bool WriteObject(ofstream& ofs,DSPACT& act); void Write(int attr); void Write(DWORD attr); void Write(bool attr); void Write(const std::string& attr); void Write(char* const pAttr,DWORD dwLen,BOOL bLast=TRUE); void Write(DSPACT& attr,bool bCompress=false,bool bVerifyCRC=true,BYTE byInitType=0); #ifndef UNIX_SYSTEM_ void Write(const CString& attr); bool Read(CString& attr,DWORD dwLen); bool Serialize(const CString& strValue,const char* lpName=NULL,BYTE nNameLen=0); bool UnSerialize(CString& strValue); #endif void SerializeStart(ofstream& ofs,DSPCOMPRESSFUNC(pFun)=NULL); bool Serialize(int nValue,const char* lpName=NULL,BYTE nNameLen=0); bool Serialize(BYTE byValue,const char* lpName=NULL,BYTE nNameLen=0); bool Serialize(bool bValue,const char* lpName=NULL,BYTE nNameLen=0); bool Serialize(std::string& strValue,const char* lpName=NULL,BYTE nNameLen=0); bool Serialize(char* lpBuff,int nBuffLen,const char* lpName=NULL,BYTE nNameLen=0,DSPSECTSEND(pFunc)=NULL); bool Serialize(DSPACT& act,const char* lpName=NULL,BYTE nNameLen=0); bool SerializeEnd(); bool UnSerializeStart(ifstream& ifs,DSPUNCOMPRESSFUNC(pFun)=NULL); inline BYTE IsKinkOf(std::string& strName); inline bool UnSerialize(DWORD& value,int& nValueLen); bool UnSerialize(int& nValue); bool UnSerialize(DWORD& dwValue); bool UnSerialize(short& sValue); bool UnSerialize(WORD& wValue); bool UnSerialize(char& cValue); bool UnSerialize(BYTE& byValue); bool UnSerialize(std::string& strValue); bool UnSerialize(char* pValue,int* nValueLen); }; static bool RegisterAct(const char* classID,DSPGETOBJFUNC(dspActFun),DWORD dwData=0); static SOCKET ConnectTo(const char *lpSrvName,int nSrvPort,bool bInternet=true,int nRetryCount=5); static SOCKET GetUDPSocket(int nListenPort=-1,bool bInternet=true); static SOCKET GetTCPSocket(int nListenPort=-1,bool bInternet=true); static bool GetAddrByName(const char *lpName,WORD port,sockaddr_in& addr); static void GetAddrByIP(const char *lpIP,WORD port,sockaddr_in& addr,bool bInternet=true); static int WaitRecvUDP(SOCKET sock,char *lpUDPBuff,int nUDPBuffLen,struct sockaddr_in& from,int nTimeoutSec=30); static DWORD GetFileSize(const char* lpFilename); static DWORD CreateNullFile(const char* lpFilename,int nSize,bool bAppend=true); static void SafeRelease(); static inline BOOL OpenIfstreamForRead(ifstream& ifs,const char* const lpFileName,int nMode=0,int nShareMode=filebuf::openprot) { ifs.open(lpFileName,ios::in|ios::binary|ios::nocreate|nMode,nShareMode); return ifs.is_open(); }; static inline BOOL OpenOfstreamForWrite(ofstream& ofs,const char* const lpFileName,int nMode=0,int nShareMode=filebuf::sh_write||filebuf::sh_read) { ofs.open(lpFileName,ios::out|ios::binary|nMode,nShareMode); return ofs.is_open(); }; }; class AFX_EXT_CLASS DSPACT { public: DSPACT(){}; virtual ~DSPACT(){}; virtual char * GetClassID()=0; virtual bool IsKindOf(char* lpClassName)=0; protected: friend struct DSP::_DSPPACKET; virtual void Init(BYTE byType){}; virtual BYTE GetClassLevel(){ return 0; }; virtual bool AttrSectRecv(BYTE byClassLevels,BYTE byAttrNo,const char* const lpBuff,DWORD dwLen,bool bLast); virtual bool AttrSectSend(BYTE byClassLevels,BYTE byAttrNo,char** const lpBuff,DWORD& dwLen,bool& bContinue); virtual bool Serialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp); virtual bool UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen); virtual bool Compress(char** const lpBuff,DWORD& dwLen); virtual bool UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart); }; #endif