00001 #ifndef SENTRY_SUE_SESS_HPP 00002 #define SENTRY_SUE_SESS_HPP 00003 00004 00005 #ifndef SENTRY_SUE_SEL_HPP 00006 #include "sue_sel.hpp" 00007 #endif 00008 00009 00011 class SUEBuffer { 00012 char *data; 00013 int datalen; 00014 int maxlen; 00015 public: 00017 SUEBuffer(); 00019 ~SUEBuffer(); 00020 00022 00023 void AddData(const char *buf, int size); 00024 00026 00033 int GetData(char *buf, int bufsize); 00034 00036 00039 void DropData(int len); 00040 00042 void EraseData(int index, int len); 00043 00045 void DropAll() { datalen = 0; } 00046 00048 void AddChar(char c); 00049 00051 00054 void AddString(const char *str); 00055 00057 00066 int ReadLine(char *buf, int bufsize); 00068 00077 bool ReadLine(SUEBuffer &buf); 00078 00080 00081 int FindLineMarker(const char *marker) const; 00082 int ReadUntilLineMarker(const char *marker, char *buf, int bufsize); 00083 bool ReadUntilLineMarker(const char *marker, SUEBuffer &dest); 00084 00086 00089 bool ContainsExactText(const char *str) const; 00090 00092 00098 const char *GetBuffer() const { return data; } 00100 00101 int Length() const { return datalen; } 00103 00108 char& operator[](int i) const { return *(data + i); } 00109 00110 private: 00111 void ProvideMaxLen(int n); 00112 }; 00113 00114 00116 00147 class SUEGenericDuplexSession : protected SUEFdHandler, 00148 private SUETimeoutHandler 00149 { 00150 00151 long timeout_sec; 00152 long timeout_usec; 00153 00155 bool scheduleddown; 00156 00157 protected: 00158 00160 SUEEventSelector *the_selector; 00161 00163 SUEBuffer inputbuffer; 00165 SUEBuffer outputbuffer; 00166 00167 00169 bool inputresetstimeout; 00171 bool outputresetstimeout; 00172 00174 00183 virtual void FdHandle(bool a_r, bool a_w, bool a_ex); 00184 00186 00191 virtual void TimeoutHandle(); 00192 00193 00195 virtual bool WantRead() const { return true; } 00199 virtual bool WantWrite() const { return outputbuffer.Length() > 0; } 00201 virtual bool WantExcept() const { return false; } 00202 00203 public: 00205 00212 SUEGenericDuplexSession(int a_timeout = 0, 00213 const char *a_greeting = 0); 00215 virtual ~SUEGenericDuplexSession(); 00216 00218 00224 void SetTimeout(int sec, int usec = 0); 00225 00227 00234 void Startup(SUEEventSelector *a_selector, 00235 int a_fd, const char *a_greeting = 0); 00236 00238 00247 void Shutdown(); 00248 00250 00253 void GracefulShutdown(); 00254 00256 00264 virtual void HandleNewInput() = 0; 00265 00267 00278 virtual void ShutdownHook() {} 00279 00281 00285 virtual void HandleSessionTimeout() { Shutdown(); } 00286 00288 00292 virtual void HandleReadError() { Shutdown(); } 00293 00295 00299 virtual void HandleWriteError() { Shutdown(); } 00300 00302 00306 virtual void HandleRemoteClosing() { Shutdown(); } 00307 00308 private: 00309 void ResetTimeout(); 00310 }; 00311 00312 00313 #endif //sentry