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