X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fipc.c;h=44601841890e5f966e1f869d5ca9c2858be8b99f;hb=bdefac5f54668fcccff11a69619ff31b25595eeb;hp=7874335c27a6c3f08f7000637462cc48559906a4;hpb=ae4f74ae1303ff2ef59d0885606f607e529c5ca0;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index 7874335c..44601841 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -53,7 +53,11 @@ void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data); int IPC_Type_Sys_GetSize(const void *Ident); int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2); void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data); -void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg); + int IPC_Type_IPCPipe_GetSize(const void *Ident); + int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2); +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data); +tIPC_Client *IPC_int_GetClient(const tIPC_Type *IPCType, const void *Ident); +void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg); // === GLOBALS === const tIPC_Type gIPC_Type_Datagram = { @@ -65,9 +69,14 @@ const tIPC_Type gIPC_Type_SysMessage = { IPC_Type_Sys_GetSize, IPC_Type_Sys_Compare, IPC_Type_Sys_Send +}; +const tIPC_Type gIPC_Type_IPCPipe = { + IPC_Type_IPCPipe_GetSize, + IPC_Type_IPCPipe_Compare, + IPC_Type_IPCPipe_Send }; int giNetworkFileHandle = -1; - int giMessagesFileHandle = -1; + int giIPCPipeHandle = -1; int giIPC_ClientCount; tIPC_Client **gIPC_Clients; @@ -82,34 +91,69 @@ void IPC_Init(void) tmp = AXWIN_PORT; _SysIOCtl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number } + + giIPCPipeHandle = _SysOpen("/Devices/ipcpipe/axwin"/*-$USER*/, OPENFLAG_CREATE); + _SysDebug("giIPCPipeHandle = %i", giIPCPipeHandle); + if( giIPCPipeHandle == -1 ) + _SysDebug("ERROR: Can't create IPCPipe handle"); +} + +void _setfd(int fd, int *nfds, fd_set *set) +{ + if( fd >= 0 ) + { + if( fd >= *nfds ) *nfds = fd+1; + FD_SET(fd, set); + } } void IPC_FillSelect(int *nfds, fd_set *set) { - if( giNetworkFileHandle != -1 ) + _setfd(giNetworkFileHandle, nfds, set); + _setfd(giIPCPipeHandle, nfds, set); + for( int i = 0; i < giIPC_ClientCount; i ++ ) { - if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle; - FD_SET(giNetworkFileHandle, set); + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + _setfd( *(int*)(gIPC_Clients[i]->Ident), nfds, set ); } } void IPC_HandleSelect(fd_set *set) { - if( giNetworkFileHandle != -1 ) + if( giNetworkFileHandle != -1 && FD_ISSET(giNetworkFileHandle, set) ) { - if( FD_ISSET(giNetworkFileHandle, set) ) - { - char staticBuf[STATICBUF_SIZE]; - int readlen, identlen; - char *msg; + char staticBuf[STATICBUF_SIZE]; + int readlen, identlen; + char *msg; + + readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); + + identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); + msg = staticBuf + identlen; + + IPC_Handle( IPC_int_GetClient(&gIPC_Type_Datagram, staticBuf), readlen - identlen, (void*)msg); + //_SysDebug("IPC_HandleSelect: UDP handled"); + } - readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); - - identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); - msg = staticBuf + identlen; + if( giIPCPipeHandle != -1 && FD_ISSET(giIPCPipeHandle, set) ) + { + int newfd = _SysOpenChild(giIPCPipeHandle, "newclient", OPENFLAG_READ|OPENFLAG_WRITE); + _SysDebug("newfd = %i"); + IPC_int_GetClient(&gIPC_Type_IPCPipe, &newfd); + } - IPC_Handle(&gIPC_Type_Datagram, staticBuf, readlen - identlen, (void*)msg); -// _SysDebug("IPC_HandleSelect: UDP handled"); + for( int i = 0; i < giIPC_ClientCount; i ++ ) + { + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + { + int fd = *(const int*)gIPC_Clients[i]->Ident; + if( FD_ISSET(fd, set) ) + { + char staticBuf[STATICBUF_SIZE]; + size_t len; + len = _SysRead(fd, staticBuf, sizeof(staticBuf)); + IPC_Handle( gIPC_Clients[i], len, (void*)staticBuf ); + } } } @@ -120,7 +164,7 @@ void IPC_HandleSelect(fd_set *set) char data[len]; _SysGetMessage(NULL, len, data); - IPC_Handle(&gIPC_Type_SysMessage, &tid, len, (void*)data); + IPC_Handle( IPC_int_GetClient(&gIPC_Type_SysMessage, &tid), len, (void*)data ); // _SysDebug("IPC_HandleSelect: Message handled"); } } @@ -163,12 +207,31 @@ void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data) _SysSendMessage( *(const tid_t*)Ident, Length, Data ); } +int IPC_Type_IPCPipe_GetSize(const void *Ident) +{ + return sizeof(int); +} +int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2) +{ + return *(const int*)Ident1 - *(const int*)Ident2; +} +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data) +{ + size_t rv = _SysWrite( *(const int*)Ident, Data, Length ); + if(rv != Length) { + _SysDebug("Sent message oversize %x", Length); + } +} + // --- Client -> Window Mappings int _CompareClientPtrs(const void *_a, const void *_b) { tIPC_Client *a = *(tIPC_Client**)_a; tIPC_Client *b = *(tIPC_Client**)_b; - + + ASSERT(a); + ASSERT(b); + if(a->IPCType < b->IPCType) return -1; if(a->IPCType > b->IPCType) return 1; @@ -406,6 +469,20 @@ int IPC_Msg_CreateWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) return 0; } +int IPC_Msg_DestroyWin(tIPC_Client *Client, tAxWin_IPCMessage *Msg) +{ + tWindow *win; + + ASSERT(Msg->ID == IPCMSG_DESTROYWIN); + + win = IPC_int_GetWindow(Client, Msg->Window); + if( !win ) + return 0; + + WM_DestroyWindow(win); + return 0; +} + int IPC_Msg_SetWindowTitle(tIPC_Client *Client, tAxWin_IPCMessage *Msg) { tWindow *win; @@ -525,7 +602,7 @@ int (*gIPC_MessageHandlers[])(tIPC_Client *Client, tAxWin_IPCMessage *Msg) = { IPC_Msg_GetDisplayDims, IPC_Msg_SendMsg, IPC_Msg_CreateWin, - NULL, // Destroy window + IPC_Msg_DestroyWin, // Destroy window IPC_Msg_SetWindowTitle, IPC_Msg_ShowWindow, IPC_Msg_DecorateWindow, @@ -535,9 +612,8 @@ int (*gIPC_MessageHandlers[])(tIPC_Client *Client, tAxWin_IPCMessage *Msg) = { }; const int giIPC_NumMessageHandlers = sizeof(gIPC_MessageHandlers)/sizeof(gIPC_MessageHandlers[0]); -void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg) +void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg) { - tIPC_Client *client; int rv = 0; // _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)", @@ -548,14 +624,9 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW if( MsgLen < sizeof(tAxWin_IPCMessage) + Msg->Size ) return ; - client = IPC_int_GetClient(IPCType, Ident); - if( !client ) { - // Oops? - } - if( Msg->Flags & IPCMSG_FLAG_RENDERER ) { - tWindow *win = IPC_int_GetWindow(client, Msg->Window); + tWindow *win = IPC_int_GetWindow(Client, Msg->Window); if( !win ) { _SysDebug("WARNING: NULL window in message %i", Msg->ID); return ; @@ -577,8 +648,8 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW else { if( Msg->ID >= giIPC_NumMessageHandlers ) { - fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); - _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType); + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Client); + _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, Client); return ; } @@ -589,7 +660,7 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW } _SysDebug("IPC_Handle: Call WM-%i", Msg->ID); - rv = gIPC_MessageHandlers[Msg->ID](client, Msg); + rv = gIPC_MessageHandlers[Msg->ID](Client, Msg); if( rv ) _SysDebug("IPC_Handle: rv != 0 (%i)", rv); }