[SHELL32]

- Add a helper HCR_GetClassName function to load the name of a reg folder to a STRRET
- Further simplify CAdminToolsFolder, CFontsFolder and CMyDocsFolder

svn path=/trunk/; revision=69319
This commit is contained in:
Giannis Adamopoulos 2015-09-22 18:11:32 +00:00
parent 49b29b7594
commit 0ea9ff44f2
8 changed files with 137 additions and 309 deletions

View file

@ -23,43 +23,22 @@
WINE_DEFAULT_DEBUG_CHANNEL (shell);
/*
This folder should not exist. It is just a file system folder...
*/
/* List shortcuts of
* CSIDL_COMMON_ADMINTOOLS
* Note: CSIDL_ADMINTOOLS is ignored, tested with Window XP SP3+
*/
/***********************************************************************
* AdminTools folder implementation
*/
CAdminToolsFolder::CAdminToolsFolder()
{
m_pisfInner = NULL;
m_pisf2Inner = NULL;
szTarget = NULL;
}
CAdminToolsFolder::~CAdminToolsFolder()
{
HeapFree(GetProcessHeap(), 0, szTarget);
m_pisfInner.Release();
m_pisf2Inner.Release();
}
HRESULT WINAPI CAdminToolsFolder::FinalConstruct()
{
HRESULT hr;
CComPtr<IPersistFolder3> ppf3;
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder, &m_pisfInner));
if (FAILED(hr))
return hr;
hr = m_pisfInner->QueryInterface(IID_PPV_ARG(IShellFolder2, &m_pisf2Inner));
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder2, &m_pisfInner));
if (FAILED(hr))
return hr;
@ -67,18 +46,16 @@ HRESULT WINAPI CAdminToolsFolder::FinalConstruct()
if (FAILED(hr))
return hr;
LPITEMIDLIST pidlRoot = _ILCreateAdminTools();
PERSIST_FOLDER_TARGET_INFO info;
ZeroMemory(&info, sizeof(PERSIST_FOLDER_TARGET_INFO));
info.csidl = CSIDL_COMMON_ADMINTOOLS;
hr = ppf3->InitializeEx(NULL, _ILCreateAdminTools(), &info);
hr = ppf3->InitializeEx(NULL, pidlRoot, &info);
szTarget = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
if (szTarget == NULL)
return E_OUTOFMEMORY;
if (!SHGetSpecialFolderPathW(NULL, szTarget, CSIDL_COMMON_ADMINTOOLS, FALSE))
return E_FAIL;
SHFree(pidlRoot);
return S_OK;
return hr;
}
HRESULT WINAPI CAdminToolsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
@ -117,28 +94,22 @@ HRESULT WINAPI CAdminToolsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARR
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;
if (!rgfInOut || !apidl)
return E_INVALIDARG;
*rgfInOut &= dwAdminToolsAttributes;
if (*rgfInOut == 0)
*rgfInOut = ~0;
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE;
*rgfInOut &= dwAdminToolsAttributes;
return S_OK;
}
/* 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,
@ -149,43 +120,25 @@ HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUIT
HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
{
if (!strRet || !pidl)
return E_INVALIDARG;
/* If we got an fs item just forward to the fs folder */
if (!_ILIsSpecialFolder(pidl))
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
HRESULT hr = S_OK;
LPWSTR pszPath;
TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl);
if (!strRet)
return E_INVALIDARG;
pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
if (!pszPath)
return E_OUTOFMEMORY;
ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR));
if (!pidl->mkid.cb)
/* The caller wants our path. Let fs folder handle it */
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
{
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
wcscpy(pszPath, szTarget);
else if (!HCR_GetClassNameW(CLSID_AdminFolderShortcut, pszPath, MAX_PATH))
hr = E_FAIL;
/* Give an empty pidl to the fs folder to make it tell us its path */
if (pidl->mkid.cb)
pidl = ILGetNext(pidl);
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
}
if (SUCCEEDED(hr))
{
strRet->uType = STRRET_WSTR;
strRet->pOleStr = pszPath;
TRACE ("-- (%p)->(%s,0x%08x)\n", this, debugstr_w(strRet->pOleStr), hr);
}
else
CoTaskMemFree(pszPath);
return hr;
/* Return the display name from the registry */
return HCR_GetClassName(CLSID_AdminFolderShortcut, strRet);
}
HRESULT WINAPI CAdminToolsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
@ -196,66 +149,58 @@ HRESULT WINAPI CAdminToolsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl
HRESULT WINAPI CAdminToolsFolder::GetDefaultSearchGUID(GUID *pguid)
{
return m_pisf2Inner->GetDefaultSearchGUID(pguid);
return m_pisfInner->GetDefaultSearchGUID(pguid);
}
HRESULT WINAPI CAdminToolsFolder::EnumSearches(IEnumExtraSearch ** ppenum)
{
return m_pisf2Inner->EnumSearches(ppenum);
return m_pisfInner->EnumSearches(ppenum);
}
HRESULT WINAPI CAdminToolsFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
{
return m_pisf2Inner->GetDefaultColumn(dwRes, pSort, pDisplay);
return m_pisfInner->GetDefaultColumn(dwRes, pSort, pDisplay);
}
HRESULT WINAPI CAdminToolsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
{
return m_pisf2Inner->GetDefaultColumnState(iColumn, pcsFlags);
return m_pisfInner->GetDefaultColumnState(iColumn, pcsFlags);
}
HRESULT WINAPI CAdminToolsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
{
return m_pisf2Inner->GetDetailsEx(pidl, pscid, pv);
return m_pisfInner->GetDetailsEx(pidl, pscid, pv);
}
HRESULT WINAPI CAdminToolsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
{
return m_pisf2Inner->GetDetailsOf(pidl, iColumn, psd);
return m_pisfInner->GetDetailsOf(pidl, iColumn, psd);
}
HRESULT WINAPI CAdminToolsFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
{
return m_pisf2Inner->MapColumnToSCID(column, pscid);
return m_pisfInner->MapColumnToSCID(column, pscid);
}
/************************************************************************
* CAdminToolsFolder::GetClassID
*/
HRESULT WINAPI CAdminToolsFolder::GetClassID(CLSID *lpClassId)
{
TRACE ("(%p)\n", this);
if (!lpClassId)
return E_POINTER;
memcpy(lpClassId, &CLSID_AdminFolderShortcut, sizeof(CLSID));
return S_OK;
}
/************************************************************************
* CAdminToolsFolder::Initialize
*
*/
HRESULT WINAPI CAdminToolsFolder::Initialize(LPCITEMIDLIST pidl)
{
return S_OK;
}
/**************************************************************************
* CAdminToolsFolder::GetCurFolder
*/
HRESULT WINAPI CAdminToolsFolder::GetCurFolder(LPITEMIDLIST *pidl)
{
CComPtr<IPersistFolder2> ppf2;
m_pisfInner->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
return ppf2->GetCurFolder(pidl);
if (!pidl)
return E_POINTER;
*pidl = _ILCreateAdminTools();
return S_OK;
}

View file

@ -29,10 +29,8 @@ class CAdminToolsFolder :
public IPersistFolder2
{
private:
CComPtr<IShellFolder> m_pisfInner;
CComPtr<IShellFolder2> m_pisf2Inner;
LPWSTR szTarget;
public:
CComPtr<IShellFolder2> m_pisfInner;
public:
CAdminToolsFolder();
~CAdminToolsFolder();
HRESULT WINAPI FinalConstruct();

View file

@ -23,46 +23,20 @@
WINE_DEFAULT_DEBUG_CHANNEL (shell);
/*
This folder should not exist. It is just a file system folder... The \windows\fonts
directory contains a hidden desktop.ini with a UIHandler entry that specifies a class
that lives in fontext.dll. The UI handler creates a custom view for the folder, which
is what we normally see. However, the folder is a perfectly normal CFSFolder.
*/
/***********************************************************************
* IShellFolder implementation
*/
CFontsFolder::CFontsFolder()
{
m_pisfInner = NULL;
m_pisf2Inner = NULL;
pidlRoot = NULL;
apidl = NULL;
}
CFontsFolder::~CFontsFolder()
{
TRACE("-- destroying IShellFolder(%p)\n", this);
SHFree(pidlRoot);
}
static LPITEMIDLIST _ILCreateFont(void)
{
return _ILCreateGuid(PT_GUID, CLSID_FontsFolderShortcut);
}
HRESULT WINAPI CFontsFolder::FinalConstruct()
{
HRESULT hr;
CComPtr<IPersistFolder3> ppf3;
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder, &m_pisfInner));
if (FAILED(hr))
return hr;
hr = m_pisfInner->QueryInterface(IID_PPV_ARG(IShellFolder2, &m_pisf2Inner));
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder2, &m_pisfInner));
if (FAILED(hr))
return hr;
@ -70,11 +44,17 @@ HRESULT WINAPI CFontsFolder::FinalConstruct()
if (FAILED(hr))
return hr;
LPITEMIDLIST pidl = _ILCreateGuid(PT_GUID, CLSID_FontsFolderShortcut);
if (!pidl)
return E_OUTOFMEMORY;
PERSIST_FOLDER_TARGET_INFO info;
ZeroMemory(&info, sizeof(PERSIST_FOLDER_TARGET_INFO));
info.csidl = CSIDL_FONTS;
hr = ppf3->InitializeEx(NULL, _ILCreateFont(), &info);
hr = ppf3->InitializeEx(NULL, pidl, &info);
ILFree(pidl);
return hr;
}
@ -114,28 +94,22 @@ HRESULT WINAPI CFontsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY ap
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;
if (!rgfInOut || !apidl)
return E_INVALIDARG;
*rgfInOut &= dwFontsAttributes;
if (*rgfInOut == 0)
*rgfInOut = ~0;
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE;
*rgfInOut &= dwFontsAttributes;
return S_OK;
}
/* 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,
@ -146,39 +120,26 @@ HRESULT WINAPI CFontsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_
HRESULT WINAPI CFontsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
{
if (!strRet || !pidl)
return E_INVALIDARG;
/* If we got an fs item just forward to the fs folder */
if (!_ILIsSpecialFolder(pidl))
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl);
if (!strRet)
return E_INVALIDARG;
if (!pidl->mkid.cb)
/* The caller wants our path. Let fs folder handle it */
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
{
WCHAR wszPath[MAX_PATH];
/* Give an empty pidl to the fs folder to tell us its path */
if (pidl->mkid.cb)
pidl = ILGetNext(pidl);
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
{
if (!SHGetSpecialFolderPathW(NULL, wszPath, CSIDL_FONTS, FALSE))
return E_FAIL;
}
else if (!HCR_GetClassNameW(CLSID_FontsFolderShortcut, wszPath, MAX_PATH))
return E_FAIL;
strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(wszPath) + 1) * sizeof(WCHAR));
if (!strRet->pOleStr)
return E_OUTOFMEMORY;
wcscpy(strRet->pOleStr, wszPath);
strRet->uType = STRRET_WSTR;
return S_OK;
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
}
else
return E_INVALIDARG;
/* Return the display name from the registry */
return HCR_GetClassName(CLSID_FontsFolderShortcut, strRet);
}
HRESULT WINAPI CFontsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
@ -189,46 +150,41 @@ HRESULT WINAPI CFontsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl,
HRESULT WINAPI CFontsFolder::GetDefaultSearchGUID(GUID *pguid)
{
return m_pisf2Inner->GetDefaultSearchGUID(pguid);
return m_pisfInner->GetDefaultSearchGUID(pguid);
}
HRESULT WINAPI CFontsFolder::EnumSearches(IEnumExtraSearch ** ppenum)
{
return m_pisf2Inner->EnumSearches(ppenum);
return m_pisfInner->EnumSearches(ppenum);
}
HRESULT WINAPI CFontsFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
{
return m_pisf2Inner->GetDefaultColumn(dwRes, pSort, pDisplay);
return m_pisfInner->GetDefaultColumn(dwRes, pSort, pDisplay);
}
HRESULT WINAPI CFontsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
{
return m_pisf2Inner->GetDefaultColumnState(iColumn, pcsFlags);
return m_pisfInner->GetDefaultColumnState(iColumn, pcsFlags);
}
HRESULT WINAPI CFontsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
{
return m_pisf2Inner->GetDetailsEx(pidl, pscid, pv);
return m_pisfInner->GetDetailsEx(pidl, pscid, pv);
}
HRESULT WINAPI CFontsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
{
return m_pisf2Inner->GetDetailsOf(pidl, iColumn, psd);
return m_pisfInner->GetDetailsOf(pidl, iColumn, psd);
}
HRESULT WINAPI CFontsFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
{
return m_pisf2Inner->MapColumnToSCID(column, pscid);
return m_pisfInner->MapColumnToSCID(column, pscid);
}
/************************************************************************
* CFontsFolder::GetClassID
*/
HRESULT WINAPI CFontsFolder::GetClassID(CLSID *lpClassId)
{
TRACE ("(%p)\n", this);
if (!lpClassId)
return E_POINTER;
@ -237,29 +193,17 @@ HRESULT WINAPI CFontsFolder::GetClassID(CLSID *lpClassId)
return S_OK;
}
/************************************************************************
* CFontsFolder::Initialize
*
* NOTES: it makes no sense to change the pidl
*/
HRESULT WINAPI CFontsFolder::Initialize(LPCITEMIDLIST pidl)
{
TRACE ("(%p)->(%p)\n", this, pidl);
return S_OK;
}
/**************************************************************************
* CFontsFolder::GetCurFolder
*/
HRESULT WINAPI CFontsFolder::GetCurFolder(LPITEMIDLIST *pidl)
{
TRACE ("(%p)->(%p)\n", this, pidl);
if (!pidl)
return E_POINTER;
*pidl = ILClone(pidlRoot);
*pidl = _ILCreateGuid(PT_GUID, CLSID_FontsFolderShortcut);
return S_OK;
}

View file

@ -29,12 +29,7 @@ class CFontsFolder :
public IPersistFolder2
{
private:
CComPtr<IShellFolder> m_pisfInner;
CComPtr<IShellFolder2> m_pisf2Inner;
/* both paths are parsible from the desktop */
LPITEMIDLIST pidlRoot; /* absolute pidl */
LPCITEMIDLIST apidl; /* currently focused font item */
CComPtr<IShellFolder2> m_pisfInner;
public:
CFontsFolder();
~CFontsFolder();

View file

@ -23,55 +23,22 @@
WINE_DEFAULT_DEBUG_CHANNEL (mydocs);
/*
CFileSysEnumX should not exist. CMyDocsFolder should aggregate a CFSFolder which always
maps the contents of CSIDL_PERSONAL. Therefore, CMyDocsFolder::EnumObjects simply calls
CFSFolder::EnumObjects.
*/
/***********************************************************************
* MyDocumentsfolder implementation
*/
CMyDocsFolder::CMyDocsFolder()
{
m_pisfInner = NULL;
m_pisf2Inner = NULL;
pidlRoot = NULL;
sPathTarget = NULL;
}
CMyDocsFolder::~CMyDocsFolder()
{
SHFree(pidlRoot);
if (sPathTarget)
HeapFree(GetProcessHeap(), 0, sPathTarget);
m_pisfInner.Release();
m_pisf2Inner.Release();
}
HRESULT WINAPI CMyDocsFolder::FinalConstruct()
{
WCHAR szMyPath[MAX_PATH];
if (!SHGetSpecialFolderPathW(0, szMyPath, CSIDL_PERSONAL, TRUE))
return E_UNEXPECTED;
pidlRoot = _ILCreateMyDocuments(); /* my qualified pidl */
sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
wcscpy(sPathTarget, szMyPath);
WCHAR szPath[MAX_PATH];
lstrcpynW(szPath, sPathTarget, MAX_PATH);
HRESULT hr;
CComPtr<IPersistFolder3> ppf3;
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder, &m_pisfInner));
if (FAILED(hr))
return hr;
hr = m_pisfInner->QueryInterface(IID_PPV_ARG(IShellFolder2, &m_pisf2Inner));
hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL, IID_PPV_ARG(IShellFolder2, &m_pisfInner));
if (FAILED(hr))
return hr;
@ -79,11 +46,15 @@ HRESULT WINAPI CMyDocsFolder::FinalConstruct()
if (FAILED(hr))
return hr;
LPITEMIDLIST pidlRoot = _ILCreateMyDocuments();
PERSIST_FOLDER_TARGET_INFO info;
ZeroMemory(&info, sizeof(PERSIST_FOLDER_TARGET_INFO));
info.csidl = CSIDL_PERSONAL;
hr = ppf3->InitializeEx(NULL, pidlRoot, &info);
SHFree(pidlRoot);
return hr;
}
@ -125,26 +96,20 @@ HRESULT WINAPI CMyDocsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY a
SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE;
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;
if (!rgfInOut || !apidl)
return E_INVALIDARG;
*rgfInOut &= dwMyDocumentsAttributes;
if (*rgfInOut == 0)
*rgfInOut = ~0;
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE;
*rgfInOut &= dwMyDocumentsAttributes;
return S_OK;
}
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE;
return S_OK;
}
HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
@ -155,48 +120,25 @@ HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID
HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
{
if (!strRet || !pidl)
return E_INVALIDARG;
/* If we got an fs item just forward to the fs folder */
if (!_ILIsSpecialFolder(pidl))
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
HRESULT hr = S_OK;
LPWSTR pszPath;
TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl);
if (!strRet)
return E_INVALIDARG;
pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
if (!pszPath)
return E_OUTOFMEMORY;
ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR));
if (_ILIsMyDocuments (pidl) || !pidl->mkid.cb)
/* The caller wants our path. Let fs folder handle it */
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
{
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
wcscpy(pszPath, sPathTarget);
else
HCR_GetClassNameW(CLSID_MyDocuments, pszPath, MAX_PATH);
TRACE("CP\n");
}
else
{
hr = E_INVALIDARG;
/* Give an empty pidl to the fs folder to make it tell us its path */
if (pidl->mkid.cb)
pidl = ILGetNext(pidl);
return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
}
if (SUCCEEDED(hr))
{
strRet->uType = STRRET_WSTR;
strRet->pOleStr = pszPath;
}
else
CoTaskMemFree(pszPath);
TRACE ("-- (%p)->(%s,0x%08x)\n", this, debugstr_w(strRet->pOleStr), hr);
return hr;
/* Return the display name from the registry */
return HCR_GetClassName(CLSID_MyDocuments, strRet);
}
HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
@ -207,43 +149,41 @@ HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl,
HRESULT WINAPI CMyDocsFolder::GetDefaultSearchGUID(GUID *pguid)
{
return m_pisf2Inner->GetDefaultSearchGUID(pguid);
return m_pisfInner->GetDefaultSearchGUID(pguid);
}
HRESULT WINAPI CMyDocsFolder::EnumSearches(IEnumExtraSearch ** ppenum)
{
return m_pisf2Inner->EnumSearches(ppenum);
return m_pisfInner->EnumSearches(ppenum);
}
HRESULT WINAPI CMyDocsFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
{
return m_pisf2Inner->GetDefaultColumn(dwRes, pSort, pDisplay);
return m_pisfInner->GetDefaultColumn(dwRes, pSort, pDisplay);
}
HRESULT WINAPI CMyDocsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
{
return m_pisf2Inner->GetDefaultColumnState(iColumn, pcsFlags);
return m_pisfInner->GetDefaultColumnState(iColumn, pcsFlags);
}
HRESULT WINAPI CMyDocsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
{
return m_pisf2Inner->GetDetailsEx(pidl, pscid, pv);
return m_pisfInner->GetDetailsEx(pidl, pscid, pv);
}
HRESULT WINAPI CMyDocsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
{
return m_pisf2Inner->GetDetailsOf(pidl, iColumn, psd);
return m_pisfInner->GetDetailsOf(pidl, iColumn, psd);
}
HRESULT WINAPI CMyDocsFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
{
return m_pisf2Inner->MapColumnToSCID(column, pscid);
return m_pisfInner->MapColumnToSCID(column, pscid);
}
HRESULT WINAPI CMyDocsFolder::GetClassID(CLSID *lpClassId)
{
TRACE ("(%p)\n", this);
if (!lpClassId)
return E_POINTER;
@ -254,16 +194,13 @@ HRESULT WINAPI CMyDocsFolder::GetClassID(CLSID *lpClassId)
HRESULT WINAPI CMyDocsFolder::Initialize(LPCITEMIDLIST pidl)
{
TRACE ("(%p)->(%p)\n", this, pidl);
return S_OK;
}
HRESULT WINAPI CMyDocsFolder::GetCurFolder(LPITEMIDLIST *pidl)
{
TRACE ("(%p)->(%p)\n", this, pidl);
if (!pidl) return E_POINTER;
*pidl = ILClone (pidlRoot);
if (!pidl)
return E_POINTER;
*pidl = _ILCreateMyDocuments();
return S_OK;
}

View file

@ -29,12 +29,7 @@ class CMyDocsFolder :
public IPersistFolder2
{
private:
CComPtr<IShellFolder> m_pisfInner;
CComPtr<IShellFolder2> m_pisf2Inner;
/* both paths are parsible from the MyDocuments */
LPWSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */
LPITEMIDLIST pidlRoot; /* absolute pidl */
CComPtr<IShellFolder2> m_pisfInner;
public:
CMyDocsFolder();
~CMyDocsFolder();

View file

@ -39,6 +39,9 @@ typedef struct {
LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut);
HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut,
LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes);
HRESULT HCR_GetClassName(REFIID riid, LPSTRRET strRet);
HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet);
HRESULT SHELL32_BindToFS (LPCITEMIDLIST pidlRoot,

View file

@ -376,6 +376,17 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf,
return hr;
}
HRESULT HCR_GetClassName(REFIID riid, LPSTRRET strRet)
{
BOOL bRet;
WCHAR wstrName[MAX_PATH+1];
bRet = HCR_GetClassNameW(CLSID_MyDocuments, wstrName, MAX_PATH);
if (!bRet)
return E_FAIL;
return SHSetStrRet(strRet, wstrName);
}
HRESULT SHELL32_GetDisplayNameOfGUIDItem(IShellFolder2* psf, LPCWSTR pszFolderPath, PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
{
HRESULT hr;