Index: chrome/installer/util/lzma_util.cc |
=================================================================== |
--- chrome/installer/util/lzma_util.cc (revision 79229) |
+++ chrome/installer/util/lzma_util.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -9,67 +9,14 @@ |
#include "base/utf_string_conversions.h" |
extern "C" { |
-#include "third_party/lzma_sdk/Archive/7z/7zExtract.h" |
-#include "third_party/lzma_sdk/Archive/7z/7zIn.h" |
-#include "third_party/lzma_sdk/7zCrc.h" |
+#include "third_party/lzma_sdk/C/7z.h" |
+#include "third_party/lzma_sdk/C/7zAlloc.h" |
+#include "third_party/lzma_sdk/C/7zCrc.h" |
+#include "third_party/lzma_sdk/C/7zFile.h" |
+#include "third_party/lzma_sdk/C/7zVersion.h" |
} |
-namespace { |
- |
-typedef struct _CFileInStream { |
- ISzInStream InStream; |
- HANDLE File; |
-} CFileInStream; |
- |
- |
-size_t LzmaReadFile(HANDLE file, void *data, size_t size) { |
- if (size == 0) |
- return 0; |
- |
- size_t processedSize = 0; |
- do { |
- DWORD processedLoc = 0; |
- BOOL res = ReadFile(file, data, (DWORD) size, &processedLoc, NULL); |
- data = (void *)((unsigned char *) data + processedLoc); |
- size -= processedLoc; |
- processedSize += processedLoc; |
- if (!res || processedLoc == 0) |
- break; |
- } while (size > 0); |
- |
- return processedSize; |
-} |
- |
-SZ_RESULT SzFileSeekImp(void *object, CFileSize pos) { |
- CFileInStream *s = (CFileInStream *) object; |
- LARGE_INTEGER value; |
- value.LowPart = (DWORD) pos; |
- value.HighPart = (LONG) ((UInt64) pos >> 32); |
- value.LowPart = SetFilePointer(s->File, value.LowPart, &value.HighPart, |
- FILE_BEGIN); |
- return ((value.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) ? |
- SZE_FAIL : SZ_OK; |
-} |
- |
-SZ_RESULT SzFileReadImp(void *object, void **buffer, |
- size_t maxRequiredSize, size_t *processedSize) { |
- const int kBufferSize = 1 << 12; |
- static Byte g_Buffer[kBufferSize]; |
- if (maxRequiredSize > kBufferSize) |
- maxRequiredSize = kBufferSize; |
- |
- CFileInStream *s = (CFileInStream *) object; |
- size_t processedSizeLoc; |
- processedSizeLoc = LzmaReadFile(s->File, g_Buffer, maxRequiredSize); |
- *buffer = g_Buffer; |
- if (processedSize != 0) |
- *processedSize = processedSizeLoc; |
- return SZ_OK; |
-} |
- |
-} // namespace |
- |
// static |
int32 LzmaUtil::UnPackArchive(const std::wstring& archive, |
const std::wstring& output_dir, |
@@ -122,24 +69,29 @@ |
return ERROR_INVALID_HANDLE; |
CFileInStream archiveStream; |
robertshield
2011/03/25 02:34:37
archiveStream -> archive_stream
bradn
2011/03/25 02:53:42
Done.
|
+ CLookToRead lookStream; |
robertshield
2011/03/25 02:34:37
lookStream -> look_stream
bradn
2011/03/25 02:53:42
Done.
bradn
2011/03/25 02:53:42
Done.
|
ISzAlloc allocImp; |
robertshield
2011/03/25 02:34:37
alloc_imp
bradn
2011/03/25 02:53:42
Done.
|
ISzAlloc allocTempImp; |
robertshield
2011/03/25 02:34:37
alloc_temp_imp
bradn
2011/03/25 02:53:42
Done.
|
- CArchiveDatabaseEx db; |
+ CSzArEx db; |
DWORD ret = NO_ERROR; |
+ UInt16 *name = NULL; |
robertshield
2011/03/25 02:34:37
nit: UInt16* name
bradn
2011/03/25 02:53:42
Done.
|
+ size_t nameLen = 0; |
robertshield
2011/03/25 02:34:37
name_len
bradn
2011/03/25 02:53:42
Done.
|
- archiveStream.File = archive_handle_; |
- archiveStream.InStream.Read = SzFileReadImp; |
- archiveStream.InStream.Seek = SzFileSeekImp; |
+ FileInStream_CreateVTable(&archiveStream); |
+ LookToRead_CreateVTable(&lookStream, False); |
+ lookStream.realStream = &archiveStream.s; |
+ LookToRead_Init(&lookStream); |
+ |
allocImp.Alloc = SzAlloc; |
allocImp.Free = SzFree; |
allocTempImp.Alloc = SzAllocTemp; |
allocTempImp.Free = SzFreeTemp; |
CrcGenerateTable(); |
- SzArDbExInit(&db); |
- if ((ret = SzArchiveOpen(&archiveStream.InStream, &db, |
- &allocImp, &allocTempImp)) != SZ_OK) { |
- LOG(ERROR) << L"Error returned by SzArchiveOpen: " << ret; |
+ SzArEx_Init(&db); |
+ if ((ret = SzArEx_Open(&db, &lookStream.s, |
+ &allocImp, &allocTempImp)) != SZ_OK) { |
+ LOG(ERROR) << L"Error returned by SzArEx_Open: " << ret; |
return ret; |
} |
@@ -147,25 +99,43 @@ |
UInt32 blockIndex = 0xFFFFFFFF; // can have any value if outBuffer = 0 |
size_t outBufferSize = 0; // can have any value if outBuffer = 0 |
- for (unsigned int i = 0; i < db.Database.NumFiles; i++) { |
+ for (unsigned int i = 0; i < db.db.NumFiles; i++) { |
DWORD written; |
size_t offset; |
size_t outSizeProcessed; |
- CFileItem *f = db.Database.Files + i; |
+ CSzFileItem *f = db.db.Files + i; |
robertshield
2011/03/25 02:34:37
CSzFileItem* f =...
bradn
2011/03/25 02:53:42
Done.
|
- if ((ret = SzExtract(&archiveStream.InStream, &db, i, &blockIndex, |
- &outBuffer, &outBufferSize, &offset, &outSizeProcessed, |
- &allocImp, &allocTempImp)) != SZ_OK) { |
- LOG(ERROR) << L"Error returned by SzExtract: " << ret; |
+ if ((ret = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, |
+ &outBuffer, &outBufferSize, &offset, |
+ &outSizeProcessed, &allocImp, |
+ &allocTempImp)) != SZ_OK) { |
+ LOG(ERROR) << L"Error returned by SzArEx_Extract: " << ret; |
break; |
} |
- FilePath file_path = FilePath(location).Append(UTF8ToWide(f->Name)); |
+ size_t len = SzArEx_GetFileNameUtf16(&db, i, NULL); |
+ if (len > nameLen) { |
robertshield
2011/03/25 02:34:37
nameLen here can only be 0, and this is also its f
bradn
2011/03/25 02:53:42
Rearranged.
|
+ SzFree(NULL, name); |
+ nameLen = len; |
+ name = (UInt16 *)SzAlloc(NULL, nameLen * sizeof(UInt16)); |
robertshield
2011/03/25 02:34:37
According to style guide, should be reinterpret_ca
bradn
2011/03/25 02:53:42
Done.
|
+ if (!name) { |
+ LOG(ERROR) << L"Can't allocate memory for filename string."; |
+ break; |
+ } |
+ } |
+ SzArEx_GetFileNameUtf16(&db, i, name); |
+ |
+ std::wstring wname; |
+ if (!UTF16ToWide(reinterpret_cast<char16*>(name), len - 1, &wname)) { |
+ LOG(ERROR) << L"Can't convert filename string."; |
+ break; |
+ } |
+ FilePath file_path = FilePath(location).Append(wname); |
if (output_file) |
*output_file = file_path.value(); |
// If archive entry is directory create it and move on to the next entry. |
- if (f->IsDirectory) { |
+ if (f->IsDir) { |
CreateDirectory(file_path); |
continue; |
} |
@@ -190,9 +160,9 @@ |
break; |
} |
- if (f->IsLastWriteTimeDefined) { |
+ if (f->MTimeDefined) { |
if (!SetFileTime(hFile, NULL, NULL, |
- (const FILETIME *)&(f->LastWriteTime))) { |
+ (const FILETIME *)&(f->MTime))) { |
robertshield
2011/03/25 02:34:37
no C-style casts
bradn
2011/03/25 02:53:42
Done.
|
ret = GetLastError(); |
CloseHandle(hFile); |
LOG(ERROR) << L"Error returned by SetFileTime: " << ret; |
@@ -206,8 +176,8 @@ |
} |
} // for loop |
- allocImp.Free(outBuffer); |
- SzArDbExFree(&db, allocImp.Free); |
+ SzFree(NULL, name); |
+ SzArEx_Free(&db, &allocImp); |
return ret; |
} |