00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackRequestDecoder.h"
00021 #include "JackServer.h"
00022 #include "JackLockedEngine.h"
00023 #include "JackChannel.h"
00024
00025 #include <assert.h>
00026 #include <signal.h>
00027
00028 using namespace std;
00029
00030 namespace Jack
00031 {
00032
00033 #define CheckRead(req, socket) { if (req.Read(socket) < 0) { jack_error("CheckRead error"); return -1; } }
00034 #define CheckWriteName(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.fName); } }
00035 #define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.fRefNum); } }
00036 #define CheckWrite(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error", error); } }
00037
00038 JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler)
00039 :fServer(server), fHandler(handler)
00040 {}
00041
00042 JackRequestDecoder::~JackRequestDecoder()
00043 {}
00044
00045 int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* socket, int type_aux)
00046 {
00047 JackRequest::RequestType type = (JackRequest::RequestType)type_aux;
00048
00049
00050 switch (type) {
00051
00052 case JackRequest::kClientCheck: {
00053 jack_log("JackRequest::ClientCheck");
00054 JackClientCheckRequest req;
00055 JackClientCheckResult res;
00056 CheckRead(req, socket);
00057 res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus);
00058 CheckWriteName("JackRequest::ClientCheck", socket);
00059
00060 if (req.fOpen) {
00061 JackRequest header;
00062 header.Read(socket);
00063 return HandleRequest(socket, header.fType);
00064 }
00065 break;
00066 }
00067
00068 case JackRequest::kClientOpen: {
00069 jack_log("JackRequest::ClientOpen");
00070 JackClientOpenRequest req;
00071 JackClientOpenResult res;
00072 CheckRead(req, socket);
00073 fHandler->ClientAdd(socket, &req, &res);
00074 CheckWriteName("JackRequest::ClientOpen", socket);
00075 break;
00076 }
00077
00078 case JackRequest::kClientClose: {
00079 jack_log("JackRequest::ClientClose");
00080 JackClientCloseRequest req;
00081 JackResult res;
00082 CheckRead(req, socket);
00083 res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum);
00084 CheckWriteRefNum("JackRequest::ClientClose", socket);
00085 fHandler->ClientRemove(socket, req.fRefNum);
00086
00087 return -1;
00088 }
00089
00090 case JackRequest::kActivateClient: {
00091 JackActivateRequest req;
00092 JackResult res;
00093 jack_log("JackRequest::ActivateClient");
00094 CheckRead(req, socket);
00095 res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime);
00096 CheckWriteRefNum("JackRequest::ActivateClient", socket);
00097 break;
00098 }
00099
00100 case JackRequest::kDeactivateClient: {
00101 jack_log("JackRequest::DeactivateClient");
00102 JackDeactivateRequest req;
00103 JackResult res;
00104 CheckRead(req, socket);
00105 res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum);
00106 CheckWriteRefNum("JackRequest::DeactivateClient", socket);
00107 break;
00108 }
00109
00110 case JackRequest::kRegisterPort: {
00111 jack_log("JackRequest::RegisterPort");
00112 JackPortRegisterRequest req;
00113 JackPortRegisterResult res;
00114 CheckRead(req, socket);
00115 res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex);
00116 CheckWriteRefNum("JackRequest::RegisterPort", socket);
00117 break;
00118 }
00119
00120 case JackRequest::kUnRegisterPort: {
00121 jack_log("JackRequest::UnRegisterPort");
00122 JackPortUnRegisterRequest req;
00123 JackResult res;
00124 CheckRead(req, socket);
00125 res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
00126 CheckWriteRefNum("JackRequest::UnRegisterPort", socket);
00127 break;
00128 }
00129
00130 case JackRequest::kConnectNamePorts: {
00131 jack_log("JackRequest::ConnectNamePorts");
00132 JackPortConnectNameRequest req;
00133 JackResult res;
00134 CheckRead(req, socket);
00135 res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
00136 CheckWriteRefNum("JackRequest::ConnectNamePorts", socket);
00137 break;
00138 }
00139
00140 case JackRequest::kDisconnectNamePorts: {
00141 jack_log("JackRequest::DisconnectNamePorts");
00142 JackPortDisconnectNameRequest req;
00143 JackResult res;
00144 CheckRead(req, socket);
00145 res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
00146 CheckWriteRefNum("JackRequest::DisconnectNamePorts", socket);
00147 break;
00148 }
00149
00150 case JackRequest::kConnectPorts: {
00151 jack_log("JackRequest::ConnectPorts");
00152 JackPortConnectRequest req;
00153 JackResult res;
00154 CheckRead(req, socket);
00155 res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
00156 CheckWriteRefNum("JackRequest::ConnectPorts", socket);
00157 break;
00158 }
00159
00160 case JackRequest::kDisconnectPorts: {
00161 jack_log("JackRequest::DisconnectPorts");
00162 JackPortDisconnectRequest req;
00163 JackResult res;
00164 CheckRead(req, socket);
00165 res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
00166 CheckWriteRefNum("JackRequest::DisconnectPorts", socket);
00167 break;
00168 }
00169
00170 case JackRequest::kPortRename: {
00171 jack_log("JackRequest::PortRename");
00172 JackPortRenameRequest req;
00173 JackResult res;
00174 CheckRead(req, socket);
00175 res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName);
00176 CheckWriteRefNum("JackRequest::PortRename", socket);
00177 break;
00178 }
00179
00180 case JackRequest::kSetBufferSize: {
00181 jack_log("JackRequest::SetBufferSize");
00182 JackSetBufferSizeRequest req;
00183 JackResult res;
00184 CheckRead(req, socket);
00185 res.fResult = fServer->SetBufferSize(req.fBufferSize);
00186 CheckWrite("JackRequest::SetBufferSize", socket);
00187 break;
00188 }
00189
00190 case JackRequest::kSetFreeWheel: {
00191 jack_log("JackRequest::SetFreeWheel");
00192 JackSetFreeWheelRequest req;
00193 JackResult res;
00194 CheckRead(req, socket);
00195 res.fResult = fServer->SetFreewheel(req.fOnOff);
00196 CheckWrite("JackRequest::SetFreeWheel", socket);
00197 break;
00198 }
00199
00200 case JackRequest::kComputeTotalLatencies: {
00201 jack_log("JackRequest::ComputeTotalLatencies");
00202 JackComputeTotalLatenciesRequest req;
00203 JackResult res;
00204 CheckRead(req, socket);
00205 res.fResult = fServer->GetEngine()->ComputeTotalLatencies();
00206 CheckWrite("JackRequest::ComputeTotalLatencies", socket);
00207 break;
00208 }
00209
00210 case JackRequest::kReleaseTimebase: {
00211 jack_log("JackRequest::ReleaseTimebase");
00212 JackReleaseTimebaseRequest req;
00213 JackResult res;
00214 CheckRead(req, socket);
00215 res.fResult = fServer->ReleaseTimebase(req.fRefNum);
00216 CheckWriteRefNum("JackRequest::ReleaseTimebase", socket);
00217 break;
00218 }
00219
00220 case JackRequest::kSetTimebaseCallback: {
00221 jack_log("JackRequest::SetTimebaseCallback");
00222 JackSetTimebaseCallbackRequest req;
00223 JackResult res;
00224 CheckRead(req, socket);
00225 res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
00226 CheckWriteRefNum("JackRequest::SetTimebaseCallback", socket);
00227 break;
00228 }
00229
00230 case JackRequest::kGetInternalClientName: {
00231 jack_log("JackRequest::GetInternalClientName");
00232 JackGetInternalClientNameRequest req;
00233 JackGetInternalClientNameResult res;
00234 CheckRead(req, socket);
00235 res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName);
00236 CheckWriteRefNum("JackRequest::GetInternalClientName", socket);
00237 break;
00238 }
00239
00240 case JackRequest::kInternalClientHandle: {
00241 jack_log("JackRequest::InternalClientHandle");
00242 JackInternalClientHandleRequest req;
00243 JackInternalClientHandleResult res;
00244 CheckRead(req, socket);
00245 res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum);
00246 CheckWriteRefNum("JackRequest::InternalClientHandle", socket);
00247 break;
00248 }
00249
00250 case JackRequest::kInternalClientLoad: {
00251 jack_log("JackRequest::InternalClientLoad");
00252 JackInternalClientLoadRequest req;
00253 JackInternalClientLoadResult res;
00254 CheckRead(req, socket);
00255 res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus);
00256 CheckWriteName("JackRequest::InternalClientLoad", socket);
00257 break;
00258 }
00259
00260 case JackRequest::kInternalClientUnload: {
00261 jack_log("JackRequest::InternalClientUnload");
00262 JackInternalClientUnloadRequest req;
00263 JackInternalClientUnloadResult res;
00264 CheckRead(req, socket);
00265 res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus);
00266 CheckWriteRefNum("JackRequest::InternalClientUnload", socket);
00267 break;
00268 }
00269
00270 case JackRequest::kNotification: {
00271 jack_log("JackRequest::Notification");
00272 JackClientNotificationRequest req;
00273 CheckRead(req, socket);
00274 if (req.fNotify == kQUIT) {
00275 jack_log("JackRequest::Notification kQUIT");
00276 throw JackQuitException();
00277 } else {
00278 fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
00279 }
00280 break;
00281 }
00282
00283 case JackRequest::kSessionNotify: {
00284 jack_log("JackRequest::SessionNotify");
00285 JackSessionNotifyRequest req;
00286 CheckRead(req, socket);
00287 fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL);
00288 break;
00289 }
00290
00291 case JackRequest::kSessionReply: {
00292 jack_log("JackRequest::SessionReply");
00293 JackSessionReplyRequest req;
00294 JackResult res;
00295 CheckRead(req, socket);
00296 res.fResult = fServer->GetEngine()->SessionReply(req.fRefNum);
00297 CheckWrite("JackRequest::SessionReply", socket);
00298 break;
00299 }
00300
00301 case JackRequest::kGetClientByUUID: {
00302 jack_log("JackRequest::GetClientByUUID");
00303 JackGetClientNameRequest req;
00304 JackClientNameResult res;
00305 CheckRead(req, socket);
00306 res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName);
00307 CheckWrite("JackRequest::GetClientByUUID", socket);
00308 break;
00309 }
00310
00311 case JackRequest::kGetUUIDByClient: {
00312 jack_log("JackRequest::GetUUIDByClient");
00313 JackGetUUIDRequest req;
00314 JackUUIDResult res;
00315 CheckRead(req, socket);
00316 res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID);
00317 CheckWrite("JackRequest::GetUUIDByClient", socket);
00318 break;
00319 }
00320
00321 case JackRequest::kReserveClientName: {
00322 jack_log("JackRequest::ReserveClientName");
00323 JackReserveNameRequest req;
00324 JackResult res;
00325 CheckRead(req, socket);
00326 res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID);
00327 CheckWrite("JackRequest::ReserveClientName", socket);
00328 break;
00329 }
00330
00331 case JackRequest::kClientHasSessionCallback: {
00332 jack_log("JackRequest::ClientHasSessionCallback");
00333 JackClientHasSessionCallbackRequest req;
00334 JackResult res;
00335 CheckRead(req, socket);
00336 res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName);
00337 CheckWrite("JackRequest::ClientHasSessionCallback", socket);
00338 break;
00339 }
00340
00341 default:
00342 jack_error("Unknown request %ld", type);
00343 return -1;
00344 }
00345
00346 return 0;
00347 }
00348
00349 }
00350
00351