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 #ifndef __JackWinNamedPipeServerChannel__ 21 #define __JackWinNamedPipeServerChannel__ 22 23 #include "JackWinNamedPipe.h" 24 #include "JackPlatformPlug.h" 25 #include "JackConstants.h" 26 #include "JackRequestDecoder.h" 27 #include <list> 28 29 namespace Jack 30 { 31 32 class JackServer; 33 34 class JackClientPipeThread : public JackRunnableInterface, public JackClientHandlerInterface 35 { 36 37 private: 38 39 JackWinNamedPipeClient* fPipe; 40 JackRequestDecoder* fDecoder; 41 JackServer* fServer; 42 JackThread fThread; 43 int fRefNum; 44 45 void ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res); 46 void ClientRemove(detail::JackChannelTransactionInterface* socket, int refnum); 47 48 void ClientKill(); 49 50 static HANDLE fMutex; 51 52 public: 53 54 JackClientPipeThread(JackWinNamedPipeClient* pipe); 55 virtual ~JackClientPipeThread(); 56 57 int Open(JackServer* server); // Open the Server/Client connection 58 void Close(); // Close the Server/Client connection 59 60 // JackRunnableInterface interface 61 bool Execute(); 62 63 // To be used for find out if the object can be deleted IsRunning()64 bool IsRunning() 65 { 66 return (fRefNum >= 0); 67 } 68 69 }; 70 71 /*! 72 \brief JackServerChannel using pipe. 73 */ 74 75 class JackWinNamedPipeServerChannel : public JackRunnableInterface 76 { 77 78 private: 79 80 JackWinNamedPipeServer fRequestListenPipe; // Pipe to create request socket for the client 81 JackServer* fServer; 82 JackThread fThread; // Thread to execute the event loop 83 char fServerName[JACK_SERVER_NAME_SIZE+1]; 84 85 std::list<JackClientPipeThread*> fClientList; 86 87 void ClientAdd(JackWinNamedPipeClient* pipe); 88 89 bool ClientListen(); 90 bool ClientAccept(); 91 92 public: 93 94 JackWinNamedPipeServerChannel(); 95 ~JackWinNamedPipeServerChannel(); 96 97 int Open(const char* server_name, JackServer* server); // Open the Server/Client connection 98 void Close(); // Close the Server/Client connection 99 100 int Start(); 101 void Stop(); 102 103 // JackRunnableInterface interface 104 bool Init(); 105 bool Execute(); 106 }; 107 108 109 } // end of namespace 110 111 #endif 112 113