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 namespace Jack
00027 {
00028
00029 class JackWinNamedPipe
00030 {
00031
00032 protected:
00033
00034 HANDLE fNamedPipe;
00035 char fName[256];
00036
00037 public:
00038
00039 JackWinNamedPipe(): fNamedPipe(INVALID_HANDLE_VALUE)
00040 {}
00041 JackWinNamedPipe(HANDLE pipe): fNamedPipe(pipe)
00042 {}
00043 virtual ~JackWinNamedPipe()
00044 {}
00045
00046 virtual int Read(void* data, int len);
00047 virtual int Write(void* data, int len);
00048 };
00049
00054 class JackWinNamedPipeClient : public JackWinNamedPipe
00055 {
00056
00057 private:
00058
00059 int ConnectAux();
00060
00061 public:
00062
00063 JackWinNamedPipeClient(): JackWinNamedPipe()
00064 {}
00065 JackWinNamedPipeClient(HANDLE pipe, const char* name): JackWinNamedPipe(pipe)
00066 {
00067 strcpy(fName, name);
00068 }
00069
00070 virtual ~JackWinNamedPipeClient()
00071 {}
00072
00073 virtual int Connect(const char* dir, int which);
00074 virtual int Connect(const char* dir, const char* name, int which);
00075 virtual int Close();
00076 virtual void SetReadTimeOut(long sec);
00077 virtual void SetWriteTimeOut(long sec);
00078 };
00079
00080 class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient
00081 {
00082 enum kIOState {kIdle = 0, kConnecting, kReading, kWriting};
00083
00084 private:
00085
00086 bool fPendingIO;
00087 kIOState fIOState;
00088 OVERLAPPED fOverlap;
00089
00090 public:
00091
00092 JackWinAsyncNamedPipeClient();
00093 JackWinAsyncNamedPipeClient(HANDLE pipe, const char* name, bool pending);
00094 virtual ~JackWinAsyncNamedPipeClient();
00095
00096 virtual int Read(void* data, int len);
00097 virtual int Write(void* data, int len);
00098
00099 HANDLE GetEvent()
00100 {
00101 return (HANDLE)fOverlap.hEvent;
00102 }
00103
00104 kIOState GetIOState()
00105 {
00106 return fIOState;
00107 }
00108
00109 bool GetPending()
00110 {
00111 return fPendingIO;
00112 }
00113
00114 int FinishIO();
00115 };
00116
00121 class JackWinNamedPipeServer : public JackWinNamedPipe
00122 {
00123 private:
00124
00125 int BindAux();
00126
00127 public:
00128
00129 JackWinNamedPipeServer(): JackWinNamedPipe()
00130 {}
00131 virtual ~JackWinNamedPipeServer()
00132 {}
00133
00134 virtual int Bind(const char* dir, int which);
00135 virtual int Bind(const char* dir, const char* name, int which);
00136 virtual bool Accept();
00137 virtual JackWinNamedPipeClient* AcceptClient();
00138 int Close();
00139 };
00140
00145 class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer
00146 {
00147
00148 private:
00149
00150 int BindAux();
00151
00152 public:
00153
00154 JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer()
00155 {}
00156 virtual ~JackWinAsyncNamedPipeServer()
00157 {}
00158
00159 int Bind(const char* dir, int which);
00160 int Bind(const char* dir, const char* name, int which);
00161 bool Accept();
00162 JackWinNamedPipeClient* AcceptClient();
00163 int Close();
00164 };
00165
00166 }
00167
00168
00169 #endif
00170