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