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 |