diff options
Diffstat (limited to 'CPP/Windows/Net.cpp')
-rw-r--r-- | CPP/Windows/Net.cpp | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/CPP/Windows/Net.cpp b/CPP/Windows/Net.cpp new file mode 100644 index 0000000..2a3952a --- /dev/null +++ b/CPP/Windows/Net.cpp | |||
@@ -0,0 +1,370 @@ | |||
1 | // Windows/Net.cpp | ||
2 | |||
3 | #include "StdAfx.h" | ||
4 | |||
5 | #include "../Common/MyBuffer.h" | ||
6 | |||
7 | #ifndef _UNICODE | ||
8 | #include "../Common/StringConvert.h" | ||
9 | #endif | ||
10 | |||
11 | #include "Net.h" | ||
12 | |||
13 | #ifndef _UNICODE | ||
14 | extern bool g_IsNT; | ||
15 | #endif | ||
16 | |||
17 | namespace NWindows { | ||
18 | namespace NNet { | ||
19 | |||
20 | DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource) | ||
21 | { | ||
22 | Close(); | ||
23 | DWORD result = ::WNetOpenEnum(scope, type, usage, netResource, &_handle); | ||
24 | _handleAllocated = (result == NO_ERROR); | ||
25 | return result; | ||
26 | } | ||
27 | |||
28 | #ifndef _UNICODE | ||
29 | DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource) | ||
30 | { | ||
31 | Close(); | ||
32 | DWORD result = ::WNetOpenEnumW(scope, type, usage, netResource, &_handle); | ||
33 | _handleAllocated = (result == NO_ERROR); | ||
34 | return result; | ||
35 | } | ||
36 | #endif | ||
37 | |||
38 | static void SetComplexString(bool &defined, CSysString &destString, LPCTSTR srcString) | ||
39 | { | ||
40 | defined = (srcString != 0); | ||
41 | if (defined) | ||
42 | destString = srcString; | ||
43 | else | ||
44 | destString.Empty(); | ||
45 | } | ||
46 | |||
47 | static void ConvertNETRESOURCEToCResource(const NETRESOURCE &netResource, CResource &resource) | ||
48 | { | ||
49 | resource.Scope = netResource.dwScope; | ||
50 | resource.Type = netResource.dwType; | ||
51 | resource.DisplayType = netResource.dwDisplayType; | ||
52 | resource.Usage = netResource.dwUsage; | ||
53 | SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName); | ||
54 | SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName); | ||
55 | SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment); | ||
56 | SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider); | ||
57 | } | ||
58 | |||
59 | static void SetComplexString2(LPTSTR *destString, bool defined, const CSysString &srcString) | ||
60 | { | ||
61 | if (defined) | ||
62 | *destString = srcString.Ptr_non_const(); | ||
63 | else | ||
64 | *destString = NULL; | ||
65 | } | ||
66 | |||
67 | static void ConvertCResourceToNETRESOURCE(const CResource &resource, NETRESOURCE &netResource) | ||
68 | { | ||
69 | netResource.dwScope = resource.Scope; | ||
70 | netResource.dwType = resource.Type; | ||
71 | netResource.dwDisplayType = resource.DisplayType; | ||
72 | netResource.dwUsage = resource.Usage; | ||
73 | SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName); | ||
74 | SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName); | ||
75 | SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment); | ||
76 | SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider); | ||
77 | } | ||
78 | |||
79 | #ifndef _UNICODE | ||
80 | |||
81 | static void SetComplexString(bool &defined, UString &destString, LPCWSTR src) | ||
82 | { | ||
83 | defined = (src != NULL); | ||
84 | if (defined) | ||
85 | destString = src; | ||
86 | else | ||
87 | destString.Empty(); | ||
88 | } | ||
89 | |||
90 | static void ConvertNETRESOURCEToCResource(const NETRESOURCEW &netResource, CResourceW &resource) | ||
91 | { | ||
92 | resource.Scope = netResource.dwScope; | ||
93 | resource.Type = netResource.dwType; | ||
94 | resource.DisplayType = netResource.dwDisplayType; | ||
95 | resource.Usage = netResource.dwUsage; | ||
96 | SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName); | ||
97 | SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName); | ||
98 | SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment); | ||
99 | SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider); | ||
100 | } | ||
101 | |||
102 | static void SetComplexString2(LPWSTR *destString, bool defined, const UString &srcString) | ||
103 | { | ||
104 | if (defined) | ||
105 | *destString = srcString.Ptr_non_const(); | ||
106 | else | ||
107 | *destString = NULL; | ||
108 | } | ||
109 | |||
110 | static void ConvertCResourceToNETRESOURCE(const CResourceW &resource, NETRESOURCEW &netResource) | ||
111 | { | ||
112 | netResource.dwScope = resource.Scope; | ||
113 | netResource.dwType = resource.Type; | ||
114 | netResource.dwDisplayType = resource.DisplayType; | ||
115 | netResource.dwUsage = resource.Usage; | ||
116 | SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName); | ||
117 | SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName); | ||
118 | SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment); | ||
119 | SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider); | ||
120 | } | ||
121 | |||
122 | static void ConvertResourceWToResource(const CResourceW &resourceW, CResource &resource) | ||
123 | { | ||
124 | *(CResourceBase *)&resource = *(CResourceBase *)&resourceW; | ||
125 | resource.LocalName = GetSystemString(resourceW.LocalName); | ||
126 | resource.RemoteName = GetSystemString(resourceW.RemoteName); | ||
127 | resource.Comment = GetSystemString(resourceW.Comment); | ||
128 | resource.Provider = GetSystemString(resourceW.Provider); | ||
129 | } | ||
130 | |||
131 | static void ConvertResourceToResourceW(const CResource &resource, CResourceW &resourceW) | ||
132 | { | ||
133 | *(CResourceBase *)&resourceW = *(CResourceBase *)&resource; | ||
134 | resourceW.LocalName = GetUnicodeString(resource.LocalName); | ||
135 | resourceW.RemoteName = GetUnicodeString(resource.RemoteName); | ||
136 | resourceW.Comment = GetUnicodeString(resource.Comment); | ||
137 | resourceW.Provider = GetUnicodeString(resource.Provider); | ||
138 | } | ||
139 | #endif | ||
140 | |||
141 | DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResource *resource) | ||
142 | { | ||
143 | NETRESOURCE netResource; | ||
144 | LPNETRESOURCE pointer = NULL; | ||
145 | if (resource) | ||
146 | { | ||
147 | ConvertCResourceToNETRESOURCE(*resource, netResource); | ||
148 | pointer = &netResource; | ||
149 | } | ||
150 | return Open(scope, type, usage, pointer); | ||
151 | } | ||
152 | |||
153 | #ifndef _UNICODE | ||
154 | DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResourceW *resource) | ||
155 | { | ||
156 | if (g_IsNT) | ||
157 | { | ||
158 | NETRESOURCEW netResource; | ||
159 | LPNETRESOURCEW pointer = NULL; | ||
160 | if (resource) | ||
161 | { | ||
162 | ConvertCResourceToNETRESOURCE(*resource, netResource); | ||
163 | pointer = &netResource; | ||
164 | } | ||
165 | return Open(scope, type, usage, pointer); | ||
166 | } | ||
167 | CResource resourceA; | ||
168 | CResource *pointer = NULL; | ||
169 | if (resource) | ||
170 | { | ||
171 | ConvertResourceWToResource(*resource, resourceA); | ||
172 | pointer = &resourceA; | ||
173 | } | ||
174 | return Open(scope, type, usage, pointer); | ||
175 | } | ||
176 | #endif | ||
177 | |||
178 | DWORD CEnum::Close() | ||
179 | { | ||
180 | if (!_handleAllocated) | ||
181 | return NO_ERROR; | ||
182 | DWORD result = ::WNetCloseEnum(_handle); | ||
183 | _handleAllocated = (result != NO_ERROR); | ||
184 | return result; | ||
185 | } | ||
186 | |||
187 | DWORD CEnum::Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize) | ||
188 | { | ||
189 | return ::WNetEnumResource(_handle, lpcCount, lpBuffer, lpBufferSize); | ||
190 | } | ||
191 | |||
192 | #ifndef _UNICODE | ||
193 | DWORD CEnum::NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize) | ||
194 | { | ||
195 | return ::WNetEnumResourceW(_handle, lpcCount, lpBuffer, lpBufferSize); | ||
196 | } | ||
197 | #endif | ||
198 | |||
199 | DWORD CEnum::Next(CResource &resource) | ||
200 | { | ||
201 | const DWORD kBufferSize = 16384; | ||
202 | CByteArr byteBuffer(kBufferSize); | ||
203 | LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer); | ||
204 | ZeroMemory(lpnrLocal, kBufferSize); | ||
205 | DWORD bufferSize = kBufferSize; | ||
206 | DWORD numEntries = 1; | ||
207 | DWORD result = Next(&numEntries, lpnrLocal, &bufferSize); | ||
208 | if (result != NO_ERROR) | ||
209 | return result; | ||
210 | if (numEntries != 1) | ||
211 | return (DWORD)E_FAIL; | ||
212 | ConvertNETRESOURCEToCResource(lpnrLocal[0], resource); | ||
213 | return result; | ||
214 | } | ||
215 | |||
216 | #ifndef _UNICODE | ||
217 | DWORD CEnum::Next(CResourceW &resource) | ||
218 | { | ||
219 | if (g_IsNT) | ||
220 | { | ||
221 | const DWORD kBufferSize = 16384; | ||
222 | CByteArr byteBuffer(kBufferSize); | ||
223 | LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer); | ||
224 | ZeroMemory(lpnrLocal, kBufferSize); | ||
225 | DWORD bufferSize = kBufferSize; | ||
226 | DWORD numEntries = 1; | ||
227 | DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize); | ||
228 | if (result != NO_ERROR) | ||
229 | return result; | ||
230 | if (numEntries != 1) | ||
231 | return (DWORD)E_FAIL; | ||
232 | ConvertNETRESOURCEToCResource(lpnrLocal[0], resource); | ||
233 | return result; | ||
234 | } | ||
235 | CResource resourceA; | ||
236 | DWORD result = Next(resourceA); | ||
237 | ConvertResourceToResourceW(resourceA, resource); | ||
238 | return result; | ||
239 | } | ||
240 | #endif | ||
241 | |||
242 | |||
243 | DWORD GetResourceParent(const CResource &resource, CResource &parentResource) | ||
244 | { | ||
245 | const DWORD kBufferSize = 16384; | ||
246 | CByteArr byteBuffer(kBufferSize); | ||
247 | LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer); | ||
248 | ZeroMemory(lpnrLocal, kBufferSize); | ||
249 | DWORD bufferSize = kBufferSize; | ||
250 | NETRESOURCE netResource; | ||
251 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
252 | DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize); | ||
253 | if (result != NO_ERROR) | ||
254 | return result; | ||
255 | ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); | ||
256 | return result; | ||
257 | } | ||
258 | |||
259 | #ifndef _UNICODE | ||
260 | DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource) | ||
261 | { | ||
262 | if (g_IsNT) | ||
263 | { | ||
264 | const DWORD kBufferSize = 16384; | ||
265 | CByteArr byteBuffer(kBufferSize); | ||
266 | LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer); | ||
267 | ZeroMemory(lpnrLocal, kBufferSize); | ||
268 | DWORD bufferSize = kBufferSize; | ||
269 | NETRESOURCEW netResource; | ||
270 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
271 | DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize); | ||
272 | if (result != NO_ERROR) | ||
273 | return result; | ||
274 | ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); | ||
275 | return result; | ||
276 | } | ||
277 | CResource resourceA, parentResourceA; | ||
278 | ConvertResourceWToResource(resource, resourceA); | ||
279 | DWORD result = GetResourceParent(resourceA, parentResourceA); | ||
280 | ConvertResourceToResourceW(parentResourceA, parentResource); | ||
281 | return result; | ||
282 | } | ||
283 | #endif | ||
284 | |||
285 | DWORD GetResourceInformation(const CResource &resource, | ||
286 | CResource &destResource, CSysString &systemPathPart) | ||
287 | { | ||
288 | const DWORD kBufferSize = 16384; | ||
289 | CByteArr byteBuffer(kBufferSize); | ||
290 | LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer); | ||
291 | ZeroMemory(lpnrLocal, kBufferSize); | ||
292 | DWORD bufferSize = kBufferSize; | ||
293 | NETRESOURCE netResource; | ||
294 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
295 | LPTSTR lplpSystem; | ||
296 | DWORD result = ::WNetGetResourceInformation(&netResource, | ||
297 | lpnrLocal, &bufferSize, &lplpSystem); | ||
298 | if (result != NO_ERROR) | ||
299 | return result; | ||
300 | if (lplpSystem != 0) | ||
301 | systemPathPart = lplpSystem; | ||
302 | ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource); | ||
303 | return result; | ||
304 | } | ||
305 | |||
306 | #ifndef _UNICODE | ||
307 | DWORD GetResourceInformation(const CResourceW &resource, | ||
308 | CResourceW &destResource, UString &systemPathPart) | ||
309 | { | ||
310 | if (g_IsNT) | ||
311 | { | ||
312 | const DWORD kBufferSize = 16384; | ||
313 | CByteArr byteBuffer(kBufferSize); | ||
314 | LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer); | ||
315 | ZeroMemory(lpnrLocal, kBufferSize); | ||
316 | DWORD bufferSize = kBufferSize; | ||
317 | NETRESOURCEW netResource; | ||
318 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
319 | LPWSTR lplpSystem; | ||
320 | DWORD result = ::WNetGetResourceInformationW(&netResource, | ||
321 | lpnrLocal, &bufferSize, &lplpSystem); | ||
322 | if (result != NO_ERROR) | ||
323 | return result; | ||
324 | if (lplpSystem != 0) | ||
325 | systemPathPart = lplpSystem; | ||
326 | ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource); | ||
327 | return result; | ||
328 | } | ||
329 | CResource resourceA, destResourceA; | ||
330 | ConvertResourceWToResource(resource, resourceA); | ||
331 | AString systemPathPartA; | ||
332 | DWORD result = GetResourceInformation(resourceA, destResourceA, systemPathPartA); | ||
333 | ConvertResourceToResourceW(destResourceA, destResource); | ||
334 | systemPathPart = GetUnicodeString(systemPathPartA); | ||
335 | return result; | ||
336 | } | ||
337 | #endif | ||
338 | |||
339 | DWORD AddConnection2(const CResource &resource, | ||
340 | LPCTSTR password, LPCTSTR userName, DWORD flags) | ||
341 | { | ||
342 | NETRESOURCE netResource; | ||
343 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
344 | return ::WNetAddConnection2(&netResource, | ||
345 | password, userName, flags); | ||
346 | } | ||
347 | |||
348 | DWORD AddConnection2(const CResource &resource, LPCTSTR password, LPCTSTR userName, DWORD flags); | ||
349 | |||
350 | #ifndef _UNICODE | ||
351 | DWORD AddConnection2(const CResourceW &resource, LPCWSTR password, LPCWSTR userName, DWORD flags) | ||
352 | { | ||
353 | if (g_IsNT) | ||
354 | { | ||
355 | NETRESOURCEW netResource; | ||
356 | ConvertCResourceToNETRESOURCE(resource, netResource); | ||
357 | return ::WNetAddConnection2W(&netResource,password, userName, flags); | ||
358 | } | ||
359 | CResource resourceA; | ||
360 | ConvertResourceWToResource(resource, resourceA); | ||
361 | const CSysString passwordA (GetSystemString(password)); | ||
362 | const CSysString userNameA (GetSystemString(userName)); | ||
363 | return AddConnection2(resourceA, | ||
364 | password ? (LPCTSTR)passwordA: 0, | ||
365 | userName ? (LPCTSTR)userNameA: 0, | ||
366 | flags); | ||
367 | } | ||
368 | #endif | ||
369 | |||
370 | }} | ||