Author: gadamopoulos Date: Sat Aug 19 11:09:28 2017 New Revision: 75622
URL: http://svn.reactos.org/svn/reactos?rev=75622&view=rev Log: [SHELL32] -Simplify the drop target of CRecycleBin to let the data object generate the list of names that can be passed to SHFileOperationW.
Modified: trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp
Modified: trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CRecycleBin.cpp [iso-8859-1] Sat Aug 19 11:09:28 2017 @@ -1079,98 +1079,18 @@
HRESULT WINAPI DoDeleteDataObject(IDataObject *pda, DWORD fMask) { - TRACE("performing delete"); HRESULT hr; - STGMEDIUM medium; FORMATETC formatetc; - InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL); + InitFormatEtc (formatetc, CF_HDROP, TYMED_HGLOBAL); hr = pda->GetData(&formatetc, &medium); - if (FAILED(hr)) + if (FAILED_UNEXPECTEDLY(hr)) return hr;
- /* lock the handle */ - LPIDA lpcida = (LPIDA)GlobalLock(medium.hGlobal); - if (!lpcida) - { - ReleaseStgMedium(&medium); - return E_FAIL; - } - - /* convert the data into pidl */ - LPITEMIDLIST pidl; - LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, lpcida); - if (!apidl) - { - ReleaseStgMedium(&medium); - return E_FAIL; - } - - CComPtr<IShellFolder> psfDesktop; - CComPtr<IShellFolder> psfFrom = NULL; - - /* Grab the desktop shell folder */ - hr = SHGetDesktopFolder(&psfDesktop); - if (FAILED(hr)) - { - ERR("SHGetDesktopFolder failed\n"); - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); - return E_FAIL; - } - - /* Find source folder, this is where the clipboard data was copied from */ - if (_ILIsDesktop(pidl)) - { - psfFrom = psfDesktop; - } - else - { - hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfFrom)); - if (FAILED(hr)) - { - ERR("no IShellFolder\n"); - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); - return E_FAIL; - } - } - - STRRET strTemp; - hr = psfFrom->GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strTemp); - if (FAILED(hr)) - { - ERR("IShellFolder_GetDisplayNameOf failed with %x\n", hr); - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); - return hr; - } - - WCHAR wszPath[MAX_PATH]; - hr = StrRetToBufW(&strTemp, apidl[0], wszPath, _countof(wszPath)); - if (FAILED(hr)) - { - ERR("StrRetToBufW failed with %x\n", hr); - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); - return hr; - } - - /* Only keep the base path */ - LPWSTR pwszFilename = PathFindFileNameW(wszPath); - *pwszFilename = L'\0'; - - /* Build paths list */ - LPWSTR pwszPaths = BuildPathsList(wszPath, lpcida->cidl, (LPCITEMIDLIST*) apidl, FALSE); - if (!pwszPaths) - { - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); + LPDROPFILES lpdf = (LPDROPFILES) GlobalLock(medium.hGlobal); + if (!lpdf) + { + ERR("Error locking global\n"); return E_FAIL; }
@@ -1178,19 +1098,16 @@ SHFILEOPSTRUCTW FileOp; ZeroMemory(&FileOp, sizeof(FileOp)); FileOp.wFunc = FO_DELETE; - FileOp.pFrom = pwszPaths; + FileOp.pFrom = (LPWSTR) (((byte*) lpdf) + lpdf->pFiles);; if ((fMask & CMIC_MASK_SHIFT_DOWN) == 0) FileOp.fFlags = FOF_ALLOWUNDO;
if (SHFileOperationW(&FileOp) != 0) { - ERR("SHFileOperation failed with 0x%x for %s\n", GetLastError(), debugstr_w(pwszPaths)); + ERR("SHFileOperation failed with 0x%x\n", GetLastError()); hr = E_FAIL; }
- HeapFree(GetProcessHeap(), 0, pwszPaths); - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); ReleaseStgMedium(&medium);
return hr;