[ros-diffs] [janderwald] 35440: - rewrite ISFHelper_CopyItems to actually copy the items when requested - should fix copy&paste of files in explorer (Directories are not yet supported)

janderwald at svn.reactos.org janderwald at svn.reactos.org
Tue Aug 19 02:04:54 CEST 2008


Author: janderwald
Date: Mon Aug 18 19:04:53 2008
New Revision: 35440

URL: http://svn.reactos.org/svn/reactos?rev=35440&view=rev
Log:
- rewrite ISFHelper_CopyItems to actually copy the items when requested
- should fix copy&paste of files in explorer (Directories are not yet supported)

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

Modified: trunk/reactos/dll/win32/shell32/shfldr_fs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_fs.c?rev=35440&r1=35439&r2=35440&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shfldr_fs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shfldr_fs.c [iso-8859-1] Mon Aug 18 19:04:53 2008
@@ -1269,39 +1269,75 @@
 ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl,
                        LPCITEMIDLIST * apidl)
 {
-    UINT i;
     IPersistFolder2 *ppf2 = NULL;
-    char szSrcPath[MAX_PATH],
-      szDstPath[MAX_PATH];
+    WCHAR szSrcPath[MAX_PATH];
+    WCHAR szTargetPath[MAX_PATH];
+    SHFILEOPSTRUCTW op;
+    LPITEMIDLIST pidl;
+    LPWSTR pszSrc, pszTarget;
+    int res;
+
 
     IGenericSFImpl *This = impl_from_ISFHelper(iface);
 
     TRACE ("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl);
 
-    IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2,
-     (LPVOID *) & ppf2);
-    if (ppf2) {
-        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);
-            }
+    IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2, (LPVOID *) & ppf2);
+    if (ppf2) 
+    {
+        if (FAILED(IPersistFolder2_GetCurFolder (ppf2, &pidl)))
+        {
+            IPersistFolder2_Release(ppf2);
+            return E_FAIL;
+        }
+
+        if (!SHGetPathFromIDListW (pidl, szSrcPath))
+        {
             SHFree (pidl);
-        }
+            IPersistFolder2_Release (ppf2);
+            return E_FAIL;
+        }
+        pszSrc = PathAddBackslashW (szSrcPath);
+        wcscpy(szTargetPath, This->sPathTarget);
+        pszTarget = PathAddBackslashW (szTargetPath);
+
+        pszSrc = build_paths_list(szSrcPath, cidl, apidl);
+        pszTarget = build_paths_list(szTargetPath, cidl, apidl);
+
+        if (!pszSrc || !pszTarget)
+        {
+            if (pszSrc)
+                HeapFree(GetProcessHeap(), 0, pszSrc);
+
+            if (pszTarget)
+                HeapFree(GetProcessHeap(), 0, pszTarget);
+
+            SHFree (pidl);
+            IPersistFolder2_Release (ppf2);
+            return E_OUTOFMEMORY;
+        }
+
+        ZeroMemory(&op, sizeof(op));
+        op.hwnd = GetActiveWindow();
+        op.wFunc = FO_COPY;
+        op.pFrom = pszSrc;
+        op.pTo = pszTarget;
+        op.fFlags = FOF_ALLOWUNDO;
+
+        res = SHFileOperationW(&op);
+
+        HeapFree(GetProcessHeap(), 0, pszSrc);
+        HeapFree(GetProcessHeap(), 0, pszTarget);
+
+        SHFree (pidl);
         IPersistFolder2_Release (ppf2);
-    }
-    return S_OK;
+
+        if (res)
+            return E_FAIL;
+        else
+            return S_OK;
+    }
+    return E_FAIL;
 }
 
 static const ISFHelperVtbl shvt =



More information about the Ros-diffs mailing list