1d86b307e785d3ca89c0c948d62b80d3ebf20bab
[reactos.git] / reactos / dll / win32 / shell32 / CFolder.cpp
1 /*
2 * Folder implementation
3 *
4 * Copyright 2015 Mark Jansen
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #include "precomp.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(shell);
24
25
26 CFolder::CFolder()
27 {
28 }
29
30 CFolder::~CFolder()
31 {
32 }
33
34 void CFolder::Init(LPITEMIDLIST idlist)
35 {
36 m_idlist.Attach(idlist);
37 }
38
39 // *** IDispatch methods ***
40 HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfoCount(UINT *pctinfo)
41 {
42 TRACE("(%p, %p)\n", this, pctinfo);
43 return E_NOTIMPL;
44 }
45
46 HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
47 {
48 TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
49 return E_NOTIMPL;
50 }
51
52 HRESULT STDMETHODCALLTYPE CFolder::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
53 {
54 TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
55 return E_NOTIMPL;
56 }
57
58 HRESULT STDMETHODCALLTYPE CFolder::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
59 {
60 TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
61 pDispParams, pVarResult, pExcepInfo, puArgErr);
62 return E_NOTIMPL;
63 }
64
65
66 // *** Folder methods ***
67 HRESULT STDMETHODCALLTYPE CFolder::get_Title(BSTR *pbs)
68 {
69 TRACE("(%p, %p)\n", this, pbs);
70 return E_NOTIMPL;
71 }
72
73 HRESULT STDMETHODCALLTYPE CFolder::get_Application(IDispatch **ppid)
74 {
75 TRACE("(%p, %p)\n", this, ppid);
76 return E_NOTIMPL;
77 }
78
79 HRESULT STDMETHODCALLTYPE CFolder::get_Parent(IDispatch **ppid)
80 {
81 TRACE("(%p %p)\n", this, ppid);
82 return E_NOTIMPL;
83 }
84
85 HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder(Folder **ppsf)
86 {
87 TRACE("(%p, %p)\n", this);
88 return E_NOTIMPL;
89 }
90
91 HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid)
92 {
93 TRACE("(%p, %p)\n", this, ppid);
94 return E_NOTIMPL;
95 }
96
97 HRESULT STDMETHODCALLTYPE CFolder::ParseName(BSTR bName, FolderItem **ppid)
98 {
99 TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
100
101 CComPtr<IShellFolder> psfDesktop;
102
103 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
104 if (FAILED_UNEXPECTEDLY(hr))
105 return hr;
106
107 CComPtr<IShellFolder> psfCurrent;
108 hr = psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent));
109 if (FAILED_UNEXPECTEDLY(hr))
110 return hr;
111
112 CComHeapPtr<ITEMIDLIST_RELATIVE> relativePidl;
113 hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL);
114 if (!SUCCEEDED(hr))
115 return S_FALSE;
116
117 CFolderItem* item = new CComObject<CFolderItem>();
118 item->AddRef();
119 item->Init(ILCombine(m_idlist, relativePidl));
120 *ppid = item;
121 return S_OK;
122 }
123
124 HRESULT STDMETHODCALLTYPE CFolder::NewFolder(BSTR bName, VARIANT vOptions)
125 {
126 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions));
127 return E_NOTIMPL;
128 }
129
130 HRESULT STDMETHODCALLTYPE CFolder::MoveHere(VARIANT vItem, VARIANT vOptions)
131 {
132 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
133 return E_NOTIMPL;
134 }
135
136 HRESULT STDMETHODCALLTYPE CFolder::CopyHere(VARIANT vItem, VARIANT vOptions)
137 {
138 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
139 return E_NOTIMPL;
140 }
141
142 HRESULT STDMETHODCALLTYPE CFolder::GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs)
143 {
144 TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs);
145 return E_NOTIMPL;
146 }
147
148
149 // *** Folder2 methods ***
150 HRESULT STDMETHODCALLTYPE CFolder::get_Self(FolderItem **ppfi)
151 {
152 TRACE("(%p, %p)\n", this, ppfi);
153 if (!ppfi)
154 return E_POINTER;
155 CFolderItem* item = new CComObject<CFolderItem>();
156 item->AddRef();
157 item->Init(ILClone(m_idlist));
158 *ppfi = item;
159 return S_OK;
160 }
161
162 HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus(LONG *pul)
163 {
164 TRACE("(%p, %p)\n", this, pul);
165 return E_NOTIMPL;
166 }
167
168 HRESULT STDMETHODCALLTYPE CFolder::Synchronize()
169 {
170 TRACE("(%p)\n", this);
171 return E_NOTIMPL;
172 }
173
174 HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade)
175 {
176 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
177 return E_NOTIMPL;
178 }
179
180 HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade()
181 {
182 TRACE("(%p)\n", this);
183 return E_NOTIMPL;
184 }
185
186