mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 09:50:07 +00:00
[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:
parent
49b29b7594
commit
0ea9ff44f2
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue