diff options
author | bashi@chromium.org <bashi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-18 23:02:31 +0000 |
---|---|---|
committer | bashi@chromium.org <bashi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-18 23:02:31 +0000 |
commit | ce59605d9f7aa1ba166dff1c36a2b3705a21cff3 (patch) | |
tree | 1d8043aa86e47194ef843273556e690fa5666e4d /chrome/installer | |
parent | 9119274849baf458401656254b079b21ece24455 (diff) | |
download | chromium_src-ce59605d9f7aa1ba166dff1c36a2b3705a21cff3.zip chromium_src-ce59605d9f7aa1ba166dff1c36a2b3705a21cff3.tar.gz chromium_src-ce59605d9f7aa1ba166dff1c36a2b3705a21cff3.tar.bz2 |
Update lzma_sdk to 9.20
Copied only C code required to open 7z archive files and
uncompress LZMA compression.
Updated chrome/installer/util/lzma_util.cc to follow API
changes.
BUG=None
TEST=installer_util_unittests --gtest_filter='LzmaUtilTest.*'
Review URL: http://codereview.chromium.org/10114005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132887 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/installer')
-rw-r--r-- | chrome/installer/util/lzma_util.cc | 129 |
1 files changed, 75 insertions, 54 deletions
diff --git a/chrome/installer/util/lzma_util.cc b/chrome/installer/util/lzma_util.cc index 70e899d..24618a4 100644 --- a/chrome/installer/util/lzma_util.cc +++ b/chrome/installer/util/lzma_util.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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,63 +9,68 @@ #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/7z.h" +#include "third_party/lzma_sdk/7zAlloc.h" #include "third_party/lzma_sdk/7zCrc.h" +#include "third_party/lzma_sdk/7zFile.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; +SRes LzmaReadFile(HANDLE file, void *data, size_t *size) { + if (*size == 0) + return SZ_OK; size_t processedSize = 0; + DWORD maxSize = *size; do { DWORD processedLoc = 0; - BOOL res = ReadFile(file, data, (DWORD) size, &processedLoc, NULL); + BOOL res = ReadFile(file, data, maxSize, &processedLoc, NULL); data = (void *)((unsigned char *) data + processedLoc); - size -= processedLoc; + maxSize -= processedLoc; processedSize += processedLoc; - if (!res || processedLoc == 0) - break; - } while (size > 0); + if (processedLoc == 0) { + if (res) + return SZ_ERROR_READ; + else + break; + } + } while (maxSize > 0); - return processedSize; + *size = processedSize; + return SZ_OK; } -SZ_RESULT SzFileSeekImp(void *object, CFileSize pos) { +SRes SzFileSeekImp(void *object, Int64 *pos, ESzSeek origin) { 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); + value.LowPart = (DWORD) *pos; + value.HighPart = (LONG) ((UInt64) *pos >> 32); + DWORD moveMethod; + switch (origin) { + case SZ_SEEK_SET: + moveMethod = FILE_BEGIN; + break; + case SZ_SEEK_CUR: + moveMethod = FILE_CURRENT; + break; + case SZ_SEEK_END: + moveMethod = FILE_END; + break; + default: + return SZ_ERROR_PARAM; + } + value.LowPart = SetFilePointer(s->file.handle, value.LowPart, &value.HighPart, + moveMethod); + *pos = ((Int64)value.HighPart << 32) | value.LowPart; return ((value.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) ? - SZE_FAIL : SZ_OK; + SZ_ERROR_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; - +SRes SzFileReadImp(void *object, void *buffer, size_t *size) { 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; + return LzmaReadFile(s->file.handle, buffer, size); } } // namespace @@ -122,50 +127,66 @@ DWORD LzmaUtil::UnPack(const std::wstring& location, return ERROR_INVALID_HANDLE; CFileInStream archiveStream; + CLookToRead lookStream; + CSzArEx db; ISzAlloc allocImp; ISzAlloc allocTempImp; - CArchiveDatabaseEx db; DWORD ret = NO_ERROR; - archiveStream.File = archive_handle_; - archiveStream.InStream.Read = SzFileReadImp; - archiveStream.InStream.Seek = SzFileSeekImp; + archiveStream.file.handle = archive_handle_; + archiveStream.s.Read = SzFileReadImp; + archiveStream.s.Seek = SzFileSeekImp; + LookToRead_CreateVTable(&lookStream, false); + lookStream.realStream = &archiveStream.s; + 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) { + SzArEx_Init(&db); + if ((ret = SzArEx_Open(&db, &lookStream.s, + &allocImp, &allocTempImp)) != SZ_OK) { LOG(ERROR) << L"Error returned by SzArchiveOpen: " << ret; - return ret; + return ERROR_INVALID_HANDLE; } Byte *outBuffer = 0; // it must be 0 before first call for each new archive 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; - if ((ret = SzExtract(&archiveStream.InStream, &db, i, &blockIndex, + if ((ret = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp)) != SZ_OK) { LOG(ERROR) << L"Error returned by SzExtract: " << ret; + ret = ERROR_INVALID_HANDLE; + break; + } + + size_t file_name_length = SzArEx_GetFileNameUtf16(&db, i, NULL); + if (file_name_length < 1) { + LOG(ERROR) << L"Couldn't get file name"; + ret = ERROR_INVALID_HANDLE; break; } + std::vector<UInt16> file_name(file_name_length); + SzArEx_GetFileNameUtf16(&db, i, &file_name[0]); + // |file_name| is NULL-terminated. + FilePath file_path = FilePath(location).Append( + FilePath::StringType(file_name.begin(), file_name.end() - 1)); - FilePath file_path = FilePath(location).Append(UTF8ToWide(f->Name)); 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 +211,9 @@ DWORD LzmaUtil::UnPack(const std::wstring& location, break; } - if (f->IsLastWriteTimeDefined) { + if (f->MTimeDefined) { if (!SetFileTime(hFile, NULL, NULL, - (const FILETIME *)&(f->LastWriteTime))) { + (const FILETIME *)&(f->MTime))) { ret = GetLastError(); CloseHandle(hFile); LOG(ERROR) << L"Error returned by SetFileTime: " << ret; @@ -206,8 +227,8 @@ DWORD LzmaUtil::UnPack(const std::wstring& location, } } // for loop - allocImp.Free(outBuffer); - SzArDbExFree(&db, allocImp.Free); + IAlloc_Free(&allocImp, outBuffer); + SzArEx_Free(&db, &allocImp); return ret; } |