Jay Yang : shell32: Make ISFHelper_fnCopyItems actually copy the items.

Alexandre Julliard julliard at winehq.org
Wed Jul 20 12:54:40 CDT 2011


Module: wine
Branch: master
Commit: 872c07a967f374e5216911f28863e5166e245bd0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=872c07a967f374e5216911f28863e5166e245bd0

Author: Jay Yang <jkelleyy at gmail.com>
Date:   Tue Jul 19 12:25:15 2011 -0400

shell32: Make ISFHelper_fnCopyItems actually copy the items.

---

 dlls/shell32/shfldr_fs.c |   48 +++++++++++++++++++++++++++------------------
 1 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c
index c0e9ae5..969f18d 100644
--- a/dlls/shell32/shfldr_fs.c
+++ b/dlls/shell32/shfldr_fs.c
@@ -1383,13 +1383,15 @@ static HRESULT WINAPI
 ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl,
                        LPCITEMIDLIST * apidl)
 {
-    UINT i;
+    HRESULT ret=E_FAIL;
     IPersistFolder2 *ppf2 = NULL;
-    char szSrcPath[MAX_PATH],
-      szDstPath[MAX_PATH];
-
+    WCHAR wszSrcPathRoot[MAX_PATH],
+      wszDstPath[MAX_PATH+1];
+    WCHAR *wszSrcPathsList;
     IGenericSFImpl *This = impl_from_ISFHelper(iface);
 
+    SHFILEOPSTRUCTW fop;
+
     TRACE ("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl);
 
     IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2,
@@ -1398,24 +1400,32 @@ ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl,
         LPITEMIDLIST pidl;
 
         if (SUCCEEDED (IPersistFolder2_GetCurFolder (ppf2, &pidl))) {
-            for (i = 0; i < cidl; i++) {
-                SHGetPathFromIDListA (pidl, szSrcPath);
-                PathAddBackslashA (szSrcPath);
-                _ILSimpleGetText (apidl[i], szSrcPath + strlen (szSrcPath),
-                 MAX_PATH);
-
-                if (!WideCharToMultiByte(CP_ACP, 0, This->sPathTarget, -1, szDstPath, MAX_PATH, NULL, NULL))
-                    szDstPath[0] = '\0';
-                PathAddBackslashA (szDstPath);
-                _ILSimpleGetText (apidl[i], szDstPath + strlen (szDstPath),
-                 MAX_PATH);
-                MESSAGE ("would copy %s to %s\n", szSrcPath, szDstPath);
+            SHGetPathFromIDListW (pidl, wszSrcPathRoot);
+            ZeroMemory(wszDstPath, MAX_PATH+1);
+            if (This->sPathTarget)
+                lstrcpynW(wszDstPath, This->sPathTarget, MAX_PATH);
+            PathAddBackslashW(wszSrcPathRoot);
+            PathAddBackslashW(wszDstPath);
+            wszSrcPathsList = build_paths_list(wszSrcPathRoot, cidl, apidl);
+            ZeroMemory(&fop, sizeof(fop));
+            fop.hwnd = GetActiveWindow();
+            fop.wFunc = FO_COPY;
+            fop.pFrom = wszSrcPathsList;
+            fop.pTo = wszDstPath;
+            fop.fFlags = FOF_ALLOWUNDO;
+            ret = S_OK;
+            if(SHFileOperationW(&fop))
+            {
+                WARN("Copy failed\n");
+                ret = E_FAIL;
             }
-            SHFree (pidl);
+            HeapFree(GetProcessHeap(), 0, wszSrcPathsList);
+
         }
-        IPersistFolder2_Release (ppf2);
+        SHFree(pidl);
+        IPersistFolder2_Release(ppf2);
     }
-    return S_OK;
+    return ret;
 }
 
 static const ISFHelperVtbl shvt =




More information about the wine-cvs mailing list