00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __JackWinNamedPipe__
00021 #define __JackWinNamedPipe__
00022
00023 #include <windows.h>
00024
00025 namespace Jack
00026 {
00027
00028 class JackWinNamedPipe
00029 {
00030
00031 protected:
00032
00033 HANDLE fNamedPipe;
00034 char fName[256];
00035
00036 public:
00037
00038 JackWinNamedPipe(): fNamedPipe(INVALID_HANDLE_VALUE)
00039 {}
00040 JackWinNamedPipe(HANDLE pipe): fNamedPipe(pipe)
00041 {}
00042 virtual ~JackWinNamedPipe()
00043 {}
00044
00045 virtual int Read(void* data, int len);
00046 virtual int Write(void* data, int len);
00047 };
00048
00053 class JackWinNamedPipeClient : public JackWinNamedPipe
00054 {
00055
00056 public:
00057
00058 JackWinNamedPipeClient(): JackWinNamedPipe()
00059 {}
00060 JackWinNamedPipeClient(HANDLE pipe): JackWinNamedPipe(pipe)
00061 {}
00062
00063 virtual ~JackWinNamedPipeClient()
00064 {}
00065
00066 virtual int Connect(const char* dir, int which);
00067 virtual int Connect(const char* dir, const char* name, int which);
00068 virtual int Close();
00069 virtual void SetReadTimeOut(long sec);
00070 virtual void SetWriteTimeOut(long sec);
00071 };
00072
00073 class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient
00074 {
00075 enum kIOState {kIdle = 0, kConnecting, kReading, kWriting};
00076
00077 private:
00078
00079 bool fPendingIO;
00080 kIOState fIOState;
00081 OVERLAPPED fOverlap;
00082
00083 public:
00084
00085 JackWinAsyncNamedPipeClient();
00086 JackWinAsyncNamedPipeClient(HANDLE pipe, bool pending);
00087 virtual ~JackWinAsyncNamedPipeClient();
00088
00089 virtual int Read(void* data, int len);
00090 virtual int Write(void* data, int len);
00091
00092 HANDLE GetEvent()
00093 {
00094 return (HANDLE)fOverlap.hEvent;
00095 }
00096
00097 kIOState GetIOState()
00098 {
00099 return fIOState;
00100 }
00101
00102 bool GetPending()
00103 {
00104 return fPendingIO;
00105 }
00106
00107 int FinishIO();
00108 };
00109
00114 class JackWinNamedPipeServer : public JackWinNamedPipe
00115 {
00116
00117 public:
00118
00119 JackWinNamedPipeServer(): JackWinNamedPipe()
00120 {}
00121 virtual ~JackWinNamedPipeServer()
00122 {}
00123
00124 virtual int Bind(const char* dir, int which);
00125 virtual int Bind(const char* dir, const char* name, int which);
00126 virtual bool Accept();
00127 virtual JackWinNamedPipeClient* AcceptClient();
00128 int Close();
00129 };
00130
00135 class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer
00136 {
00137
00138 public:
00139
00140 JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer()
00141 {}
00142 virtual ~JackWinAsyncNamedPipeServer()
00143 {}
00144
00145 int Bind(const char* dir, int which);
00146 int Bind(const char* dir, const char* name, int which);
00147 bool Accept();
00148 JackWinNamedPipeClient* AcceptClient();
00149 int Close();
00150 };
00151
00152 }
00153
00154
00155 #endif
00156