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