Panda3D
|
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