Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

packetbuffer.h

Go to the documentation of this file.
00001 /********************************************************************
00002         Copyright (c) 2001, Lee Patterson & Ant Works Software
00003         http://ssobjects.sourceforge.net
00004 
00005         created  :  5/24/1999
00006         filename :  packet.h
00007         author   :  Lee Patterson (lee@antws.com)
00008         
00009         purpose  :  Packet class for sending data over sockets
00010                 
00011 *********************************************************************/
00012 
00013 #ifndef PACKETBUFFER_H
00014 #define PACKETBUFFER_H
00015 
00016 #include <time.h>
00017 #include "defs.h"
00018 #include "generalexception.h"
00019 #include "logs.h"
00020 
00021 
00022 namespace ssobjects
00023 {
00024 
00025 
00026 class ClientConnector;
00027 class BufferedSocket;
00028 class PacketBuffer;
00029 class Communicable;
00030 
00031 //typedefs for static headerSize function can get the correct size
00032 
00033 #define typeCookie unsigned16
00034 #define typeBufferSize unsigned32
00035 #define typeCommand unsigned16
00036 
00044 //TODO: need a copy construtor
00045 class PacketBufferHeader
00046 {
00047     friend PacketBuffer;
00048     friend Communicable;
00049   public:
00050     //header block starts here -->
00051     typeBufferSize  m_nBufferSize;        
00052     typeCookie      m_wCookie;            
00053     typeCommand     m_wCommand;           
00054     // <--
00055     static unsigned32 m_nMaxPacketSize;   
00056     bool        m_bNetworkReady;          
00057   public:
00058     PacketBufferHeader() : m_nBufferSize(0),m_wCookie(0),m_wCommand(0),m_bNetworkReady(false){};
00059     PacketBufferHeader(unsigned16 wCommand,unsigned16 wCookie) : m_nBufferSize(0),m_wCookie(wCookie),m_wCommand(wCommand),m_bNetworkReady(false){};
00060     void        makeNetworkReady(bool bOverrideFailsave=false);         
00061     void        makeHostReady(bool bOverrideFailsafe=false);            
00062     unsigned8*  getHeader() const {return (unsigned8*)&m_nBufferSize;}  
00063     unsigned32  getBufferSize() const {return m_nBufferSize;}           
00064     unsigned16  getCookie() const {return m_wCookie;}                   
00065     unsigned16  getCmd() const {return m_wCommand;}                     
00066     void        reset();                                                
00067     bool        isValid();                                              
00068     bool        isNetworkReady() const {return m_bNetworkReady;}        
00069 
00070     static      unsigned32 getMaxPacketSize();                          
00071     static      unsigned32 setMaxPacketSize(unsigned32);                
00072     static unsigned32  getSize() 
00073     {return sizeof(typeBufferSize)+sizeof(typeCookie)+sizeof(typeCommand);} 
00074 };
00075 
00110 class PacketBuffer 
00111 {
00112   public:
00142     enum    //standard commands
00143       {
00144       pcInvalid=0,        
00145       pcLogin,            
00146       pcLoginOkay,        
00147       pcLoginBad,         
00148       pcLogout,           
00149       pcGetVersion,       
00150       pcVersion,          
00151       pcPing,             
00152       pcPong,             
00153       pcStatus,           
00154       pcNetFileStart,     
00155       pcNetFileData,      
00156       pcNetFileEnd,       
00157       pcClosed,           
00158       pcNewConnection,    
00159       pcAuthenticate,     
00160       pcAuthReply,        
00161 
00162       //debugging packets
00163       pcNoop=100,         
00164 
00165       pcUser=256,         
00166       };
00167 
00168     enum 
00169       {
00170       pkCookie=0x4C50                 
00171       }; 
00172     enum 
00173       {
00174       DefaultPacketBufferSize=1000    
00175       };  
00176 
00177     //TODO: packet header should be protected but isn't as I need the info in the servsocket class, and hadn't thought of making it a friend till now :)
00178     PacketBufferHeader  m_packetHeader;             
00179   protected:
00180     unsigned8*      m_Buffer;                   
00181 
00182     unsigned8*      m_pPointer;                 
00183     bool            m_bUsed;                    
00184     unsigned32      m_nID;                      
00185     unsigned32      m_nBufferSizeMax;           
00186 
00187     //static data
00188     static  unsigned32    m_nUniqueID;          
00189 
00190     //static methods
00191   public:
00192     static unsigned32     getHeaderSize()     {return PacketBufferHeader::getSize();}
00193     virtual void makeNetworkReady(bool bOverrideFailsave=false);        
00194     virtual void makeHostReady(bool bOverrideFailsave=false);           
00195         
00196     //friend methods
00197   protected:
00198     friend ClientConnector;                       
00199     friend BufferedSocket;                        
00200     virtual void receive(BufferedSocket*);        
00201     virtual void transmit(BufferedSocket*);       
00202     virtual void process() {}               
00203 
00204     //overloadable methods
00205   public:
00206     virtual unsigned32  getPacketSize()    const {return (unsigned32)(getHeaderSize() + getBufferSize());}  
00207     virtual unsigned32  getBufferSizeMax() const {return m_nBufferSizeMax;}                                 
00208     virtual unsigned32  getBufferSize()    const {return m_packetHeader.getBufferSize();}                   
00209     virtual unsigned8*  getBuffer()        const;                                                           
00210     virtual unsigned8*  getPointer()       const;                                                           
00211     virtual unsigned8*  getHeader()        const {return m_packetHeader.getHeader();}                       
00212     virtual unsigned8*  resizeBuffer(unsigned32 nNewSize);                                                  
00213 
00214   public:
00215     PacketBuffer(const PacketBuffer&);                                  
00216     PacketBuffer& PacketBuffer::operator=(const PacketBuffer& packet);      
00217     PacketBuffer(unsigned16 wCmd,unsigned32 nSize=DefaultPacketBufferSize); 
00218     PacketBuffer();                                                         
00219     virtual ~PacketBuffer();
00220 
00221     //regular methods
00222     unsigned32  getID()       {return m_nID;}                           
00223     unsigned16  getCmd() const {return m_packetHeader.getCmd();}        
00224     unsigned16  cookie() const {return m_packetHeader.getCookie();}     
00225     void        rewind()      {m_pPointer = m_Buffer;}                  
00226     void        reset();                                                
00227     void        append(unsigned8* pdata,unsigned32 nSize);              
00228 
00229   public:
00230     //overloads
00231     void operator << (const char*);   
00232     void operator << (char*);         
00233     void operator << (CStr&);     
00234     void operator << (signed32);      
00235     void operator << (unsigned32);    
00236     void operator << (signed16);      
00237     void operator << (unsigned16);    
00238     void operator << (unsigned8);     
00239     void operator << (double);        
00240     void operator << (float);         
00241     
00242     void operator >> (char*);         
00243     void operator >> (CStr&);     
00244     void operator >> (signed32&);     
00245     void operator >> (unsigned32&);   
00246     void operator >> (signed16&);     
00247     void operator >> (unsigned16&);   
00248     void operator >> (unsigned8&);    
00249     void operator >> (double&);       
00250     void operator >> (float&);        
00251 };
00252 
00253 #define throwPacketBufferException(m) (throw PacketBufferException(m,__FILE__,__LINE__))
00254 
00258 class PacketBufferException : public GeneralException
00259 {
00260   public: // Constructor/destructor
00261     PacketBufferException(char* pchMessage,const char* pFname,const int iLine) 
00262       : GeneralException(pchMessage,pFname,iLine){};
00263 };
00264 
00265 class NetFile : public PacketBuffer
00266 {
00267   protected:  //attributes
00268     unsigned32 m_nFileSize;
00269     CStr       m_strFilename;
00270     unsigned8* m_pFileData;
00271 
00272   protected:  //methods
00273     virtual void receive(BufferedSocket* psocket);
00274     virtual void transmit(BufferedSocket* psocket);
00275 
00276   public:     //construction
00277     NetFile(const char* pszFilename,unsigned32 nSize,unsigned8* pdata);
00278     NetFile() : m_nFileSize(0),m_strFilename(),m_pFileData(0){};
00279     virtual ~NetFile();
00280 
00281   public:     //user callable methods
00282     CONSTCHAR*       getFilename()   {return m_strFilename;}
00283     const unsigned32  getSize()      {return m_nFileSize;}
00284     unsigned8*        getData()      {return m_pFileData;}
00285 
00286   private:
00287     //unused overloads
00288     NetFile(const NetFile&);
00289     NetFile& operator=(const NetFile&);
00290 };
00291 
00292 #define throwNetFileException(m) (throw NetFileException(m,__FILE__,__LINE__))
00293 
00294 class NetFileException : public PacketBufferException
00295 {
00296   public: // Constructor/destructor
00297     NetFileException(char* pchMessage,const char* pFname,const int iLine) 
00298       : PacketBufferException(pchMessage,pFname,iLine){};
00299 };
00300 
00301 //
00302 // all objects that will be sent over internet will be derived from 
00303 // this class. You must override the two pure virtual methods to impliment
00304 // your new object. You don't override process(). Just the pure methods.
00305 //
00306 // All communicable objects can be ACKed or NAKed. 
00307 //
00308 class Communicable : public PacketBuffer
00309 {
00310   public:
00311     Communicable() {}
00312     Communicable(unsigned16 wCmd) : PacketBuffer(wCmd) {}
00313 //        Communicable(PacketBuffer* ppacket) {extract(ppacket);}   //example of how to call extract
00314 
00315   protected:
00316     //extract data from packet, and fill your class data when receiving
00317     //you should override extraceData, and call extract when constructing with a packet pointer
00318     //
00319     virtual void extract(PacketBuffer* ppacket) {extractHeader(ppacket); extractData(ppacket);}
00320     virtual void extractData(PacketBuffer*)=0;
00321     virtual void extractHeader(PacketBuffer* ppacket) 
00322     {
00323       //TODO: should use a copy constructor or something to copy entire header
00324       //TODO  in one shot instead of each member
00325       m_packetHeader.m_nBufferSize = ppacket->m_packetHeader.m_nBufferSize;
00326       m_packetHeader.m_wCookie     = ppacket->m_packetHeader.m_wCookie;
00327       m_packetHeader.m_wCommand    = ppacket->m_packetHeader.m_wCommand;
00328     }
00329 
00330     //take your class data, and put it into our packet buffer for sending
00331     virtual void stuff()=0;
00332     virtual void process() {extract(this);}      //you don't override this
00333 };
00334 
00335   };  //namespace
00336 
00337 #endif
00338 

Generated on Thu Nov 8 12:39:25 2001 for SimpleServerObjects by doxygen1.2.11 written by Dimitri van Heesch, © 1997-2001