00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __JackWinNamedPipe__
00022 #define __JackWinNamedPipe__
00023
00024 #include <windows.h>
00025
00026 #include "JackChannel.h"
00027
00028 namespace Jack
00029 {
00030
00031 class JackWinNamedPipeAux
00032 {
00033
00034 protected:
00035
00036 HANDLE fNamedPipe;
00037 char fName[256];
00038
00039 int ReadAux(void* data, int len);
00040 int WriteAux(void* data, int len);
00041
00042 public:
00043
00044 JackWinNamedPipeAux(): fNamedPipe(INVALID_HANDLE_VALUE)
00045 {}
00046 JackWinNamedPipeAux(HANDLE pipe): fNamedPipe(pipe)
00047 {}
00048 virtual ~JackWinNamedPipeAux()
00049 {}
00050
00051 };
00052
00053
00054 class JackWinNamedPipe : public JackWinNamedPipeAux, public detail::JackChannelTransactionInterface
00055 {
00056
00057 public:
00058
00059 JackWinNamedPipe():JackWinNamedPipeAux()
00060 {}
00061 JackWinNamedPipe(HANDLE pipe):JackWinNamedPipeAux(pipe)
00062 {}
00063 virtual ~JackWinNamedPipe()
00064 {}
00065
00066 virtual int Read(void* data, int len)
00067 {
00068 return ReadAux(data, len);
00069 }
00070 virtual int Write(void* data, int len)
00071 {
00072 return WriteAux(data, len);
00073 }
00074 };
00075
00080 class JackWinNamedPipeClient : public JackWinNamedPipeAux, public detail::JackClientRequestInterface
00081 {
00082
00083 protected:
00084
00085 int ConnectAux();
00086
00087 public:
00088
00089 JackWinNamedPipeClient():JackWinNamedPipeAux()
00090 {}
00091 JackWinNamedPipeClient(HANDLE pipe, const char* name):JackWinNamedPipeAux(pipe)
00092 {
00093 strcpy(fName, name);
00094 }
00095
00096 virtual ~JackWinNamedPipeClient()
00097 {}
00098
00099 virtual int Connect(const char* dir, int which);
00100 virtual int Connect(const char* dir, const char* name, int which);
00101 virtual int Close();
00102
00103 virtual int Read(void* data, int len)
00104 {
00105 return ReadAux(data, len);
00106 }
00107 virtual int Write(void* data, int len)
00108 {
00109 return WriteAux(data, len);
00110 }
00111
00112 virtual void SetReadTimeOut(long sec);
00113 virtual void SetWriteTimeOut(long sec);
00114
00115 virtual void SetNonBlocking(bool onoff);
00116 };
00117
00118 class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient
00119 {
00120 enum kIOState {kIdle = 0, kConnecting, kReading, kWriting};
00121
00122 private:
00123
00124 bool fPendingIO;
00125 kIOState fIOState;
00126 OVERLAPPED fOverlap;
00127
00128 public:
00129
00130 JackWinAsyncNamedPipeClient();
00131 JackWinAsyncNamedPipeClient(HANDLE pipe, const char* name, bool pending);
00132 virtual ~JackWinAsyncNamedPipeClient();
00133
00134 virtual int Read(void* data, int len);
00135 virtual int Write(void* data, int len);
00136
00137 HANDLE GetEvent()
00138 {
00139 return (HANDLE)fOverlap.hEvent;
00140 }
00141
00142 kIOState GetIOState()
00143 {
00144 return fIOState;
00145 }
00146
00147 bool GetPending()
00148 {
00149 return fPendingIO;
00150 }
00151
00152 int FinishIO();
00153 };
00154
00159 class JackWinNamedPipeServer : public JackWinNamedPipe
00160 {
00161 private:
00162
00163 int BindAux();
00164
00165 public:
00166
00167 JackWinNamedPipeServer(): JackWinNamedPipe()
00168 {}
00169 virtual ~JackWinNamedPipeServer()
00170 {}
00171
00172 virtual int Bind(const char* dir, int which);
00173 virtual int Bind(const char* dir, const char* name, int which);
00174 virtual bool Accept();
00175 virtual JackWinNamedPipeClient* AcceptClient();
00176 int Close();
00177 };
00178
00183 class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer
00184 {
00185
00186 private:
00187
00188 int BindAux();
00189
00190 public:
00191
00192 JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer()
00193 {}
00194 virtual ~JackWinAsyncNamedPipeServer()
00195 {}
00196
00197 int Bind(const char* dir, int which);
00198 int Bind(const char* dir, const char* name, int which);
00199 bool Accept();
00200 JackWinNamedPipeClient* AcceptClient();
00201 int Close();
00202 };
00203
00204 }
00205
00206
00207 #endif
00208