Add missing methods in JackDebugClient(2).
[jack2.git] / posix / JackSocketClientChannel.cpp
blob08dbaa7632e53a8aef383bcd58f5a887181e25ab
1 /*
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.
20 #include "JackSocketClientChannel.h"
21 #include "JackRequest.h"
22 #include "JackClient.h"
23 #include "JackGlobals.h"
24 #include "JackError.h"
26 namespace Jack
29 JackSocketClientChannel::JackSocketClientChannel()
30 :JackGenericClientChannel(), fThread(this)
32 fRequest = new JackClientSocket();
33 fNotificationSocket = NULL;
36 JackSocketClientChannel::~JackSocketClientChannel()
38 delete fRequest;
39 delete fNotificationSocket;
42 int JackSocketClientChannel::Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status)
44 int result = 0;
45 jack_log("JackSocketClientChannel::Open name = %s", name);
47 if (fRequest->Connect(jack_server_dir, server_name, 0) < 0) {
48 jack_error("Cannot connect to server socket");
49 goto error;
52 // Check name in server
53 ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result, true);
54 if (result < 0) {
55 int status1 = *status;
56 if (status1 & JackVersionError) {
57 jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION);
58 } else {
59 jack_error("Client name = %s conflits with another running client", name);
61 goto error;
64 if (fNotificationListenSocket.Bind(jack_client_dir, name_res, 0) < 0) {
65 jack_error("Cannot bind socket");
66 goto error;
69 fClient = obj;
70 return 0;
72 error:
73 fRequest->Close();
74 fNotificationListenSocket.Close();
75 return -1;
78 void JackSocketClientChannel::Close()
80 fRequest->Close();
81 fNotificationListenSocket.Close();
82 if (fNotificationSocket)
83 fNotificationSocket->Close();
86 int JackSocketClientChannel::Start()
88 jack_log("JackSocketClientChannel::Start");
90 To be sure notification thread is started before ClientOpen is called.
92 if (fThread.StartSync() != 0) {
93 jack_error("Cannot start Jack client listener");
94 return -1;
95 } else {
96 return 0;
100 void JackSocketClientChannel::Stop()
102 jack_log("JackSocketClientChannel::Stop");
103 fThread.Kill();
106 bool JackSocketClientChannel::Init()
108 jack_log("JackSocketClientChannel::Init");
109 fNotificationSocket = fNotificationListenSocket.Accept();
111 // No more needed
112 fNotificationListenSocket.Close();
114 // Setup context
115 if (!jack_tls_set(JackGlobals::fNotificationThread, this)) {
116 jack_error("Failed to set thread notification key");
119 if (!fNotificationSocket) {
120 jack_error("JackSocketClientChannel: cannot establish notication socket");
121 return false;
122 } else {
123 return true;
127 bool JackSocketClientChannel::Execute()
129 JackClientNotification event;
130 JackResult res;
132 if (event.Read(fNotificationSocket) < 0) {
133 jack_error("JackSocketClientChannel read fail");
134 goto error;
137 res.fResult = fClient->ClientNotify(event.fRefNum, event.fName, event.fNotify, event.fSync, event.fMessage, event.fValue1, event.fValue2);
139 if (event.fSync) {
140 if (res.Write(fNotificationSocket) < 0) {
141 jack_error("JackSocketClientChannel write fail");
142 goto error;
145 return true;
147 error:
148 fNotificationSocket->Close();
149 fClient->ShutDown();
150 return false;
153 } // end of namespace