20 #include "JackRequestDecoder.h"    21 #include "JackServer.h"    22 #include "JackLockedEngine.h"    23 #include "JackChannel.h"    33 #define CheckRead(req, socket)          { if (req.Read(socket) <  0) { jack_error("CheckRead error"); return -1; } }    34 #define CheckWriteName(error, socket)   { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.fName); } }    35 #define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.fRefNum); } }    36 #define CheckWrite(error, socket)       { if (res.Write(socket) < 0) { jack_error("%s write error", error); } }    38 JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler)
    39     :fServer(server), fHandler(handler)
    42 JackRequestDecoder::~JackRequestDecoder()
    45 int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* socket, 
int type_aux)
    47     JackRequest::RequestType type = (JackRequest::RequestType)type_aux;
    52         case JackRequest::kClientCheck: {
    53             jack_log(
"JackRequest::ClientCheck");
    54             JackClientCheckRequest req;
    55             JackClientCheckResult res;
    56             CheckRead(req, socket);
    57             res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus);
    58             CheckWriteName(
"JackRequest::ClientCheck", socket);
    63                 return HandleRequest(socket, header.fType);
    68         case JackRequest::kClientOpen: {
    70             JackClientOpenRequest req;
    71             JackClientOpenResult res;
    72             CheckRead(req, socket);
    73             fHandler->ClientAdd(socket, &req, &res);
    74             CheckWriteName(
"JackRequest::ClientOpen", socket);
    78         case JackRequest::kClientClose: {
    79             jack_log(
"JackRequest::ClientClose");
    80             JackClientCloseRequest req;
    82             CheckRead(req, socket);
    83             res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum);
    84             CheckWriteRefNum(
"JackRequest::ClientClose", socket);
    85             fHandler->ClientRemove(socket, req.fRefNum);
    90         case JackRequest::kActivateClient: {
    91             JackActivateRequest req;
    93             jack_log(
"JackRequest::ActivateClient");
    94             CheckRead(req, socket);
    95             res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime);
    96             CheckWriteRefNum(
"JackRequest::ActivateClient", socket);
   100         case JackRequest::kDeactivateClient: {
   101             jack_log(
"JackRequest::DeactivateClient");
   102             JackDeactivateRequest req;
   104             CheckRead(req, socket);
   105             res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum);
   106             CheckWriteRefNum(
"JackRequest::DeactivateClient", socket);
   110         case JackRequest::kRegisterPort: {
   111             jack_log(
"JackRequest::RegisterPort");
   112             JackPortRegisterRequest req;
   113             JackPortRegisterResult res;
   114             CheckRead(req, socket);
   115             res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex);
   116             CheckWriteRefNum(
"JackRequest::RegisterPort", socket);
   120         case JackRequest::kUnRegisterPort: {
   121             jack_log(
"JackRequest::UnRegisterPort");
   122             JackPortUnRegisterRequest req;
   124             CheckRead(req, socket);
   125             res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
   126             CheckWriteRefNum(
"JackRequest::UnRegisterPort", socket);
   130         case JackRequest::kConnectNamePorts: {
   131             jack_log(
"JackRequest::ConnectNamePorts");
   132             JackPortConnectNameRequest req;
   134             CheckRead(req, socket);
   135             res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
   136             CheckWriteRefNum(
"JackRequest::ConnectNamePorts", socket);
   140         case JackRequest::kDisconnectNamePorts: {
   141             jack_log(
"JackRequest::DisconnectNamePorts");
   142             JackPortDisconnectNameRequest req;
   144             CheckRead(req, socket);
   145             res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
   146             CheckWriteRefNum(
"JackRequest::DisconnectNamePorts", socket);
   150         case JackRequest::kConnectPorts: {
   151             jack_log(
"JackRequest::ConnectPorts");
   152             JackPortConnectRequest req;
   154             CheckRead(req, socket);
   155             res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
   156             CheckWriteRefNum(
"JackRequest::ConnectPorts", socket);
   160         case JackRequest::kDisconnectPorts: {
   161             jack_log(
"JackRequest::DisconnectPorts");
   162             JackPortDisconnectRequest req;
   164             CheckRead(req, socket);
   165             res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
   166             CheckWriteRefNum(
"JackRequest::DisconnectPorts", socket);
   170         case JackRequest::kPortRename: {
   171             jack_log(
"JackRequest::PortRename");
   172             JackPortRenameRequest req;
   174             CheckRead(req, socket);
   175             res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName);
   176             CheckWriteRefNum(
"JackRequest::PortRename", socket);
   180         case JackRequest::kSetBufferSize: {
   181             jack_log(
"JackRequest::SetBufferSize");
   182             JackSetBufferSizeRequest req;
   184             CheckRead(req, socket);
   185             res.fResult = fServer->SetBufferSize(req.fBufferSize);
   186             CheckWrite(
"JackRequest::SetBufferSize", socket);
   190         case JackRequest::kSetFreeWheel: {
   191             jack_log(
"JackRequest::SetFreeWheel");
   192             JackSetFreeWheelRequest req;
   194             CheckRead(req, socket);
   195             res.fResult = fServer->SetFreewheel(req.fOnOff);
   196             CheckWrite(
"JackRequest::SetFreeWheel", socket);
   200          case JackRequest::kComputeTotalLatencies: {
   201             jack_log(
"JackRequest::ComputeTotalLatencies");
   202             JackComputeTotalLatenciesRequest req;
   204             CheckRead(req, socket);
   205             res.fResult = fServer->GetEngine()->ComputeTotalLatencies();
   206             CheckWrite(
"JackRequest::ComputeTotalLatencies", socket);
   210         case JackRequest::kReleaseTimebase: {
   211             jack_log(
"JackRequest::ReleaseTimebase");
   212             JackReleaseTimebaseRequest req;
   214             CheckRead(req, socket);
   215             res.fResult = fServer->ReleaseTimebase(req.fRefNum);
   216             CheckWriteRefNum(
"JackRequest::ReleaseTimebase", socket);
   220         case JackRequest::kSetTimebaseCallback: {
   221             jack_log(
"JackRequest::SetTimebaseCallback");
   222             JackSetTimebaseCallbackRequest req;
   224             CheckRead(req, socket);
   225             res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
   226             CheckWriteRefNum(
"JackRequest::SetTimebaseCallback", socket);
   230         case JackRequest::kGetInternalClientName: {
   231             jack_log(
"JackRequest::GetInternalClientName");
   232             JackGetInternalClientNameRequest req;
   233             JackGetInternalClientNameResult res;
   234             CheckRead(req, socket);
   235             res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName);
   236             CheckWriteRefNum(
"JackRequest::GetInternalClientName", socket);
   240         case JackRequest::kInternalClientHandle: {
   241             jack_log(
"JackRequest::InternalClientHandle");
   242             JackInternalClientHandleRequest req;
   243             JackInternalClientHandleResult res;
   244             CheckRead(req, socket);
   245             res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum);
   246             CheckWriteRefNum(
"JackRequest::InternalClientHandle", socket);
   250         case JackRequest::kInternalClientLoad: {
   251             jack_log(
"JackRequest::InternalClientLoad");
   252             JackInternalClientLoadRequest req;
   253             JackInternalClientLoadResult res;
   254             CheckRead(req, socket);
   255             res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus);
   256             CheckWriteName(
"JackRequest::InternalClientLoad", socket);
   260         case JackRequest::kInternalClientUnload: {
   261             jack_log(
"JackRequest::InternalClientUnload");
   262             JackInternalClientUnloadRequest req;
   263             JackInternalClientUnloadResult res;
   264             CheckRead(req, socket);
   265             res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus);
   266             CheckWriteRefNum(
"JackRequest::InternalClientUnload", socket);
   270         case JackRequest::kNotification: {
   271             jack_log(
"JackRequest::Notification");
   272             JackClientNotificationRequest req;
   273             CheckRead(req, socket);
   274             if (req.fNotify == kQUIT) {
   275                 jack_log(
"JackRequest::Notification kQUIT");
   276                 throw JackQuitException();
   278                 fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
   283         case JackRequest::kSessionNotify: {
   284             jack_log(
"JackRequest::SessionNotify");
   285             JackSessionNotifyRequest req;
   286             CheckRead(req, socket);
   287             fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL);
   291         case JackRequest::kSessionReply: {
   292             jack_log(
"JackRequest::SessionReply");
   293             JackSessionReplyRequest req;
   295             CheckRead(req, socket);
   296             res.fResult = fServer->GetEngine()->SessionReply(req.fRefNum);
   297             CheckWrite(
"JackRequest::SessionReply", socket);
   301         case JackRequest::kGetClientByUUID: {
   302             jack_log(
"JackRequest::GetClientByUUID");
   303             JackGetClientNameRequest req;
   304             JackClientNameResult res;
   305             CheckRead(req, socket);
   306             res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName);
   307             CheckWrite(
"JackRequest::GetClientByUUID", socket);
   311         case JackRequest::kGetUUIDByClient: {
   312             jack_log(
"JackRequest::GetUUIDByClient");
   313             JackGetUUIDRequest req;
   315             CheckRead(req, socket);
   316             res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID);
   317             CheckWrite(
"JackRequest::GetUUIDByClient", socket);
   321         case JackRequest::kReserveClientName: {
   322             jack_log(
"JackRequest::ReserveClientName");
   323             JackReserveNameRequest req;
   325             CheckRead(req, socket);
   326             res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID);
   327             CheckWrite(
"JackRequest::ReserveClientName", socket);
   331         case JackRequest::kClientHasSessionCallback: {
   332             jack_log(
"JackRequest::ClientHasSessionCallback");
   333             JackClientHasSessionCallbackRequest req;
   335             CheckRead(req, socket);
   336             res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName);
   337             CheckWrite(
"JackRequest::ClientHasSessionCallback", socket);
 
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)