:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / ws2_32 / misc / event.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS WinSock 2 DLL
4  * FILE:        misc/event.c
5  * PURPOSE:     Event handling
6  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7  * REVISIONS:
8  *   CSH 01/09-2000 Created
9  */
10 #include <ws2_32.h>
11 #include <handle.h>
12
13
14 BOOL
15 EXPORT
16 WSACloseEvent(
17   IN  WSAEVENT hEvent)
18 {
19   BOOL Success;
20
21   if (!WSAINITIALIZED) {
22     WSASetLastError(WSANOTINITIALISED);
23     return FALSE;
24   }
25
26   Success = CloseHandle((HANDLE)hEvent);
27
28   if (!Success)
29     WSASetLastError(WSA_INVALID_HANDLE);
30
31   return Success;
32 }
33
34
35 WSAEVENT
36 EXPORT
37 WSACreateEvent(VOID)
38 {
39   HANDLE Event;
40
41   if (!WSAINITIALIZED) {
42     WSASetLastError(WSANOTINITIALISED);
43     return FALSE;
44   }
45
46   Event = CreateEvent(NULL, TRUE, FALSE, NULL);
47
48   if (Event == INVALID_HANDLE_VALUE)
49     WSASetLastError(WSA_INVALID_HANDLE);
50   
51   return (WSAEVENT)Event;
52 }
53
54
55 BOOL
56 EXPORT
57 WSAResetEvent(
58   IN  WSAEVENT hEvent)
59 {
60   BOOL Success;
61
62   if (!WSAINITIALIZED) {
63     WSASetLastError(WSANOTINITIALISED);
64     return FALSE;
65   }
66
67   Success = ResetEvent((HANDLE)hEvent);
68
69   if (!Success)
70     WSASetLastError(WSA_INVALID_HANDLE);
71
72   return Success;
73 }
74
75
76 BOOL
77 EXPORT
78 WSASetEvent(
79   IN  WSAEVENT hEvent)
80 {
81   BOOL Success;
82
83   if (!WSAINITIALIZED) {
84     WSASetLastError(WSANOTINITIALISED);
85     return FALSE;
86   }
87
88   Success = SetEvent((HANDLE)hEvent);
89
90   if (!Success)
91     WSASetLastError(WSA_INVALID_HANDLE);
92
93   return Success;
94 }
95
96
97 DWORD
98 EXPORT
99 WSAWaitForMultipleEvents(
100   IN  DWORD cEvents,
101   IN  CONST WSAEVENT FAR* lphEvents,
102   IN  BOOL fWaitAll,
103   IN  DWORD dwTimeout,
104   IN  BOOL fAlertable)
105 {
106   DWORD Status;
107
108   if (!WSAINITIALIZED) {
109     WSASetLastError(WSANOTINITIALISED);
110     return FALSE;
111   }
112
113   Status = WaitForMultipleObjectsEx(cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable);
114   if (Status == WAIT_FAILED) {
115     Status = GetLastError();
116
117     if (Status == ERROR_NOT_ENOUGH_MEMORY)
118       WSASetLastError(WSA_NOT_ENOUGH_MEMORY);
119     else if (Status == ERROR_INVALID_HANDLE)
120       WSASetLastError(WSA_INVALID_HANDLE);
121     else
122       WSASetLastError(WSA_INVALID_PARAMETER);
123
124     return WSA_WAIT_FAILED;
125   }
126
127   return Status;
128 }
129
130
131 INT
132 EXPORT
133 WSAEnumNetworkEvents(
134   IN  SOCKET s,
135   IN  WSAEVENT hEventObject,
136   OUT LPWSANETWORKEVENTS lpNetworkEvents)
137 {
138   PCATALOG_ENTRY Provider;
139   INT Status;
140   INT Errno;
141
142   if (!lpNetworkEvents) {
143     WSASetLastError(WSAEINVAL);
144     return SOCKET_ERROR;
145   }
146
147   if (!WSAINITIALIZED) {
148     WSASetLastError(WSANOTINITIALISED);
149     return SOCKET_ERROR;
150   }
151
152   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
153     WSASetLastError(WSAENOTSOCK);
154     return SOCKET_ERROR;
155   }
156
157   Status = Provider->ProcTable.lpWSPEnumNetworkEvents(
158     s, hEventObject, lpNetworkEvents, &Errno);
159
160   DereferenceProviderByPointer(Provider);
161
162   if (Status == SOCKET_ERROR)
163     WSASetLastError(Errno);
164
165   return Status;
166 }
167
168
169 INT
170 EXPORT
171 WSAEventSelect(
172     IN  SOCKET s,
173     IN  WSAEVENT hEventObject,
174     IN  LONG lNetworkEvents)
175 {
176   PCATALOG_ENTRY Provider;
177   INT Status;
178   INT Errno;
179   LONG i;
180
181   if (!WSAINITIALIZED) {
182     WSASetLastError(WSANOTINITIALISED);
183     return SOCKET_ERROR;
184   }
185
186   if (!ReferenceProviderByHandle((HANDLE)s, &Provider)) {
187     WSASetLastError(WSAENOTSOCK);
188     return SOCKET_ERROR;
189   }
190
191   Status = Provider->ProcTable.lpWSPEventSelect(
192     s, hEventObject, lNetworkEvents, &Errno);
193
194   DereferenceProviderByPointer(Provider);
195
196   if (Status == SOCKET_ERROR)
197     WSASetLastError(Errno);
198
199   return Status;
200 }
201
202 /* EOF */