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
00024
00025
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)
00061 {
00062
00063 if(!sck.ErrorIs_WouldBlocking(gotbytes) )
00064 {
00065 answer = -3;
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;
00071 }
00072 }
00073 else if(gotbytes > 0)
00074 {
00075
00076 _EndPos += gotbytes;
00077 answer = 1;
00078 }
00079 else
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