| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "third_party/zlib/google/zip_reader.h" | 5 #include "third_party/zlib/google/zip_reader.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" |
| 10 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 11 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/thread_task_runner_handle.h" | 14 #include "base/thread_task_runner_handle.h" |
| 15 #include "build/build_config.h" |
| 14 #include "third_party/zlib/google/zip_internal.h" | 16 #include "third_party/zlib/google/zip_internal.h" |
| 15 | 17 |
| 16 #if defined(USE_SYSTEM_MINIZIP) | 18 #if defined(USE_SYSTEM_MINIZIP) |
| 17 #include <minizip/unzip.h> | 19 #include <minizip/unzip.h> |
| 18 #else | 20 #else |
| 19 #include "third_party/zlib/contrib/minizip/unzip.h" | 21 #include "third_party/zlib/contrib/minizip/unzip.h" |
| 20 #if defined(OS_WIN) | 22 #if defined(OS_WIN) |
| 21 #include "third_party/zlib/contrib/minizip/iowin32.h" | 23 #include "third_party/zlib/contrib/minizip/iowin32.h" |
| 22 #endif // defined(OS_WIN) | 24 #endif // defined(OS_WIN) |
| 23 #endif // defined(USE_SYSTEM_MINIZIP) | 25 #endif // defined(USE_SYSTEM_MINIZIP) |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 if (current_entry_info()->is_directory()) { | 433 if (current_entry_info()->is_directory()) { |
| 432 output->clear(); | 434 output->clear(); |
| 433 return true; | 435 return true; |
| 434 } | 436 } |
| 435 | 437 |
| 436 // The original_size() is the best hint for the real size, so it saves | 438 // The original_size() is the best hint for the real size, so it saves |
| 437 // doing reallocations for the common case when the uncompressed size is | 439 // doing reallocations for the common case when the uncompressed size is |
| 438 // correct. However, we need to assume that the uncompressed size could be | 440 // correct. However, we need to assume that the uncompressed size could be |
| 439 // incorrect therefore this function needs to read as much data as possible. | 441 // incorrect therefore this function needs to read as much data as possible. |
| 440 std::string contents; | 442 std::string contents; |
| 441 contents.reserve(static_cast<size_t>(std::min( | 443 contents.reserve( |
| 442 static_cast<int64>(max_read_bytes), | 444 static_cast<size_t>(std::min(static_cast<int64_t>(max_read_bytes), |
| 443 current_entry_info()->original_size()))); | 445 current_entry_info()->original_size()))); |
| 444 | 446 |
| 445 StringWriterDelegate writer(max_read_bytes, &contents); | 447 StringWriterDelegate writer(max_read_bytes, &contents); |
| 446 if (!ExtractCurrentEntry(&writer)) | 448 if (!ExtractCurrentEntry(&writer)) |
| 447 return false; | 449 return false; |
| 448 output->swap(contents); | 450 output->swap(contents); |
| 449 return true; | 451 return true; |
| 450 } | 452 } |
| 451 | 453 |
| 452 bool ZipReader::OpenInternal() { | 454 bool ZipReader::OpenInternal() { |
| 453 DCHECK(zip_file_); | 455 DCHECK(zip_file_); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 469 zip_file_ = NULL; | 471 zip_file_ = NULL; |
| 470 num_entries_ = 0; | 472 num_entries_ = 0; |
| 471 reached_end_ = false; | 473 reached_end_ = false; |
| 472 current_entry_info_.reset(); | 474 current_entry_info_.reset(); |
| 473 } | 475 } |
| 474 | 476 |
| 475 void ZipReader::ExtractChunk(base::File output_file, | 477 void ZipReader::ExtractChunk(base::File output_file, |
| 476 const SuccessCallback& success_callback, | 478 const SuccessCallback& success_callback, |
| 477 const FailureCallback& failure_callback, | 479 const FailureCallback& failure_callback, |
| 478 const ProgressCallback& progress_callback, | 480 const ProgressCallback& progress_callback, |
| 479 const int64 offset) { | 481 const int64_t offset) { |
| 480 char buffer[internal::kZipBufSize]; | 482 char buffer[internal::kZipBufSize]; |
| 481 | 483 |
| 482 const int num_bytes_read = unzReadCurrentFile(zip_file_, | 484 const int num_bytes_read = unzReadCurrentFile(zip_file_, |
| 483 buffer, | 485 buffer, |
| 484 internal::kZipBufSize); | 486 internal::kZipBufSize); |
| 485 | 487 |
| 486 if (num_bytes_read == 0) { | 488 if (num_bytes_read == 0) { |
| 487 unzCloseCurrentFile(zip_file_); | 489 unzCloseCurrentFile(zip_file_); |
| 488 success_callback.Run(); | 490 success_callback.Run(); |
| 489 } else if (num_bytes_read < 0) { | 491 } else if (num_bytes_read < 0) { |
| 490 DVLOG(1) << "Unzip failed: error while reading zipfile " | 492 DVLOG(1) << "Unzip failed: error while reading zipfile " |
| 491 << "(" << num_bytes_read << ")"; | 493 << "(" << num_bytes_read << ")"; |
| 492 failure_callback.Run(); | 494 failure_callback.Run(); |
| 493 } else { | 495 } else { |
| 494 if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) { | 496 if (num_bytes_read != output_file.Write(offset, buffer, num_bytes_read)) { |
| 495 DVLOG(1) << "Unzip failed: unable to write all bytes to target."; | 497 DVLOG(1) << "Unzip failed: unable to write all bytes to target."; |
| 496 failure_callback.Run(); | 498 failure_callback.Run(); |
| 497 return; | 499 return; |
| 498 } | 500 } |
| 499 | 501 |
| 500 int64 current_progress = offset + num_bytes_read; | 502 int64_t current_progress = offset + num_bytes_read; |
| 501 | 503 |
| 502 progress_callback.Run(current_progress); | 504 progress_callback.Run(current_progress); |
| 503 | 505 |
| 504 base::MessageLoop::current()->PostTask( | 506 base::MessageLoop::current()->PostTask( |
| 505 FROM_HERE, | 507 FROM_HERE, |
| 506 base::Bind(&ZipReader::ExtractChunk, | 508 base::Bind(&ZipReader::ExtractChunk, |
| 507 weak_ptr_factory_.GetWeakPtr(), | 509 weak_ptr_factory_.GetWeakPtr(), |
| 508 Passed(output_file.Pass()), | 510 Passed(output_file.Pass()), |
| 509 success_callback, | 511 success_callback, |
| 510 failure_callback, | 512 failure_callback, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 534 } | 536 } |
| 535 | 537 |
| 536 bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) { | 538 bool FileWriterDelegate::WriteBytes(const char* data, int num_bytes) { |
| 537 int bytes_written = file_->WriteAtCurrentPos(data, num_bytes); | 539 int bytes_written = file_->WriteAtCurrentPos(data, num_bytes); |
| 538 if (bytes_written > 0) | 540 if (bytes_written > 0) |
| 539 file_length_ += bytes_written; | 541 file_length_ += bytes_written; |
| 540 return bytes_written == num_bytes; | 542 return bytes_written == num_bytes; |
| 541 } | 543 } |
| 542 | 544 |
| 543 } // namespace zip | 545 } // namespace zip |
| OLD | NEW |