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

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

Webmaster