14718abef20fb947333903838d612243002dce40
[tpg/acess2.git] / Usermode / Applications / axwin2_src / WM / messages.c
1 /*
2  * Acess GUI (AxWin) Version 2
3  * By John Hodge (thePowersGang)
4  */
5 #include "common.h"
6 #include <acess/sys.h>
7 #include <net.h>
8 #include <axwin2/messages.h>
9 #include <string.h>
10
11 #define AXWIN_PORT      4101
12
13 #define STATICBUF_SIZE  64
14
15 // === TYPES ===
16 typedef void tMessages_Handle_Callback(void*, size_t, void*);
17
18 // === PROTOTYPES ===
19 void    IPC_Init(void);
20 void    IPC_FillSelect(int *nfds, fd_set *set);
21 void    IPC_HandleSelect(fd_set *set);
22 void    Messages_RespondDatagram(void *Ident, size_t Length, void *Data);
23 void    Messages_RespondIPC(void *Ident, size_t Length, void *Data);
24 void    Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond);
25
26 // === GLOBALS ===
27  int    giNetworkFileHandle = -1;
28  int    giMessagesFileHandle = -1;
29
30 // === CODE ===
31 void IPC_Init(void)
32 {
33          int    tmp;
34         // TODO: Check this
35         giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
36         tmp = AXWIN_PORT;       ioctl(giNetworkFileHandle, 4, &tmp);    // TODO: Don't hard-code IOCtl number
37
38         // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages
39 //      giMessagesFileHandle = open("/Devices/"
40 }
41
42 void IPC_FillSelect(int *nfds, fd_set *set)
43 {
44         if( giNetworkFileHandle > *nfds )       *nfds = giNetworkFileHandle;
45         FD_SET(giNetworkFileHandle, set);
46 }
47
48 void IPC_HandleSelect(fd_set *set)
49 {
50         if( FD_ISSET(giNetworkFileHandle, set) )
51         {
52                 char    staticBuf[STATICBUF_SIZE];
53                  int    readlen, identlen;
54                 char    *msg;
55
56                 readlen = read(giNetworkFileHandle, sizeof(staticBuf), staticBuf);
57                 
58                 // Assume that all connections are from localhost
59                 identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] );
60                 msg = staticBuf + identlen;
61
62                 Messages_Handle(staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram);
63         }
64
65         while(SysGetMessage(NULL, NULL))
66         {
67                 pid_t   tid;
68                  int    len = SysGetMessage(&tid, NULL);
69                 char    data[len];
70                 SysGetMessage(NULL, data);
71
72                 Messages_Handle(&tid, len, (void*)data, Messages_RespondIPC);
73         }
74 }
75
76 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data)
77 {
78          int    addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] );
79         char    tmpbuf[ 4 + addrSize + Length ];
80         memcpy(tmpbuf, Ident, 4 + addrSize);
81         memcpy(tmpbuf + 4 + addrSize, Data, Length);
82         // TODO: Handle fragmented packets
83         write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf);
84 }
85
86 void Messages_RespondIPC(void *Ident, size_t Length, void *Data)
87 {
88         SysSendMessage( *(tid_t*)Ident, Length, Data );
89 }
90
91 void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond)
92 {
93         switch(Msg->ID)
94         {
95         #if 0
96         case MSG_SREQ_PING:
97                 Msg->ID = MSG_SRSP_VERSION;
98                 Msg->Size = 2;
99                 Msg->Data[0] = 0;
100                 Msg->Data[1] = 1;
101                 *(uint16_t*)&Msg->Data[2] = -1;
102                 Respond(Ident, sizeof(Msg->ID), Msg);
103                 break;
104         #endif
105         default:
106                 fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
107                 _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
108                 break;
109         }
110 }
111

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