Ilya Shpigor : extrac32: Implementation of the CAB archive extraction.
Alexandre Julliard
julliard at winehq.org
Wed Nov 11 08:33:25 CST 2009
Module: wine
Branch: master
Commit: 007586ea29859a2698a0c05ffe81045f9d94fbbf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=007586ea29859a2698a0c05ffe81045f9d94fbbf
Author: Ilya Shpigor <shpigor at 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':
More information about the wine-cvs
mailing list