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
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCE netResource)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
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCEW netResource)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
SetComplexString(bool & defined,CSysString & destString,LPCTSTR srcString)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
ConvertNETRESOURCEToCResource(const NETRESOURCE & netResource,CResource & resource)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
SetComplexString2(LPTSTR * destString,bool defined,const CSysString & srcString)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
ConvertCResourceToNETRESOURCE(const CResource & resource,NETRESOURCE & netResource)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
SetComplexString(bool & defined,UString & destString,LPCWSTR src)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
ConvertNETRESOURCEToCResource(const NETRESOURCEW & netResource,CResourceW & resource)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
SetComplexString2(LPWSTR * destString,bool defined,const UString & srcString)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
ConvertCResourceToNETRESOURCE(const CResourceW & resource,NETRESOURCEW & netResource)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
ConvertResourceWToResource(const CResourceW & resourceW,CResource & resource)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
ConvertResourceToResourceW(const CResource & resource,CResourceW & resourceW)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
Open(DWORD scope,DWORD type,DWORD usage,const CResource * resource)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
Open(DWORD scope,DWORD type,DWORD usage,const CResourceW * resource)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
Close()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
Next(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)187 DWORD CEnum::Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
188 {
189 return ::WNetEnumResource(_handle, lpcCount, lpBuffer, lpBufferSize);
190 }
191
192 #ifndef _UNICODE
NextW(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)193 DWORD CEnum::NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
194 {
195 return ::WNetEnumResourceW(_handle, lpcCount, lpBuffer, lpBufferSize);
196 }
197 #endif
198
Next(CResource & resource)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
Next(CResourceW & resource)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
GetResourceParent(const CResource & resource,CResource & parentResource)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
GetResourceParent(const CResourceW & resource,CResourceW & parentResource)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
GetResourceInformation(const CResource & resource,CResource & destResource,CSysString & systemPathPart)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
GetResourceInformation(const CResourceW & resource,CResourceW & destResource,UString & systemPathPart)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
AddConnection2(const CResource & resource,LPCTSTR password,LPCTSTR userName,DWORD flags)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
AddConnection2(const CResourceW & resource,LPCWSTR password,LPCWSTR userName,DWORD flags)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 }}
371