Andrey Turkin : extrac32: Implement /C mode.

Alexandre Julliard julliard at winehq.org
Wed Feb 24 10:21:32 CST 2010


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

Author: Andrey Turkin <andrey.turkin at gmail.com>
Date:   Tue Feb 23 18:41:47 2010 +0300

extrac32: Implement /C mode.

---

 programs/extrac32/Makefile.in |    2 +-
 programs/extrac32/extrac32.c  |   32 ++++++++++++++++++++++++++++++--
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/programs/extrac32/Makefile.in b/programs/extrac32/Makefile.in
index 78e4fef..3ee70a9 100644
--- a/programs/extrac32/Makefile.in
+++ b/programs/extrac32/Makefile.in
@@ -5,7 +5,7 @@ VPATH     = @srcdir@
 MODULE    = extrac32.exe
 APPMODE   = -mwindows -municode
 EXTRADEFS = -DWINE_NO_UNICODE
-IMPORTS   = shell32 setupapi user32 kernel32
+IMPORTS   = shell32 setupapi shlwapi user32 kernel32
 
 C_SRCS = \
 	extrac32.c
diff --git a/programs/extrac32/extrac32.c b/programs/extrac32/extrac32.c
index 7e66458..d7f2da4 100644
--- a/programs/extrac32/extrac32.c
+++ b/programs/extrac32/extrac32.c
@@ -22,12 +22,15 @@
 #include <windows.h>
 #include <shellapi.h>
 #include <setupapi.h>
+#include <shlwapi.h>
 
 #include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(extrac32);
 
+static BOOL force_mode;
+
 static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
 {
     FILE_IN_CABINET_INFO_W *pInfo;
@@ -54,6 +57,31 @@ static void extract(LPCWSTR cabfile, LPWSTR destdir)
         WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile));
 }
 
+static void copy_file(LPCWSTR source, LPCWSTR destination)
+{
+    WCHAR destfile[MAX_PATH];
+
+    /* append source filename if destination is a directory */
+    if (PathIsDirectoryW(destination))
+    {
+        PathCombineW(destfile, destination, PathFindFileNameW(source));
+        destination = destfile;
+    }
+
+    if (PathFileExistsW(destination) && !force_mode)
+    {
+        static const WCHAR overwriteMsg[] = {'O','v','e','r','w','r','i','t','e',' ','"','%','s','"','?',0};
+        static const WCHAR titleMsg[] = {'E','x','t','r','a','c','t',0};
+        WCHAR msg[MAX_PATH+100];
+        snprintfW(msg, sizeof(msg)/sizeof(msg[0]), overwriteMsg, destination);
+        if (MessageBoxW(NULL, msg, titleMsg, MB_YESNO | MB_ICONWARNING) != IDYES)
+            return;
+    }
+
+    WINE_TRACE("copying %s to %s\n", wine_dbgstr_w(source), wine_dbgstr_w(destination));
+    CopyFileW(source, destination, FALSE);
+}
+
 int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show)
 {
     LPWSTR *argv;
@@ -90,7 +118,7 @@ int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int sho
                 WINE_FIXME("/A not implemented\n");
                 break;
             case 'Y':
-                WINE_FIXME("/Y not implemented\n");
+                force_mode = TRUE;
                 break;
             case 'L':
                 if ((i + 1) >= argc) return 0;
@@ -128,7 +156,7 @@ int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int sho
     {
         case 'C':
             /* Copy file */
-            WINE_FIXME("/C not implemented\n");
+            copy_file(cabfile, path);
             break;
         case 'E':
             /* Extract CAB archive */




More information about the wine-cvs mailing list