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;
+ m_pidlInner = 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));
- if (FAILED(hr))
- return hr;
-
- hr = m_pisfInner->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3));
- if (FAILED(hr))
- return hr;
-
- PERSIST_FOLDER_TARGET_INFO info;
- ZeroMemory(&info, sizeof(PERSIST_FOLDER_TARGET_INFO));
- info.csidl = CSIDL_PERSONAL;
- hr = ppf3->InitializeEx(NULL, pidlRoot, &info);
-
- return hr;
+ if(m_pidlInner)
+ SHFree(m_pidlInner);
}
HRESULT WINAPI CMyDocsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
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)
+ 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,
HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
{
- 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)
+ if (!strRet || !pidl)
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)
- {
- 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;
- }
+ /* If we got an fs item just forward to the fs folder */
+ if (!_ILIsSpecialFolder(pidl))
+ return m_pisfInner->GetDisplayNameOf(pidl, dwFlags, strRet);
- if (SUCCEEDED(hr))
+ /* The caller wants our path. Let fs folder handle it */
+ if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
+ (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
{
- strRet->uType = STRRET_WSTR;
- strRet->pOleStr = pszPath;
+ /* 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);
}
- else
- CoTaskMemFree(pszPath);
- TRACE ("-- (%p)->(%s,0x%08x)\n", this, debugstr_w(strRet->pOleStr), hr);
- return hr;
+ ERR("Got empty pidl without SHGDN_FORPARSING\n");
+ return E_INVALIDARG;
}
HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple 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;
return S_OK;
}
-HRESULT WINAPI CMyDocsFolder::Initialize(LPCITEMIDLIST pidl)
+HRESULT WINAPI CMyDocsFolder::Initialize(PCIDLIST_ABSOLUTE pidl)
{
- TRACE ("(%p)->(%p)\n", this, pidl);
+ m_pidlInner = ILClone(pidl);
+ if (!m_pidlInner)
+ return E_OUTOFMEMORY;
- return E_NOTIMPL;
+ return SHELL32_CoCreateInitSF(m_pidlInner,
+ &CLSID_ShellFSFolder,
+ CSIDL_PERSONAL,
+ IID_PPV_ARG(IShellFolder2, &m_pisfInner));
}
-HRESULT WINAPI CMyDocsFolder::GetCurFolder(LPITEMIDLIST *pidl)
+HRESULT WINAPI CMyDocsFolder::GetCurFolder(PIDLIST_ABSOLUTE *pidl)
{
- TRACE ("(%p)->(%p)\n", this, pidl);
-
- if (!pidl) return E_POINTER;
- *pidl = ILClone (pidlRoot);
+ if (!pidl)
+ return E_POINTER;
+ *pidl = ILClone(m_pidlInner);
return S_OK;
}