File:
[Public] /
Amaya /
amaya /
AHTEvntrg.c
Revision
1.15:
download - view:
text,
annotated -
select for diffs
Thu Apr 12 16:13:22 2001 UTC (23 years, 2 months ago) by
cvs
Branches:
MAIN
CVS tags:
HEAD,
Amaya-9-55-1,
Amaya-9-55,
Amaya-9-54,
Amaya-9-53bis,
Amaya-9-53,
Amaya-9-52,
Amaya-9-51,
Amaya-9-5,
Amaya-9-4,
Amaya-9-3,
Amaya-9-2-1,
Amaya-9-2,
Amaya-9-1,
Amaya-8-7,
Amaya-8-6,
Amaya-8-5,
Amaya-8-4,
Amaya-8-3,
Amaya-8-2,
Amaya-8-1b,
Amaya-8-1,
Amaya-8-0,
Amaya-7-2,
Amaya-7-1,
Amaya-7-0,
Amaya-6-4,
Amaya-6-3,
Amaya-6-2,
Amaya-6-1,
Amaya-6-0,
Amaya-5-3,
Amaya-5-2,
Amaya-5-1,
Amaya-5-0,
Amaya-11-4-7,
Amaya-11-3-1,
Amaya-11-3,
Amaya-11-2,
Amaya-11-1,
Amaya-11-0,
Amaya-10-0
Code clean up
Irene
/* AHTEvntrg.c
** Amaya EVENT MANAGER
**
*/
/* Amaya includes */
#define THOT_EXPORT extern
/* Implementation dependent include files */
#include "amaya.h"
#include "AHTBridge_f.h"
#include <assert.h> /* @@@ Should be in sysdep.h @@@ */
#include <fcntl.h>
static HWND HTSocketWin;
static unsigned long HTwinMsg;
/* Type definitions and global variables etc. local to this module */
PRIVATE int HTEndLoop = 0; /* If !0 then exit event loop */
typedef unsigned long DWORD;
/*
** our internal structure to hold a socket, it's request
** and our action. For version 1, we allow one action per socket
*/
typedef struct rq_t RQ;
/*
** an action consists of a request, a set of requested operations
** a HTEventCallback function, and a priority (priority is not used in this
** version)
*/
#ifndef WWW_MSWINDOWS
typedef void * HANDLE ;
#endif
/* ------------------------------------------------------------------------- */
/* HTEventrg_loop
** ------------
** event loop: that is, we wait for activity from one of our registered
** channels, and dispatch on that.
**
** There are now two versions of the event loop. The first is if you want
** to use async I/O on windows, and the other is if you want to use normal
** Unix setup with sockets
*/
/* only responsible for WM_TIMER and WSA_AsyncSelect */
PUBLIC LRESULT CALLBACK AmayaAsyncWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WORD event;
SOCKET sock;
HTEventCallback *cbf;
HTRequest *rqp;
if (uMsg != HTwinMsg) /* not our async message */
return (DefWindowProc(hwnd, uMsg, wParam, lParam));
event = LOWORD(lParam);
sock = (SOCKET)wParam;
cbf = (HTEventCallback *) __RetrieveCBF (sock, FD_WRITE, &rqp);
if (event & FD_CLOSE) {
/* close the socket and unregister it from the Windows environment */
if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK)
HTEndLoop = -1;
WSAAsyncSelect(sock, HTSocketWin, 0, 0);
return 0;
}
if (event & (FD_READ | FD_ACCEPT))
if (HTEventrg_dispatch((int)sock, FD_READ) != HT_OK) {
HTEndLoop = -1;
return 0;
}
if (event & (FD_WRITE | FD_CONNECT))
if (HTEventrg_dispatch((int)sock, FD_WRITE) != HT_OK) {
HTEndLoop = -1;
return 0;
}
if (event & FD_OOB)
if (HTEventrg_dispatch((int)sock, FD_OOB) != HT_OK) {
HTEndLoop = -1;
return 0;
}
return (0);
}
ThotBool AHTEventInit (void)
{
/*
** We are here starting a hidden window to take care of events from
** the async select() call in the async version of the event loop in
** the Internal event manager (HTEvntrg.c)
*/
static char className[] = "AsyncWindowClass";
WNDCLASS wc;
OSVERSIONINFO osInfo;
wc.style=0;
wc.lpfnWndProc=(WNDPROC)AmayaAsyncWindowProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hIcon=0;
wc.hCursor=0;
wc.hbrBackground=0;
wc.lpszMenuName=(LPSTR)0;
wc.lpszClassName=className;
osInfo.dwOSVersionInfoSize = sizeof(osInfo);
GetVersionEx(&osInfo);
if (osInfo.dwPlatformId == VER_PLATFORM_WIN32s || osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
wc.hInstance=GetModuleHandle(NULL); /* 95 and non threaded platforms */
else
wc.hInstance=GetCurrentProcess(); /* NT and hopefully everything following */
if (!RegisterClass(&wc)) {
HTTrace("HTLibInit.. Can't RegisterClass \"%s\"\n", className);
return NO;
}
if (!(HTSocketWin = CreateWindow(className, "WWW_WIN_ASYNC", WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, wc.hInstance,0))) {
char *space = TtaGetMemory (50);
HTTrace("HTLibInit.. Can't CreateWindow \"WWW_WIN_ASYNC\" - error:");
sprintf(space, "%ld\n", GetLastError());
HTTrace(space);
TtaFreeMemory (space);
return NO;
}
HTwinMsg = WM_USER; /* use first available message since app uses none */
HTEventrg_setWinHandle (HTSocketWin, HTwinMsg);
#ifdef _WINSOCKAPI_
/*
** Initialise WinSock DLL. This must also be shut down! PMH
*/
{
WSADATA wsadata;
if (WSAStartup(DESIRED_WINSOCK_VERSION, &wsadata)) {
if (WWWTRACE)
HTTrace("HTEventInit. Can't initialize WinSoc\n");
WSACleanup();
return NO;
}
if (wsadata.wVersion < MINIMUM_WINSOCK_VERSION) {
if (WWWTRACE)
HTTrace("HTEventInit. Bad version of WinSoc\n");
WSACleanup();
return NO;
}
if (APP_TRACE)
HTTrace("HTEventInit. Using WinSoc version \"%s\".\n",
wsadata.szDescription);
}
#endif /* _WINSOCKAPI_ */
HTEvent_setRegisterCallback(AHTEvent_register);
HTEvent_setUnregisterCallback (AHTEvent_unregister);
return YES;
}
PUBLIC BOOL AHTEventTerminate (void)
{
#ifdef _WINSOCKAPI_
WSACleanup();
#endif
DestroyWindow(HTSocketWin);
return YES;
}
Webmaster