[SHELL32] CCopyToMenu/CMoveToMenu: Check if this_ is NULL
[reactos.git] / dll / win32 / shell32 / CFolder.cpp
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
10 WINE_DEFAULT_DEBUG_CHANNEL(shell);
11
12
13 CFolder::CFolder()
14 {
15 }
16
17 CFolder::~CFolder()
18 {
19 }
20
21 HRESULT CFolder::Initialize(LPITEMIDLIST idlist)
22 {
23 m_idlist.Attach(ILClone(idlist));
24 return CShellDispatch_Constructor(IID_PPV_ARG(IShellDispatch, &m_Application));
25 }
26
27 HRESULT 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 ***
39 HRESULT 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
53 HRESULT 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
66 HRESULT 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
76 HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder(Folder **ppsf)
77 {
78 TRACE("(%p, %p)\n", this);
79
80 *ppsf = NULL;
81
82 return E_NOTIMPL;
83 }
84
85 HRESULT 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
91 HRESULT 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
114 HRESULT 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
120 HRESULT 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
126 HRESULT 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
132 HRESULT 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 ***
140 HRESULT 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
149 HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus(LONG *pul)
150 {
151 TRACE("(%p, %p)\n", this, pul);
152 return E_NOTIMPL;
153 }
154
155 HRESULT STDMETHODCALLTYPE CFolder::Synchronize()
156 {
157 TRACE("(%p)\n", this);
158 return E_NOTIMPL;
159 }
160
161 HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade)
162 {
163 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
164 return E_NOTIMPL;
165 }
166
167 HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade()
168 {
169 TRACE("(%p)\n", this);
170 return E_NOTIMPL;
171 }
172
173