2 * Network Places (Neighbourhood) folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2003 Mike McCormack for Codeweavers
7 * Copyright 2009 Andrew Hill
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
28 /***********************************************************************
29 * IShellFolder implementation
32 static shvheader NetworkPlacesSFHeader
[] = {
33 {IDS_SHV_COLUMN8
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
34 {IDS_SHV_COLUMN13
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
35 {IDS_SHV_COLUMN_WORKGROUP
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
36 {IDS_SHV_NETWORKLOCATION
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15}
40 #define COLUMN_CATEGORY 1
41 #define COLUMN_WORKGROUP 2
42 #define COLUMN_NETLOCATION 3
44 #define NETWORKPLACESSHELLVIEWCOLUMNS 4
46 CNetFolder::CNetFolder()
51 CNetFolder::~CNetFolder()
53 TRACE("-- destroying IShellFolder(%p)\n", this);
57 HRESULT WINAPI
CNetFolder::FinalConstruct()
59 pidlRoot
= _ILCreateGuid(PT_GUID
, CLSID_NetworkPlaces
); /* my qualified pidl */
65 /**************************************************************************
66 * CNetFolder::ParseDisplayName
68 HRESULT WINAPI
CNetFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbcReserved
, LPOLESTR lpszDisplayName
,
69 DWORD
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, DWORD
*pdwAttributes
)
71 HRESULT hr
= E_UNEXPECTED
;
73 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
74 hwndOwner
, pbcReserved
, lpszDisplayName
, debugstr_w (lpszDisplayName
),
75 pchEaten
, ppidl
, pdwAttributes
);
79 *pchEaten
= 0; /* strange but like the original */
81 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr
);
86 /**************************************************************************
87 * CNetFolder::EnumObjects
89 HRESULT WINAPI
CNetFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
91 TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this,
92 hwndOwner
, dwFlags
, ppEnumIDList
);
94 *ppEnumIDList
= NULL
; //IEnumIDList_Constructor();
96 TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList
);
98 // return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY;
101 /**************************************************************************
102 * CNetFolder::BindToObject
104 HRESULT WINAPI
CNetFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
106 TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this,
107 pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
109 return SHELL32_BindToChild(pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
112 /**************************************************************************
113 * CNetFolder::BindToStorage
115 HRESULT WINAPI
CNetFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
117 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
118 pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
124 /**************************************************************************
125 * CNetFolder::CompareIDs
128 HRESULT WINAPI
CNetFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
132 TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam
, pidl1
, pidl2
);
133 nReturn
= SHELL32_CompareIDs(this, lParam
, pidl1
, pidl2
);
134 TRACE("-- %i\n", nReturn
);
138 /**************************************************************************
139 * CNetFolder::CreateViewObject
141 HRESULT WINAPI
CNetFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
143 CComPtr
<IShellView
> pShellView
;
144 HRESULT hr
= E_INVALIDARG
;
146 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
147 hwndOwner
, shdebugstr_guid (&riid
), ppvOut
);
154 if (IsEqualIID(riid
, IID_IDropTarget
))
156 WARN("IDropTarget not implemented\n");
159 else if (IsEqualIID(riid
, IID_IContextMenu
))
161 WARN("IContextMenu not implemented\n");
164 else if (IsEqualIID(riid
, IID_IShellView
))
166 hr
= IShellView_Constructor((IShellFolder
*)this, &pShellView
);
169 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
172 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut
);
176 /**************************************************************************
177 * CNetFolder::GetAttributesOf
179 HRESULT WINAPI
CNetFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
181 static const DWORD dwNethoodAttributes
=
182 SFGAO_STORAGE
| SFGAO_HASPROPSHEET
| SFGAO_STORAGEANCESTOR
|
183 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_FILESYSTEM
| SFGAO_HASSUBFOLDER
| SFGAO_CANRENAME
| SFGAO_CANDELETE
;
186 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", this,
187 cidl
, apidl
, rgfInOut
, rgfInOut
? *rgfInOut
: 0);
198 *rgfInOut
= dwNethoodAttributes
;
201 while (cidl
> 0 && *apidl
)
204 SHELL32_GetItemAttributes(this, *apidl
, rgfInOut
);
210 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
211 *rgfInOut
&= ~SFGAO_VALIDATE
;
213 TRACE("-- result=0x%08x\n", *rgfInOut
);
217 /**************************************************************************
218 * CNetFolder::GetUIObjectOf
221 * hwndOwner [in] Parent window for any output
222 * cidl [in] array size
223 * apidl [in] simple pidl array
224 * riid [in] Requested Interface
225 * prgfInOut [ ] reserved
226 * ppvObject [out] Resulting Interface
229 HRESULT WINAPI
CNetFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
,
230 UINT
* prgfInOut
, LPVOID
* ppvOut
)
233 IUnknown
*pObj
= NULL
;
234 HRESULT hr
= E_INVALIDARG
;
236 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
237 hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
244 if (IsEqualIID(riid
, IID_IContextMenu
) && (cidl
>= 1))
246 IContextMenu
* pCm
= NULL
;
247 hr
= CDefFolderMenu_Create2(pidlRoot
, hwndOwner
, cidl
, apidl
, static_cast<IShellFolder
*>(this), NULL
, 0, NULL
, &pCm
);
250 else if (IsEqualIID(riid
, IID_IDataObject
) && (cidl
>= 1))
252 IDataObject
* pDo
= NULL
;
253 hr
= IDataObject_Constructor (hwndOwner
, pidlRoot
, apidl
, cidl
, &pDo
);
256 else if (IsEqualIID(riid
, IID_IExtractIconA
) && (cidl
== 1))
258 pidl
= ILCombine (pidlRoot
, apidl
[0]);
259 pObj
= IExtractIconA_Constructor (pidl
);
263 else if (IsEqualIID(riid
, IID_IExtractIconW
) && (cidl
== 1))
265 pidl
= ILCombine (pidlRoot
, apidl
[0]);
266 pObj
= IExtractIconW_Constructor (pidl
);
270 else if (IsEqualIID(riid
, IID_IDropTarget
) && (cidl
>= 1))
272 IDropTarget
* pDt
= NULL
;
273 hr
= this->QueryInterface(IID_PPV_ARG(IDropTarget
, &pDt
));
279 if (SUCCEEDED(hr
) && !pObj
)
283 TRACE("(%p)->hr=0x%08x\n", this, hr
);
287 /**************************************************************************
288 * CNetFolder::GetDisplayNameOf
291 HRESULT WINAPI
CNetFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
293 FIXME("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
302 /**************************************************************************
303 * CNetFolder::SetNameOf
304 * Changes the name of a file object or subfolder, possibly changing its item
305 * identifier in the process.
308 * hwndOwner [in] Owner window for output
309 * pidl [in] simple pidl of item to change
310 * lpszName [in] the items new display name
311 * dwFlags [in] SHGNO formatting flags
312 * ppidlOut [out] simple pidl returned
314 HRESULT WINAPI
CNetFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /*simple pidl */
315 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
317 FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this,
318 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
322 HRESULT WINAPI
CNetFolder::GetDefaultSearchGUID(GUID
*pguid
)
324 FIXME("(%p)\n", this);
328 HRESULT WINAPI
CNetFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
330 FIXME("(%p)\n", this);
334 HRESULT WINAPI
CNetFolder::GetDefaultColumn (DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
336 TRACE("(%p)\n", this);
346 HRESULT WINAPI
CNetFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
348 TRACE("(%p)\n", this);
350 if (!pcsFlags
|| iColumn
>= NETWORKPLACESSHELLVIEWCOLUMNS
)
352 *pcsFlags
= NetworkPlacesSFHeader
[iColumn
].pcsFlags
;
356 HRESULT WINAPI
CNetFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
358 FIXME("(%p)\n", this);
362 HRESULT WINAPI
CNetFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
364 WCHAR buffer
[MAX_PATH
] = {0};
367 if (iColumn
>= NETWORKPLACESSHELLVIEWCOLUMNS
)
370 psd
->fmt
= NetworkPlacesSFHeader
[iColumn
].fmt
;
371 psd
->cxChar
= NetworkPlacesSFHeader
[iColumn
].cxChar
;
374 psd
->str
.uType
= STRRET_WSTR
;
375 if (LoadStringW(shell32_hInstance
, NetworkPlacesSFHeader
[iColumn
].colnameid
, buffer
, _countof(buffer
)))
376 hr
= SHStrDupW(buffer
, &psd
->str
.pOleStr
);
381 if (iColumn
== COLUMN_NAME
)
382 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
, &psd
->str
);
384 FIXME("(%p)->(%p %i %p)\n", this, pidl
, iColumn
, psd
);
389 HRESULT WINAPI
CNetFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
391 FIXME("(%p)\n", this);
396 /************************************************************************
397 * CNetFolder::GetClassID
399 HRESULT WINAPI
CNetFolder::GetClassID(CLSID
*lpClassId
)
401 TRACE("(%p)\n", this);
406 *lpClassId
= CLSID_NetworkPlaces
;
411 /************************************************************************
412 * CNetFolder::Initialize
414 * NOTES: it makes no sense to change the pidl
416 HRESULT WINAPI
CNetFolder::Initialize(LPCITEMIDLIST pidl
)
418 TRACE("(%p)->(%p)\n", this, pidl
);
423 /**************************************************************************
424 * CNetFolder::GetCurFolder
426 HRESULT WINAPI
CNetFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
428 TRACE("(%p)->(%p)\n", this, pidl
);
433 *pidl
= ILClone(pidlRoot
);