Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(839)

Unified Diff: ui/file_manager/zip_archiver/unpacker/cpp/module.cc

Issue 2804453002: Move files from zip_archiver/unpacker/ to zip_archiver/. (Closed)
Patch Set: Move files from zip_archiver/unpacker/ to zip_archiver/. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/file_manager/zip_archiver/unpacker/cpp/module.cc
diff --git a/ui/file_manager/zip_archiver/unpacker/cpp/module.cc b/ui/file_manager/zip_archiver/unpacker/cpp/module.cc
deleted file mode 100644
index 24ae6c0be7afb24ff75fb6c88ca5a3f1870efe9c..0000000000000000000000000000000000000000
--- a/ui/file_manager/zip_archiver/unpacker/cpp/module.cc
+++ /dev/null
@@ -1,500 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <clocale>
-#include <sstream>
-
-#include "ppapi/cpp/instance.h"
-#include "ppapi/cpp/instance_handle.h"
-#include "ppapi/cpp/logging.h"
-#include "ppapi/cpp/module.h"
-#include "ppapi/cpp/var_dictionary.h"
-#include "ppapi/utility/threading/lock.h"
-#include "ppapi/utility/threading/simple_thread.h"
-
-#include "compressor.h"
-#include "request.h"
-#include "volume.h"
-
-namespace {
-
-typedef std::map<std::string, Volume*>::const_iterator volume_iterator;
-typedef std::map<int, Compressor*>::const_iterator compressor_iterator;
-
-// An internal implementation of JavaScriptMessageSenderInterface. This class
-// handles all communication from the module to the JavaScript code. Thread
-// safety is ensured only for PNaCl, not NaCl. See crbug.com/412692 and
-// crbug.com/413513.
-class JavaScriptMessageSender : public JavaScriptMessageSenderInterface {
- public:
- // JavaScriptMessageSender does not own the instance pointer.
- explicit JavaScriptMessageSender(pp::Instance* instance)
- : instance_(instance) {}
-
- virtual void SendFileSystemError(const std::string& file_system_id,
- const std::string& request_id,
- const std::string& message) {
- JavaScriptPostMessage(
- request::CreateFileSystemError(file_system_id, request_id, message));
- }
-
- virtual void SendCompressorError(int compressor_id,
- const std::string& message) {
- JavaScriptPostMessage(
- request::CreateCompressorError(compressor_id, message));
- }
-
- virtual void SendFileChunkRequest(const std::string& file_system_id,
- const std::string& request_id,
- int64_t offset,
- int64_t bytes_to_read) {
- PP_DCHECK(offset >= 0);
- PP_DCHECK(bytes_to_read > 0);
- JavaScriptPostMessage(request::CreateReadChunkRequest(
- file_system_id, request_id, offset, bytes_to_read));
- }
-
- virtual void SendPassphraseRequest(const std::string& file_system_id,
- const std::string& request_id) {
- JavaScriptPostMessage(request::CreateReadPassphraseRequest(
- file_system_id, request_id));
- }
-
- virtual void SendReadMetadataDone(const std::string& file_system_id,
- const std::string& request_id,
- const pp::VarDictionary& metadata) {
- JavaScriptPostMessage(request::CreateReadMetadataDoneResponse(
- file_system_id, request_id, metadata));
- }
-
- virtual void SendOpenFileDone(const std::string& file_system_id,
- const std::string& request_id) {
- JavaScriptPostMessage(
- request::CreateOpenFileDoneResponse(file_system_id, request_id));
- }
-
- virtual void SendCloseFileDone(const std::string& file_system_id,
- const std::string& request_id,
- const std::string& open_request_id) {
- JavaScriptPostMessage(request::CreateCloseFileDoneResponse(
- file_system_id, request_id, open_request_id));
- }
-
- virtual void SendReadFileDone(const std::string& file_system_id,
- const std::string& request_id,
- const pp::VarArrayBuffer& array_buffer,
- bool has_more_data) {
- JavaScriptPostMessage(request::CreateReadFileDoneResponse(
- file_system_id, request_id, array_buffer, has_more_data));
- }
-
- virtual void SendConsoleLog(const std::string& file_system_id,
- const std::string& request_id,
- const std::string& src_file,
- int src_line,
- const std::string& src_func,
- const std::string& message) {
- JavaScriptPostMessage(request::CreateConsoleLog(
- file_system_id, request_id, src_file, src_line, src_func, message));
- }
-
- virtual void SendCreateArchiveDone(int compressor_id) {
- JavaScriptPostMessage(request::CreateCreateArchiveDoneResponse(
- compressor_id));
- }
-
- virtual void SendReadFileChunk(int compressor_id, int64_t length) {
- JavaScriptPostMessage(request::CreateReadFileChunkRequest(
- compressor_id, length));
- }
-
- virtual void SendWriteChunk(int compressor_id,
- const pp::VarArrayBuffer& array_buffer,
- int64_t length) {
- JavaScriptPostMessage(request::CreateWriteChunkRequest(
- compressor_id, array_buffer, length));
- }
-
- virtual void SendAddToArchiveDone(int compressor_id) {
- JavaScriptPostMessage(request::CreateAddToArchiveDoneResponse(
- compressor_id));
- }
-
- virtual void SendCloseArchiveDone(int compressor_id) {
- JavaScriptPostMessage(request::CreateCloseArchiveDoneResponse(
- compressor_id));
- }
-
- private:
- // Posts a message to JavaScript. This is prone to races in case of using
- // NaCl instead of PNaCl. See crbug.com/413513.
- void JavaScriptPostMessage(const pp::VarDictionary& message) {
- instance_->PostMessage(message);
- }
-
- pp::Instance* instance_;
-};
-
-} // namespace
-
-// An instance for every "embed" in the web page. For this extension only one
-// "embed" is necessary.
-class NaclArchiveInstance : public pp::Instance {
- public:
- explicit NaclArchiveInstance(PP_Instance instance)
- : pp::Instance(instance),
- instance_handle_(instance),
- message_sender_(this) {}
-
- virtual ~NaclArchiveInstance() {
- for (volume_iterator iterator = volumes_.begin();
- iterator != volumes_.end();
- ++iterator) {
- delete iterator->second;
- }
- }
-
- // Handler for messages coming in from JS via postMessage().
- virtual void HandleMessage(const pp::Var& var_message) {
- PP_DCHECK(var_message.is_dictionary());
- pp::VarDictionary var_dict(var_message);
-
- PP_DCHECK(var_dict.Get(request::key::kOperation).is_int());
- int operation = var_dict.Get(request::key::kOperation).AsInt();
-
- if (request::IsPackRequest(operation))
- HandlePackMessage(var_dict, operation);
- else
- HandleUnpackMessage(var_dict, operation);
- }
-
- private:
-
- // Processes unpack messages.
- void HandleUnpackMessage(const pp::VarDictionary& var_dict,
- const int operation) {
-
- PP_DCHECK(var_dict.Get(request::key::kFileSystemId).is_string());
- std::string file_system_id =
- var_dict.Get(request::key::kFileSystemId).AsString();
-
- PP_DCHECK(var_dict.Get(request::key::kRequestId).is_string());
- std::string request_id = var_dict.Get(request::key::kRequestId).AsString();
-
- // Processes operation.
- switch (operation) {
- case request::READ_METADATA: {
- ReadMetadata(var_dict, file_system_id, request_id);
- break;
- }
-
- case request::READ_CHUNK_DONE:
- ReadChunkDone(var_dict, file_system_id, request_id);
- break;
-
- case request::READ_CHUNK_ERROR:
- ReadChunkError(file_system_id, request_id);
- break;
-
- case request::READ_PASSPHRASE_DONE:
- ReadPassphraseDone(var_dict, file_system_id, request_id);
- break;
-
- case request::READ_PASSPHRASE_ERROR:
- ReadPassphraseError(file_system_id, request_id);
- break;
-
- case request::OPEN_FILE:
- OpenFile(var_dict, file_system_id, request_id);
- break;
-
- case request::CLOSE_FILE:
- CloseFile(var_dict, file_system_id, request_id);
- break;
-
- case request::READ_FILE:
- ReadFile(var_dict, file_system_id, request_id);
- break;
-
- case request::CLOSE_VOLUME: {
- volume_iterator iterator = volumes_.find(file_system_id);
- PP_DCHECK(iterator != volumes_.end());
- delete iterator->second;
- volumes_.erase(file_system_id);
- break;
- }
-
- default:
- PP_NOTREACHED();
- }
- }
-
- // Processes pack messages.
- void HandlePackMessage(const pp::VarDictionary& var_dict,
- const int operation) {
- PP_DCHECK(var_dict.Get(request::key::kCompressorId).is_int());
- int compressor_id =
- var_dict.Get(request::key::kCompressorId).AsInt();
-
- switch (operation) {
- case request::CREATE_ARCHIVE: {
- CreateArchive(compressor_id);
- break;
- }
-
- case request::ADD_TO_ARCHIVE: {
- AddToArchive(var_dict, compressor_id);
- break;
- }
-
- case request::READ_FILE_CHUNK_DONE: {
- ReadFileChunkDone(var_dict, compressor_id);
- break;
- }
-
- case request::WRITE_CHUNK_DONE: {
- WriteChunkDone(var_dict, compressor_id);
- break;
- }
-
- case request::CLOSE_ARCHIVE: {
- CloseArchive(var_dict, compressor_id);
- break;
- }
-
- default:
- PP_NOTREACHED();
- }
- }
-
- // Reads the metadata for the corresponding volume for file_system_id. This
- // should be called only once and before any other operation like OpenFile,
- // ReadFile, etc.
- // Reading metadata or opening a file could work even if the Volume exists
- // or not, but as the JavaScript code doesn't use this feature there is no
- // reason to allow it. If the logic on JavaScript changes then this can be
- // updated. But in current design if we read metadata for an existing Volume,
- // then there is a programmer error on JavaScript side.
- void ReadMetadata(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- // Should not call ReadMetadata for a Volume already present in NaCl.
- PP_DCHECK(volumes_.find(file_system_id) == volumes_.end());
-
- Volume* volume =
- new Volume(instance_handle_, file_system_id, &message_sender_);
- if (!volume->Init()) {
- message_sender_.SendFileSystemError(
- file_system_id,
- request_id,
- "Could not create a volume for: " + file_system_id + ".");
- delete volume;
- return;
- }
- volumes_[file_system_id] = volume;
-
- PP_DCHECK(var_dict.Get(request::key::kEncoding).is_string());
- PP_DCHECK(var_dict.Get(request::key::kArchiveSize).is_string());
-
- volume->ReadMetadata(
- request_id,
- var_dict.Get(request::key::kEncoding).AsString(),
- request::GetInt64FromString(var_dict, request::key::kArchiveSize));
- }
-
- void ReadChunkDone(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- PP_DCHECK(var_dict.Get(request::key::kChunkBuffer).is_array_buffer());
- pp::VarArrayBuffer array_buffer(var_dict.Get(request::key::kChunkBuffer));
-
- PP_DCHECK(var_dict.Get(request::key::kOffset).is_string());
- int64_t read_offset =
- request::GetInt64FromString(var_dict, request::key::kOffset);
-
- volume_iterator iterator = volumes_.find(file_system_id);
- // Volume was unmounted so ignore the read chunk operation.
- // Possible scenario for read ahead.
- if (iterator == volumes_.end())
- return;
- iterator->second->ReadChunkDone(request_id, array_buffer, read_offset);
- }
-
- void ReadChunkError(const std::string& file_system_id,
- const std::string& request_id) {
- volume_iterator iterator = volumes_.find(file_system_id);
- // Volume was unmounted so ignore the read chunk operation.
- // Possible scenario for read ahead.
- if (iterator == volumes_.end())
- return;
- iterator->second->ReadChunkError(request_id);
- }
-
- void ReadPassphraseDone(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- PP_DCHECK(var_dict.Get(request::key::kPassphrase).is_string());
- std::string passphrase(var_dict.Get(request::key::kPassphrase).AsString());
-
- volume_iterator iterator = volumes_.find(file_system_id);
- // Volume was unmounted so ignore the read passphrase operation.
- if (iterator == volumes_.end())
- return;
- iterator->second->ReadPassphraseDone(request_id, passphrase);
- }
-
- void ReadPassphraseError(const std::string& file_system_id,
- const std::string& request_id) {
- volume_iterator iterator = volumes_.find(file_system_id);
- // Volume was unmounted so ignore the read chunk operation.
- if (iterator == volumes_.end())
- return;
- iterator->second->ReadPassphraseError(request_id);
- }
-
- void OpenFile(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- PP_DCHECK(var_dict.Get(request::key::kIndex).is_string());
- int64_t index =
- request::GetInt64FromString(var_dict, request::key::kIndex);
-
- PP_DCHECK(var_dict.Get(request::key::kEncoding).is_string());
- std::string encoding(var_dict.Get(request::key::kEncoding).AsString());
-
- PP_DCHECK(var_dict.Get(request::key::kArchiveSize).is_string());
- int64_t archive_size =
- request::GetInt64FromString(var_dict, request::key::kArchiveSize);
-
- volume_iterator iterator = volumes_.find(file_system_id);
- PP_DCHECK(iterator != volumes_.end()); // Should call OpenFile after
- // ReadMetadata.
- iterator->second->OpenFile(request_id, index, encoding, archive_size);
- }
-
- void CloseFile(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- PP_DCHECK(var_dict.Get(request::key::kOpenRequestId).is_string());
- std::string open_request_id(
- var_dict.Get(request::key::kOpenRequestId).AsString());
-
- volume_iterator iterator = volumes_.find(file_system_id);
- PP_DCHECK(iterator !=
- volumes_.end()); // Should call CloseFile after OpenFile.
-
- iterator->second->CloseFile(request_id, open_request_id);
- }
-
- void ReadFile(const pp::VarDictionary& var_dict,
- const std::string& file_system_id,
- const std::string& request_id) {
- PP_DCHECK(var_dict.Get(request::key::kOpenRequestId).is_string());
- PP_DCHECK(var_dict.Get(request::key::kOffset).is_string());
- PP_DCHECK(var_dict.Get(request::key::kLength).is_string());
-
- volume_iterator iterator = volumes_.find(file_system_id);
- PP_DCHECK(iterator !=
- volumes_.end()); // Should call ReadFile after OpenFile.
-
- // Passing the entire dictionary because pp::CompletionCallbackFactory
- // cannot create callbacks with more than 3 parameters. Here we need 4:
- // request_id, open_request_id, offset and length.
- iterator->second->ReadFile(request_id, var_dict);
- }
-
- // Requests libarchive to create an archive object for the given compressor_id.
- void CreateArchive(int compressor_id) {
- Compressor* compressor =
- new Compressor(instance_handle_, compressor_id, &message_sender_);
- if (!compressor->Init()) {
- std::stringstream ss;
- ss << compressor_id;
- message_sender_.SendCompressorError(
- compressor_id,
- "Could not create a compressor for compressor id: " + ss.str() + ".");
- delete compressor;
- return;
- }
- compressors_[compressor_id] = compressor;
-
- compressor->CreateArchive();
- }
-
- void AddToArchive(const pp::VarDictionary& var_dict,
- int compressor_id) {
- compressor_iterator iterator = compressors_.find(compressor_id);
- PP_DCHECK(iterator != compressors_.end());
-
- iterator->second->AddToArchive(var_dict);
- }
-
- void ReadFileChunkDone(const pp::VarDictionary& var_dict,
- const int compressor_id) {
- compressor_iterator iterator = compressors_.find(compressor_id);
- PP_DCHECK(iterator != compressors_.end());
-
- iterator->second->ReadFileChunkDone(var_dict);
- }
-
- void WriteChunkDone(const pp::VarDictionary& var_dict,
- int compressor_id) {
- compressor_iterator iterator = compressors_.find(compressor_id);
- PP_DCHECK(iterator != compressors_.end());
-
- iterator->second->WriteChunkDone(var_dict);
- }
-
- void CloseArchive(const pp::VarDictionary& var_dict,
- int compressor_id) {
- compressor_iterator iterator = compressors_.find(compressor_id);
-
- if (iterator != compressors_.end())
- iterator->second->CloseArchive(var_dict);
- }
-
- // A map that holds for every opened archive its instance. The key is the file
- // system id of the archive.
- std::map<std::string, Volume*> volumes_;
-
- // A map from compressor ids to compressors.
- std::map<int, Compressor*> compressors_;
-
- // An pp::InstanceHandle used to create pp::SimpleThread in Volume.
- pp::InstanceHandle instance_handle_;
-
- // An object used to send messages to JavaScript.
- JavaScriptMessageSender message_sender_;
-};
-
-// The Module class. The browser calls the CreateInstance() method to create
-// an instance of your NaCl module on the web page. The browser creates a new
-// instance for each <embed> tag with type="application/x-pnacl" or
-// type="application/x-nacl".
-class NaclArchiveModule : public pp::Module {
- public:
- NaclArchiveModule() : pp::Module() {}
- virtual ~NaclArchiveModule() {}
-
- // Create and return a NaclArchiveInstance object.
- // @param[in] instance The browser-side instance.
- // @return the plugin-side instance.
- virtual pp::Instance* CreateInstance(PP_Instance instance) {
- return new NaclArchiveInstance(instance);
- }
-};
-
-namespace pp {
-
-// Factory function called by the browser when the module is first loaded.
-// The browser keeps a singleton of this module. It calls the
-// CreateInstance() method on the object you return to make instances. There
-// is one instance per <embed> tag on the page. This is the main binding
-// point for your NaCl module with the browser.
-Module* CreateModule() {
- std::setlocale(LC_ALL, "en_US.UTF-8");
- return new NaclArchiveModule();
-}
-
-} // namespace pp

Powered by Google App Engine
This is Rietveld 408576698