4 * Copyright 2014 David Quintana
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <shlwapi_undoc.h>
24 #include "CMergedFolder.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(CMergedFolder
);
28 class CEnumMergedFolder
:
29 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
33 CComPtr
<IEnumIDList
> m_UserLocal
;
34 CComPtr
<IEnumIDList
> m_AllUSers
;
38 CEnumMergedFolder() : m_UserLocal(NULL
), m_AllUSers(NULL
), m_FirstDone(FALSE
) {}
39 ~CEnumMergedFolder() {}
41 DECLARE_NOT_AGGREGATABLE(CEnumMergedFolder
)
42 DECLARE_PROTECT_FINAL_CONSTRUCT()
44 BEGIN_COM_MAP(CEnumMergedFolder
)
45 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
48 HRESULT
Begin(HWND hwndOwner
, SHCONTF flags
, IShellFolder
* userLocal
, IShellFolder
* allUSers
)
51 hr
= userLocal
->EnumObjects(hwndOwner
, flags
, &m_UserLocal
);
52 if (FAILED_UNEXPECTEDLY(hr
))
54 hr
= userLocal
->EnumObjects(hwndOwner
, flags
, &m_AllUSers
);
55 if (FAILED_UNEXPECTEDLY(hr
))
64 virtual HRESULT STDMETHODCALLTYPE
Next(
75 hr
= m_UserLocal
->Next(celt
, rgelt
, pceltFetched
);
76 if (FAILED_UNEXPECTEDLY(hr
))
84 DWORD offset
= *pceltFetched
;
85 if (*pceltFetched
< celt
)
87 rgelt
+= *pceltFetched
;
88 celt
= (celt
- *pceltFetched
);
91 hr
= m_AllUSers
->Next(celt
, rgelt
, pceltFetched
);
92 if (FAILED_UNEXPECTEDLY(hr
))
95 *pceltFetched
+= offset
;
103 virtual HRESULT STDMETHODCALLTYPE
Skip(
110 virtual HRESULT STDMETHODCALLTYPE
Reset(
115 return m_UserLocal
->Reset();
118 virtual HRESULT STDMETHODCALLTYPE
Clone(
119 IEnumIDList
**ppenum
)
127 HRESULT WINAPI
CMergedFolder_Constructor(IShellFolder
* userLocal
, IShellFolder
* allUsers
, REFIID riid
, LPVOID
*ppv
)
131 CMergedFolder
* fld
= new CComObject
<CMergedFolder
>();
134 return E_OUTOFMEMORY
;
138 hr
= fld
->_SetSources(userLocal
, allUsers
);
140 hr
= fld
->QueryInterface(riid
, ppv
);
141 if (FAILED_UNEXPECTEDLY(hr
))
147 HRESULT
CMergedFolder::_SetSources(IShellFolder
* userLocal
, IShellFolder
* allUsers
)
149 m_UserLocal
= userLocal
;
150 m_AllUSers
= allUsers
;
155 HRESULT STDMETHODCALLTYPE
CMergedFolder::ParseDisplayName(
158 LPOLESTR lpszDisplayName
,
161 ULONG
*pdwAttributes
)
167 HRESULT STDMETHODCALLTYPE
CMergedFolder::EnumObjects(
170 IEnumIDList
**ppenumIDList
)
172 CEnumMergedFolder
* merged
= new CComObject
<CEnumMergedFolder
>();
173 *ppenumIDList
= merged
;
174 return merged
->Begin(hwndOwner
, grfFlags
, m_UserLocal
, m_AllUSers
);
177 HRESULT STDMETHODCALLTYPE
CMergedFolder::BindToObject(
185 hr
= m_UserLocal
->BindToObject(pidl
, pbcReserved
, riid
, ppvOut
);
189 hr
= m_AllUSers
->BindToObject(pidl
, pbcReserved
, riid
, ppvOut
);
194 HRESULT STDMETHODCALLTYPE
CMergedFolder::BindToStorage(
204 HRESULT STDMETHODCALLTYPE
CMergedFolder::CompareIDs(
213 HRESULT STDMETHODCALLTYPE
CMergedFolder::CreateViewObject(
222 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetAttributesOf(
224 LPCITEMIDLIST
*apidl
,
229 hr
= m_UserLocal
->GetAttributesOf(cidl
, apidl
, rgfInOut
);
234 hr
= m_AllUSers
->GetAttributesOf(cidl
, apidl
, rgfInOut
);
239 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetUIObjectOf(
242 LPCITEMIDLIST
*apidl
,
249 hr
= m_UserLocal
->GetUIObjectOf(hwndOwner
, cidl
, apidl
, riid
, prgfInOut
, ppvOut
);
253 hr
= m_AllUSers
->GetUIObjectOf(hwndOwner
, cidl
, apidl
, riid
, prgfInOut
, ppvOut
);
258 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDisplayNameOf(
265 hr
= m_UserLocal
->GetDisplayNameOf(pidl
, uFlags
, lpName
);
269 hr
= m_AllUSers
->GetDisplayNameOf(pidl
, uFlags
, lpName
);
274 HRESULT STDMETHODCALLTYPE
CMergedFolder::SetNameOf(
279 LPITEMIDLIST
*ppidlOut
)
286 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDefaultSearchGUID(
293 HRESULT STDMETHODCALLTYPE
CMergedFolder::EnumSearches(
294 IEnumExtraSearch
**ppenum
)
300 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDefaultColumn(
309 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDefaultColumnState(
311 SHCOLSTATEF
*pcsFlags
)
317 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDetailsEx(
319 const SHCOLUMNID
*pscid
,
326 HRESULT STDMETHODCALLTYPE
CMergedFolder::GetDetailsOf(
335 HRESULT STDMETHODCALLTYPE
CMergedFolder::MapColumnToSCID(