Author: gadamopoulos
Date: Tue May 3 13:47:16 2016
New Revision: 71242
URL:
http://svn.reactos.org/svn/reactos?rev=71242&view=rev
Log:
[SHELL32]
- CDesktopFolder: Avoid doing any operation with pidls. Use the internal fs folders
instead.
Modified:
trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h
trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp
Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/…
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp [iso-8859-1] Tue May 3
13:47:16 2016
@@ -266,7 +266,7 @@
pidlRoot = _ILCreateDesktop();
/* Create the inner fs folder */
- hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL,
IID_PPV_ARG(IShellFolder, &m_DesktopFSFolder));
+ hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL,
IID_PPV_ARG(IShellFolder2, &m_DesktopFSFolder));
if (FAILED(hr))
return hr;
@@ -280,7 +280,7 @@
hr = ppf3->InitializeEx(NULL, pidlRoot, &info);
/* Create the inner shared fs folder */
- hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL,
IID_PPV_ARG(IShellFolder, &m_SharedDesktopFSFolder));
+ hr = SHCoCreateInstance(NULL, &CLSID_ShellFSFolder, NULL,
IID_PPV_ARG(IShellFolder2, &m_SharedDesktopFSFolder));
if (FAILED(hr))
return hr;
@@ -297,6 +297,25 @@
sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
wcscpy(sPathTarget, szMyPath);
return S_OK;
+}
+
+HRESULT CDesktopFolder::_GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2** psf)
+{
+ WCHAR szFileName[MAX_PATH];
+
+ lstrcpynW(szFileName, sPathTarget, MAX_PATH - 1);
+ PathAddBackslashW(szFileName);
+ int cLen = wcslen(szFileName);
+
+ if (!_ILSimpleGetTextW(pidl, szFileName + cLen, MAX_PATH - cLen))
+ return E_FAIL;
+
+ ERR("%S\n", szFileName);
+
+ if (GetFileAttributes(szFileName) == INVALID_FILE_ATTRIBUTES)
+ return m_SharedDesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2,
psf));
+ else
+ return m_DesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
}
/**************************************************************************
@@ -394,14 +413,7 @@
{
if (pdwAttributes && *pdwAttributes)
{
- if (_ILIsMyComputer(pidlTemp))
- *pdwAttributes &= dwMyComputerAttributes;
- else if (_ILIsNetHood(pidlTemp))
- *pdwAttributes &= dwMyNetPlacesAttributes;
- else if (_ILIsSpecialFolder(pidlTemp))
- SHELL32_GetGuidItemAttributes(this, pidlTemp, pdwAttributes);
- else if(_ILIsFolder(pidlTemp) || _ILIsValue(pidlTemp))
- SHELL32_GetFSItemAttributes(this, pidlTemp, pdwAttributes);
+ GetAttributesOf(1, &pidlTemp, pdwAttributes);
}
}
}
@@ -439,7 +451,12 @@
if (_ILIsSpecialFolder(pidl))
return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
- return m_DesktopFSFolder->BindToObject(pidl, pbcReserved, riid, ppvOut );
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(pidl, &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
}
/**************************************************************************
@@ -555,8 +572,15 @@
*rgfInOut &= dwMyNetPlacesAttributes;
else if (_ILIsSpecialFolder(apidl[i]))
SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
- else if(_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]))
- SHELL32_GetFSItemAttributes(this, apidl[i], rgfInOut);
+ else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]))
+ {
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ continue;
+
+ psf->GetAttributesOf(1, &apidl[i], rgfInOut);
+ }
else
ERR("Got an unknown pidl type!!!\n");
}
@@ -600,6 +624,16 @@
*ppvOut = NULL;
+ if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]))
+ {
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
+ }
+
if (IsEqualIID (riid, IID_IContextMenu))
{
hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder
*)this, NULL, 0, NULL, (IContextMenu **)&pObj);
@@ -611,19 +645,6 @@
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid,
IID_IExtractIconW)) && (cidl == 1))
{
hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
- }
- else if (IsEqualIID (riid, IID_IDropTarget))
- {
- /* only interested in attempting to bind to shell folders, not files, semicolon
intentionate */
- if (cidl > 1)
- {
- hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj);
- }
- }
- else if ((IsEqualIID(riid, IID_IShellLinkW) ||
- IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1))
- {
- hr = IShellLink_ConstructFromFile(this, apidl[0], riid, &pObj);
}
else
hr = E_NOINTERFACE;
@@ -644,9 +665,6 @@
*/
HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags,
LPSTRRET strRet)
{
- HRESULT hr = S_OK;
- LPWSTR pszPath;
-
TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl);
@@ -661,77 +679,21 @@
{
return SHELL32_GetDisplayNameOfGUIDItem(this, L"", pidl, dwFlags,
strRet);
}
-
- pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
- if (!pszPath)
- return E_OUTOFMEMORY;
-
- if (_ILIsDesktop (pidl))
- {
- if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
- (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
- wcscpy(pszPath, sPathTarget);
+ else if (_ILIsDesktop(pidl))
+ {
+ if ((GET_SHGDN_RELATION(dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING))
+ return SHSetStrRet(strRet, sPathTarget);
else
- HCR_GetClassNameW(CLSID_ShellDesktop, pszPath, MAX_PATH);
- }
- else
- {
- int cLen = 0;
-
- /* file system folder or file rooted at the desktop */
- if ((GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING) &&
- (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER))
- {
- lstrcpynW(pszPath, sPathTarget, MAX_PATH - 1);
- PathAddBackslashW(pszPath);
- cLen = wcslen(pszPath);
- }
-
- _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen);
- if (!_ILIsFolder(pidl))
- SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags);
-
- if (GetFileAttributes(pszPath) == INVALID_FILE_ATTRIBUTES)
- {
- /* file system folder or file rooted at the AllUsers desktop */
- if ((GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING) &&
- (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER))
- {
- SHGetSpecialFolderPathW(0, pszPath, CSIDL_COMMON_DESKTOPDIRECTORY,
FALSE);
- PathAddBackslashW(pszPath);
- cLen = wcslen(pszPath);
- }
-
- _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen);
- if (!_ILIsFolder(pidl))
- SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags);
- }
- }
-
- if (SUCCEEDED(hr))
- {
- /* Win9x always returns ANSI strings, NT always returns Unicode strings */
- if (GetVersion() & 0x80000000)
- {
- strRet->uType = STRRET_CSTR;
- if (!WideCharToMultiByte(CP_ACP, 0, pszPath, -1, strRet->cStr, MAX_PATH,
- NULL, NULL))
- strRet->cStr[0] = '\0';
- CoTaskMemFree(pszPath);
- }
- else
- {
- strRet->uType = STRRET_WSTR;
- strRet->pOleStr = pszPath;
- }
- }
- else
- CoTaskMemFree(pszPath);
-
- TRACE ("-- (%p)->(%s,0x%08x)\n", this,
- strRet->uType == STRRET_CSTR ? strRet->cStr :
- debugstr_w(strRet->pOleStr), hr);
- return hr;
+ return HCR_GetClassName(CLSID_ShellDesktop, strRet);
+ }
+
+ /* file system folder or file rooted at the desktop */
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(pidl, &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
}
/**************************************************************************
@@ -753,65 +715,15 @@
DWORD dwFlags,
PITEMID_CHILD *pPidlOut)
{
- CComPtr<IShellFolder2> psf;
- HRESULT hr;
- WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
- LPWSTR ptr;
- BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl));
-
- TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
- debugstr_w (lpName), dwFlags, pPidlOut);
-
if (_ILGetGUIDPointer(pidl))
return SHELL32_SetNameOfGuidItem(pidl, lpName, dwFlags, pPidlOut);
- /* build source path */
- lstrcpynW(szSrc, sPathTarget, MAX_PATH);
- ptr = PathAddBackslashW (szSrc);
- if (ptr)
- _ILSimpleGetTextW (pidl, ptr, MAX_PATH + 1 - (ptr - szSrc));
-
- /* build destination path */
- if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER) {
- lstrcpynW(szDest, sPathTarget, MAX_PATH);
- ptr = PathAddBackslashW (szDest);
- if (ptr)
- lstrcpynW(ptr, lpName, MAX_PATH + 1 - (ptr - szDest));
- } else
- lstrcpynW(szDest, lpName, MAX_PATH);
-
- if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) {
- WCHAR *ext = PathFindExtensionW(szSrc);
- if(*ext != '\0') {
- INT len = wcslen(szDest);
- lstrcpynW(szDest + len, ext, MAX_PATH - len);
- }
- }
-
- if (!memcmp(szSrc, szDest, (wcslen(szDest) + 1) * sizeof(WCHAR)))
- {
- /* src and destination is the same */
- hr = S_OK;
- if (pPidlOut)
- hr = _ILCreateFromPathW(szDest, pPidlOut);
-
- return hr;
- }
-
- TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
- if (MoveFileW (szSrc, szDest))
- {
- hr = S_OK;
-
- if (pPidlOut)
- hr = _ILCreateFromPathW(szDest, pPidlOut);
-
- SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM,
- SHCNF_PATHW, szSrc, szDest);
-
- return hr;
- }
- return E_FAIL;
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(pidl, &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
}
HRESULT WINAPI CDesktopFolder::GetDefaultSearchGUID(GUID *pguid)
@@ -865,10 +777,6 @@
UINT iColumn,
SHELLDETAILS *psd)
{
- HRESULT hr = S_OK;
-
- TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
-
if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS)
return E_INVALIDARG;
@@ -883,27 +791,14 @@
return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
}
- /* the data from the pidl */
- psd->str.uType = STRRET_CSTR;
- switch (iColumn)
- {
- case 0: /* name */
- hr = GetDisplayNameOf(pidl,
- SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
- break;
- case 1: /* size */
- _ILGetFileSize (pidl, psd->str.cStr, MAX_PATH);
- break;
- case 2: /* type */
- _ILGetFileType (pidl, psd->str.cStr, MAX_PATH);
- break;
- case 3: /* date */
- _ILGetFileDate (pidl, psd->str.cStr, MAX_PATH);
- break;
- case 4: /* attributes */
- _ILGetFileAttributes (pidl, psd->str.cStr, MAX_PATH);
- break;
- }
+ CComPtr<IShellFolder2> psf;
+ HRESULT hr = _GetSFFromPidl(pidl, &psf);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ hr = psf->GetDetailsOf(pidl, iColumn, psd);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
return hr;
}
@@ -942,54 +837,6 @@
return S_OK;
}
-HRESULT WINAPI CDesktopFolder::_GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut) {
- HRESULT hr;
-
- TRACE("CFSFolder::_GetDropTarget entered\n");
-
- if (_ILGetGUIDPointer (pidl) || _ILIsFolder (pidl))
- return this->BindToObject(pidl, NULL, IID_IDropTarget, ppvOut);
-
- LPITEMIDLIST pidlNext = NULL;
-
- STRRET strFile;
- hr = this->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strFile);
- if (SUCCEEDED(hr))
- {
- WCHAR wszPath[MAX_PATH];
- hr = StrRetToBufW(&strFile, pidl, wszPath, _countof(wszPath));
-
- if (SUCCEEDED(hr))
- {
- PathRemoveFileSpecW (wszPath);
- hr = this->ParseDisplayName(NULL, NULL, wszPath, NULL, &pidlNext,
NULL);
-
- if (SUCCEEDED(hr))
- {
- CComPtr<IShellFolder> psf;
- hr = this->BindToObject(pidlNext, NULL, IID_PPV_ARG(IShellFolder,
&psf));
- CoTaskMemFree(pidlNext);
- if (SUCCEEDED(hr))
- {
- hr = psf->GetUIObjectOf(NULL, 1, &pidl, IID_IDropTarget, NULL,
ppvOut);
- if (FAILED(hr))
- ERR("FS GetUIObjectOf failed: %x\n", hr);
- }
- else
- ERR("BindToObject failed: %x\n", hr);
- }
- else
- ERR("ParseDisplayName failed: %x\n", hr);
- }
- else
- ERR("StrRetToBufW failed: %x\n", hr);
- }
- else
- ERR("GetDisplayNameOf failed: %x\n", hr);
-
- return hr;
-}
-
/*************************************************************************
* SHGetDesktopFolder [SHELL32.@]
*/
Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/…
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h [iso-8859-1] Tue May 3
13:47:16 2016
@@ -31,13 +31,13 @@
{
private:
/* both paths are parsible from the desktop */
- CComPtr<IShellFolder> m_DesktopFSFolder;
- CComPtr<IShellFolder> m_SharedDesktopFSFolder;
+ CComPtr<IShellFolder2> m_DesktopFSFolder;
+ CComPtr<IShellFolder2> m_SharedDesktopFSFolder;
LPWSTR sPathTarget; /* complete path to target used for enumeration and
ChangeNotify */
LPITEMIDLIST pidlRoot; /* absolute pidl */
- virtual HRESULT WINAPI _GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut);
+ HRESULT _GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2** psf);
public:
CDesktopFolder();
Modified: trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/…
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp [iso-8859-1] Tue May 3 13:47:16
2016
@@ -1585,7 +1585,7 @@
TRACE("CFSFolder::_GetDropTarget entered\n");
- if (_ILGetGUIDPointer (pidl) || _ILIsFolder (pidl))
+ if (_ILIsFolder (pidl))
return this->BindToObject(pidl, NULL, IID_IDropTarget, ppvOut);
STRRET strFile;