Author: gschneider
Date: Fri Apr 16 23:22:06 2010
New Revision: 46900

URL: http://svn.reactos.org/svn/reactos?rev=46900&view=rev
Log:
[SHELL32]
- Add support for deleting multiple files from the context menu
- Fix error debug print
See issue #4383 for more details.

Modified:
    trunk/reactos/dll/win32/shell32/shv_def_cmenu.c

Modified: trunk/reactos/dll/win32/shell32/shv_def_cmenu.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_def_cmenu.c?rev=46900&r1=46899&r2=46900&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_def_cmenu.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shv_def_cmenu.c [iso-8859-1] Fri Apr 16 
23:22:06 2010
@@ -48,7 +48,7 @@
 }
 
 VOID INewItem_SetCurrentShellFolder(IShellFolder * psfParent); // HACK
-
+WCHAR *build_paths_list(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls);
 
 static
 HRESULT
@@ -1297,12 +1297,12 @@
     HRESULT hr;
     STRRET strTemp;
     WCHAR szPath[MAX_PATH];
+    LPWSTR wszPath, wszPos;
     SHFILEOPSTRUCTW op;
     int ret;
     LPSHELLBROWSER lpSB;
     HWND hwnd;
 
-
     hr = IShellFolder2_GetDisplayNameOf(This->dcm.psf, This->dcm.apidl[0], 
SHGDN_FORPARSING, &strTemp);
     if(hr != S_OK)
     {
@@ -1316,20 +1316,26 @@
         ERR("StrRetToBufW failed with %x\n", hr);
         return hr;
     }
-    /* FIXME
-     * implement deletion with multiple files
-     */
+
+    /* Only keep the base path */
+    wszPos = strrchrW(szPath, '\\');
+    if (wszPos != NULL)
+    {
+        *(wszPos + 1) = '\0';
+    }
+
+    wszPath = build_paths_list(szPath, This->dcm.cidl, This->dcm.apidl);
 
     ZeroMemory(&op, sizeof(op));
     op.hwnd = GetActiveWindow();
     op.wFunc = FO_DELETE;
-    op.pFrom = szPath;
+    op.pFrom = wszPath;
     op.fFlags = FOF_ALLOWUNDO;
     ret = SHFileOperationW(&op);
 
     if (ret)
     {
-        TRACE("SHFileOperation failed with %0x%x", GetLastError());
+        ERR("SHFileOperation failed with 0x%x for %s\n", GetLastError(), 
debugstr_w(wszPath));
         return S_OK;
     }
 
@@ -1348,6 +1354,7 @@
     }
     NotifyShellViewWindow(lpcmi, TRUE);
 
+    HeapFree(GetProcessHeap(), 0, wszPath);
     return S_OK;
 
 }


Reply via email to