From 7628fcdd76eece53960dac5554ecc241feff2135 Mon Sep 17 00:00:00 2001 From: Andrey Turkin Date: Tue, 23 Feb 2010 18:41:47 +0300 Subject: [PATCH] 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 78e4fefb86b..3ee70a99921 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 7e66458af43..d7f2da44bfa 100644 --- a/programs/extrac32/extrac32.c +++ b/programs/extrac32/extrac32.c @@ -22,12 +22,15 @@ #include #include #include +#include #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 */