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/exp…
==============================================================================
--- 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/exp…
==============================================================================
--- 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/exp…
==============================================================================
--- 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/exp…
==============================================================================
--- 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/exp…
==============================================================================
--- 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"