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

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.5     ! cvs        71: /*** Add here the call for ProcessTerminateRequest ****/
        !            72: 
1.4       cvs        73:     if (event & FD_CLOSE) {
                     74:                /* close the socket and unregister it from the Windows environment */
                     75:        if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK)
                     76:                HTEndLoop = -1;
                     77:            WSAAsyncSelect(sock, HTSocketWin, 0, 0);
                     78:                return 0;
                     79:        }
1.1       cvs        80:     if (event & (FD_READ | FD_ACCEPT))
                     81:        if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK) {
                     82:            HTEndLoop = -1;
                     83:            return 0;
                     84:        }
                     85:     if (event & (FD_WRITE | FD_CONNECT))
                     86:        if (HTEventrg_dispatch((int)sock, FD_WRITE) != HT_OK) {
                     87:            HTEndLoop = -1;
                     88:            return 0;
                     89:        }
                     90:     if (event & FD_OOB)
                     91:        if (HTEventrg_dispatch((int)sock, FD_OOB) != HT_OK) {
                     92:            HTEndLoop = -1;
                     93:            return 0;
1.2       cvs        94:        }
1.3       cvs        95:                
1.1       cvs        96:     return (0);
                     97: }
                     98: 
                     99: 
1.2       cvs       100: 
                    101: boolean AHTEventInit (void)
1.1       cvs       102: {
                    103:     /*
                    104:     ** We are here starting a hidden window to take care of events from
                    105:     **  the async select() call in the async version of the event loop in
                    106:     ** the Internal event manager (HTEvntrg.c)
                    107:     */
                    108:     static char className[] = "AsyncWindowClass";
                    109:     WNDCLASS wc;
                    110:     OSVERSIONINFO osInfo;
                    111:     
                    112:     wc.style=0;
                    113:     wc.lpfnWndProc=(WNDPROC)AmayaAsyncWindowProc;
                    114:     wc.cbClsExtra=0;
                    115:     wc.cbWndExtra=0;
                    116:     wc.hIcon=0;
                    117:     wc.hCursor=0;
                    118:     wc.hbrBackground=0;
                    119:     wc.lpszMenuName=(LPSTR)0;
                    120:     wc.lpszClassName=className;
                    121: 
                    122:     osInfo.dwOSVersionInfoSize = sizeof(osInfo);
                    123:     GetVersionEx(&osInfo);
                    124:     if (osInfo.dwPlatformId == VER_PLATFORM_WIN32s || osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
                    125:        wc.hInstance=GetModuleHandle(NULL); /* 95 and non threaded platforms */
                    126:     else
                    127:        wc.hInstance=GetCurrentProcess(); /* NT and hopefully everything following */
                    128:     if (!RegisterClass(&wc)) {
                    129:        HTTrace("HTLibInit.. Can't RegisterClass \"%s\"\n", className);
                    130:            return NO;
                    131:     }
                    132:     if (!(HTSocketWin = CreateWindow(className, "WWW_WIN_ASYNC", WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 
                    133:                                      CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, wc.hInstance,0))) {
                    134:        char space[50];
                    135:                HTTrace("HTLibInit.. Can't CreateWindow \"WWW_WIN_ASYNC\" - error:");
                    136:        sprintf(space, "%ld\n", GetLastError());
                    137:        HTTrace(space);
                    138:        return NO;
                    139:     }
                    140:     HTwinMsg = WM_USER;  /* use first available message since app uses none */
1.2       cvs       141:     HTEventrg_setWinHandle  (HTSocketWin, HTwinMsg);
1.1       cvs       142: #ifdef _WINSOCKAPI_
                    143:     /*
                    144:     ** Initialise WinSock DLL. This must also be shut down! PMH
                    145:     */
                    146:     {
                    147:         WSADATA            wsadata;
                    148:        if (WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata)) {
                    149:            if (WWWTRACE)
                    150:                HTTrace("HTEventInit. Can't initialize WinSoc\n");
                    151:             WSACleanup();
                    152:             return NO;
                    153:         }
                    154:         if (wsadata.wVersion < MINIMUM_WINSOCK_VERSION) {
                    155:             if (WWWTRACE)
                    156:                HTTrace("HTEventInit. Bad version of WinSoc\n");
                    157:             WSACleanup();
                    158:             return NO;
                    159:         }
                    160:        if (APP_TRACE)
                    161:            HTTrace("HTEventInit. Using WinSoc version \"%s\".\n", 
                    162:                    wsadata.szDescription);
                    163:     }
                    164: #endif /* _WINSOCKAPI_ */
                    165: 
1.2       cvs       166:     HTEvent_setRegisterCallback(AHTEvent_register);
                    167:        HTEvent_setUnregisterCallback (AHTEvent_unregister);
1.1       cvs       168:     return YES;
                    169: }
                    170: 
                    171: PUBLIC BOOL AHTEventTerminate (void)
                    172: {
                    173: #ifdef _WINSOCKAPI_
                    174:     WSACleanup();
                    175: #endif
                    176: 
                    177:     DestroyWindow(HTSocketWin);
                    178:     return YES;
                    179: }
1.2       cvs       180:                 
                    181: #endif /* !_AMAYA_JAVA */
1.1       cvs       182: 
                    183: 
                    184: 

Webmaster