From 3c6b222f150b0fe6675d5967ebe537abcf93d5e5 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sat, 19 Aug 2017 11:09:28 +0000 Subject: [PATCH] [SHELL32] -Simplify the drop target of CRecycleBin to let the data object generate the list of names that can be passed to SHFileOperationW. svn path=/trunk/; revision=75622 --- .../dll/win32/shell32/folders/CRecycleBin.cpp | 97 ++----------------- 1 file changed, 7 insertions(+), 90 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp index 853c81ef757..96790c767c3 100644 --- a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp @@ -1079,98 +1079,18 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject, 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)) - 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 psfDesktop; - CComPtr 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); + if (FAILED_UNEXPECTEDLY(hr)) 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) + LPDROPFILES lpdf = (LPDROPFILES) GlobalLock(medium.hGlobal); + if (!lpdf) { - SHFree(pidl); - _ILFreeaPidl(apidl, lpcida->cidl); - ReleaseStgMedium(&medium); + ERR("Error locking global\n"); return E_FAIL; } @@ -1178,19 +1098,16 @@ HRESULT WINAPI DoDeleteDataObject(IDataObject *pda, DWORD fMask) 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; -- 2.17.1