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