X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibaxwin4.so_src%2Fipc.cpp;h=d0455f53a8a673607d2dd42d591defdf85f6d2f7;hb=6a28fd66345b484f9dfa5dba869888becdaf7112;hp=d6df7f86222216edb0173677dccd777da854c07f;hpb=145dd00e5c5a36f844be327e16a00b2983245423;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libaxwin4.so_src/ipc.cpp b/Usermode/Libraries/libaxwin4.so_src/ipc.cpp index d6df7f86..d0455f53 100644 --- a/Usermode/Libraries/libaxwin4.so_src/ipc.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/ipc.cpp @@ -21,6 +21,7 @@ namespace AxWin { IIPCChannel* gIPCChannel; ::std::mutex glSyncReply; +bool gSyncReplyActive; bool gSyncReplyValid; CDeserialiser gSyncReplyBuf; @@ -82,11 +83,25 @@ void SendMessage(CSerialiser& message) void RecvMessage(CDeserialiser& message) { uint8_t id = message.ReadU8(); + _SysDebug("RecvMessage: id=%i", id); switch(id) { + case IPCMSG_PING: + // If we hear ping, we must pong + { + CSerialiser pong; + pong.WriteU8(IPCMSG_REPLY); + pong.WriteU8(IPCMSG_PING); + SendMessage(pong); + } + break; case IPCMSG_REPLY: // Flag reply and take a copy of this message - if( gSyncReplyValid ) + if( !gSyncReplyActive ) + { + _SysDebug("Unexpected reply message %i", message.ReadU8()); + } + else if( gSyncReplyValid ) { // Oh... that was unexpected _SysDebug("Unexpected second reply message %i", message.ReadU8()); @@ -97,6 +112,12 @@ void RecvMessage(CDeserialiser& message) gSyncReplyBuf = message; } break; + // TODO: Handle messages from server (input events, IPC) + // TODO: If an event is currently being processed, save the message in a queue to be handled when processing is complete + // - This will prevent deep recursion (and make server errors aparent) + case IPCMSG_INPUTEVENT: + _SysDebug("TODO: Input events"); + break; default: _SysDebug("TODO: RecvMessage(%i)", id); break; @@ -106,6 +127,7 @@ void RecvMessage(CDeserialiser& message) CDeserialiser GetSyncReply(CSerialiser& request, unsigned int Message) { ::std::lock_guard lock(glSyncReply); + gSyncReplyActive = true; gSyncReplyValid = false; // Send once lock is acquired SendMessage(request); @@ -116,14 +138,18 @@ CDeserialiser GetSyncReply(CSerialiser& request, unsigned int Message) if( !AxWin4_WaitEventQueue(0) ) throw ::std::runtime_error("Connection dropped while waiting for reply"); } + gSyncReplyActive = false; uint8_t id = gSyncReplyBuf.ReadU8(); if( id != Message ) { - _SysDebug("Unexpected reply message '%i', message.ReadU8()"); + _SysDebug("Unexpected reply message id=%i, expected %i", + id, Message); + throw ::std::runtime_error("Sequencing error, unexpected reply"); } - return gSyncReplyBuf; + // Use move to avoid copying + return ::std::move(gSyncReplyBuf); } extern "C" void AxWin4_GetScreenDimensions(unsigned int ScreenIndex, unsigned int *Width, unsigned int *Height)