Panda3D

buffered_datagramreader.h

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 
 All Classes Functions Variables Enumerations