[ros-diffs] [fireball] 45457: - Merge 45418, 45419 (expand sync from Wine). Part 1/2.

fireball at svn.reactos.org fireball at svn.reactos.org
Sat Feb 6 14:36:35 CET 2010


Author: fireball
Date: Sat Feb  6 14:36:35 2010
New Revision: 45457

URL: http://svn.reactos.org/svn/reactos?rev=45457&view=rev
Log:
- Merge 45418, 45419 (expand sync from Wine). Part 1/2.

Removed:
    branches/arwinss/reactos/base/system/expand/lang/
    branches/arwinss/reactos/base/system/expand/resource.h
    branches/arwinss/reactos/base/system/expand/rsrc.rc
Modified:
    branches/arwinss/reactos/base/system/expand/expand.c
    branches/arwinss/reactos/base/system/expand/expand.rbuild
    branches/arwinss/reactos/base/system/expand/expand.rc

Modified: branches/arwinss/reactos/base/system/expand/expand.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/base/system/expand/expand.c?rev=45457&r1=45456&r2=45457&view=diff
==============================================================================
--- branches/arwinss/reactos/base/system/expand/expand.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/base/system/expand/expand.c [iso-8859-1] Sat Feb  6 14:36:35 2010
@@ -1,6 +1,7 @@
 /*
  * Copyright 1997 Victor Schneider
  * Copyright 2002 Alexandre Julliard
+ * Copyright 2007 Hans Leidekker
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -14,44 +15,178 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <stdlib.h>
+#define WIN32_LEAN_AND_MEAN
+
 #include <stdio.h>
 #include <string.h>
 #include <windows.h>
 #include <lzexpand.h>
-#include <tchar.h>
+#include <setupapi.h>
 
-#include "resource.h"
+static UINT CALLBACK set_outfile( PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2 )
+{
+    FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)param1;
+    char buffer[MAX_PATH];
+    char* basename;
 
-int _tmain(int argc, TCHAR *argv[])
+    switch (notification)
+    {
+    case SPFILENOTIFY_FILEINCABINET:
+    {
+        LPSTR outfile = context;
+        if (outfile[0] != 0)
+        {
+            SetLastError( ERROR_NOT_SUPPORTED );
+            return FILEOP_ABORT;
+        }
+        GetFullPathNameA( info->NameInCabinet, sizeof(buffer), buffer, &basename );
+        strcpy( outfile, basename );
+        return FILEOP_SKIP;
+    }
+    default: return NO_ERROR;
+    }
+}
+
+static UINT CALLBACK extract_callback( PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2 )
 {
-  OFSTRUCT SourceOpenStruct1, SourceOpenStruct2;
-  LONG ret;
-  HFILE hSourceFile, hDestFile;
-  TCHAR szMsg[RC_STRING_MAX_SIZE];
+    FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)param1;
 
-  if (argc < 2)
-  {
-      LoadString( GetModuleHandle(NULL), IDS_Copy, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
-      _ftprintf( stderr, szMsg, argv[0] );
-      return 1;
-  }
-  hSourceFile = LZOpenFile(argv[1], &SourceOpenStruct1, OF_READ);
-  if (argv[2])
-      hDestFile = LZOpenFile(argv[2], &SourceOpenStruct2, OF_CREATE | OF_WRITE);
-  else
-  {
-      TCHAR OriginalName[MAX_PATH];
-      GetExpandedName(argv[1], OriginalName);
-      hDestFile = LZOpenFile(OriginalName, &SourceOpenStruct2, OF_CREATE | OF_WRITE);
-  }
-  ret = LZCopy(hSourceFile, hDestFile);
-  LZClose(hSourceFile);
-  LZClose(hDestFile);
-  LoadString( GetModuleHandle(NULL), IDS_FAILS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
-  if (ret <= 0) _ftprintf(stderr,szMsg,ret);
-  return (ret <= 0);
+    switch (notification)
+    {
+    case SPFILENOTIFY_FILEINCABINET:
+    {
+        LPCSTR targetname = context;
+
+        strcpy( info->FullTargetName, targetname );
+        return FILEOP_DOIT;
+    }
+    default: return NO_ERROR;
+    }
 }
+
+static BOOL option_equal(LPCSTR str1, LPCSTR str2)
+{
+    if (str1[0] != '/' && str1[0] != '-')
+        return FALSE;
+    return !lstrcmpA( str1 + 1, str2 );
+}
+
+int main(int argc, char *argv[])
+{
+    int ret = 0;
+    char infile[MAX_PATH], outfile[MAX_PATH], actual_name[MAX_PATH];
+    char outfile_basename[MAX_PATH], *basename_index;
+    UINT comp;
+
+    if (argc < 3)
+    {
+        fprintf( stderr, "Usage:\n" );
+        fprintf( stderr, "\t%s infile outfile\n", argv[0] );
+        fprintf( stderr, "\t%s /r infile\n", argv[0] );
+        return 1;
+    }
+
+    if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r")))
+        GetFullPathNameA( argv[2], sizeof(infile), infile, NULL );
+    else
+        GetFullPathNameA( argv[1], sizeof(infile), infile, NULL );
+
+    if (!SetupGetFileCompressionInfoExA( infile, actual_name, sizeof(actual_name), NULL, NULL, NULL, &comp ))
+    {
+        fprintf( stderr, "%s: can't open input file %s\n", argv[0], infile );
+        return 1;
+    }
+
+    if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r")))
+    {
+        switch (comp)
+        {
+        case FILE_COMPRESSION_MSZIP:
+        {
+            outfile_basename[0] = 0;
+            if (!SetupIterateCabinetA( infile, 0, set_outfile, outfile_basename ))
+            {
+                fprintf( stderr, "%s: can't determine original name\n", argv[0] );
+                return 1;
+            }
+            GetFullPathNameA( infile, sizeof(outfile), outfile, &basename_index );
+            *basename_index = 0;
+            strcat( outfile, outfile_basename );
+            break;
+        }
+        case FILE_COMPRESSION_WINLZA:
+        {
+            GetExpandedNameA( infile, outfile_basename );
+            break;
+        }
+        default:
+        {
+            fprintf( stderr, "%s: can't determine original\n", argv[0] );
+            return 1;
+        }
+        }
+    }
+    else
+        GetFullPathNameA( argv[2], sizeof(outfile), outfile, NULL );
+
+    if (!lstrcmpiA( infile, outfile ))
+    {
+        fprintf( stderr, "%s: can't expand file to itself\n", argv[0] );
+        return 1;
+    }
+
+    switch (comp)
+    {
+    case FILE_COMPRESSION_MSZIP:
+    {
+        if (!SetupIterateCabinetA( infile, 0, extract_callback, outfile ))
+        {
+            fprintf( stderr, "%s: cabinet extraction failed\n", argv[0] );
+            return 1;
+        }
+        break;
+    }
+    case FILE_COMPRESSION_WINLZA:
+    {
+        INT hin, hout;
+        OFSTRUCT ofin, ofout;
+        LONG error;
+
+        if ((hin = LZOpenFileA( infile, &ofin, OF_READ )) < 0)
+        {
+            fprintf( stderr, "%s: can't open input file %s\n", argv[0], infile );
+            return 1;
+        }
+        if ((hout = LZOpenFileA( outfile, &ofout, OF_CREATE | OF_WRITE )) < 0)
+        {
+            LZClose( hin );
+            fprintf( stderr, "%s: can't open output file %s\n", argv[0], outfile );
+            return 1;
+        }
+        error = LZCopy( hin, hout );
+
+        LZClose( hin );
+        LZClose( hout );
+
+        if (error < 0)
+        {
+            fprintf( stderr, "%s: LZCopy failed, error is %ld\n", argv[0], error );
+            return 1;
+        }
+        break;
+    }
+    default:
+    {
+        if (!CopyFileA( infile, outfile, FALSE ))
+        {
+            fprintf( stderr, "%s: CopyFileA failed\n", argv[0] );
+            return 1;
+        }
+        break;
+    }
+    }
+    return ret;
+}

Modified: branches/arwinss/reactos/base/system/expand/expand.rbuild
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/base/system/expand/expand.rbuild?rev=45457&r1=45456&r2=45457&view=diff
==============================================================================
--- branches/arwinss/reactos/base/system/expand/expand.rbuild [iso-8859-1] (original)
+++ branches/arwinss/reactos/base/system/expand/expand.rbuild [iso-8859-1] Sat Feb  6 14:36:35 2010
@@ -3,8 +3,8 @@
 <module name="expand" type="win32cui" installbase="system32" installname="expand.exe" >
 	<include base="ReactOS">include/reactos/wine</include>
 	<include base="expand">.</include>
-	<define name="ANONYMOUSUNIONS" />
 	<library>lz32</library>
+	<library>setupapi</library>
 	<library>user32</library>
 	<file>expand.c</file>
 	<file>expand.rc</file>

Modified: branches/arwinss/reactos/base/system/expand/expand.rc
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/base/system/expand/expand.rc?rev=45457&r1=45456&r2=45457&view=diff
==============================================================================
--- branches/arwinss/reactos/base/system/expand/expand.rc [iso-8859-1] (original)
+++ branches/arwinss/reactos/base/system/expand/expand.rc [iso-8859-1] Sat Feb  6 14:36:35 2010
@@ -3,5 +3,3 @@
 #define REACTOS_STR_INTERNAL_NAME	"expand\0"
 #define REACTOS_STR_ORIGINAL_FILENAME	"expand.exe\0"
 #include <reactos/version.rc>
-
-#include "rsrc.rc"

Removed: branches/arwinss/reactos/base/system/expand/resource.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/base/system/expand/resource.h?rev=45456&view=auto
==============================================================================
--- branches/arwinss/reactos/base/system/expand/resource.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/base/system/expand/resource.h (removed)
@@ -1,10 +1,0 @@
-#ifndef RESOURCE_H__
-#define RESOURCE_H__
-
-#define RC_STRING_MAX_SIZE                 4096
-#define IDS_Copy                            100
-#define IDS_FAILS                           101
-
-#endif
-
-/* EOF */

Removed: branches/arwinss/reactos/base/system/expand/rsrc.rc
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/base/system/expand/rsrc.rc?rev=45456&view=auto
==============================================================================
--- branches/arwinss/reactos/base/system/expand/rsrc.rc [iso-8859-1] (original)
+++ branches/arwinss/reactos/base/system/expand/rsrc.rc (removed)
@@ -1,24 +1,0 @@
-#include <windows.h>
-#include "resource.h"
-
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
-#include "lang/bg-BG.rc"
-#include "lang/cs-CZ.rc"
-#include "lang/de-DE.rc"
-#include "lang/el-GR.rc"
-#include "lang/en-US.rc"
-#include "lang/es-ES.rc"
-#include "lang/fr-FR.rc"
-#include "lang/hu-HU.rc"
-#include "lang/id-ID.rc"
-#include "lang/it-IT.rc"
-#include "lang/ja-JP.rc"
-#include "lang/lt-LT.rc"
-#include "lang/no-NO.rc"
-#include "lang/pl-PL.rc"
-#include "lang/pt-BR.rc"
-#include "lang/ru-RU.rc"
-#include "lang/sv-SE.rc"
-#include "lang/th-TH.rc"
-#include "lang/uk-UA.rc"




More information about the Ros-diffs mailing list