widl: Strip last separator in append_namespaces if suffix is NULL.
[wine.git] / dlls / shell32 / shfldr_netplaces.c
blob71b21c5e73d190bb6fa8b793735d713d6a5bda72
1 /*
2 * Network Places (Neighbourhood) folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2003 Mike McCormack for CodeWeavers
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "config.h"
24 #include "wine/port.h"
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdarg.h>
29 #include <stdio.h>
31 #define COBJMACROS
33 #include "winerror.h"
34 #include "windef.h"
35 #include "winbase.h"
36 #include "winreg.h"
38 #include "pidl.h"
39 #include "undocshell.h"
40 #include "shell32_main.h"
41 #include "shresdef.h"
42 #include "wine/debug.h"
43 #include "wine/unicode.h"
44 #include "debughlp.h"
45 #include "shfldr.h"
47 WINE_DEFAULT_DEBUG_CHANNEL (shell);
49 /***********************************************************************
50 * IShellFolder implementation
53 typedef struct {
54 IShellFolder2 IShellFolder2_iface;
55 IPersistFolder2 IPersistFolder2_iface;
56 LONG ref;
58 /* both paths are parsible from the desktop */
59 LPITEMIDLIST pidlRoot; /* absolute pidl */
60 } IGenericSFImpl;
62 static const IShellFolder2Vtbl vt_ShellFolder2;
63 static const IPersistFolder2Vtbl vt_NP_PersistFolder2;
65 static inline IGenericSFImpl *impl_from_IShellFolder2(IShellFolder2 *iface)
67 return CONTAINING_RECORD(iface, IGenericSFImpl, IShellFolder2_iface);
70 static inline IGenericSFImpl *impl_from_IPersistFolder2(IPersistFolder2 *iface)
72 return CONTAINING_RECORD(iface, IGenericSFImpl, IPersistFolder2_iface);
76 static const shvheader networkplaces_header[] =
78 { NULL, 0, IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15 },
79 { NULL, 0, IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10 },
82 /**************************************************************************
83 * ISF_NetworkPlaces_Constructor
85 HRESULT WINAPI ISF_NetworkPlaces_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
87 IGenericSFImpl *sf;
89 TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid));
91 if (!ppv)
92 return E_POINTER;
93 if (pUnkOuter)
94 return CLASS_E_NOAGGREGATION;
96 sf = heap_alloc_zero (sizeof (*sf));
97 if (!sf)
98 return E_OUTOFMEMORY;
100 sf->ref = 0;
101 sf->IShellFolder2_iface.lpVtbl = &vt_ShellFolder2;
102 sf->IPersistFolder2_iface.lpVtbl = &vt_NP_PersistFolder2;
103 sf->pidlRoot = _ILCreateNetHood(); /* my qualified pidl */
105 if (FAILED (IShellFolder2_QueryInterface (&sf->IShellFolder2_iface, riid, ppv)))
107 IShellFolder2_Release (&sf->IShellFolder2_iface);
108 return E_NOINTERFACE;
111 TRACE ("--(%p)\n", sf);
112 return S_OK;
115 /**************************************************************************
116 * ISF_NetworkPlaces_fnQueryInterface
118 * NOTE
119 * supports not IPersist/IPersistFolder
121 static HRESULT WINAPI ISF_NetworkPlaces_fnQueryInterface (IShellFolder2 *iface, REFIID riid, LPVOID *ppvObj)
123 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
125 TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj);
127 *ppvObj = NULL;
129 if (IsEqualIID (riid, &IID_IUnknown) ||
130 IsEqualIID (riid, &IID_IShellFolder) ||
131 IsEqualIID (riid, &IID_IShellFolder2))
133 *ppvObj = &This->IShellFolder2_iface;
135 else if (IsEqualIID (riid, &IID_IPersist) ||
136 IsEqualIID (riid, &IID_IPersistFolder) ||
137 IsEqualIID (riid, &IID_IPersistFolder2))
139 *ppvObj = &This->IPersistFolder2_iface;
142 if (*ppvObj)
144 IUnknown_AddRef ((IUnknown *) (*ppvObj));
145 TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
146 return S_OK;
148 TRACE ("-- Interface: E_NOINTERFACE\n");
149 return E_NOINTERFACE;
152 static ULONG WINAPI ISF_NetworkPlaces_fnAddRef (IShellFolder2 * iface)
154 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
155 ULONG refCount = InterlockedIncrement(&This->ref);
157 TRACE ("(%p)->(count=%u)\n", This, refCount - 1);
159 return refCount;
162 static ULONG WINAPI ISF_NetworkPlaces_fnRelease (IShellFolder2 * iface)
164 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
165 ULONG refCount = InterlockedDecrement(&This->ref);
167 TRACE ("(%p)->(count=%u)\n", This, refCount + 1);
169 if (!refCount) {
170 TRACE ("-- destroying IShellFolder(%p)\n", This);
171 SHFree (This->pidlRoot);
172 heap_free (This);
174 return refCount;
177 /**************************************************************************
178 * ISF_NetworkPlaces_fnParseDisplayName
180 static HRESULT WINAPI ISF_NetworkPlaces_fnParseDisplayName (IShellFolder2 * iface,
181 HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName,
182 DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
184 static const WCHAR wszEntireNetwork[] = {'E','n','t','i','r','e','N','e','t','w','o','r','k'}; /* not nul-terminated */
185 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
186 HRESULT hr = E_INVALIDARG;
187 LPCWSTR szNext = NULL;
188 WCHAR szElement[MAX_PATH];
189 LPITEMIDLIST pidlTemp = NULL;
190 int len;
192 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", This,
193 hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName),
194 pchEaten, ppidl, pdwAttributes);
196 *ppidl = NULL;
198 szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
199 len = strlenW(szElement);
200 if (len == ARRAY_SIZE(wszEntireNetwork) && !strncmpiW(szElement, wszEntireNetwork, ARRAY_SIZE(wszEntireNetwork)))
202 pidlTemp = _ILCreateEntireNetwork();
203 if (pidlTemp)
204 hr = S_OK;
205 else
206 hr = E_OUTOFMEMORY;
208 else
209 FIXME("not implemented for %s\n", debugstr_w(lpszDisplayName));
211 if (SUCCEEDED(hr) && pidlTemp)
213 if (szNext && *szNext)
215 hr = SHELL32_ParseNextElement(iface, hwndOwner, pbcReserved,
216 &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
218 else
220 if (pdwAttributes && *pdwAttributes)
221 hr = SHELL32_GetItemAttributes(&This->IShellFolder2_iface, pidlTemp, pdwAttributes);
225 if (SUCCEEDED(hr))
226 *ppidl = pidlTemp;
227 else
228 ILFree(pidlTemp);
230 TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr);
232 return hr;
235 /**************************************************************************
236 * ISF_NetworkPlaces_fnEnumObjects
238 static HRESULT WINAPI ISF_NetworkPlaces_fnEnumObjects (IShellFolder2 * iface,
239 HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
241 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
242 IEnumIDListImpl *list;
244 TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This,
245 hwndOwner, dwFlags, ppEnumIDList);
247 if (!(list = IEnumIDList_Constructor()))
248 return E_OUTOFMEMORY;
249 *ppEnumIDList = &list->IEnumIDList_iface;
251 TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
253 return S_OK;
256 /**************************************************************************
257 * ISF_NetworkPlaces_fnBindToObject
259 static HRESULT WINAPI ISF_NetworkPlaces_fnBindToObject (IShellFolder2 * iface,
260 LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
262 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
264 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This,
265 pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
267 return SHELL32_BindToChild (This->pidlRoot, NULL, pidl, riid, ppvOut);
270 /**************************************************************************
271 * ISF_NetworkPlaces_fnBindToStorage
273 static HRESULT WINAPI ISF_NetworkPlaces_fnBindToStorage (IShellFolder2 * iface,
274 LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
276 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
278 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This,
279 pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
281 *ppvOut = NULL;
282 return E_NOTIMPL;
285 /**************************************************************************
286 * ISF_NetworkPlaces_fnCompareIDs
289 static HRESULT WINAPI ISF_NetworkPlaces_fnCompareIDs (IShellFolder2 * iface,
290 LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
292 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
293 int nReturn;
295 TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2);
296 nReturn = SHELL32_CompareIDs(&This->IShellFolder2_iface, lParam, pidl1, pidl2);
297 TRACE ("-- %i\n", nReturn);
298 return nReturn;
301 /**************************************************************************
302 * ISF_NetworkPlaces_fnCreateViewObject
304 static HRESULT WINAPI ISF_NetworkPlaces_fnCreateViewObject (IShellFolder2 * iface,
305 HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
307 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
308 LPSHELLVIEW pShellView;
309 HRESULT hr = E_INVALIDARG;
311 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This,
312 hwndOwner, shdebugstr_guid (riid), ppvOut);
314 if (!ppvOut)
315 return hr;
317 *ppvOut = NULL;
319 if (IsEqualIID (riid, &IID_IDropTarget))
321 WARN ("IDropTarget not implemented\n");
322 hr = E_NOTIMPL;
324 else if (IsEqualIID (riid, &IID_IContextMenu))
326 WARN ("IContextMenu not implemented\n");
327 hr = E_NOTIMPL;
329 else if (IsEqualIID (riid, &IID_IShellView))
331 pShellView = IShellView_Constructor ((IShellFolder *) iface);
332 if (pShellView)
334 hr = IShellView_QueryInterface (pShellView, riid, ppvOut);
335 IShellView_Release (pShellView);
338 TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut);
339 return hr;
342 /**************************************************************************
343 * ISF_NetworkPlaces_fnGetAttributesOf
345 static HRESULT WINAPI ISF_NetworkPlaces_fnGetAttributesOf (IShellFolder2 * iface,
346 UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut)
348 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
349 HRESULT hr = S_OK;
351 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This,
352 cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
354 if (!rgfInOut)
355 return E_INVALIDARG;
356 if (cidl && !apidl)
357 return E_INVALIDARG;
359 if (*rgfInOut == 0)
360 *rgfInOut = ~0;
362 if (cidl == 0)
364 IShellFolder2 *parent = NULL;
365 LPCITEMIDLIST rpidl = NULL;
367 hr = SHBindToParent(This->pidlRoot, &IID_IShellFolder2, (void **)&parent, &rpidl);
368 if(SUCCEEDED(hr))
370 SHELL32_GetItemAttributes(parent, rpidl, rgfInOut);
371 IShellFolder2_Release(parent);
374 else
376 while (cidl > 0 && *apidl)
378 pdump (*apidl);
379 SHELL32_GetItemAttributes(&This->IShellFolder2_iface, *apidl, rgfInOut);
380 apidl++;
381 cidl--;
385 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
386 *rgfInOut &= ~SFGAO_VALIDATE;
388 TRACE ("-- result=0x%08x\n", *rgfInOut);
389 return hr;
392 /**************************************************************************
393 * ISF_NetworkPlaces_fnGetUIObjectOf
395 * PARAMETERS
396 * hwndOwner [in] Parent window for any output
397 * cidl [in] array size
398 * apidl [in] simple pidl array
399 * riid [in] Requested Interface
400 * prgfInOut [ ] reserved
401 * ppvObject [out] Resulting Interface
404 static HRESULT WINAPI ISF_NetworkPlaces_fnGetUIObjectOf (IShellFolder2 * iface,
405 HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid,
406 UINT * prgfInOut, LPVOID * ppvOut)
408 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
410 LPITEMIDLIST pidl;
411 IUnknown *pObj = NULL;
412 HRESULT hr = E_INVALIDARG;
414 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", This,
415 hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut);
417 if (!ppvOut)
418 return hr;
420 *ppvOut = NULL;
422 if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1))
424 return ItemMenu_Constructor((IShellFolder*)iface, This->pidlRoot, apidl, cidl, riid, ppvOut);
426 else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1))
428 pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl);
429 hr = S_OK;
431 else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1))
433 pidl = ILCombine (This->pidlRoot, apidl[0]);
434 pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
435 SHFree (pidl);
436 hr = S_OK;
438 else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1))
440 pidl = ILCombine (This->pidlRoot, apidl[0]);
441 pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
442 SHFree (pidl);
443 hr = S_OK;
445 else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1))
447 hr = IShellFolder2_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj);
449 else
450 hr = E_NOINTERFACE;
452 if (SUCCEEDED(hr) && !pObj)
453 hr = E_OUTOFMEMORY;
455 *ppvOut = pObj;
456 TRACE ("(%p)->hr=0x%08x\n", This, hr);
457 return hr;
460 /**************************************************************************
461 * ISF_NetworkPlaces_fnGetDisplayNameOf
464 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDisplayNameOf (IShellFolder2 * iface,
465 LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
467 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
469 FIXME ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet);
470 pdump (pidl);
472 if (!strRet)
473 return E_INVALIDARG;
475 return E_NOTIMPL;
478 /**************************************************************************
479 * ISF_NetworkPlaces_fnSetNameOf
480 * Changes the name of a file object or subfolder, possibly changing its item
481 * identifier in the process.
483 * PARAMETERS
484 * hwndOwner [in] Owner window for output
485 * pidl [in] simple pidl of item to change
486 * lpszName [in] the items new display name
487 * dwFlags [in] SHGNO formatting flags
488 * ppidlOut [out] simple pidl returned
490 static HRESULT WINAPI ISF_NetworkPlaces_fnSetNameOf (IShellFolder2 * iface,
491 HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */
492 LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
494 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
496 FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This,
497 hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut);
498 return E_FAIL;
501 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDefaultSearchGUID(IShellFolder2 *iface, GUID *guid)
503 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
504 TRACE("(%p)->(%p)\n", This, guid);
505 return E_NOTIMPL;
508 static HRESULT WINAPI ISF_NetworkPlaces_fnEnumSearches (IShellFolder2 * iface,
509 IEnumExtraSearch ** ppenum)
511 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
513 FIXME ("(%p)\n", This);
514 return E_NOTIMPL;
517 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDefaultColumn(IShellFolder2 *iface, DWORD reserved,
518 ULONG *sort, ULONG *display)
520 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
522 TRACE("(%p)->(%#x, %p, %p)\n", This, reserved, sort, display);
524 return E_NOTIMPL;
527 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDefaultColumnState (
528 IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
530 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
532 TRACE ("(%p)->(%d %p)\n", This, iColumn, pcsFlags);
534 if (!pcsFlags || iColumn >= ARRAY_SIZE(networkplaces_header))
535 return E_INVALIDARG;
537 *pcsFlags = networkplaces_header[iColumn].pcsFlags;
539 return S_OK;
542 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDetailsEx (IShellFolder2 * iface,
543 LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
545 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
547 FIXME ("(%p)\n", This);
548 return E_NOTIMPL;
551 static HRESULT WINAPI ISF_NetworkPlaces_fnGetDetailsOf (IShellFolder2 * iface,
552 LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
554 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
556 FIXME ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd);
558 return E_NOTIMPL;
561 static HRESULT WINAPI ISF_NetworkPlaces_fnMapColumnToSCID (IShellFolder2 *iface, UINT column, SHCOLUMNID *scid)
563 IGenericSFImpl *This = impl_from_IShellFolder2(iface);
565 TRACE("(%p)->(%u %p)\n", This, column, scid);
567 if (column >= ARRAY_SIZE(networkplaces_header))
568 return E_INVALIDARG;
570 return shellfolder_map_column_to_scid(networkplaces_header, column, scid);
573 static const IShellFolder2Vtbl vt_ShellFolder2 = {
574 ISF_NetworkPlaces_fnQueryInterface,
575 ISF_NetworkPlaces_fnAddRef,
576 ISF_NetworkPlaces_fnRelease,
577 ISF_NetworkPlaces_fnParseDisplayName,
578 ISF_NetworkPlaces_fnEnumObjects,
579 ISF_NetworkPlaces_fnBindToObject,
580 ISF_NetworkPlaces_fnBindToStorage,
581 ISF_NetworkPlaces_fnCompareIDs,
582 ISF_NetworkPlaces_fnCreateViewObject,
583 ISF_NetworkPlaces_fnGetAttributesOf,
584 ISF_NetworkPlaces_fnGetUIObjectOf,
585 ISF_NetworkPlaces_fnGetDisplayNameOf,
586 ISF_NetworkPlaces_fnSetNameOf,
587 /* ShellFolder2 */
588 ISF_NetworkPlaces_fnGetDefaultSearchGUID,
589 ISF_NetworkPlaces_fnEnumSearches,
590 ISF_NetworkPlaces_fnGetDefaultColumn,
591 ISF_NetworkPlaces_fnGetDefaultColumnState,
592 ISF_NetworkPlaces_fnGetDetailsEx,
593 ISF_NetworkPlaces_fnGetDetailsOf,
594 ISF_NetworkPlaces_fnMapColumnToSCID
597 /************************************************************************
598 * INPFldr_PersistFolder2_QueryInterface
600 static HRESULT WINAPI INPFldr_PersistFolder2_QueryInterface (IPersistFolder2 * iface,
601 REFIID iid, LPVOID * ppvObj)
603 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
605 TRACE ("(%p)\n", This);
607 return IShellFolder2_QueryInterface (&This->IShellFolder2_iface, iid, ppvObj);
610 /************************************************************************
611 * INPFldr_PersistFolder2_AddRef
613 static ULONG WINAPI INPFldr_PersistFolder2_AddRef (IPersistFolder2 * iface)
615 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
617 TRACE ("(%p)->(count=%u)\n", This, This->ref);
619 return IShellFolder2_AddRef (&This->IShellFolder2_iface);
622 /************************************************************************
623 * ISFPersistFolder_Release
625 static ULONG WINAPI INPFldr_PersistFolder2_Release (IPersistFolder2 * iface)
627 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
629 TRACE ("(%p)->(count=%u)\n", This, This->ref);
631 return IShellFolder2_Release (&This->IShellFolder2_iface);
634 /************************************************************************
635 * INPFldr_PersistFolder2_GetClassID
637 static HRESULT WINAPI INPFldr_PersistFolder2_GetClassID (
638 IPersistFolder2 * iface, CLSID * lpClassId)
640 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
642 TRACE ("(%p)\n", This);
644 if (!lpClassId)
645 return E_POINTER;
647 *lpClassId = CLSID_NetworkPlaces;
649 return S_OK;
652 /************************************************************************
653 * INPFldr_PersistFolder2_Initialize
655 * NOTES: it makes no sense to change the pidl
657 static HRESULT WINAPI INPFldr_PersistFolder2_Initialize (
658 IPersistFolder2 * iface, LPCITEMIDLIST pidl)
660 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
662 TRACE ("(%p)->(%p)\n", This, pidl);
664 return E_NOTIMPL;
667 /**************************************************************************
668 * IPersistFolder2_fnGetCurFolder
670 static HRESULT WINAPI INPFldr_PersistFolder2_GetCurFolder (
671 IPersistFolder2 * iface, LPITEMIDLIST * pidl)
673 IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
675 TRACE ("(%p)->(%p)\n", This, pidl);
677 if (!pidl)
678 return E_POINTER;
680 *pidl = ILClone (This->pidlRoot);
682 return S_OK;
685 static const IPersistFolder2Vtbl vt_NP_PersistFolder2 =
687 INPFldr_PersistFolder2_QueryInterface,
688 INPFldr_PersistFolder2_AddRef,
689 INPFldr_PersistFolder2_Release,
690 INPFldr_PersistFolder2_GetClassID,
691 INPFldr_PersistFolder2_Initialize,
692 INPFldr_PersistFolder2_GetCurFolder