Panda3D

http_bufferedreader.h

00001 #ifndef __WEBBUFFEREDREADER_GM_H__
00002 #define __WEBBUFFEREDREADER_GM_H__
00003 // RHH
00004 
00005 #include  <string>
00006 #include   "strtargetbuffer.h"
00007 #include   "ringbuffer_slide.h"
00008 #include   "application_log.h"
00009 
00010 
00011 class   Http_BufferedReader : protected RingBuffer_Slide
00012 {
00013     inline bool GetTermedString(char * outdata, size_t maxlen,char termchar1, char termchar2);
00014     inline bool GetDoubleTermedString(char * outdata, int maxlen,char termchar1, char termchar2);
00015     inline bool GetTermedStringInPLace(char ** outdata,char termchars);
00016     inline bool GetTermedString(char * outdata, int maxlen,char * termchars);
00017     inline bool GetSizeString(StrTargetBuffer  & outdata);
00018 public:
00019     inline Http_BufferedReader(int in_size = 8192) ;
00020 //
00021 // The Read Message Interface
00022 //
00023     inline void ReSet(void); 
00024     inline int PumpCRRead(char * data, int   maxdata, Socket_TCP &sck);
00025     inline int PumpHTTPHeaderRead(char * data, int   maxdata, Socket_TCP &sck);
00026     inline int PumpSizeRead(StrTargetBuffer  & outdata,Socket_TCP &sck);
00027     inline int PumpEofRead(StrTargetBuffer  & outdata,Socket_TCP &sck);
00028     //inline int PumpMessageReader(CoreMessage &inmsg, Socket_TCP &sck);
00029 
00030 
00031     template < class SOCK_TYPE>
00032         inline int ReadPump(SOCK_TYPE &sck)
00033     {       
00034         int     answer = 0;
00035         size_t      readsize = BufferAvailabe();
00036 
00037         if(readsize < 1)
00038         {
00039             FullCompress();
00040             readsize = BufferAvailabe();
00041         }
00042 
00043 
00044         if(readsize > 0)
00045         {
00046             char * ff = GetBufferOpen();
00047             int gotbytes = sck.RecvData(ff,(int)readsize);
00048 
00049 
00050             if(gotbytes < 0)  // some error
00051             {
00052                 int er = GETERROR(); 
00053                 // if(err != LOCAL_BLOCKING_ERROR )
00054                 if(!sck.ErrorIs_WouldBlocking(gotbytes) )
00055                 {
00056                     answer = -3; 
00057                     LOGINFO("Http_BufferedReader::ReadPump->Socket Level Read Error %d %d %d %s",er,gotbytes,errno,sck.GetPeerName().get_ip_port().c_str());
00058                 }
00059                 else
00060                 {
00061                     answer = 0; // try again nothing to read
00062                 }
00063             }
00064             else if(gotbytes > 0) // ok got some lets process it
00065             {
00066 
00067                 _EndPos +=  gotbytes;
00068                 answer = 1;
00069             }
00070             else   // 0 mean other end disconect arggggg
00071             {
00072                 answer = -1;
00073                 LOGWARNING("Http_BufferedReader::ReadPump->Other End Closed Normal [%s]",sck.GetPeerName().get_ip_port().c_str());
00074             }
00075         }       
00076         else
00077         {
00078             std::string addstr = sck.GetPeerName().get_ip_port();
00079             LOGWARNING("Http_BufferedReader::ReadPump->** Very Important** No Internal buffer left for read[%s] BufferSIze=[%d][%d]",
00080                 addstr.c_str(),
00081                 AmountBuffered(),
00082                 BufferAvailabe()
00083                 );
00084 
00085             answer = -2;
00086         }
00087         return answer;
00088     }
00089 
00090 };
00091 
00092 #include "http_bufferedreader.i"
00093 
00094 #endif //__BUFFEREDREADER_GM_H__
00095 
00096 
 All Classes Functions Variables Enumerations