| 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
|
|
|