X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin2_src%2FWM%2Fmessages.c;h=af7c81944d3dd1fcd6dff6a684f6d91f6294b86f;hb=b32d0aff4c3ed251970a2244d5ead84cd86d50cd;hp=01bd07c4ff5c0e62a7ed2a10b8a3526a64dd2900;hpb=d55488f17f9fbd25d9126853720e2fd78bd8540f;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin2_src/WM/messages.c b/Usermode/Applications/axwin2_src/WM/messages.c index 01bd07c4..af7c8194 100644 --- a/Usermode/Applications/axwin2_src/WM/messages.c +++ b/Usermode/Applications/axwin2_src/WM/messages.c @@ -4,21 +4,63 @@ */ #include "common.h" #include -#include +#include +#include +//#include + +#define AXWIN_PORT 4101 #define STATICBUF_SIZE 64 // === TYPES === -typedef void tMessages_Handle_Callback(int, size_t,void*); +typedef void tMessages_Handle_Callback(void*, size_t, void*); // === PROTOTYPES === void Messages_PollIPC(); -void Messages_RespondIPC(int ID, size_t Length, void *Data); -void Messages_Handle(tAxWin_Message *Msg, tMessages_Handle_Callback *Respond, int ID); +void Messages_RespondIPC(void *Ident, size_t Length, void *Data); +void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond); // === GLOBALS === + int giNetworkFileHandle = -1; + int giMessagesFileHandle = -1; // === CODE === +void IPC_Init(void) +{ + int tmp; + // TODO: Check this + giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ); + tmp = AXWIN_PORT; ioctl(giIPCFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number + + // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages +// giMessagesFileHandle = open("/Devices/" +} + +void IPC_FillSelect(int *nfds, fd_set *set) +{ + if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle; + FD_SET(giNetworkFileHandle, set); +} + +void IPC_HandleSelect(fd_set *set) +{ + if( FD_ISSET(giIPCFileHandle, set) ) + { + char staticBuf[STATICBUF_SIZE]; + int readlen, identlen; + char *msg; + + readlen = read(giIPCFileHandle, sizeof(staticBuf), staticBuf); + + // Assume that all connections are from localhost + identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); + msg = staticBuf + identlen; + + Messages_Handle(staticBuf, readlen - identlen, (void*)msg, Messages_RespondIPC); + } +} + +#if 0 void Messages_PollIPC() { int len; @@ -50,27 +92,30 @@ void Messages_PollIPC() Messages_Handle(msg, Messages_RespondIPC, tid); } +#endif -void Messages_RespondIPC(int ID, size_t Length, void *Data) +void Messages_RespondIPC(void *Ident, size_t Length, void *Data) { - SysSendMessage(ID, Length, Data); + SysSendMessage( *(tid_t*)Ident, Length, Data ); } -void Messages_Handle(tAxWin_Message *Msg, tMessages_Handle_Callback *Respond, int ID) +void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond) { switch(Msg->ID) { + #if 0 case MSG_SREQ_PING: - Msg->ID = MSG_SRSP_PONG; + Msg->ID = MSG_SRSP_VERSION; Msg->Size = 2; - Msg->SRsp_Pong.Major = 0; - Msg->SRsp_Pong.Minor = 1; - Msg->SRsp_Pong.Build = -1; - Messages_RespondIPC(ID, sizeof(Msg->ID), Msg); + Msg->Data[0] = 0; + Msg->Data[1] = 1; + *(uint16_t*)&Msg->Data[2] = -1; + Respond(Ident, sizeof(Msg->ID), Msg); break; + #endif default: - fprintf(stderr, "WARNING: Unknown message %i from %i (%p)\n", Msg->ID, ID, Respond); - _SysDebug("WARNING: Unknown message %i from %i (%p)\n", Msg->ID, ID, Respond); + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); + _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); break; } }