2 Copyright (C) 2004-2008 Grame
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.
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.
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.
21 #include "JackWinNamedPipeClientChannel.h"
22 #include "JackRequest.h"
23 #include "JackClient.h"
24 #include "JackGlobals.h"
25 #include "JackError.h"
30 JackWinNamedPipeClientChannel::JackWinNamedPipeClientChannel()
31 :JackGenericClientChannel(),fThread(this)
33 fRequest
= new JackWinNamedPipeClient();
36 JackWinNamedPipeClientChannel::~JackWinNamedPipeClientChannel()
41 int JackWinNamedPipeClientChannel::Open(const char* server_name
, const char* name
, jack_uuid_t uuid
, char* name_res
, JackClient
* client
, jack_options_t options
, jack_status_t
* status
)
44 jack_log("JackWinNamedPipeClientChannel::Open name = %s", name
);
47 16/08/07: was called before doing "fRequest->Connect" .... still necessary?
48 if (fNotificationListenPipe.Bind(jack_client_dir, name, 0) < 0) {
49 jack_error("Cannot bind pipe");
54 // Before any server/client call
57 if (fRequest
->Connect(jack_server_dir
, server_name
, 0) < 0) {
58 jack_error("Cannot connect to server pipe");
62 // OK so server is there...
63 JackGlobals::fServerRunning
= true;
65 // Check name in server
66 ClientCheck(name
, uuid
, name_res
, JACK_PROTOCOL_VERSION
, (int)options
, (int*)status
, &result
, true);
68 int status1
= *status
;
69 if (status1
& JackVersionError
) {
70 jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION
);
72 jack_error("Client name = %s conflits with another running client", name
);
76 if (fNotificationListenPipe
.Bind(jack_client_dir
, name_res
, 0) < 0) {
77 jack_error("Cannot bind pipe");
85 fNotificationListenPipe
.Close();
89 void JackWinNamedPipeClientChannel::Close()
92 fNotificationListenPipe
.Close();
93 // Here the thread will correctly stop when the pipe are closed
97 int JackWinNamedPipeClientChannel::Start()
99 jack_log("JackWinNamedPipeClientChannel::Start");
101 To be sure notification thread is started before ClientOpen is called.
103 if (fThread
.StartSync() != 0) {
104 jack_error("Cannot start Jack client listener");
111 void JackWinNamedPipeClientChannel::Stop()
113 jack_log("JackWinNamedPipeClientChannel::Stop");
114 fThread
.Kill(); // Unsafe on WIN32... TODO : solve WIN32 thread Kill issue
117 bool JackWinNamedPipeClientChannel::Init()
119 jack_log("JackWinNamedPipeClientChannel::Init");
122 if (!jack_tls_set(JackGlobals::fNotificationThread
, this)) {
123 jack_error("Failed to set thread notification key");
126 if (!fNotificationListenPipe
.Accept()) {
127 jack_error("JackWinNamedPipeClientChannel: cannot establish notification pipe");
134 bool JackWinNamedPipeClientChannel::Execute()
136 JackClientNotification event
;
139 if (event
.Read(&fNotificationListenPipe
) < 0) {
140 jack_error("JackWinNamedPipeClientChannel read fail");
144 res
.fResult
= fClient
->ClientNotify(event
.fRefNum
, event
.fName
, event
.fNotify
, event
.fSync
, event
.fMessage
, event
.fValue1
, event
.fValue2
);
147 if (res
.Write(&fNotificationListenPipe
) < 0) {
148 jack_error("JackWinNamedPipeClientChannel write fail");
155 // Close the pipes, server won't be able to create them otherwise.
156 fNotificationListenPipe
.Close();
158 fClient
->ShutDown(jack_status_t(JackFailure
| JackServerError
), JACK_SERVER_FAILURE
);
162 } // end of namespace