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
00038 #ifndef BLOCXX_UNNAMEDPIPE_HPP_
00039 #define BLOCXX_UNNAMEDPIPE_HPP_
00040 #include "blocxx/BLOCXX_config.h"
00041 #include "blocxx/IntrusiveCountableBase.hpp"
00042 #include "blocxx/Exception.hpp"
00043 #include "blocxx/IntrusiveReference.hpp"
00044 #include "blocxx/IOIFC.hpp"
00045 #include "blocxx/CommonFwd.hpp"
00046 #include "blocxx/Timeout.hpp"
00047 #include "blocxx/AutoDescriptor.hpp"
00048 #include "blocxx/NetworkTypes.hpp"
00049
00050 namespace BLOCXX_NAMESPACE
00051 {
00052
00053
00054 BLOCXX_DECLARE_APIEXCEPTION(UnnamedPipe, BLOCXX_COMMON_API);
00055
00060 class BLOCXX_COMMON_API UnnamedPipe : public IOIFC, public IntrusiveCountableBase
00061 {
00062 public:
00063 virtual ~UnnamedPipe();
00064
00073 int writeInt(int value);
00074
00084 int writeString(const String& strData);
00085
00094 int readInt(int* value);
00095
00107 int readString(String& strData);
00108
00109 static const int INFINITE_TIMEOUT = -1;
00117 void setReadTimeout(const Timeout& timeout) { m_readTimeout = timeout; }
00118 BLOCXX_DEPRECATED void setReadTimeout(int seconds) { m_readTimeout = Timeout::relative(seconds); }
00126 Timeout getReadTimeout() { return m_readTimeout; }
00134 void setWriteTimeout(const Timeout& timeout) { m_writeTimeout = timeout; }
00135 BLOCXX_DEPRECATED void setWriteTimeout(int seconds) { m_writeTimeout = Timeout::relative(seconds); }
00143 Timeout getWriteTimeout() { return m_writeTimeout; }
00151 void setTimeouts(const Timeout& timeout) { m_readTimeout = m_writeTimeout = timeout; }
00152 BLOCXX_DEPRECATED void setTimeouts(int seconds) { m_readTimeout = m_writeTimeout = Timeout::relative(seconds); }
00153
00163 String readAll();
00164
00168 virtual void open() = 0;
00169
00174 virtual int close() = 0;
00175
00179 virtual bool isOpen() const = 0;
00180
00184 virtual Select_t getReadSelectObj() const = 0;
00185
00189 virtual Select_t getWriteSelectObj() const = 0;
00190
00191
00192 enum EBlockingMode
00193 {
00194 E_NONBLOCKING,
00195 E_BLOCKING
00196 };
00202 virtual void setBlocking(EBlockingMode isBlocking=E_BLOCKING) = 0;
00203
00209 virtual void setWriteBlocking(EBlockingMode isBlocking=E_BLOCKING) = 0;
00210
00216 virtual void setReadBlocking(EBlockingMode isBlocking=E_BLOCKING) = 0;
00217
00221 virtual EBlockingMode getReadBlocking() const = 0;
00222
00226 virtual EBlockingMode getWriteBlocking() const = 0;
00227
00232 virtual Descriptor getInputDescriptor() const = 0;
00233
00238 virtual Descriptor getOutputDescriptor() const = 0;
00239
00247 virtual void passDescriptor(Descriptor h, const UnnamedPipeRef& ackPipe = 0, const ProcessRef& targetProcess = 0) = 0;
00248
00257 virtual AutoDescriptor receiveDescriptor(const UnnamedPipeRef& ackPipe = 0) = 0;
00258
00259 virtual int closeInputHandle() = 0;
00260 virtual int closeOutputHandle() = 0;
00261
00262
00263 enum EOpen
00264 {
00265 E_DONT_OPEN,
00266 E_OPEN
00267 };
00275 static UnnamedPipeRef createUnnamedPipe(EOpen doOpen=E_OPEN);
00283 static UnnamedPipeRef createUnnamedPipeFromDescriptor(AutoDescriptor inputAndOutput);
00291 static UnnamedPipeRef createUnnamedPipeFromDescriptor(AutoDescriptor input, AutoDescriptor output);
00292
00302 static void createConnectedPipes(UnnamedPipeRef& first,
00303 UnnamedPipeRef& second);
00304
00310 static UnnamedPipeRef createStdin();
00316 static UnnamedPipeRef createStdout();
00322 static UnnamedPipeRef createStdinStdout();
00328 static UnnamedPipeRef createStderr();
00329
00330 protected:
00331 UnnamedPipe()
00332 : m_readTimeout(Timeout::infinite)
00333 , m_writeTimeout(Timeout::infinite)
00334 {}
00335 private:
00336 Timeout m_readTimeout;
00337 Timeout m_writeTimeout;
00338 };
00339 BLOCXX_EXPORT_TEMPLATE(BLOCXX_COMMON_API, IntrusiveReference, UnnamedPipe);
00340
00341 }
00342
00343 #endif // BLOCXX_UNNAMEDPIPE_HPP_