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