| Index: ui/file_manager/zip_archiver/cpp/volume.cc
|
| diff --git a/ui/file_manager/zip_archiver/cpp/volume.cc b/ui/file_manager/zip_archiver/cpp/volume.cc
|
| index 588698f57c291199ede886f2c899912420dfeacc..97d63803e639e7cfee20a97d61ed613397928595 100644
|
| --- a/ui/file_manager/zip_archiver/cpp/volume.cc
|
| +++ b/ui/file_manager/zip_archiver/cpp/volume.cc
|
| @@ -182,7 +182,7 @@ struct Volume::OpenFileArgs {
|
| Volume::Volume(const pp::InstanceHandle& instance_handle,
|
| const std::string& file_system_id,
|
| JavaScriptMessageSenderInterface* message_sender)
|
| - : volume_archive_(NULL),
|
| + : volume_archive_(nullptr),
|
| file_system_id_(file_system_id),
|
| message_sender_(message_sender),
|
| worker_(instance_handle),
|
| @@ -198,7 +198,7 @@ Volume::Volume(const pp::InstanceHandle& instance_handle,
|
| JavaScriptMessageSenderInterface* message_sender,
|
| VolumeArchiveFactoryInterface* volume_archive_factory,
|
| VolumeReaderFactoryInterface* volume_reader_factory)
|
| - : volume_archive_(NULL),
|
| + : volume_archive_(nullptr),
|
| file_system_id_(file_system_id),
|
| message_sender_(message_sender),
|
| worker_(instance_handle),
|
| @@ -323,43 +323,62 @@ void Volume::ReadMetadataCallback(int32_t /*result*/,
|
| file_system_id_, request_id, volume_archive_->error_message());
|
| ClearJob();
|
| delete volume_archive_;
|
| - volume_archive_ = NULL;
|
| + volume_archive_ = nullptr;
|
| return;
|
| }
|
|
|
| // Read and construct metadata.
|
| pp::VarDictionary root_metadata = CreateEntry(-1, "" /* name */, true, 0, 0);
|
|
|
| - const char* path_name = NULL;
|
| + std::string path_name;
|
| int64_t size = 0;
|
| bool is_directory = false;
|
| time_t modification_time = 0;
|
| int64_t index = 0;
|
|
|
| for (;;) {
|
| - VolumeArchive::Result ret = volume_archive_->GetNextHeader(
|
| - &path_name, &size, &is_directory, &modification_time);
|
| - if (ret == VolumeArchive::RESULT_FAIL) {
|
| - message_sender_->SendFileSystemError(
|
| - file_system_id_, request_id, volume_archive_->error_message());
|
| + path_name.clear();
|
| + if (volume_archive_->GetCurrentFileInfo(
|
| + &path_name,
|
| + &size,
|
| + &is_directory,
|
| + &modification_time) == VolumeArchive::RESULT_FAIL) {
|
| + message_sender_->SendFileSystemError(file_system_id_, request_id,
|
| + volume_archive_->error_message());
|
| ClearJob();
|
| delete volume_archive_;
|
| - volume_archive_ = NULL;
|
| + volume_archive_ = nullptr;
|
| return;
|
| - } else if (ret == VolumeArchive::RESULT_EOF)
|
| + }
|
| +
|
| + if (path_name.empty()) // End of archive.
|
| break;
|
|
|
| - ConstructMetadata(index, path_name, size, is_directory, modification_time,
|
| - &root_metadata);
|
| + ConstructMetadata(index, path_name.c_str(), size, is_directory,
|
| + modification_time, &root_metadata);
|
| +
|
| + index_to_pathname_[index] = path_name;
|
|
|
| ++index;
|
| +
|
| + int return_value = volume_archive_->GoToNextFile();
|
| + if (return_value == VolumeArchive::RESULT_FAIL) {
|
| + message_sender_->SendFileSystemError(file_system_id_, request_id,
|
| + volume_archive_->error_message());
|
| + ClearJob();
|
| + delete volume_archive_;
|
| + volume_archive_ = nullptr;
|
| + return;
|
| + }
|
| + if (return_value == VolumeArchive::RESULT_EOF)
|
| + break;
|
| }
|
|
|
| ClearJob();
|
|
|
| // Send metadata back to JavaScript.
|
| - message_sender_->SendReadMetadataDone(
|
| - file_system_id_, request_id, root_metadata);
|
| + message_sender_->SendReadMetadataDone(file_system_id_, request_id,
|
| + root_metadata);
|
| }
|
|
|
| void Volume::OpenFileCallback(int32_t /*result*/,
|
| @@ -379,21 +398,31 @@ void Volume::OpenFileCallback(int32_t /*result*/,
|
| job_lock_.Release();
|
| return;
|
| }
|
| - static_cast<VolumeReaderJavaScriptStream*>(volume_archive_->reader())->
|
| - SetRequestId(args.request_id);
|
| +
|
| + static_cast<VolumeReaderJavaScriptStream*>(volume_archive_->reader())
|
| + ->SetRequestId(args.request_id);
|
| reader_request_id_ = args.request_id;
|
| job_lock_.Release();
|
|
|
| - if (!volume_archive_->SeekHeader(args.index)) {
|
| - message_sender_->SendFileSystemError(
|
| - file_system_id_, args.request_id, volume_archive_->error_message());
|
| + std::string path_name = index_to_pathname_[args.index];
|
| + int64_t size = 0;
|
| + bool is_directory = false;
|
| + time_t modification_time = 0;
|
| +
|
| + if (!volume_archive_->SeekHeader(path_name)) {
|
| + message_sender_->SendFileSystemError(file_system_id_, args.request_id,
|
| + volume_archive_->error_message());
|
| ClearJob();
|
| return;
|
| }
|
|
|
| - if (volume_archive_->GetNextHeader() == VolumeArchive::RESULT_FAIL) {
|
| - message_sender_->SendFileSystemError(
|
| - file_system_id_, args.request_id, volume_archive_->error_message());
|
| + if (volume_archive_->GetCurrentFileInfo(
|
| + &path_name,
|
| + &size,
|
| + &is_directory,
|
| + &modification_time) != VolumeArchive::RESULT_SUCCESS) {
|
| + message_sender_->SendFileSystemError(file_system_id_, args.request_id,
|
| + volume_archive_->error_message());
|
| ClearJob();
|
| return;
|
| }
|
| @@ -444,7 +473,7 @@ void Volume::ReadFileCallback(int32_t /*result*/,
|
| // depending on how many bytes VolumeArchive::ReadData returns.
|
| int64_t left_length = length;
|
| while (left_length > 0) {
|
| - const char* destination_buffer = NULL;
|
| + const char* destination_buffer = nullptr;
|
| int64_t read_bytes = volume_archive_->ReadData(
|
| offset, left_length, &destination_buffer);
|
|
|
|
|