Panda3D
http_bufferedreader.h
1 #ifndef __WEBBUFFEREDREADER_GM_H__
2 #define __WEBBUFFEREDREADER_GM_H__
3 // RHH
4 
5 #include <string>
6 #include "strtargetbuffer.h"
7 #include "ringbuffer_slide.h"
8 #include "application_log.h"
9 
10 
12 {
13  inline bool GetTermedString(char * outdata, size_t maxlen,char termchar1, char termchar2);
14  inline bool GetDoubleTermedString(char * outdata, int maxlen,char termchar1, char termchar2);
15  inline bool GetTermedStringInPLace(char ** outdata,char termchars);
16  inline bool GetTermedString(char * outdata, int maxlen,char * termchars);
17  inline bool GetSizeString(StrTargetBuffer & outdata);
18 public:
19  inline Http_BufferedReader(int in_size = 8192) ;
20 //
21 // The Read Message Interface
22 //
23  inline void ReSet(void);
24  inline int PumpCRRead(char * data, int maxdata, Socket_TCP &sck);
25  inline int PumpHTTPHeaderRead(char * data, int maxdata, Socket_TCP &sck);
26  inline int PumpSizeRead(StrTargetBuffer & outdata,Socket_TCP &sck);
27  inline int PumpEofRead(StrTargetBuffer & outdata,Socket_TCP &sck);
28  //inline int PumpMessageReader(CoreMessage &inmsg, Socket_TCP &sck);
29 
30 
31  template < class SOCK_TYPE>
32  inline int ReadPump(SOCK_TYPE &sck)
33  {
34  int answer = 0;
35  size_t readsize = BufferAvailabe();
36 
37  if(readsize < 1)
38  {
39  FullCompress();
40  readsize = BufferAvailabe();
41  }
42 
43 
44  if(readsize > 0)
45  {
46  char * ff = GetBufferOpen();
47  int gotbytes = sck.RecvData(ff,(int)readsize);
48 
49 
50  if(gotbytes < 0) // some error
51  {
52  int er = GETERROR();
53  // if(err != LOCAL_BLOCKING_ERROR )
54  if(!sck.ErrorIs_WouldBlocking(gotbytes) )
55  {
56  answer = -3;
57  LOGINFO("Http_BufferedReader::ReadPump->Socket Level Read Error %d %d %d %s",er,gotbytes,errno,sck.GetPeerName().get_ip_port().c_str());
58  }
59  else
60  {
61  answer = 0; // try again nothing to read
62  }
63  }
64  else if(gotbytes > 0) // ok got some lets process it
65  {
66 
67  _EndPos += gotbytes;
68  answer = 1;
69  }
70  else // 0 mean other end disconect arggggg
71  {
72  answer = -1;
73  LOGWARNING("Http_BufferedReader::ReadPump->Other End Closed Normal [%s]",sck.GetPeerName().get_ip_port().c_str());
74  }
75  }
76  else
77  {
78  std::string addstr = sck.GetPeerName().get_ip_port();
79  LOGWARNING("Http_BufferedReader::ReadPump->** Very Important** No Internal buffer left for read[%s] BufferSIze=[%d][%d]",
80  addstr.c_str(),
81  AmountBuffered(),
82  BufferAvailabe()
83  );
84 
85  answer = -2;
86  }
87  return answer;
88  }
89 
90 };
91 
92 #include "http_bufferedreader.i"
93 
94 #endif //__BUFFEREDREADER_GM_H__
95 
96 
Base functionality for a TCP connected socket This class is pretty useless by itself but it does hide...
Definition: socket_tcp.h:15
This is an implemention of the membuffer with ring buffer interface on it....