00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00046 #ifndef CCXX_UNIX_H_
00047 #define CCXX_UNIX_H_
00048
00049 #ifndef CCXX_MISSING_H_
00050 #include <cc++/missing.h>
00051 #endif
00052
00053 #ifndef CCXX_SOCKET_H_
00054 #include <cc++/socket.h>
00055 #endif
00056
00057 #ifdef CCXX_NAMESPACES
00058 namespace ost {
00059 #endif
00060
00061 #ifndef WIN32
00062
00076 class UnixSocket : protected Socket
00077 {
00078 protected:
00079 friend class UnixStream;
00080 friend class SocketPort;
00081 friend class unixstream;
00082
00083 public:
00092 UnixSocket(const char* pathname, int backlog = 5);
00093
00097 inline bool isPendingConnection(timeout_t timeout = TIMEOUT_INF)
00098 {return Socket::isPending(pendingInput, timeout);}
00099
00103 virtual ~UnixSocket()
00104 {endSocket();};
00105 };
00106
00120 class UnixStream : public Socket, public std::streambuf, public std::iostream
00121 {
00122 private:
00123 int doallocate();
00124
00125 protected:
00126 timeout_t timeout;
00127 int bufsize;
00128 char *gbuf, *pbuf;
00129
00134 UnixStream(bool throwflag = true);
00135
00142 void allocate(int size);
00143
00148 void endStream(void);
00149
00156 virtual int underflow(void);
00157
00166 int uflow(void);
00167
00175 int overflow(int ch);
00176
00183 void connect(const char* pathname, int size);
00184
00192 std::iostream *unixstr(void)
00193 {return ((std::iostream *)this);};
00194
00195 public:
00206 UnixStream(UnixSocket &server, int size = 512, bool throwflag = true, timeout_t timeout = 0);
00207
00216 UnixStream(const char* pathname, int size = 512, bool throwflag = true, timeout_t to = 0);
00217
00223 inline void setTimeout(timeout_t to)
00224 {timeout = to;};
00225
00232 UnixStream(const UnixStream &source);
00233
00238 virtual ~UnixStream()
00239 {endStream();};
00240
00247 int sync(void);
00248
00256 bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF);
00257
00263 int getBufferSize(void) const
00264 {return bufsize;};
00265 };
00266
00275 class unixstream : public UnixStream
00276 {
00277 public:
00281 unixstream();
00282
00290 unixstream(const char *pathname, int buffer = 512);
00291
00299 unixstream(UnixSocket &unixsock, int buffer = 512);
00300
00308 void open(const char *pathname, int buffer = 512)
00309 { UnixStream::connect( pathname, buffer ); }
00310
00317 void open(UnixSocket &unixsock, int buffer = 512);
00318
00322 void close(void);
00323
00327 bool operator!() const;
00328 };
00329
00340 class UnixSession : public UnixStream, public Thread
00341 {
00342 protected:
00355 int waitConnection(timeout_t timeout = TIMEOUT_INF);
00356
00363 CCXX_MEMBER(void) initial(void);
00364
00370 CCXX_MEMBER(void) final(void)
00371 {delete this;};
00372 public:
00382 UnixSession(const char* pathname, int size = 512, int pri = 0, int stack = 0);
00383
00393 UnixSession(UnixSocket &server, int size = 512,
00394 int pri = 0, int stack = 0);
00395 };
00396
00397 #endif // ndef WIN32
00398
00399 #ifdef CCXX_NAMESPACES
00400 }
00401 #endif
00402
00403 #endif
00404
00405
00406