Chromium Code Reviews| 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/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 break; | 337 break; |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 } | 340 } |
| 341 | 341 |
| 342 unzCloseCurrentFile(zip_file_); | 342 unzCloseCurrentFile(zip_file_); |
| 343 return success; | 343 return success; |
| 344 } | 344 } |
| 345 #endif // defined(OS_POSIX) | 345 #endif // defined(OS_POSIX) |
| 346 | 346 |
| 347 bool ZipReader::ExtractCurrentEntryToString( | |
| 348 size_t max_read_bytes, | |
| 349 std::string* output) const { | |
| 350 DCHECK(output); | |
| 351 DCHECK(zip_file_); | |
| 352 DCHECK(max_read_bytes != 0); | |
| 353 | |
| 354 if (current_entry_info()->is_directory()) { | |
| 355 output->clear(); | |
|
satorux1
2014/05/23 23:45:47
i think we should always call output->clear() even
João Eiras
2014/06/02 16:41:07
It's my personal style to avoid changing output pa
satorux1
2014/06/03 08:17:40
That's fine by me.
| |
| 356 return true; | |
| 357 } | |
| 358 | |
| 359 const int open_result = unzOpenCurrentFile(zip_file_); | |
| 360 if (open_result != UNZ_OK) | |
| 361 return false; | |
| 362 | |
| 363 // The original_size() is the best hint for the real size, so it saves | |
| 364 // doing reallocations for the common case when the uncompressed size is | |
| 365 // correct. However, we need to assume that the uncompressed size could be | |
| 366 // incorrect therefore this function needs to read as much data as possible. | |
| 367 std::string contents; | |
| 368 contents.reserve(std::min<size_t>( | |
| 369 max_read_bytes, current_entry_info()->original_size()) + 1); | |
|
satorux1
2014/05/23 23:45:47
i think we don't need +1
João Eiras
2014/06/02 16:41:07
Was there for unzReadCurrentFile() to tell if it h
| |
| 370 | |
| 371 size_t buffer_index = 0; | |
| 372 bool success = true; | |
| 373 while (true) { | |
| 374 // This just sets size() to be equal to capacity() so the chars which are re ad | |
|
satorux1
2014/05/23 23:45:47
line should be < 80 chars
| |
| 375 // ahead will not be erased by calling resize() later. | |
| 376 contents.resize(contents.capacity()); | |
|
satorux1
2014/05/23 23:45:47
hmm, this looks complex. I understand that you are
João Eiras
2014/06/02 16:41:07
It does look a bit overly complicated, but then my
| |
| 377 | |
| 378 const size_t space_available = contents.capacity() - buffer_index; | |
| 379 const int bytes_to_read = std::min<int>(INT_MAX, space_available); | |
| 380 const int bytes_read = unzReadCurrentFile( | |
| 381 zip_file_, | |
| 382 &(contents[buffer_index]), | |
| 383 bytes_to_read); | |
| 384 DCHECK(bytes_read <= bytes_to_read); | |
| 385 | |
| 386 if (bytes_read == 0) { | |
| 387 contents.resize(buffer_index); | |
| 388 // Reached the end of the file. | |
| 389 break; | |
| 390 } else if (bytes_read < 0) { | |
| 391 // If num_bytes_read < 0, then it's a specific UNZ_* error code. | |
| 392 success = false; | |
| 393 break; | |
| 394 } else { // if (num_bytes_read > 0) | |
| 395 buffer_index += bytes_read; | |
| 396 | |
| 397 if (buffer_index > max_read_bytes) { | |
| 398 success = false; | |
| 399 break; | |
| 400 } | |
| 401 | |
| 402 if (bytes_read == bytes_to_read) { | |
| 403 // Filled up the buffer, no more space left, need to resize. | |
| 404 if (static_cast<size_t>(bytes_to_read) == space_available) | |
| 405 contents.reserve(contents.capacity() + internal::kZipBufSize); | |
| 406 } else { | |
| 407 contents.resize(buffer_index); | |
| 408 // Read less bytes than asked. That means it reached end of file. | |
| 409 break; | |
| 410 } | |
| 411 } | |
| 412 } | |
| 413 | |
| 414 unzCloseCurrentFile(zip_file_); | |
| 415 if (success) | |
| 416 output->swap(contents); | |
| 417 | |
| 418 return success; | |
| 419 } | |
| 420 | |
| 347 bool ZipReader::OpenInternal() { | 421 bool ZipReader::OpenInternal() { |
| 348 DCHECK(zip_file_); | 422 DCHECK(zip_file_); |
| 349 | 423 |
| 350 unz_global_info zip_info = {}; // Zero-clear. | 424 unz_global_info zip_info = {}; // Zero-clear. |
| 351 if (unzGetGlobalInfo(zip_file_, &zip_info) != UNZ_OK) { | 425 if (unzGetGlobalInfo(zip_file_, &zip_info) != UNZ_OK) { |
| 352 return false; | 426 return false; |
| 353 } | 427 } |
| 354 num_entries_ = zip_info.number_entry; | 428 num_entries_ = zip_info.number_entry; |
| 355 if (num_entries_ < 0) | 429 if (num_entries_ < 0) |
| 356 return false; | 430 return false; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 success_callback, | 478 success_callback, |
| 405 failure_callback, | 479 failure_callback, |
| 406 progress_callback, | 480 progress_callback, |
| 407 current_progress)); | 481 current_progress)); |
| 408 | 482 |
| 409 } | 483 } |
| 410 } | 484 } |
| 411 | 485 |
| 412 | 486 |
| 413 } // namespace zip | 487 } // namespace zip |
| OLD | NEW |