Reactos
1/*
2 * PROJECT: shell32
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Folder implementation
5 * COPYRIGHT: Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8#include "precomp.h"
9
10WINE_DEFAULT_DEBUG_CHANNEL(shell);
11
12
13CFolder::CFolder()
14{
15}
16
17CFolder::~CFolder()
18{
19}
20
21HRESULT CFolder::Initialize(LPITEMIDLIST idlist)
22{
23 m_idlist.Attach(ILClone(idlist));
24 return CShellDispatch_Constructor(IID_PPV_ARG(IShellDispatch, &m_Application));
25}
26
27HRESULT CFolder::GetShellFolder(CComPtr<IShellFolder>& psfCurrent)
28{
29 CComPtr<IShellFolder> psfDesktop;
30
31 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
32 if (FAILED_UNEXPECTEDLY(hr))
33 return hr;
34
35 return psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent));
36}
37
38// *** Folder methods ***
39HRESULT STDMETHODCALLTYPE CFolder::get_Title(BSTR *pbs)
40{
41 if (!pbs)
42 return E_POINTER;
43
44 WCHAR path[MAX_PATH+2] = {0};
45 HRESULT hr = ILGetDisplayNameExW(NULL, m_idlist, path, ILGDN_INFOLDER) ? S_OK : E_FAIL;
46 if (FAILED_UNEXPECTEDLY(hr))
47 return hr;
48
49 *pbs = SysAllocString(path);
50 return S_OK;
51}
52
53HRESULT STDMETHODCALLTYPE CFolder::get_Application(IDispatch **ppid)
54{
55 TRACE("(%p, %p)\n", this, ppid);
56
57 if (!ppid)
58 return E_INVALIDARG;
59
60 *ppid = m_Application;
61 (*ppid)->AddRef();
62
63 return S_OK;
64}
65
66HRESULT STDMETHODCALLTYPE CFolder::get_Parent(IDispatch **ppid)
67{
68 TRACE("(%p %p)\n", this, ppid);
69
70 if (ppid)
71 *ppid = NULL;
72
73 return E_NOTIMPL;
74}
75
76HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder(Folder **ppsf)
77{
78 TRACE("(%p, %p)\n", this);
79
80 *ppsf = NULL;
81
82 return E_NOTIMPL;
83}
84
85HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid)
86{
87 /* FolderItems_Constructor */
88 return ShellObjectCreatorInit<CFolderItems>(static_cast<LPITEMIDLIST>(m_idlist), this, IID_PPV_ARG(FolderItems, ppid));
89}
90
91HRESULT STDMETHODCALLTYPE CFolder::ParseName(BSTR bName, FolderItem **ppid)
92{
93 TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
94 if (!ppid)
95 return E_POINTER;
96 *ppid = NULL;
97
98 CComPtr<IShellFolder> psfCurrent;
99 HRESULT hr = GetShellFolder(psfCurrent);
100 if (FAILED_UNEXPECTEDLY(hr))
101 return hr;
102
103 CComHeapPtr<ITEMIDLIST_RELATIVE> relativePidl;
104 hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL);
105 if (!SUCCEEDED(hr))
106 return S_FALSE;
107
108 CComHeapPtr<ITEMIDLIST> combined;
109 combined.Attach(ILCombine(m_idlist, relativePidl));
110
111 return ShellObjectCreatorInit<CFolderItem>(this, static_cast<LPITEMIDLIST>(combined), IID_PPV_ARG(FolderItem, ppid));
112}
113
114HRESULT STDMETHODCALLTYPE CFolder::NewFolder(BSTR bName, VARIANT vOptions)
115{
116 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions));
117 return E_NOTIMPL;
118}
119
120HRESULT STDMETHODCALLTYPE CFolder::MoveHere(VARIANT vItem, VARIANT vOptions)
121{
122 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
123 return E_NOTIMPL;
124}
125
126HRESULT STDMETHODCALLTYPE CFolder::CopyHere(VARIANT vItem, VARIANT vOptions)
127{
128 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
129 return E_NOTIMPL;
130}
131
132HRESULT STDMETHODCALLTYPE CFolder::GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs)
133{
134 TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs);
135 return E_NOTIMPL;
136}
137
138
139// *** Folder2 methods ***
140HRESULT STDMETHODCALLTYPE CFolder::get_Self(FolderItem **ppfi)
141{
142 TRACE("(%p, %p)\n", this, ppfi);
143 if (!ppfi)
144 return E_POINTER;
145
146 return ShellObjectCreatorInit<CFolderItem>(this, static_cast<LPITEMIDLIST>(m_idlist), IID_PPV_ARG(FolderItem, ppfi));
147}
148
149HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus(LONG *pul)
150{
151 TRACE("(%p, %p)\n", this, pul);
152 return E_NOTIMPL;
153}
154
155HRESULT STDMETHODCALLTYPE CFolder::Synchronize()
156{
157 TRACE("(%p)\n", this);
158 return E_NOTIMPL;
159}
160
161HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade)
162{
163 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
164 return E_NOTIMPL;
165}
166
167HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade()
168{
169 TRACE("(%p)\n", this);
170 return E_NOTIMPL;
171}
172
173