- Replace WIN32 types by corresponding native types.
[reactos.git] / reactos / lib / msafd / misc / event.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver DLL
4 * FILE: misc/event.c
5 * PURPOSE: Event handling
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Alex Ionescu (alex@relsoft.net)
8 * REVISIONS:
9 * CSH 15/06-2001 Created
10 * Alex 16/07/2004 - Complete Rewrite
11 */
12
13 #include <msafd.h>
14
15 int
16 WSPAPI
17 WSPEventSelect(
18 SOCKET Handle,
19 WSAEVENT hEventObject,
20 long lNetworkEvents,
21 LPINT lpErrno)
22 {
23 IO_STATUS_BLOCK IOSB;
24 AFD_EVENT_SELECT_INFO EventSelectInfo;
25 PSOCKET_INFORMATION Socket = NULL;
26 NTSTATUS Status;
27 ULONG BlockMode;
28 HANDLE SockEvent;
29
30 Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
31 NULL, 1, FALSE );
32
33 if( !NT_SUCCESS(Status) ) return -1;
34
35 /* Get the Socket Structure associate to this Socket*/
36 Socket = GetSocketStructure(Handle);
37
38 /* Set Socket to Non-Blocking */
39 BlockMode = 1;
40 SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL);
41 Socket->SharedData.NonBlocking = TRUE;
42
43 /* Deactivate Async Select if there is one */
44 if (Socket->EventObject) {
45 //SockAsyncSelect(Socket, NULL, 0, 0);
46 }
47
48 /* Set Structure Info */
49 EventSelectInfo.EventObject = hEventObject;
50 EventSelectInfo.Events = 0;
51
52 /* Set Events to wait for */
53 if (lNetworkEvents & FD_READ) {
54 EventSelectInfo.Events |= AFD_EVENT_RECEIVE;
55 }
56
57 if (lNetworkEvents & FD_WRITE) {
58 EventSelectInfo.Events |= AFD_EVENT_SEND;
59 }
60
61 if (lNetworkEvents & FD_OOB) {
62 EventSelectInfo.Events |= AFD_EVENT_OOB_RECEIVE;
63 }
64
65 if (lNetworkEvents & FD_ACCEPT) {
66 EventSelectInfo.Events |= AFD_EVENT_ACCEPT;
67 }
68
69 if (lNetworkEvents & FD_CONNECT) {
70 EventSelectInfo.Events |= AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL;
71 }
72
73 if (lNetworkEvents & FD_CLOSE) {
74 EventSelectInfo.Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT;
75 }
76
77 if (lNetworkEvents & FD_QOS) {
78 EventSelectInfo.Events |= AFD_EVENT_QOS;
79 }
80
81 if (lNetworkEvents & FD_GROUP_QOS) {
82 EventSelectInfo.Events |= AFD_EVENT_GROUP_QOS;
83 }
84
85 /* Send IOCTL */
86 Status = NtDeviceIoControlFile((HANDLE)Handle,
87 SockEvent,
88 NULL,
89 NULL,
90 &IOSB,
91 IOCTL_AFD_EVENT_SELECT,
92 &EventSelectInfo,
93 sizeof(EventSelectInfo),
94 NULL,
95 0);
96
97 /* Wait for return */
98 if (Status == STATUS_PENDING) {
99 WaitForSingleObject(SockEvent, 0);
100 }
101
102 NtClose( SockEvent );
103
104 /* Set Socket Data*/
105 Socket->EventObject = hEventObject;
106 Socket->NetworkEvents = lNetworkEvents;
107
108 return 0;
109 }
110
111
112 INT
113 WSPAPI
114 WSPEnumNetworkEvents(
115 IN SOCKET s,
116 IN WSAEVENT hEventObject,
117 OUT LPWSANETWORKEVENTS lpNetworkEvents,
118 OUT LPINT lpErrno)
119 {
120 return 0;
121 }
122
123 /* EOF */