AxWin2 - Huge changes, getting to the working point
[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
17 // === PROTOTYPES ===
18 void    IPC_Init(void);
19 void    IPC_FillSelect(int *nfds, fd_set *set);
20 void    IPC_HandleSelect(fd_set *set);
21 void    Messages_RespondDatagram(void *Ident, size_t Length, void *Data);
22 void    Messages_RespondIPC(void *Ident, size_t Length, void *Data);
23 void    Messages_Handle(void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond);
24
25 // === GLOBALS ===
26  int    giNetworkFileHandle = -1;
27  int    giMessagesFileHandle = -1;
28
29 // === CODE ===
30 void IPC_Init(void)
31 {
32          int    tmp;
33         // TODO: Check this
34         giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
35         tmp = AXWIN_PORT;       ioctl(giNetworkFileHandle, 4, &tmp);    // TODO: Don't hard-code IOCtl number
36
37         // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages
38 //      giMessagesFileHandle = open("/Devices/"
39 }
40
41 void IPC_FillSelect(int *nfds, fd_set *set)
42 {
43         if( giNetworkFileHandle > *nfds )       *nfds = giNetworkFileHandle;
44         FD_SET(giNetworkFileHandle, set);
45 }
46
47 void IPC_HandleSelect(fd_set *set)
48 {
49         if( FD_ISSET(giNetworkFileHandle, set) )
50         {
51                 char    staticBuf[STATICBUF_SIZE];
52                  int    readlen, identlen;
53                 char    *msg;
54
55                 readlen = read(giNetworkFileHandle, sizeof(staticBuf), staticBuf);
56                 
57                 // Assume that all connections are from localhost
58                 identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] );
59                 msg = staticBuf + identlen;
60
61                 Messages_Handle(staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram);
62         }
63
64         while(SysGetMessage(NULL, NULL))
65         {
66                 pid_t   tid;
67                  int    len = SysGetMessage(&tid, NULL);
68                 char    data[len];
69                 SysGetMessage(NULL, data);
70
71                 Messages_Handle(&tid, len, (void*)data, Messages_RespondIPC);
72         }
73 }
74
75 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data)
76 {
77          int    addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] );
78         char    tmpbuf[ 4 + addrSize + Length ];
79         memcpy(tmpbuf, Ident, 4 + addrSize);
80         memcpy(tmpbuf + 4 + addrSize, Data, Length);
81         // TODO: Handle fragmented packets
82         write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf);
83 }
84
85 void Messages_RespondIPC(void *Ident, size_t Length, void *Data)
86 {
87         SysSendMessage( *(tid_t*)Ident, Length, Data );
88 }
89
90 void Messages_Handle(void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond)
91 {
92         if( MsgLen < sizeof(tAxWin_Message) )
93                 return ;
94         if( MsgLen < sizeof(tAxWin_Message) + Msg->Size )
95                 return ;
96
97         switch(Msg->ID)
98         {
99         case MSG_SREQ_PING:
100                 if( MsgLen < sizeof(tAxWin_Message) + 4 )       return;
101                 Msg->ID = MSG_SRSP_VERSION;
102                 Msg->Size = 4;
103                 Msg->Data[0] = 0;
104                 Msg->Data[1] = 1;
105                 *(uint16_t*)&Msg->Data[2] = -1;
106                 Respond(Ident, sizeof(Msg->ID), Msg);
107                 break;
108
109         case MSG_SREQ_REGISTER:
110                 if( Msg->Len == strnlen(Msg->Len, Msg->Data) ) {
111                         // Special handling?
112                         return ;
113                 }
114                 
115                 break;
116
117         default:
118                 fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
119                 _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
120                 break;
121         }
122 }
123

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