Reactos
at master 173 lines 4.3 kB view raw
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