X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2Flibaxwin3.so_src%2Fmsg.c;h=a9a79a30a72170d88a357820695a815aee4e44f3;hb=a41c4af4ae30e963f6bc370efad60dacc39b0275;hp=1059a0a2f37186aa58706d69a82527dc8da489ae;hpb=4fa95391e2ff812412d7229e0135efd49cd5f3ed;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c index 1059a0a2..a9a79a30 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c @@ -11,10 +11,12 @@ #include #include // AxWin3 common #include "include/internal.h" +#include "include/ipc.h" // === CONSTANTS === enum eConnectionType { + CONNTYPE_NONE, CONNTYPE_SENDMESSAGE, CONNTYPE_UDP, CONNTYPE_TCP @@ -31,9 +33,8 @@ tAxWin3_MessageCallback gAxWin3_MessageCallback; // === CODE === void AxWin3_Connect(const char *ServerDesc) { - _SysDebug("ServerDesc = %s", ServerDesc); - if( !ServerDesc ) - { + _SysDebug("ServerDesc (argument) = %s", ServerDesc); + if( !ServerDesc ) { ServerDesc = gsAxWin3_int_ServerDesc; } _SysDebug("ServerDesc = %s", ServerDesc); @@ -48,6 +49,10 @@ void AxWin3_Connect(const char *ServerDesc) case '6': case '7': case '8': case '9': case '0': giConnectionType = CONNTYPE_SENDMESSAGE; giConnectionNum = atoi(ServerDesc); + if( giConnectionNum == 0 ) { + _SysDebug("Invalid server PID"); + exit(-1); + } break; case 'u': while(*ServerDesc && *ServerDesc != ':') ServerDesc ++; @@ -69,6 +74,14 @@ tAxWin3_MessageCallback AxWin3_SetMessageCallback(tAxWin3_MessageCallback Callba return old; } +uint32_t AxWin3_int_GetWindowID(tHWND Window) +{ + if(Window) + return Window->ServerID; + else + return -1; +} + tAxWin_IPCMessage *AxWin3_int_AllocateIPCMessage(tHWND Window, int Message, int Flags, int ExtraBytes) { tAxWin_IPCMessage *ret; @@ -76,10 +89,7 @@ tAxWin_IPCMessage *AxWin3_int_AllocateIPCMessage(tHWND Window, int Message, int ret = malloc( sizeof(tAxWin_IPCMessage) + ExtraBytes ); ret->Flags = Flags; ret->ID = Message; - if(Window) - ret->Window = Window->ServerID; - else - ret->Window = -1; + ret->Window = AxWin3_int_GetWindowID(Window); ret->Size = ExtraBytes; return ret; } @@ -90,67 +100,73 @@ void AxWin3_int_SendIPCMessage(tAxWin_IPCMessage *Msg) switch(giConnectionType) { case CONNTYPE_SENDMESSAGE: - SysSendMessage(giConnectionNum, size, Msg); + _SysSendMessage(giConnectionNum, size, Msg); break; case CONNTYPE_UDP: { // Create UDP header char tmpbuf[giAxWin3_int_UDPHeaderLen + size]; memcpy(tmpbuf, gaAxWin3_int_UDPHeader, giAxWin3_int_UDPHeaderLen); memcpy(tmpbuf + giAxWin3_int_UDPHeaderLen, Msg, size); - write(giConnectionNum, tmpbuf, sizeof(tmpbuf)); + _SysWrite(giConnectionNum, tmpbuf, sizeof(tmpbuf)); } break; case CONNTYPE_TCP: - write(giConnectionNum, Msg, size); + _SysWrite(giConnectionNum, Msg, size); break; default: break; } } -tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(void) +tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(int nFD, fd_set *fds) { int len; tAxWin_IPCMessage *ret = NULL; - switch(giConnectionType) + int tid; + + _SysSelect(nFD, fds, NULL, NULL, NULL, THREAD_EVENT_IPCMSG); + + // Clear out IPC messages + while( (len = _SysGetMessage(&tid, 0, NULL)) ) { - case CONNTYPE_SENDMESSAGE: - // TODO: Less hack, I need a version of select for GetMessage etc - if(SysGetMessage(NULL, NULL) == 0) sleep(); - while(SysGetMessage(NULL, NULL)) + if( giConnectionType != CONNTYPE_SENDMESSAGE || tid != giConnectionNum ) { - pid_t tid; - len = SysGetMessage(&tid, NULL); - // Check if the message came from the server - if(tid != giConnectionNum) - { - // If not, pass the buck (or ignore) - if( gAxWin3_MessageCallback ) - gAxWin3_MessageCallback(tid, len); - else - SysGetMessage(NULL, GETMSG_IGNORE); - continue ; - } - - // If it's from the server, allocate a buffer and return it - ret = malloc(len); - if(ret == NULL) return NULL; - SysGetMessage(NULL, ret); - break; + _SysDebug("%i byte message from %i", len, tid); + // If not, pass the buck (or ignore) + if( gAxWin3_MessageCallback ) + gAxWin3_MessageCallback(tid, len); + else + _SysGetMessage(NULL, 0, GETMSG_IGNORE); + continue ; } - break; - default: - // TODO: Implement - _SysDebug("TODO: Implement AxWin3_int_GetIPCMessage for TCP/UDP"); + + // Using CONNTYPE_SENDMESSAGE and server message has arrived + ret = malloc(len); + if(ret == NULL) { + _SysDebug("malloc() failed, ignoring message"); + _SysGetMessage(NULL, 0, GETMSG_IGNORE); + return NULL; + } + _SysGetMessage(NULL, len, ret); break; } - // No message? - if( ret == NULL ) - return NULL; - - // TODO: Sanity checks, so a stupid server can't crash us + if( giConnectionType == CONNTYPE_TCP || giConnectionType == CONNTYPE_UDP ) + { + // Check fds + } return ret; } +tAxWin_IPCMessage *AxWin3_int_WaitIPCMessage(int WantedID) +{ + tAxWin_IPCMessage *msg; + for(;;) + { + msg = AxWin3_int_GetIPCMessage(0, NULL); + if(msg->ID == WantedID) return msg; + AxWin3_int_HandleMessage( msg ); + } +} +