[WS2_32] The current ws2_32 served us well, but it's time for ws2_32_new to shine...
[reactos.git] / reactos / dll / win32 / ws2_32 / src / nsprovid.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 API
4 * FILE: dll/win32/ws2_32_new/src/nsprovid.c
5 * PURPOSE: Namespace Provider Object
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <ws2_32.h>
12
13 /* FUNCTIONS *****************************************************************/
14
15 PNSQUERY_PROVIDER
16 WSAAPI
17 WsNqProvAllocate(VOID)
18 {
19 PNSQUERY_PROVIDER Provider;
20
21 /* Allocate the object */
22 Provider = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*Provider));
23
24 /* Return it */
25 return Provider;
26 }
27
28 DWORD
29 WSAAPI
30 WsNqProvInitialize(IN PNSQUERY_PROVIDER QueryProvider,
31 IN PNS_PROVIDER Provider)
32 {
33 /* Reference the provider */
34 InterlockedIncrement(&Provider->RefCount);
35
36 /* Set it as our own */
37 QueryProvider->Provider = Provider;
38
39 /* Return success */
40 return ERROR_SUCCESS;
41 }
42
43 VOID
44 WSAAPI
45 WsNqProvDelete(IN PNSQUERY_PROVIDER QueryProvider)
46 {
47 /* Check if we have a provider */
48 if (QueryProvider->Provider)
49 {
50 /* Dereference it */
51 WsNpDereference(QueryProvider->Provider);
52
53 /* Clear it */
54 QueryProvider->Provider = NULL;
55 }
56
57 /* Delete us */
58 HeapFree(WsSockHeap, 0, QueryProvider);
59 }
60
61 PNS_PROVIDER
62 WSAAPI
63 WsNpAllocate(VOID)
64 {
65 PNS_PROVIDER Provider;
66
67 /* Allocate the object */
68 Provider = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*Provider));
69
70 /* Set non-null data */
71 Provider->RefCount = 1;
72 Provider->Service.cbSize = sizeof(NSP_ROUTINE);
73
74 /* Return us */
75 return Provider;
76 }
77
78 DWORD
79 WSAAPI
80 WsNpInitialize(IN PNS_PROVIDER Provider,
81 IN LPWSTR DllName,
82 IN LPGUID ProviderId)
83 {
84 INT ErrorCode = ERROR_SUCCESS;
85 LPNSPSTARTUP NSPStartupProc;
86 CHAR AnsiPath[MAX_PATH], ExpandedDllPath[MAX_PATH];
87
88 /* Convert the path to ANSI */
89 WideCharToMultiByte(CP_ACP,
90 0,
91 DllName,
92 -1,
93 AnsiPath,
94 MAX_PATH,
95 NULL,
96 NULL);
97
98 /* Expand the DLL Path */
99 ExpandEnvironmentStringsA(AnsiPath,
100 ExpandedDllPath,
101 MAX_PATH);
102
103 /* Load the DLL */
104 Provider->DllHandle = LoadLibraryA(ExpandedDllPath);
105 if (!Provider->DllHandle)
106 {
107 /* Fail */
108 ErrorCode = WSAEPROVIDERFAILEDINIT;
109 goto Fail;
110 }
111
112 /* Get the pointer to NSPStartup */
113 NSPStartupProc = (LPNSPSTARTUP)GetProcAddress(Provider->DllHandle,
114 "NSPStartup");
115 if (!NSPStartupProc)
116 {
117 /* Fail */
118 ErrorCode = WSAEPROVIDERFAILEDINIT;
119 goto Fail;
120 }
121
122 /* Call it */
123 (*NSPStartupProc)(ProviderId, (LPNSP_ROUTINE)&Provider->Service.cbSize);
124
125 /* Save the provider ID */
126 Provider->ProviderId = *ProviderId;
127 return ErrorCode;
128
129 Fail:
130 /* Bail out */
131 if (Provider->DllHandle) FreeLibrary(Provider->DllHandle);
132 return ErrorCode;
133 }
134
135 DWORD
136 WSAAPI
137 WsNpNSPCleanup(IN PNS_PROVIDER Provider)
138 {
139 INT ErrorCode = ERROR_SUCCESS;
140 LPNSPCLEANUP lpNSPCleanup = NULL;
141
142 /* Make sure we have a loaded handle */
143 if (Provider->DllHandle)
144 {
145 /* Get the pointer and clear it */
146 lpNSPCleanup = InterlockedExchangePointer((PVOID*)&Provider->Service.NSPCleanup,
147 NULL);
148 /* If it's not NULL, call it */
149 if (lpNSPCleanup) ErrorCode = lpNSPCleanup(&Provider->ProviderId);
150 }
151
152 /* Return */
153 return ErrorCode;
154 }
155
156 VOID
157 WSAAPI
158 WsNpDelete(IN PNS_PROVIDER Provider)
159 {
160 /* Make sure we have a loaded handle */
161 if (Provider->DllHandle)
162 {
163 /* Clean us up */
164 WsNpNSPCleanup(Provider);
165
166 /* Unload the library */
167 FreeLibrary(Provider->DllHandle);
168
169 /* Clear the handle value */
170 Provider->DllHandle = NULL;
171 }
172 }
173
174 VOID
175 WSAAPI
176 WsNpDereference(IN PNS_PROVIDER Provider)
177 {
178 /* Decrease the reference count and check if it's zero */
179 if (!InterlockedDecrement(&Provider->RefCount))
180 {
181 /* Delete us*/
182 WsNpDelete(Provider);
183 }
184 }
185
186 DWORD
187 WSAAPI
188 WsNqProvLookupServiceEnd(IN PNSQUERY_PROVIDER QueryProvider)
189 {
190 /* Simply call the provider */
191 return WsNpLookupServiceEnd(QueryProvider->Provider,
192 QueryProvider->LookupHandle);
193 }
194
195 DWORD
196 WSAAPI
197 WsNqProvLookupServiceNext(IN PNSQUERY_PROVIDER QueryProvider,
198 IN DWORD ControlFlags,
199 IN PDWORD BufferLength,
200 LPWSAQUERYSETW Results)
201 {
202 /* Simply call the provider */
203 return WsNpLookupServiceNext(QueryProvider->Provider,
204 QueryProvider->LookupHandle,
205 ControlFlags,
206 BufferLength,
207 Results);
208 }
209
210 DWORD
211 WSAAPI
212 WsNqProvLookupServiceBegin(IN PNSQUERY_PROVIDER QueryProvider,
213 IN LPWSAQUERYSETW Restrictions,
214 IN LPWSASERVICECLASSINFOW ServiceClassInfo,
215 IN DWORD ControlFlags)
216 {
217 /* Simply call the provider */
218 return WsNpLookupServiceBegin(QueryProvider->Provider,
219 Restrictions,
220 ServiceClassInfo,
221 ControlFlags,
222 &QueryProvider->LookupHandle);
223 }
224
225 DWORD
226 WSAAPI
227 WsNpLookupServiceEnd(IN PNS_PROVIDER Provider,
228 IN HANDLE LookupHandle)
229 {
230 /* Call the NSP */
231 return Provider->Service.NSPLookupServiceEnd(LookupHandle);
232 }
233
234 DWORD
235 WSAAPI
236 WsNpLookupServiceNext(IN PNS_PROVIDER Provider,
237 IN HANDLE LookupHandle,
238 IN DWORD ControlFlags,
239 OUT PDWORD BufferLength,
240 OUT LPWSAQUERYSETW Results)
241 {
242 /* Call the NSP */
243 return Provider->Service.NSPLookupServiceNext(LookupHandle,
244 ControlFlags,
245 BufferLength,
246 Results);
247 }
248
249 DWORD
250 WSAAPI
251 WsNpLookupServiceBegin(IN PNS_PROVIDER Provider,
252 IN LPWSAQUERYSETW Restrictions,
253 IN LPWSASERVICECLASSINFOW ServiceClassInfo,
254 IN DWORD ControlFlags,
255 OUT PHANDLE LookupHandle)
256 {
257 /* Call the NSP */
258 return Provider->Service.NSPLookupServiceBegin(&Provider->ProviderId,
259 Restrictions,
260 ServiceClassInfo,
261 ControlFlags,
262 LookupHandle);
263 }
264