Module: wine Branch: master Commit: 007586ea29859a2698a0c05ffe81045f9d94fbbf URL: http://source.winehq.org/git/wine.git/?a=commit;h=007586ea29859a2698a0c05ffe...
Author: Ilya Shpigor shpigor@etersoft.ru Date: Mon Nov 9 14:04:08 2009 +0300
extrac32: Implementation of the CAB archive extraction.
---
programs/extrac32/Makefile.in | 2 +- programs/extrac32/extrac32.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/programs/extrac32/Makefile.in b/programs/extrac32/Makefile.in index 31aa7e0..78e4fef 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 user32 kernel32 +IMPORTS = shell32 setupapi user32 kernel32
C_SRCS = \ extrac32.c diff --git a/programs/extrac32/extrac32.c b/programs/extrac32/extrac32.c index e6fefc9..7e66458 100644 --- a/programs/extrac32/extrac32.c +++ b/programs/extrac32/extrac32.c @@ -21,12 +21,39 @@
#include <windows.h> #include <shellapi.h> +#include <setupapi.h>
#include "wine/unicode.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(extrac32);
+static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2) +{ + FILE_IN_CABINET_INFO_W *pInfo; + FILEPATHS_W *pFilePaths; + + switch(Notification) + { + case SPFILENOTIFY_FILEINCABINET: + pInfo = (FILE_IN_CABINET_INFO_W*)Param1; + lstrcpyW(pInfo->FullTargetName, (LPCWSTR)Context); + lstrcatW(pInfo->FullTargetName, pInfo->NameInCabinet); + return FILEOP_DOIT; + case SPFILENOTIFY_FILEEXTRACTED: + pFilePaths = (FILEPATHS_W*)Param1; + WINE_TRACE("Extracted %s\n", wine_dbgstr_w(pFilePaths->Target)); + return NO_ERROR; + } + return NO_ERROR; +} + +static void extract(LPCWSTR cabfile, LPWSTR destdir) +{ + if (!SetupIterateCabinetW(cabfile, 0, ExtCabCallback, destdir)) + WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile)); +} + int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show) { LPWSTR *argv; @@ -105,7 +132,7 @@ int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int sho break; case 'E': /* Extract CAB archive */ - WINE_FIXME("/E not implemented\n"); + extract(cabfile, path); break; case 0: case 'D':