5 #include <IIPCChannel.hpp>
8 #include <serialisation.hpp>
9 #include <ipc_proto.hpp>
10 #include <CCompositor.hpp>
14 #include <CIPCChannel_AcessIPCPipe.hpp>
19 CCompositor* gpCompositor;
20 ::std::list<IIPCChannel*> glChannels;
21 //::std::map<uint16_t,CClient*> glClients;
23 void Initialise(const CConfigIPC& config, CCompositor& compositor)
25 gpCompositor = &compositor;
27 ::std::string pipe_basepath = "axwin4";
28 glChannels.push_back( new CIPCChannel_AcessIPCPipe( pipe_basepath ) );
30 //glChannels.push_back( new CIPCChannel_TCP("0.0.0.0:2100") );
32 //for( auto channel : config.m_channels )
34 // channels.push_back( );
38 int FillSelect(fd_set& rfds)
41 for( auto channel : glChannels )
43 ret = ::std::max(ret, channel->FillSelect(rfds));
48 void HandleSelect(fd_set& rfds)
50 for( auto channel : glChannels )
52 channel->HandleSelect(rfds);
56 void RegisterClient(CClient& client)
58 // allocate a client ID, and save
60 //glClients[client.m_id] = &client;
63 void DeregisterClient(CClient& client)
65 //glClients.erase( client.m_id );
70 typedef void MessageHandler_op_t(CClient& client, CDeserialiser& message);
71 MessageHandler_op_t HandleMessage_Ping;
72 MessageHandler_op_t HandleMessage_GetWindowAttr;
73 MessageHandler_op_t HandleMessage_Reply;
74 MessageHandler_op_t HandleMessage_CreateWindow;
75 MessageHandler_op_t HandleMessage_CloseWindow;
76 MessageHandler_op_t HandleMessage_SetWindowAttr;
77 MessageHandler_op_t HandleMessage_AddRegion;
78 MessageHandler_op_t HandleMessage_DelRegion;
79 MessageHandler_op_t HandleMessage_SetRegionAttr;
80 MessageHandler_op_t HandleMessage_PushData;
81 MessageHandler_op_t HandleMessage_SendIPC;
83 MessageHandler_op_t *message_handlers[] = {
84 [IPCMSG_PING] = &HandleMessage_Ping,
85 [IPCMSG_REPLY] = &HandleMessage_Reply,
87 [IPCMSG_CREATEWIN] = &HandleMessage_CreateWindow,
88 [IPCMSG_CLOSEWIN] = &HandleMessage_CloseWindow,
89 [IPCMSG_SETWINATTR] = &HandleMessage_SetWindowAttr,
90 [IPCMSG_GETWINATTR] = &HandleMessage_GetWindowAttr,
92 [IPCMSG_RGNADD] = &HandleMessage_AddRegion,
93 [IPCMSG_RGNDEL] = &HandleMessage_DelRegion,
94 [IPCMSG_RGNSETATTR] = &HandleMessage_SetRegionAttr,
95 [IPCMSG_RGNPUSHDATA]= &HandleMessage_PushData, // to a region
96 [IPCMSG_SENDIPC] = &HandleMessage_SendIPC, // Use the GUI server for low-bandwith inter-process messaging
99 void HandleMessage(CClient& client, CDeserialiser& message)
101 unsigned int command = message.ReadU8();
102 if( command >= sizeof(message_handlers)/sizeof(IPC::MessageHandler_op_t*) ) {
103 // Drop, invalid command
107 (message_handlers[command])(client, message);
110 void HandleMessage_Reply(CClient& client, CDeserialiser& message)
112 // Reply to a sent message
113 // - Not many messages need server-bound replies
114 int orig_command = message.ReadU8();
118 // Ping reply, mark client as still responding
126 void HandleMessage_Ping(CClient& client, CDeserialiser& message)
128 // A client has asked for a ping, we pong them back
130 reply.WriteU8(IPCMSG_REPLY);
131 reply.WriteU8(IPCMSG_PING);
132 client.SendMessage(reply);
135 void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message)
137 uint16_t parent_id = message.ReadU16();
138 uint16_t new_id = message.ReadU16();
139 CWindow* parent = client.GetWindow( parent_id );
141 client.SetWindow( new_id, gpCompositor->CreateWindow(client) );
144 void HandleMessage_CloseWindow(CClient& client, CDeserialiser& message)
149 void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message)
154 void HandleMessage_GetWindowAttr(CClient& client, CDeserialiser& message)
159 void HandleMessage_AddRegion(CClient& client, CDeserialiser& message)
164 void HandleMessage_DelRegion(CClient& client, CDeserialiser& message)
169 void HandleMessage_SetRegionAttr(CClient& client, CDeserialiser& message)
174 void HandleMessage_PushData(CClient& client, CDeserialiser& message)
179 void HandleMessage_SendIPC(CClient& client, CDeserialiser& message)
186 IIPCChannel::~IIPCChannel()
190 }; // namespace AxWin