https://git.reactos.org/?p=reactos.git;a=commitdiff;h=aa719b9989103c238a15e66f1d6b0b0e4520fdce

commit aa719b9989103c238a15e66f1d6b0b0e4520fdce
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Tue Aug 29 19:29:05 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Tue Aug 29 19:29:05 2023 +0900

    [SHELL32] SHFileOperation: Confirm overwrite on moving files (#5618)
    
    - Add move_file_to_file helper function.
    - Modify move_to_dir and move_files helper
      functions.
    CORE-18910
---
 dll/win32/shell32/shlfileop.cpp | 55 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/dll/win32/shell32/shlfileop.cpp b/dll/win32/shell32/shlfileop.cpp
index 18956867143..f90f3265773 100644
--- a/dll/win32/shell32/shlfileop.cpp
+++ b/dll/win32/shell32/shlfileop.cpp
@@ -5,7 +5,7 @@
  * Copyright 2002 Andriy Palamarchuk
  * Copyright 2004 Dietrich Teickner (from Odin)
  * Copyright 2004 Rolf Kalbermatter
- * Copyright 2019 Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
+ * Copyright 2019-2023 Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1744,15 +1744,48 @@ static void move_dir_to_dir(FILE_OPERATION *op, const 
FILE_ENTRY *feFrom, LPCWST
         Win32RemoveDirectoryW(feFrom->szFullPath);
 }
 
+#ifdef __REACTOS__
+static BOOL move_file_to_file(FILE_OPERATION *op, const WCHAR *szFrom, const 
WCHAR *szTo)
+{
+    if (PathFileExistsW(szTo))
+    {
+        if (op->req->fFlags & FOF_RENAMEONCOLLISION)
+        {
+            CStringW newPath = try_find_new_name(szTo);
+            if (!newPath.IsEmpty())
+            {
+                return SHNotifyMoveFileW(op, szFrom, newPath, FALSE) == 0;
+            }
+        }
+        else if (!(op->req->fFlags & FOF_NOCONFIRMATION))
+        {
+            if (!SHELL_ConfirmDialogW(op->req->hwnd, ASK_OVERWRITE_FILE, 
PathFindFileNameW(szTo), op))
+                return FALSE;
+        }
+    }
+
+    return SHNotifyMoveFileW(op, szFrom, szTo, FALSE) == 0;
+}
+#endif
+
 /* moves a file or directory to another directory */
 static void move_to_dir(FILE_OPERATION *op, const FILE_ENTRY *feFrom, const 
FILE_ENTRY *feTo)
 {
     WCHAR szDestPath[MAX_PATH];
 
+#ifdef __REACTOS__
+    if (!PathFileExistsW(feTo->szFullPath))
+        SHNotifyCreateDirectoryW(feTo->szFullPath, NULL);
+#endif
+
     PathCombineW(szDestPath, feTo->szFullPath, feFrom->szFilename);
 
     if (IsAttribFile(feFrom->attributes))
+#ifdef __REACTOS__
+        move_file_to_file(op, feFrom->szFullPath, szDestPath);
+#else
         SHNotifyMoveFileW(op, feFrom->szFullPath, szDestPath, FALSE);
+#endif
     else if (!(op->req->fFlags & FOF_FILESONLY && feFrom->bFromWildcard))
         move_dir_to_dir(op, feFrom, szDestPath);
 }
@@ -1813,10 +1846,30 @@ static DWORD move_files(FILE_OPERATION *op, BOOL 
multiDest, const FILE_LIST *flF
             }
         }
 
+#ifdef __REACTOS__
+        if ((flFrom->dwNumFiles > 1 && flTo->dwNumFiles == 1) ||
+            IsAttribDir(fileDest->attributes))
+        {
+            move_to_dir(op, entryToMove, fileDest);
+        }
+        else if (IsAttribDir(entryToMove->attributes))
+        {
+            move_dir_to_dir(op, entryToMove, fileDest->szFullPath);
+        }
+        else
+        {
+            if (!move_file_to_file(op, entryToMove->szFullPath, 
fileDest->szFullPath))
+            {
+                op->req->fAnyOperationsAborted = TRUE;
+                return ERROR_CANCELLED;
+            }
+        }
+#else
         if (fileDest->bExists && IsAttribDir(fileDest->attributes))
             move_to_dir(op, entryToMove, fileDest);
         else
             SHNotifyMoveFileW(op, entryToMove->szFullPath, 
fileDest->szFullPath, IsAttribDir(entryToMove->attributes));
+#endif
 
         if (op->progress != NULL)
             op->bCancelled |= op->progress->HasUserCancelled();

Reply via email to