Usermode/AxWin3 - Added ipcpipe support
authorJohn Hodge <[email protected]>
Tue, 26 Feb 2013 05:49:30 +0000 (13:49 +0800)
committerJohn Hodge <[email protected]>
Tue, 26 Feb 2013 05:49:30 +0000 (13:49 +0800)
Usermode/Applications/axwin3_src/WM/ipc.c
Usermode/Applications/axwin3_src/libaxwin3.so_src/main.c
Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c

index 51692a6..4460184 100644 (file)
@@ -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,6 +207,22 @@ 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)
 {
@@ -552,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)",
@@ -565,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 ;
@@ -594,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 ;
                }
                
@@ -606,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);
        }
index da2ffe7..ab764d2 100644 (file)
@@ -17,7 +17,8 @@ int   giAxWin3_MainLoopExit;
 int SoMain(void *Base, int argc, const char *argv[], const char **envp)
 {
        // TODO: Parse the environment for the AXWIN3_SERVER variable
-       gsAxWin3_int_ServerDesc = getenv("AXWIN3_SERVER");
+       //gsAxWin3_int_ServerDesc = getenv("AXWIN3_SERVER");
+       gsAxWin3_int_ServerDesc = "pipe:/Devices/ipcpipe/axwin";
        return 0;
 }
 
index a9a79a3..955da44 100644 (file)
 #include "include/internal.h"
 #include "include/ipc.h"
 
+#define assert(cnd)    do{if(!(cnd)){_SysDebug("Assertion failed: %s", #cnd);}}while(0)
+
+#define STATICBUF_SIZE 0x1000
+
 // === CONSTANTS ===
 enum eConnectionType
 {
        CONNTYPE_NONE,
        CONNTYPE_SENDMESSAGE,
+       CONNTYPE_IPCPIPE,
        CONNTYPE_UDP,
        CONNTYPE_TCP
 };
@@ -33,7 +38,6 @@ tAxWin3_MessageCallback       gAxWin3_MessageCallback;
 // === CODE ===
 void AxWin3_Connect(const char *ServerDesc)
 {
-       _SysDebug("ServerDesc (argument) = %s", ServerDesc);
        if( !ServerDesc ) {
                ServerDesc = gsAxWin3_int_ServerDesc;
        }
@@ -64,6 +68,20 @@ void AxWin3_Connect(const char *ServerDesc)
                ServerDesc ++;
                // TODO: Open socket
                break;
+       case 'p':
+               assert( strncmp(ServerDesc, "pipe:", 5) == 0 );
+               ServerDesc += 5;
+               giConnectionType = CONNTYPE_IPCPIPE;
+               giConnectionNum = _SysOpen(ServerDesc, OPENFLAG_READ|OPENFLAG_WRITE);
+               if( giConnectionNum == -1 ) {
+                       _SysDebug("Cannot open IPC Pipe '%s'", ServerDesc);
+                       exit(-1);
+               }
+               break;
+       default:
+               _SysDebug("Unknown server desc format '%s'", ServerDesc);
+               exit(-1);
+               break;
        }
 }
 
@@ -110,6 +128,7 @@ void AxWin3_int_SendIPCMessage(tAxWin_IPCMessage *Msg)
                _SysWrite(giConnectionNum, tmpbuf, sizeof(tmpbuf));
                }
                break;
+       case CONNTYPE_IPCPIPE:
        case CONNTYPE_TCP:
                _SysWrite(giConnectionNum, Msg, size);
                break;
@@ -123,6 +142,17 @@ tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(int nFD, fd_set *fds)
         int    len;
        tAxWin_IPCMessage       *ret = NULL;
         int    tid;
+       fd_set  local_set;
+       
+       if(!fds)
+               fds = &local_set;
+
+       if( giConnectionType != CONNTYPE_SENDMESSAGE )
+       {
+               if(nFD <= giConnectionNum)
+                       nFD = giConnectionNum+1;
+               FD_SET(giConnectionNum, fds);
+       }
 
        _SysSelect(nFD, fds, NULL, NULL, NULL, THREAD_EVENT_IPCMSG);
        
@@ -151,9 +181,24 @@ tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(int nFD, fd_set *fds)
                break;
        }
 
-       if( giConnectionType == CONNTYPE_TCP || giConnectionType == CONNTYPE_UDP )
+       if( giConnectionType != CONNTYPE_SENDMESSAGE )
        {
-               // Check fds
+               if( FD_ISSET(giConnectionNum, fds) )
+               {
+                       char    tmpbuf[STATICBUF_SIZE];
+                       char    *data = tmpbuf;
+                       size_t len = _SysRead(giConnectionNum, tmpbuf, sizeof(tmpbuf));
+                       
+                       if( giConnectionType == CONNTYPE_UDP )
+                       {
+                               assert(len > giAxWin3_int_UDPHeaderLen);
+                               len -= giAxWin3_int_UDPHeaderLen;
+                               data += giAxWin3_int_UDPHeaderLen;
+                       }
+                       assert(len >= sizeof(tAxWin_IPCMessage));
+                       ret = malloc(len);
+                       memcpy(ret, data, len);
+               }
        }
 
        return ret;

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