X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin2_src%2FWM%2Fmessages.c;h=f876f50509e2dc4f237e7cc81c12707762975eee;hb=b43ed8d15c86ff9b7f5abc9f47e1385503dcdf35;hp=61ffc53042d94b4cb2dee1ae7aeb2ff15fe31a1a;hpb=117854336280cdf3d07143820e4d82d92c570239;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin2_src/WM/messages.c b/Usermode/Applications/axwin2_src/WM/messages.c index 61ffc530..f876f505 100644 --- a/Usermode/Applications/axwin2_src/WM/messages.c +++ b/Usermode/Applications/axwin2_src/WM/messages.c @@ -18,13 +18,27 @@ void IPC_Init(void); void IPC_FillSelect(int *nfds, fd_set *set); void IPC_HandleSelect(fd_set *set); -void Messages_RespondDatagram(void *Ident, size_t Length, void *Data); -void Messages_RespondIPC(void *Ident, size_t Length, void *Data); -void Messages_Handle(size_t IdentLen, void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond); +void IPC_Handle(tIPC_Type *IPCType, void *Ident, size_t MsgLen, tAxWin_Message *Msg); + int IPC_Type_Datagram_GetSize(void *Ident); + int IPC_Type_Datagram_Compare(void *Ident1, void *Ident2); +void IPC_Type_Datagram_Send(void *Ident, size_t Length, void *Data); + int IPC_Type_Sys_GetSize(void *Ident); + int IPC_Type_Sys_Compare(void *Ident1, void *Ident2); +void IPC_Type_Sys_Send(void *Ident, size_t Length, void *Data); // === GLOBALS === int giNetworkFileHandle = -1; int giMessagesFileHandle = -1; +tIPC_Type gIPC_Type_Datagram = { + IPC_Type_Datagram_GetSize, + IPC_Type_Datagram_Compare, + IPC_Type_Datagram_Send +}; +tIPC_Type gIPC_Type_SysMessage = { + IPC_Type_Sys_GetSize, + IPC_Type_Sys_Compare, + IPC_Type_Sys_Send +}; // === CODE === void IPC_Init(void) @@ -55,7 +69,7 @@ void IPC_HandleSelect(fd_set *set) identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); msg = staticBuf + identlen; - Messages_Handle(identlen, staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram); + IPC_Handle(&gIPC_Type_Datagram, staticBuf, readlen - identlen, (void*)msg); } while(SysGetMessage(NULL, NULL)) @@ -65,34 +79,24 @@ void IPC_HandleSelect(fd_set *set) char data[len]; SysGetMessage(NULL, data); - Messages_Handle(sizeof(tid), &tid, len, (void*)data, Messages_RespondIPC); + IPC_Handle(&gIPC_Type_SysMessage, &tid, len, (void*)data); } } -void Messages_RespondDatagram(void *Ident, size_t Length, void *Data) -{ - int addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] ); - char tmpbuf[ 4 + addrSize + Length ]; - memcpy(tmpbuf, Ident, 4 + addrSize); - memcpy(tmpbuf + 4 + addrSize, Data, Length); - // TODO: Handle fragmented packets - write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf); -} - -void Messages_RespondIPC(void *Ident, size_t Length, void *Data) -{ - SysSendMessage( *(tid_t*)Ident, Length, Data ); -} - -void Messages_Handle(size_t IdentLen, void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond) +void IPC_Handle(tIPC_Type *IPCType, void *Ident, size_t MsgLen, tAxWin_Message *Msg) { + tApplication *app; + if( MsgLen < sizeof(tAxWin_Message) ) return ; if( MsgLen < sizeof(tAxWin_Message) + Msg->Size ) return ; + + app = AxWin_GetClient(IPCType, Ident); - switch(Msg->ID) + switch((enum eAxWin_Messages) Msg->ID) { + // --- Ping message (reset timeout and get server version) case MSG_SREQ_PING: if( MsgLen < sizeof(tAxWin_Message) + 4 ) return; Msg->ID = MSG_SRSP_VERSION; @@ -100,23 +104,77 @@ void Messages_Handle(size_t IdentLen, void *Ident, size_t MsgLen, tAxWin_Message Msg->Data[0] = 0; Msg->Data[1] = 1; *(uint16_t*)&Msg->Data[2] = -1; - Respond(Ident, sizeof(Msg->ID), Msg); + IPCType->SendMessage(Ident, sizeof(Msg->ID), Msg); break; + + // --- Register an application case MSG_SREQ_REGISTER: if( Msg->Data[Msg->Size-1] != '\0' ) { // Invalid message return ; } - AxWin_RegisterClient(IdentLen, Ident, Respond, Msg->Data); - + if( app != NULL ) { + _SysDebug("Notice: Duplicate registration (%s)\n", Msg->Data); + return ; + } + + // TODO: Should this function be implemented here? + AxWin_RegisterClient(IPCType, Ident, Msg->Data); break; - + + // --- Create a window + case MSG_SREQ_ADDWIN: + if( Msg->Data[Msg->Size-1] != '\0' ) { + // Invalid message + return ; + } + + break; + + // --- Unknown message default: - fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); - _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); + _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); break; } } +int IPC_Type_Datagram_GetSize(void *Ident) +{ + return 4 + Net_GetAddressSize( ((uint16_t*)Ident)[1] ); +} + +int IPC_Type_Datagram_Compare(void *Ident1, void *Ident2) +{ + // Pass the buck :) + // - No need to worry about mis-matching sizes, as the size is computed + // from the 3rd/4th bytes, hence it will differ before the size is hit. + return memcmp(Ident1, Ident2, IPC_Type_Datagram_GetSize(Ident1)); +} + +void IPC_Type_Datagram_Send(void *Ident, size_t Length, void *Data) +{ + int identlen = IPC_Type_Datagram_GetSize(Ident); + char tmpbuf[ identlen + Length ]; + memcpy(tmpbuf, Ident, identlen); // Header + memcpy(tmpbuf + identlen, Data, Length); // Data + // TODO: Handle fragmented packets + write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf); +} + +int IPC_Type_Sys_GetSize(void *Ident) +{ + return sizeof(pid_t); +} + +int IPC_Type_Sys_Compare(void *Ident1, void *Ident2) +{ + return *(int*)Ident1 - *(int*)Ident2; +} + +void IPC_Type_Sys_Send(void *Ident, size_t Length, void *Data) +{ + SysSendMessage( *(tid_t*)Ident, Length, Data ); +}