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