21 #include "JackWinNamedPipeServerChannel.h"
22 #include "JackNotification.h"
23 #include "JackRequest.h"
24 #include "JackServer.h"
25 #include "JackLockedEngine.h"
26 #include "JackGlobals.h"
27 #include "JackClient.h"
28 #include "JackNotification.h"
29 #include "JackException.h"
37 HANDLE JackClientPipeThread::fMutex = NULL;
41 JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe)
42 :fPipe(pipe), fDecoder(NULL), fServer(NULL), fThread(this), fRefNum(0)
46 fMutex = CreateMutex(NULL, FALSE, NULL);
50 JackClientPipeThread::~JackClientPipeThread()
52 jack_log(
"JackClientPipeThread::~JackClientPipeThread");
56 int JackClientPipeThread::Open(JackServer* server)
59 if (fThread.Start() != 0) {
60 jack_error(
"Cannot start Jack server listener\n");
63 fDecoder =
new JackRequestDecoder(server,
this);
69 void JackClientPipeThread::Close()
71 jack_log(
"JackClientPipeThread::Close 0 %x %ld",
this, fRefNum);
81 bool JackClientPipeThread::Execute()
85 jack_log(
"JackClientPipeThread::Execute %x",
this);
87 int res = header.Read(fPipe);
91 if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) {
92 jack_error(
"JackClientPipeThread::Execute : mutex wait error");
97 jack_log(
"JackClientPipeThread::Execute : cannot decode header");
101 }
else if (fDecoder->HandleRequest(fPipe, header.fType) < 0) {
106 if (!ReleaseMutex(fMutex)) {
107 jack_error(
"JackClientPipeThread::Execute : mutex release error");
111 }
catch (JackQuitException& e) {
112 jack_log(
"JackClientPipeThread::Execute : JackQuitException");
117 void JackClientPipeThread::ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res)
119 jack_log(
"JackClientPipeThread::ClientAdd %x %s",
this, req->fName);
121 res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &fRefNum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph);
124 void JackClientPipeThread::ClientRemove(detail::JackChannelTransactionInterface* socket_aux,
int refnum)
126 jack_log(
"JackClientPipeThread::ClientRemove ref = %d", refnum);
130 void JackClientPipeThread::ClientKill()
132 jack_log(
"JackClientPipeThread::ClientKill ref = %d", fRefNum);
135 jack_log(
"Kill a closed client %x",
this);
136 }
else if (fRefNum == 0) {
137 jack_log(
"Kill a not opened client %x",
this);
139 fServer->ClientKill(fRefNum);
145 JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel():fThread(this)
148 JackWinNamedPipeServerChannel::~JackWinNamedPipeServerChannel()
150 std::list<JackClientPipeThread*>::iterator it;
152 for (it = fClientList.begin(); it != fClientList.end(); it++) {
153 JackClientPipeThread* client = *it;
159 int JackWinNamedPipeServerChannel::Open(
const char* server_name, JackServer* server)
161 jack_log(
"JackWinNamedPipeServerChannel::Open");
162 snprintf(fServerName,
sizeof(fServerName), server_name);
165 if (ClientListen()) {
169 jack_error(
"JackWinNamedPipeServerChannel::Open : cannot create result listen pipe");
174 void JackWinNamedPipeServerChannel::Close()
184 fRequestListenPipe.Close();
187 int JackWinNamedPipeServerChannel::Start()
189 if (fThread.Start() != 0) {
190 jack_error(
"Cannot start Jack server listener");
197 void JackWinNamedPipeServerChannel::Stop()
204 jack_log(
"JackWinNamedPipeServerChannel::Init");
206 return ClientAccept();
209 bool JackWinNamedPipeServerChannel::ClientListen()
211 if (fRequestListenPipe.Bind(jack_server_dir, fServerName, 0) < 0) {
212 jack_error(
"JackWinNamedPipeServerChannel::ClientListen : cannot create result listen pipe");
219 bool JackWinNamedPipeServerChannel::ClientAccept()
221 JackWinNamedPipeClient* pipe;
223 if ((pipe = fRequestListenPipe.AcceptClient()) == NULL) {
224 jack_error(
"JackWinNamedPipeServerChannel::ClientAccept : cannot connect pipe");
232 bool JackWinNamedPipeServerChannel::Execute()
234 if (!ClientListen()) {
238 return ClientAccept();
241 void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe)
244 std::list<JackClientPipeThread*>::iterator it = fClientList.begin();
245 JackClientPipeThread* client;
247 jack_log(
"JackWinNamedPipeServerChannel::ClientAdd size %ld", fClientList.size());
249 while (it != fClientList.end()) {
251 if (client->IsRunning()) {
254 it = fClientList.erase(it);
259 client =
new JackClientPipeThread(pipe);
260 client->Open(fServer);
263 fClientList.push_back(client);
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)