Annotation of Amaya/amaya/AHTEvntrg.c, revision 1.11

1.1       cvs         1: /*                                                                 AHTEvntrg.c
1.2       cvs         2: **     Amaya EVENT MANAGER
1.1       cvs         3: **
                      4: */
                      5: 
1.2       cvs         6: #ifndef AMAYA_JAVA
1.1       cvs         7: 
1.2       cvs         8: /* Amaya includes  */
                      9: #define THOT_EXPORT extern
                     10: 
                     11: /* Implementation dependent include files */
                     12: #include "amaya.h"
                     13: #include "AHTBridge_f.h"
1.1       cvs        14: #include <assert.h>                    /* @@@ Should be in sysdep.h @@@ */
1.2       cvs        15: #include <fcntl.h>
1.1       cvs        16: 
                     17: static HWND HTSocketWin;
                     18: static unsigned long HTwinMsg;
                     19: 
                     20: /* Type definitions and global variables etc. local to this module */
                     21: 
                     22: PRIVATE int HTEndLoop = 0;                    /* If !0 then exit event loop */
                     23: typedef unsigned long DWORD;
                     24: 
                     25: /*
                     26: ** our internal structure to hold a socket, it's request 
                     27: ** and our action. For version 1, we allow one action per socket
                     28: */
                     29: 
                     30: typedef struct rq_t RQ;
                     31: 
                     32: /*
                     33: ** an action consists of a request, a set of requested operations 
                     34: ** a HTEventCallback function, and a priority (priority is not used in this
                     35: ** version)
                     36: */
                     37: 
                     38: #ifndef WWW_MSWINDOWS 
                     39: typedef void * HANDLE ;
                     40: #endif
                     41: 
1.2       cvs        42: 
1.1       cvs        43: /* ------------------------------------------------------------------------- */
                     44: 
                     45: /*  HTEventrg_loop
                     46: **  ------------
                     47: **  event loop: that is, we wait for activity from one of our registered 
                     48: **  channels, and dispatch on that.
                     49: **
                     50: **  There are now two versions of the event loop. The first is if you want
                     51: **  to use async I/O on windows, and the other is if you want to use normal
                     52: **  Unix setup with sockets
                     53: */
1.2       cvs        54: 
1.1       cvs        55: /* only responsible for WM_TIMER and WSA_AsyncSelect */        
1.2       cvs        56: PUBLIC LRESULT CALLBACK AmayaAsyncWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1.1       cvs        57: {
                     58:     WORD event;
                     59:     SOCKET sock;
1.2       cvs        60:     HTEventCallback    *cbf;
                     61:        HTRequest *rqp;
1.1       cvs        62: 
                     63:     if (uMsg != HTwinMsg)      /* not our async message */
                     64:        return (DefWindowProc(hwnd, uMsg, wParam, lParam));
                     65: 
                     66:     event = LOWORD(lParam);
                     67:     sock = (SOCKET)wParam;
1.2       cvs        68: 
                     69:     cbf = (HTEventCallback *) __RetrieveCBF (sock, FD_WRITE, &rqp);
                     70: 
1.4       cvs        71:     if (event & FD_CLOSE) {
                     72:                /* close the socket and unregister it from the Windows environment */
                     73:        if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK)
                     74:                HTEndLoop = -1;
                     75:            WSAAsyncSelect(sock, HTSocketWin, 0, 0);
                     76:                return 0;
                     77:        }
1.1       cvs        78:     if (event & (FD_READ | FD_ACCEPT))
                     79:        if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK) {
                     80:            HTEndLoop = -1;
                     81:            return 0;
                     82:        }
                     83:     if (event & (FD_WRITE | FD_CONNECT))
                     84:        if (HTEventrg_dispatch((int)sock, FD_WRITE) != HT_OK) {
                     85:            HTEndLoop = -1;
                     86:            return 0;
                     87:        }
                     88:     if (event & FD_OOB)
                     89:        if (HTEventrg_dispatch((int)sock, FD_OOB) != HT_OK) {
                     90:            HTEndLoop = -1;
                     91:            return 0;
1.2       cvs        92:        }
1.3       cvs        93:                
1.1       cvs        94:     return (0);
                     95: }
                     96: 
                     97: 
1.2       cvs        98: 
1.11    ! cvs        99: ThotBool AHTEventInit (void)
1.1       cvs       100: {
                    101:     /*
                    102:     ** We are here starting a hidden window to take care of events from
                    103:     **  the async select() call in the async version of the event loop in
                    104:     ** the Internal event manager (HTEvntrg.c)
                    105:     */
1.10      cvs       106:     static CHAR_T className[] = "AsyncWindowClass";
1.1       cvs       107:     WNDCLASS wc;
                    108:     OSVERSIONINFO osInfo;
                    109:     
                    110:     wc.style=0;
                    111:     wc.lpfnWndProc=(WNDPROC)AmayaAsyncWindowProc;
                    112:     wc.cbClsExtra=0;
                    113:     wc.cbWndExtra=0;
                    114:     wc.hIcon=0;
                    115:     wc.hCursor=0;
                    116:     wc.hbrBackground=0;
                    117:     wc.lpszMenuName=(LPSTR)0;
                    118:     wc.lpszClassName=className;
                    119: 
                    120:     osInfo.dwOSVersionInfoSize = sizeof(osInfo);
                    121:     GetVersionEx(&osInfo);
                    122:     if (osInfo.dwPlatformId == VER_PLATFORM_WIN32s || osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
                    123:        wc.hInstance=GetModuleHandle(NULL); /* 95 and non threaded platforms */
                    124:     else
                    125:        wc.hInstance=GetCurrentProcess(); /* NT and hopefully everything following */
                    126:     if (!RegisterClass(&wc)) {
                    127:        HTTrace("HTLibInit.. Can't RegisterClass \"%s\"\n", className);
                    128:            return NO;
                    129:     }
                    130:     if (!(HTSocketWin = CreateWindow(className, "WWW_WIN_ASYNC", WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 
                    131:                                      CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, wc.hInstance,0))) {
1.10      cvs       132:        STRING space = (STRING) TtaGetMemory (50 * sizeof (CHAR_T));
1.6       cvs       133:        HTTrace("HTLibInit.. Can't CreateWindow \"WWW_WIN_ASYNC\" - error:");
                    134:        sprintf(space, "%ld\n", GetLastError());
                    135:        HTTrace(space);
                    136:           TtaFreeMemory (space);
                    137:        return NO;
1.1       cvs       138:     }
                    139:     HTwinMsg = WM_USER;  /* use first available message since app uses none */
1.2       cvs       140:     HTEventrg_setWinHandle  (HTSocketWin, HTwinMsg);
1.1       cvs       141: #ifdef _WINSOCKAPI_
                    142:     /*
                    143:     ** Initialise WinSock DLL. This must also be shut down! PMH
                    144:     */
                    145:     {
                    146:         WSADATA            wsadata;
                    147:        if (WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata)) {
                    148:            if (WWWTRACE)
                    149:                HTTrace("HTEventInit. Can't initialize WinSoc\n");
                    150:             WSACleanup();
                    151:             return NO;
                    152:         }
                    153:         if (wsadata.wVersion < MINIMUM_WINSOCK_VERSION) {
                    154:             if (WWWTRACE)
                    155:                HTTrace("HTEventInit. Bad version of WinSoc\n");
                    156:             WSACleanup();
                    157:             return NO;
                    158:         }
                    159:        if (APP_TRACE)
                    160:            HTTrace("HTEventInit. Using WinSoc version \"%s\".\n", 
                    161:                    wsadata.szDescription);
                    162:     }
                    163: #endif /* _WINSOCKAPI_ */
                    164: 
1.2       cvs       165:     HTEvent_setRegisterCallback(AHTEvent_register);
                    166:        HTEvent_setUnregisterCallback (AHTEvent_unregister);
1.1       cvs       167:     return YES;
                    168: }
                    169: 
                    170: PUBLIC BOOL AHTEventTerminate (void)
                    171: {
                    172: #ifdef _WINSOCKAPI_
                    173:     WSACleanup();
                    174: #endif
                    175: 
                    176:     DestroyWindow(HTSocketWin);
                    177:     return YES;
                    178: }
1.2       cvs       179:                 
                    180: #endif /* !_AMAYA_JAVA */
1.1       cvs       181: 
                    182: 
                    183: 

Webmaster