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
00032
00033 #define typeCookie unsigned16
00034 #define typeBufferSize unsigned32
00035 #define typeCommand unsigned16
00036
00044
00045 class PacketBufferHeader
00046 {
00047 friend PacketBuffer;
00048 friend Communicable;
00049 public:
00050
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
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
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
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
00188 static unsigned32 m_nUniqueID;
00189
00190
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
00197 protected:
00198 friend ClientConnector;
00199 friend BufferedSocket;
00200 virtual void receive(BufferedSocket*);
00201 virtual void transmit(BufferedSocket*);
00202 virtual void process() {}
00203
00204
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
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
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:
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:
00268 unsigned32 m_nFileSize;
00269 CStr m_strFilename;
00270 unsigned8* m_pFileData;
00271
00272 protected:
00273 virtual void receive(BufferedSocket* psocket);
00274 virtual void transmit(BufferedSocket* psocket);
00275
00276 public:
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:
00282 CONSTCHAR* getFilename() {return m_strFilename;}
00283 const unsigned32 getSize() {return m_nFileSize;}
00284 unsigned8* getData() {return m_pFileData;}
00285
00286 private:
00287
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:
00297 NetFileException(char* pchMessage,const char* pFname,const int iLine)
00298 : PacketBufferException(pchMessage,pFname,iLine){};
00299 };
00300
00301
00302
00303
00304
00305
00306
00307
00308 class Communicable : public PacketBuffer
00309 {
00310 public:
00311 Communicable() {}
00312 Communicable(unsigned16 wCmd) : PacketBuffer(wCmd) {}
00313
00314
00315 protected:
00316
00317
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
00324
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
00331 virtual void stuff()=0;
00332 virtual void process() {extract(this);}
00333 };
00334
00335 };
00336
00337 #endif
00338