3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: FolderItem(s) implementation
5 * COPYRIGHT: Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
10 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
13 CFolderItem::CFolderItem()
17 CFolderItem::~CFolderItem()
21 HRESULT
CFolderItem::Initialize(Folder
* folder
, LPITEMIDLIST idlist
)
23 m_idlist
.Attach(ILClone(idlist
));
28 // *** FolderItem methods ***
29 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Application(IDispatch
**ppid
)
31 TRACE("(%p, %p)\n", this, ppid
);
32 return m_Folder
->get_Application(ppid
);
35 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Parent(IDispatch
**ppid
)
37 TRACE("(%p, %p)\n", this, ppid
);
46 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Name(BSTR
*pbs
)
48 TRACE("(%p, %p)\n", this, pbs
);
52 CComPtr
<IShellFolder2
> Parent
;
53 LPCITEMIDLIST last_part
;
54 HRESULT hr
= SHBindToParent(m_idlist
, IID_PPV_ARG(IShellFolder2
, &Parent
), &last_part
);
55 if (FAILED_UNEXPECTEDLY(hr
))
59 hr
= Parent
->GetDisplayNameOf(last_part
, SHGDN_INFOLDER
, &strret
);
60 if (!FAILED_UNEXPECTEDLY(hr
))
61 hr
= StrRetToBSTR(&strret
, last_part
, pbs
);
66 HRESULT STDMETHODCALLTYPE
CFolderItem::put_Name(BSTR bs
)
68 TRACE("(%p, %s)\n", this, wine_dbgstr_w(bs
));
72 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Path(BSTR
*pbs
)
74 CComPtr
<IShellFolder
> psfDesktop
;
76 HRESULT hr
= SHGetDesktopFolder(&psfDesktop
);
81 hr
= psfDesktop
->GetDisplayNameOf(m_idlist
, SHGDN_FORPARSING
, &strret
);
82 if (FAILED_UNEXPECTEDLY(hr
))
85 return StrRetToBSTR(&strret
, NULL
, pbs
);
88 HRESULT STDMETHODCALLTYPE
CFolderItem::get_GetLink(IDispatch
**ppid
)
90 TRACE("(%p, %p)\n", this, ppid
);
94 HRESULT STDMETHODCALLTYPE
CFolderItem::get_GetFolder(IDispatch
**ppid
)
96 TRACE("(%p, %p)\n", this, ppid
);
100 HRESULT STDMETHODCALLTYPE
CFolderItem::get_IsLink(VARIANT_BOOL
*pb
)
102 TRACE("(%p, %p)\n", this, pb
);
106 HRESULT STDMETHODCALLTYPE
CFolderItem::get_IsFolder(VARIANT_BOOL
*pb
)
108 TRACE("(%p, %p)\n", this, pb
);
112 HRESULT STDMETHODCALLTYPE
CFolderItem::get_IsFileSystem(VARIANT_BOOL
*pb
)
114 TRACE("(%p, %p)\n", this, pb
);
118 HRESULT STDMETHODCALLTYPE
CFolderItem::get_IsBrowsable(VARIANT_BOOL
*pb
)
120 TRACE("(%p, %p)\n", this, pb
);
124 HRESULT STDMETHODCALLTYPE
CFolderItem::get_ModifyDate(DATE
*pdt
)
126 TRACE("(%p, %p)\n", this, pdt
);
130 HRESULT STDMETHODCALLTYPE
CFolderItem::put_ModifyDate(DATE dt
)
132 TRACE("(%p, %f)\n", this, dt
);
136 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Size(LONG
*pul
)
138 TRACE("(%p, %p)\n", this, pul
);
142 HRESULT STDMETHODCALLTYPE
CFolderItem::get_Type(BSTR
*pbs
)
144 TRACE("(%p, %p)\n", this, pbs
);
148 HRESULT STDMETHODCALLTYPE
CFolderItem::Verbs(FolderItemVerbs
**ppfic
)
152 CFolderItemVerbs
* verbs
= new CComObject
<CFolderItemVerbs
>();
153 HRESULT hr
= verbs
->Init(m_idlist
);
154 if (FAILED_UNEXPECTEDLY(hr
))
164 HRESULT STDMETHODCALLTYPE
CFolderItem::InvokeVerb(VARIANT vVerb
)
166 TRACE("(%p, %s)\n", this, wine_dbgstr_variant(&vVerb
));
172 CFolderItems::CFolderItems()
177 CFolderItems::~CFolderItems()
181 HRESULT
CFolderItems::Initialize(LPITEMIDLIST idlist
, Folder
* parent
)
183 CComPtr
<IShellFolder
> psfDesktop
, psfTarget
;
185 m_idlist
.Attach(ILClone(idlist
));
187 HRESULT hr
= SHGetDesktopFolder(&psfDesktop
);
188 if (FAILED_UNEXPECTEDLY(hr
))
191 hr
= psfDesktop
->BindToObject(m_idlist
, NULL
, IID_PPV_ARG(IShellFolder
, &psfTarget
));
192 if (FAILED_UNEXPECTEDLY(hr
))
195 hr
= psfTarget
->EnumObjects(NULL
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
, &m_EnumIDList
);
197 if (FAILED_UNEXPECTEDLY(hr
))
204 // *** FolderItems methods ***
205 HRESULT STDMETHODCALLTYPE
CFolderItems::get_Count(long *plCount
)
217 HRESULT hr
= m_EnumIDList
->Reset();
218 if (FAILED_UNEXPECTEDLY(hr
))
221 CComHeapPtr
<ITEMIDLIST
> Pidl
;
222 while ((hr
= m_EnumIDList
->Next(1, &Pidl
, 0)) != S_FALSE
)
234 HRESULT STDMETHODCALLTYPE
CFolderItems::get_Application(IDispatch
**ppid
)
236 TRACE("(%p, %p)\n", this, ppid
);
237 return m_Folder
->get_Application(ppid
);
240 HRESULT STDMETHODCALLTYPE
CFolderItems::get_Parent(IDispatch
**ppid
)
242 TRACE("(%p, %p)\n", this, ppid
);
250 HRESULT STDMETHODCALLTYPE
CFolderItems::Item(VARIANT var
, FolderItem
**ppid
)
258 hr
= VariantCopyInd(&index
, &var
);
262 if (V_VT(&index
) == VT_I2
)
263 VariantChangeType(&index
, &index
, 0, VT_I4
);
265 if (V_VT(&index
) == VT_I4
)
267 ULONG count
= V_UI4(&index
);
269 hr
= m_EnumIDList
->Reset();
270 if (FAILED_UNEXPECTEDLY(hr
))
273 hr
= m_EnumIDList
->Skip(count
);
275 if (FAILED_UNEXPECTEDLY(hr
))
278 CComHeapPtr
<ITEMIDLIST
> spPidl
;
279 hr
= m_EnumIDList
->Next(1, &spPidl
, 0);
280 if (FAILED_UNEXPECTEDLY(hr
))
282 hr
= ShellObjectCreatorInit
<CFolderItem
>(m_Folder
, static_cast<LPITEMIDLIST
>(spPidl
), IID_PPV_ARG(FolderItem
, ppid
));
283 if (FAILED_UNEXPECTEDLY(hr
))
287 else if (V_VT(&index
) == VT_BSTR
)
292 hr
= m_Folder
->ParseName(V_BSTR(&index
), ppid
);
293 if (FAILED_UNEXPECTEDLY(hr
))
298 FIXME("Index type %d not handled.\n", V_VT(&index
));
302 HRESULT STDMETHODCALLTYPE
CFolderItems::_NewEnum(IUnknown
**ppunk
)
304 return ShellObjectCreatorInit
<CFolderItems
>(static_cast<LPITEMIDLIST
>(m_idlist
), m_Folder
, IID_FolderItems
, reinterpret_cast<void**>(ppunk
));