Usermode/AxWin4 - Code now compiling (if STL is present)
[tpg/acess2.git] / Usermode / Applications / axwin4_src / Server / ipc.cpp
1 /*
2  */
3 #include <ipc.hpp>
4 #include <list>
5 #include <IIPCChannel.hpp>
6 #include <algorithm>
7 #include <CClient.hpp>
8 #include <serialisation.hpp>
9 #include <ipc_proto.hpp>
10 #include <CCompositor.hpp>
11 extern "C" {
12 #include <assert.h>
13 };
14
15 namespace AxWin {
16 namespace IPC {
17
18 CCompositor*    gpCompositor;
19 ::std::list<IIPCChannel*>       channels;
20
21 void Initialise(const CConfigIPC& config, CCompositor* compositor)
22 {
23         gpCompositor = compositor;
24         //for( auto channel : config.m_channels )
25         //{
26         //      channels.push_back(  );
27         //}
28 }
29
30 int FillSelect(fd_set& rfds)
31 {
32         int ret = 0;
33         for( auto channel : channels )
34         {
35                 ret = ::std::max(ret, channel->FillSelect(rfds));
36         }
37         return ret;
38 }
39
40 void HandleSelect(fd_set& rfds)
41 {
42         
43 }
44
45 void RegisterClient(IIPCChannel& channel, CClient& client)
46 {
47         
48 }
49
50
51
52 typedef void    MessageHandler_op_t(CClient& client, CDeserialiser& message);
53 MessageHandler_op_t     HandleMessage_Ping;
54 MessageHandler_op_t     HandleMessage_GetWindowAttr;
55 MessageHandler_op_t     HandleMessage_Reply;
56 MessageHandler_op_t     HandleMessage_CreateWindow;
57 MessageHandler_op_t     HandleMessage_CloseWindow;
58 MessageHandler_op_t     HandleMessage_SetWindowAttr;
59 MessageHandler_op_t     HandleMessage_AddRegion;
60 MessageHandler_op_t     HandleMessage_DelRegion;
61 MessageHandler_op_t     HandleMessage_SetRegionAttr;
62 MessageHandler_op_t     HandleMessage_PushData;
63 MessageHandler_op_t     HandleMessage_SendIPC;
64
65 MessageHandler_op_t     *message_handlers[] = {
66         [IPCMSG_PING]       = &HandleMessage_Ping,
67         [IPCMSG_REPLY]      = &HandleMessage_Reply,
68         
69         [IPCMSG_CREATEWIN]  = &HandleMessage_CreateWindow,
70         [IPCMSG_CLOSEWIN]   = &HandleMessage_CloseWindow,
71         [IPCMSG_SETWINATTR] = &HandleMessage_SetWindowAttr,
72         [IPCMSG_GETWINATTR] = &HandleMessage_GetWindowAttr,
73         
74         [IPCMSG_RGNADD]     = &HandleMessage_AddRegion,
75         [IPCMSG_RGNDEL]     = &HandleMessage_DelRegion,
76         [IPCMSG_RGNSETATTR] = &HandleMessage_SetRegionAttr,
77         [IPCMSG_RGNPUSHDATA]= &HandleMessage_PushData,  // to a region
78         [IPCMSG_SENDIPC]    = &HandleMessage_SendIPC,   // Use the GUI server for low-bandwith inter-process messaging
79 };
80
81 void HandleMessage(CClient& client, CDeserialiser& message)
82 {
83         unsigned int command = message.ReadU8();
84         if( command >= sizeof(message_handlers)/sizeof(IPC::MessageHandler_op_t*) ) {
85                 // Drop, invalid command
86                 return ;
87         }
88         
89         (message_handlers[command])(client, message);
90 }
91
92 void HandleMessage_Reply(CClient& client, CDeserialiser& message)
93 {
94         // Reply to a sent message
95         // - Not many messages need server-bound replies
96         int orig_command = message.ReadU8();
97         switch(orig_command)
98         {
99         case IPCMSG_PING:
100                 // Ping reply, mark client as still responding
101                 break;
102         default:
103                 // Unexpected reply
104                 break;
105         }
106 }
107
108 void HandleMessage_Ping(CClient& client, CDeserialiser& message)
109 {
110         // A client has asked for a ping, we pong them back
111         CSerialiser     reply;
112         reply.WriteU8(IPCMSG_REPLY);
113         reply.WriteU8(IPCMSG_PING);
114         client.SendMessage(reply);
115 }
116
117 void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message)
118 {
119         uint16_t        parent_id = message.ReadU16();
120         uint16_t        new_id = message.ReadU16();
121         CWindow* parent = client.GetWindow( parent_id );
122         
123         client.SetWindow( new_id, gpCompositor->CreateWindow(client) );
124 }
125
126 void HandleMessage_CloseWindow(CClient& client, CDeserialiser& message)
127 {
128         assert(!"TODO");
129 }
130
131 void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message)
132 {
133         assert(!"TODO");
134 }
135
136 void HandleMessage_GetWindowAttr(CClient& client, CDeserialiser& message)
137 {
138         assert(!"TODO");
139 }
140
141 void HandleMessage_AddRegion(CClient& client, CDeserialiser& message)
142 {
143         assert(!"TODO");
144 }
145
146 void HandleMessage_DelRegion(CClient& client, CDeserialiser& message)
147 {
148         assert(!"TODO");
149 }
150
151 void HandleMessage_SetRegionAttr(CClient& client, CDeserialiser& message)
152 {
153         assert(!"TODO");
154 }
155
156 void HandleMessage_PushData(CClient& client, CDeserialiser& message)
157 {
158         assert(!"TODO");
159 }
160
161 void HandleMessage_SendIPC(CClient& client, CDeserialiser& message)
162 {
163         assert(!"TODO");
164 }
165
166 };
167 };      // namespace AxWin
168

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