Panda3D
|
00001 #ifndef __BUFFEREDREADER_GM_H__ 00002 #define __BUFFEREDREADER_GM_H__ 00003 00004 00005 #include "ringbuffer.h" 00006 #include "datagram.h" 00007 #include "config_nativenet.h" 00008 00009 00010 inline unsigned short GetUnsignedShort(char * in) 00011 { 00012 return *((unsigned short *)in); 00013 }; 00014 00015 00016 class Buffered_DatagramReader : protected RingBuffer 00017 { 00018 inline bool GetMessageFromBuffer(Datagram &inmsg); 00019 public: 00020 inline Buffered_DatagramReader(int in_size = 8192) ; 00021 inline void ReSet(void); 00022 // 00023 // SOCK_TYPE is used to allow for 00024 // abstract socket type to be used .. 00025 // see socket_tcp and socket_ssl 00026 00027 template < class SOCK_TYPE> 00028 inline int PumpMessageReader(Datagram &inmsg, SOCK_TYPE &sck) 00029 { 00030 if(GetMessageFromBuffer(inmsg) == true) 00031 return 1; 00032 int rp = ReadPump(sck); 00033 if(rp == 0) 00034 return 0; 00035 00036 if(rp < 1) 00037 return -1; 00038 if(GetMessageFromBuffer(inmsg) == true) 00039 return 1; 00040 return 0; 00041 } 00042 00043 00044 template < class SOCK_TYPE> 00045 inline int ReadPump(SOCK_TYPE &sck) 00046 { 00047 int answer = 0; 00048 size_t readsize = BufferAvailabe(); 00049 00050 if(readsize < 1) 00051 { 00052 Compress(); 00053 readsize = BufferAvailabe(); 00054 } 00055 00056 if(readsize > 0) 00057 { 00058 char * ff = GetBufferOpen(); 00059 int gotbytes = sck.RecvData(ff,(int)readsize); 00060 if(gotbytes < 0) // some error 00061 { 00062 //int er = GETERROR(); 00063 if(!sck.ErrorIs_WouldBlocking(gotbytes) ) 00064 { 00065 answer = -3; // hard error ? 00066 nativenet_cat.error() << "buffered_datagram_reader:ReadPump socket read error -- " << GETERROR() <<", " << sck.GetPeerName().get_ip_port().c_str() << "\n"; 00067 } 00068 else 00069 { 00070 answer = 0; // try again nothing to read 00071 } 00072 } 00073 else if(gotbytes > 0) // ok got some lets process it 00074 { 00075 00076 _EndPos += gotbytes; 00077 answer = 1; 00078 } 00079 else // 0 mean other end disconect arggggg 00080 { 00081 answer = -1; 00082 nativenet_cat.error() << "buffered_datagram_reader:ReadPump other end of socket closed -- " << sck.GetPeerName().get_ip_port().c_str() << "\n"; 00083 } 00084 } 00085 else 00086 { 00087 answer = -2; 00088 nativenet_cat.error() << "buffered_datagram_reader:ReadPump Yeep! buffer has no room to read to -- " << sck.GetPeerName().get_ip_port().c_str() << "\nBufferAvaiable = " << readsize <<" AmountBuffered = " << AmountBuffered() << " BufferSize " << GetBufferSize() << "\n"; 00089 00090 } 00091 return answer; 00092 } 00093 }; 00094 00095 #include "buffered_datagramreader.i" 00096 00097 #endif //__BUFFEREDREADER_GM_H__ 00098