1 /* 2 Copyright (C) 2004-2008 Grame 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU Lesser General Public License as published by 6 the Free Software Foundation; either version 2.1 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 */ 19 20 21 #ifndef __JackWinNamedPipe__ 22 #define __JackWinNamedPipe__ 23 24 #ifdef __MINGW32__ 25 #include <winsock2.h> 26 #endif 27 #include <windows.h> 28 29 #include "JackChannel.h" 30 31 namespace Jack 32 { 33 34 class JackWinNamedPipeAux 35 { 36 37 protected: 38 39 HANDLE fNamedPipe; 40 char fName[256]; 41 42 int ReadAux(void* data, int len); 43 int WriteAux(void* data, int len); 44 45 public: 46 JackWinNamedPipeAux()47 JackWinNamedPipeAux(): fNamedPipe(INVALID_HANDLE_VALUE) 48 {} JackWinNamedPipeAux(HANDLE pipe)49 JackWinNamedPipeAux(HANDLE pipe): fNamedPipe(pipe) 50 {} ~JackWinNamedPipeAux()51 virtual ~JackWinNamedPipeAux() 52 {} 53 54 }; 55 56 57 class JackWinNamedPipe : public JackWinNamedPipeAux, public detail::JackChannelTransactionInterface 58 { 59 60 public: 61 JackWinNamedPipe()62 JackWinNamedPipe():JackWinNamedPipeAux() 63 {} JackWinNamedPipe(HANDLE pipe)64 JackWinNamedPipe(HANDLE pipe):JackWinNamedPipeAux(pipe) 65 {} ~JackWinNamedPipe()66 virtual ~JackWinNamedPipe() 67 {} 68 Read(void * data,int len)69 virtual int Read(void* data, int len) 70 { 71 return ReadAux(data, len); 72 } Write(void * data,int len)73 virtual int Write(void* data, int len) 74 { 75 return WriteAux(data, len); 76 } 77 }; 78 79 /*! 80 \brief Client named pipe. 81 */ 82 83 class JackWinNamedPipeClient : public JackWinNamedPipeAux, public detail::JackClientRequestInterface 84 { 85 86 protected: 87 88 int ConnectAux(); 89 90 public: 91 JackWinNamedPipeClient()92 JackWinNamedPipeClient():JackWinNamedPipeAux() 93 {} JackWinNamedPipeClient(HANDLE pipe,const char * name)94 JackWinNamedPipeClient(HANDLE pipe, const char* name):JackWinNamedPipeAux(pipe) 95 { 96 strcpy(fName, name); 97 } 98 ~JackWinNamedPipeClient()99 virtual ~JackWinNamedPipeClient() 100 {} 101 102 virtual int Connect(const char* dir, int which); 103 virtual int Connect(const char* dir, const char* name, int which); 104 virtual int Close(); 105 Read(void * data,int len)106 virtual int Read(void* data, int len) 107 { 108 return ReadAux(data, len); 109 } Write(void * data,int len)110 virtual int Write(void* data, int len) 111 { 112 return WriteAux(data, len); 113 } 114 115 virtual void SetReadTimeOut(long sec); 116 virtual void SetWriteTimeOut(long sec); 117 118 virtual void SetNonBlocking(bool onoff); 119 }; 120 121 class JackWinAsyncNamedPipeClient : public JackWinNamedPipeClient 122 { 123 enum kIOState {kIdle = 0, kConnecting, kReading, kWriting}; 124 125 private: 126 127 bool fPendingIO; 128 kIOState fIOState; 129 OVERLAPPED fOverlap; 130 131 public: 132 133 JackWinAsyncNamedPipeClient(); 134 JackWinAsyncNamedPipeClient(HANDLE pipe, const char* name, bool pending); 135 virtual ~JackWinAsyncNamedPipeClient(); 136 137 virtual int Read(void* data, int len); 138 virtual int Write(void* data, int len); 139 GetEvent()140 HANDLE GetEvent() 141 { 142 return (HANDLE)fOverlap.hEvent; 143 } 144 GetIOState()145 kIOState GetIOState() 146 { 147 return fIOState; 148 } 149 GetPending()150 bool GetPending() 151 { 152 return fPendingIO; 153 } 154 155 int FinishIO(); 156 }; 157 158 /*! 159 \brief Server named pipe. 160 */ 161 162 class JackWinNamedPipeServer : public JackWinNamedPipe 163 { 164 private: 165 166 int BindAux(); 167 168 public: 169 JackWinNamedPipeServer()170 JackWinNamedPipeServer(): JackWinNamedPipe() 171 {} ~JackWinNamedPipeServer()172 virtual ~JackWinNamedPipeServer() 173 {} 174 175 virtual int Bind(const char* dir, int which); 176 virtual int Bind(const char* dir, const char* name, int which); 177 virtual bool Accept(); 178 virtual JackWinNamedPipeClient* AcceptClient(); 179 int Close(); 180 }; 181 182 /*! 183 \brief Server async named pipe. 184 */ 185 186 class JackWinAsyncNamedPipeServer : public JackWinNamedPipeServer 187 { 188 189 private: 190 191 int BindAux(); 192 193 public: 194 JackWinAsyncNamedPipeServer()195 JackWinAsyncNamedPipeServer(): JackWinNamedPipeServer() 196 {} ~JackWinAsyncNamedPipeServer()197 virtual ~JackWinAsyncNamedPipeServer() 198 {} 199 200 int Bind(const char* dir, int which); 201 int Bind(const char* dir, const char* name, int which); 202 bool Accept(); 203 JackWinNamedPipeClient* AcceptClient(); 204 int Close(); 205 }; 206 207 } // end of namespace 208 209 210 #endif 211 212