From ef89f318da21f2fc373d31e035bd5d92892071ba Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 17 Aug 2015 11:28:20 +0000 Subject: [PATCH] [SHELL32] - CAdminToolsFolder: return proper attributes when no items are specified. (This is fine for reg folders but doesn't work for fs folders). - CFontsFolder: fix GetAttributesOf as above. Fix Initialize method to return success. All shell folders should support this method. - CNetFolder: Return the name of the folder when asked. - CPrinterFolder: It doesn't have subfolders so it doesn't make sense to implement BindToObject. svn path=/trunk/; revision=68728 --- .../shell32/folders/CAdminToolsFolder.cpp | 26 ++++++++++++++++- .../win32/shell32/folders/CFontsFolder.cpp | 28 +++++++++++++++++-- .../dll/win32/shell32/folders/CNetFolder.cpp | 23 +++++++++++++-- .../win32/shell32/folders/CPrinterFolder.cpp | 5 +--- 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/CAdminToolsFolder.cpp b/reactos/dll/win32/shell32/folders/CAdminToolsFolder.cpp index eb24895b86a..efc50cfc05b 100644 --- a/reactos/dll/win32/shell32/folders/CAdminToolsFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CAdminToolsFolder.cpp @@ -114,7 +114,31 @@ HRESULT WINAPI CAdminToolsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, HRESULT WINAPI CAdminToolsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { - return m_pisfInner->GetAttributesOf(cidl, apidl, rgfInOut); + static const DWORD dwAdminToolsAttributes = + SFGAO_STORAGE | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | + SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; + + if(cidl) + { + return m_pisfInner->GetAttributesOf(cidl, apidl, rgfInOut); + } + else + { + if (!rgfInOut) + return E_INVALIDARG; + if (cidl && !apidl) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + *rgfInOut &= dwAdminToolsAttributes; + + /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ + *rgfInOut &= ~SFGAO_VALIDATE; + + return S_OK; + } } HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, diff --git a/reactos/dll/win32/shell32/folders/CFontsFolder.cpp b/reactos/dll/win32/shell32/folders/CFontsFolder.cpp index 6d4507e842e..ba6b89509b7 100644 --- a/reactos/dll/win32/shell32/folders/CFontsFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CFontsFolder.cpp @@ -111,7 +111,31 @@ HRESULT WINAPI CFontsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOI HRESULT WINAPI CFontsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { - return m_pisfInner->GetAttributesOf(cidl, apidl, rgfInOut); + static const DWORD dwFontsAttributes = + SFGAO_STORAGE | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | + SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; + + if(cidl) + { + return m_pisfInner->GetAttributesOf(cidl, apidl, rgfInOut); + } + else + { + if (!rgfInOut) + return E_INVALIDARG; + if (cidl && !apidl) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + *rgfInOut &= dwFontsAttributes; + + /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ + *rgfInOut &= ~SFGAO_VALIDATE; + + return S_OK; + } } HRESULT WINAPI CFontsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, @@ -222,7 +246,7 @@ HRESULT WINAPI CFontsFolder::Initialize(LPCITEMIDLIST pidl) { TRACE ("(%p)->(%p)\n", this, pidl); - return E_NOTIMPL; + return S_OK; } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CNetFolder.cpp b/reactos/dll/win32/shell32/folders/CNetFolder.cpp index 781e72f8048..558652706ca 100644 --- a/reactos/dll/win32/shell32/folders/CNetFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CNetFolder.cpp @@ -279,12 +279,31 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CH */ HRESULT WINAPI CNetFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { - FIXME("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); - pdump(pidl); + LPWSTR pszName; + + TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet); + pdump (pidl); if (!strRet) return E_INVALIDARG; + if (!pidl->mkid.cb) + { + pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); + if (!pszName) + return E_OUTOFMEMORY; + + if (LoadStringW(shell32_hInstance, IDS_NETWORKPLACE, pszName, MAX_PATH)) + { + pszName[MAX_PATH-1] = L'\0'; + strRet->uType = STRRET_WSTR; + strRet->pOleStr = pszName; + return S_OK; + } + CoTaskMemFree(pszName); + return E_FAIL; + } + return E_NOTIMPL; } diff --git a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp index 13abdaa9ec8..fc8580d8180 100644 --- a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp @@ -370,10 +370,7 @@ HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUM */ HRESULT WINAPI CPrinterFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) { - TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, - pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); - - return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut); + return E_NOTIMPL; } /**************************************************************************