AxWin - General cleaning
[tpg/acess2.git] / Usermode / Applications / axwin2_src / WM / messages.c
index 92137f0..af7c819 100644 (file)
@@ -4,21 +4,63 @@
  */
 #include "common.h"
 #include <acess/sys.h>
-#include <axwin/messages.h>
+#include <net.h>
+#include <axwin2/messages.h>
+//#include <sys/select.h>
+
+#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,13 +92,14 @@ 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)
        {
@@ -67,12 +110,12 @@ void Messages_Handle(tAxWin_Message *Msg, tMessages_Handle_Callback *Respond, in
                Msg->Data[0] = 0;
                Msg->Data[1] = 1;
                *(uint16_t*)&Msg->Data[2] = -1;
-               Messages_RespondIPC(ID, sizeof(Msg->ID), Msg);
+               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;
        }
 }

UCC git Repository :: git.ucc.asn.au