extrac32: Implement /C mode.

This commit is contained in:
Andrey Turkin 2010-02-23 18:41:47 +03:00 committed by Alexandre Julliard
parent 2db497e89e
commit 7628fcdd76
2 changed files with 31 additions and 3 deletions

View File

@ -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

View File

@ -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 */