| Index: ppapi/proxy/filesystem_provider_resource.h
|
| diff --git a/ppapi/proxy/filesystem_provider_resource.h b/ppapi/proxy/filesystem_provider_resource.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4b886ce4e5c5095d583cc88937f43c31f63bc4e2
|
| --- /dev/null
|
| +++ b/ppapi/proxy/filesystem_provider_resource.h
|
| @@ -0,0 +1,526 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +#ifndef FILESYSTEM_PROVIDER_RESOURCE_H
|
| +#define FILESYSTEM_PROVIDER_RESOURCE_H
|
| +
|
| +#include <chrono>
|
| +#include <map>
|
| +
|
| +#include "ppapi/proxy/connection.h"
|
| +#include "ppapi/proxy/plugin_resource.h"
|
| +#include "ppapi/proxy/ppapi_proxy_export.h"
|
| +#include "ppapi/shared_impl/resource.h"
|
| +#include "ppapi/thunk/ppb_filesystem_provider_api.h"
|
| +
|
| +namespace ppapi {
|
| +namespace proxy {
|
| +
|
| +namespace filesystem_provider_internal{
|
| +struct OperationTranslator;
|
| +} // namespace
|
| +class PPAPI_PROXY_EXPORT FilesystemProviderResource
|
| + :public PluginResource,
|
| + public NON_EXPORTED_BASE(thunk::PPB_FilesystemProvider_API) {
|
| + private:
|
| + // Waiting room for shared memory
|
| + // This is used when sending read file responses to the browser
|
| + class ShmChannelController{
|
| + typedef base::Callback<bool(scoped_ptr<base::ListValue>, const char* data,
|
| + uint32_t data_size)>
|
| + FlushResponseCallback;
|
| + public:
|
| + ShmChannelController( uint32_t size, FlushResponseCallback callback );
|
| + ~ShmChannelController();
|
| + // This will flush send the re
|
| + bool EnqueueResponse(scoped_ptr<base::ListValue> response,
|
| + const char* data, uint32_t data_size);
|
| + bool PushNextResponse();
|
| + bool AckLastPushedResponse();
|
| + private:
|
| + uint32_t size();
|
| + uint32_t max_size;
|
| + ScopedVector<base::ListValue> replies;
|
| + bool ready;
|
| + FlushResponseCallback callback;
|
| + };
|
| + // All the information we need about the filesystem is stored here
|
| + struct ProvidedFilesystemInfo{
|
| + ProvidedFilesystemInfo();
|
| + ~ProvidedFilesystemInfo();
|
| + std::string filesystem_id;
|
| + std::string display_name;
|
| + bool writable;
|
| + int32_t opened_files_limit;
|
| + };
|
| + // Shared memory container
|
| + struct ShmBuffer {
|
| + ShmBuffer(uint32_t read_size,
|
| + uint32_t write_size, scoped_ptr<base::SharedMemory> shm);
|
| + ~ShmBuffer();
|
| + uint32_t read_size;
|
| + uint32_t write_size;
|
| + scoped_ptr<base::SharedMemory> shm;
|
| + };
|
| + // An interface used for statistics and ill intended
|
| + // notifications from the plugin implementation.This will filter out
|
| + // operation responses that don't have an operation request from the browser.
|
| + class RequestManager{
|
| + private:
|
| + // Current Requests typedefs
|
| + typedef std::pair<PP_OperationType_Dev,
|
| + std::chrono::time_point<std::chrono::system_clock>>
|
| + OperationStartTimePair;
|
| + typedef std::map<int32_t, OperationStartTimePair >
|
| + ListOfRequests;
|
| + typedef ListOfRequests::iterator ListOfRequestsIterator;
|
| +
|
| + public:
|
| + RequestManager();
|
| + ~RequestManager();
|
| + // Adds a request
|
| + void AddRequest( int32_t request_id, PP_OperationType_Dev operation );
|
| + // Removes a request. This is successful only if the request previously
|
| + // existed. The out_time_span contains the time in seconds of the operation
|
| + bool HasRequest(int32_t request_id);
|
| + bool RemoveRequest(int32_t request_id, int* out_time_span);
|
| +
|
| + private:
|
| + ListOfRequests requests_;
|
| + };
|
| + public:
|
| + FilesystemProviderResource(
|
| + Connection connection,
|
| + PP_Instance instance );
|
| + virtual ~FilesystemProviderResource();
|
| + // PluginResource overrides:
|
| + virtual thunk::PPB_FilesystemProvider_API*
|
| + AsPPB_FilesystemProvider_API() override;
|
| + void OnReplyReceived(
|
| + const ResourceMessageReplyParams ¶ms,
|
| + const IPC::Message &msg) override;
|
| + // PPB_FilesystemProvider_API overrides
|
| + // The below functions will be called from the instance module
|
| + // to notify the browser or to request certain actions from the browser
|
| + virtual int32_t Mount(
|
| + struct PP_Var filesystem_id,
|
| + struct PP_Var display_name,
|
| + PP_Bool writable,
|
| + int32_t opened_files_limit,
|
| + scoped_refptr<TrackedCallback> callback) override;
|
| + virtual int32_t Unmount(
|
| + struct PP_Var filesystemId,
|
| + scoped_refptr<TrackedCallback> callback) override;
|
| + virtual int32_t Notify(PP_Var notify_options) override;
|
| +
|
| + virtual int32_t SendSuccessResponse(
|
| + PP_OperationType_Dev operation_type,
|
| + int32_t request_id) override;
|
| + virtual int32_t SendErrorResponse(
|
| + PP_OperationType_Dev operation_type,
|
| + int32_t error,
|
| + int32_t request_id) override;
|
| +
|
| + virtual int32_t SendMetadataSuccessResponse(
|
| + struct PP_Var metadata,
|
| + int32_t request_id) override;
|
| + virtual int32_t SendReadDirectorySuccessResponse(
|
| + struct PP_Var entries,
|
| + PP_Bool has_more,
|
| + int32_t request_id) override;
|
| + virtual int32_t SendReadFileSuccessResponse(
|
| + uint32_t data_size,
|
| + const void* data,
|
| + PP_Bool has_more,
|
| + int32_t request_id) override;
|
| + virtual int32_t GetNextRequest(
|
| + PP_FilesystemRequest *request,
|
| + scoped_refptr<TrackedCallback> callback)override;
|
| + virtual int32_t ReleaseRequestBuffer(int32_t request_id)override;
|
| +
|
| +
|
| + private:
|
| + // Message Handlers for the browser messages
|
| + void OnPluginMsgMountReply(const ResourceMessageReplyParams& params);
|
| + void OnPluginMsgUnmountReply(const ResourceMessageReplyParams& params);
|
| + // Handles the file system operations
|
| + // requested by the browser
|
| + void OnPluginMsgOperationRequest(
|
| + const ResourceMessageParams& params,
|
| + const PP_OperationType_Dev& operation,
|
| + const base::ListValue& operationArgs);
|
| + void OnPluginMsgBuffersReady(const ResourceMessageParams& params,
|
| + uint32_t buffer_length, uint32_t write_buffer_size);
|
| + void OnPluginMsgReadAck(
|
| + const ResourceMessageReplyParams& params);
|
| +
|
| + // Remember a request in the provided container address
|
| + bool WriteRequest();
|
| + // Send Read response to browser
|
| + bool FlushReadResponse(scoped_ptr<base::ListValue> response,
|
| + const char *data,
|
| + uint32_t data_size);
|
| + void SendWriteAck();
|
| + // The filesystem information
|
| + ProvidedFilesystemInfo filesystem_info_;
|
| + // Flag for the state of the filesystem
|
| + bool mounted_;
|
| + // User callbacks
|
| + scoped_refptr<TrackedCallback> mount_callback_;
|
| + scoped_refptr<TrackedCallback> unmount_callback_;
|
| + scoped_refptr<TrackedCallback> get_next_request_callback_;
|
| + // Data containers for the above callback
|
| + struct PP_FilesystemRequest* get_next_request_callback_data_;
|
| + // Keep received requests until consumed
|
| + // by calling GetNextRequest
|
| + std::deque<scoped_refptr<filesystem_provider_internal::OperationTranslator>>
|
| + received_requests_;
|
| + // Received requests that are buffered from when GetNextRequest
|
| + // is called until ReleaseRequestBuffer is called.
|
| + typedef
|
| + std::map< int32_t,
|
| + scoped_refptr<filesystem_provider_internal::OperationTranslator> >
|
| + ListOfRequests;
|
| + ListOfRequests pending_process_requests_;
|
| + // Shared memory buffer
|
| + scoped_ptr<ShmBuffer> read_write_buffer_;
|
| + // A RequestManager that controls access to the shared memory write
|
| + scoped_ptr<FilesystemProviderResource::RequestManager> request_manager_;
|
| + // Cacher for replys that content for the shared mem buffer
|
| + scoped_ptr<ShmChannelController> read_channel_controller_;
|
| + DISALLOW_COPY_AND_ASSIGN( FilesystemProviderResource );
|
| +};
|
| +
|
| +namespace filesystem_provider_internal{
|
| +
|
| +struct OperationTranslator : public base::RefCounted<OperationTranslator>{
|
| + virtual ~OperationTranslator();
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()=0;
|
| +};
|
| +struct AbortOperationTranslator : public OperationTranslator{
|
| + virtual ~AbortOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static
|
| + scoped_refptr< AbortOperationTranslator > PopulateFromRequest(
|
| + const base::ListValue& request );
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // An ID of the request to be aborted.
|
| + int operation_request_id;
|
| + private:
|
| + AbortOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(AbortOperationTranslator);
|
| +};
|
| +
|
| +struct CloseFileOperationTranslator : public OperationTranslator{
|
| + ~CloseFileOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + // Creates a CloseFileRequestedOptions object from a base::Value, or NULL on
|
| + // failure.
|
| + static
|
| + scoped_refptr<CloseFileOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // A request ID used to open the file.
|
| + int open_request_id;
|
| + private:
|
| + CloseFileOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(CloseFileOperationTranslator);
|
| +};
|
| +
|
| +struct CopyEntryOperationTranslator : public OperationTranslator{
|
| + ~CopyEntryOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<CopyEntryOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The source path of the entry to be copied.
|
| + std::string source_path;
|
| + // The destination path for the copy operation.
|
| + std::string target_path;
|
| + private:
|
| + CopyEntryOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(CopyEntryOperationTranslator);
|
| +};
|
| +
|
| +struct CreateDirectoryOperationTranslator : public OperationTranslator {
|
| + ~CreateDirectoryOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<CreateDirectoryOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request );
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the directory to be created.
|
| + std::string directory_path;
|
| + // Whether the operation is recursive (for directories only).
|
| + bool recursive;
|
| + private:
|
| + CreateDirectoryOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(CreateDirectoryOperationTranslator);
|
| +};
|
| +
|
| +struct CreateFileOperationTranslator : public OperationTranslator{
|
| + ~CreateFileOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<CreateFileOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue &request );
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the file to be created.
|
| + std::string file_path;
|
| + private:
|
| + CreateFileOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(CreateFileOperationTranslator);
|
| +};
|
| +
|
| +struct DeleteEntryOperationTranslator : public OperationTranslator{
|
| + ~DeleteEntryOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<DeleteEntryOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request );
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the entry to be deleted.
|
| + std::string entry_path;
|
| + // Whether the operation is recursive (for directories only).
|
| + bool recursive;
|
| + private:
|
| + DeleteEntryOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(DeleteEntryOperationTranslator);
|
| +};
|
| +
|
| +struct GetMetadataOperationTranslator:public OperationTranslator{
|
| + ~GetMetadataOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<GetMetadataOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request );
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the entry to fetch metadata about.
|
| + std::string entry_path;
|
| + // Set to <code>true</code> if the thumbnail is requested.
|
| + bool thumbnail;
|
| +private:
|
| + GetMetadataOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN( GetMetadataOperationTranslator );
|
| +};
|
| +
|
| +struct MoveOperationTranslator : public OperationTranslator {
|
| + ~MoveOperationTranslator()override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<MoveOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request );
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The source path of the entry to be moved into a new place.
|
| + std::string source_path;
|
| + // The destination path for the copy operation.
|
| + std::string target_path;
|
| + private:
|
| + MoveOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(MoveOperationTranslator);
|
| +};
|
| +
|
| +struct OpenFileOperationTranslator : public OperationTranslator {
|
| + ~OpenFileOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest()override;
|
| + static scoped_refptr<OpenFileOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // A request ID which will be used by consecutive read/write and close
|
| + // requests.
|
| + int request_id;
|
| + // The path of the file to be opened.
|
| + std::string file_path;
|
| + // Whether the file will be used for reading or writing.
|
| + PP_OpenFileMode_Dev mode;
|
| + private:
|
| + OpenFileOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(OpenFileOperationTranslator);
|
| +};
|
| +
|
| +struct ReadDirectoryOperationTranslator : public OperationTranslator {
|
| + ~ReadDirectoryOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<ReadDirectoryOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& value);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the directory which contents are requested.
|
| + std::string directory_path;
|
| + private:
|
| + ReadDirectoryOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(ReadDirectoryOperationTranslator);
|
| +};
|
| +
|
| +struct ReadFileOperationTranslator : public OperationTranslator {
|
| + ~ReadFileOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<ReadFileOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& value);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // A request ID used to open the file.
|
| + int open_request_id;
|
| + // Position in the file (in bytes) to start reading from.
|
| + double offset;
|
| + // Number of bytes to be returned.
|
| + double length;
|
| + private:
|
| + ReadFileOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(ReadFileOperationTranslator);
|
| +};
|
| +
|
| +struct TruncateOperationTranslator : public OperationTranslator {
|
| + ~TruncateOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<TruncateOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // The path of the file to be truncated.
|
| + std::string file_path;
|
| + // Number of bytes to be retained after the operation completes.
|
| + double length;
|
| + private:
|
| + TruncateOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(TruncateOperationTranslator);
|
| +};
|
| +
|
| +struct UnmountOperationTranslator : public OperationTranslator {
|
| + ~UnmountOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<UnmountOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + // The identifier of the file system to be unmounted.
|
| + std::string file_system_id;
|
| + int request_id;
|
| + private:
|
| + UnmountOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(UnmountOperationTranslator);
|
| +};
|
| +
|
| +struct WriteFileOperationTranslator : public OperationTranslator {
|
| + ~WriteFileOperationTranslator() override;
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<WriteFileOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request,
|
| + char* memory_address);
|
| + // The identifier of the file system related to this operation.
|
| + std::string file_system_id;
|
| + // The unique identifier of this request.
|
| + int request_id;
|
| + // A request ID used to open the file.
|
| + int open_request_id;
|
| + // Position in the file (in bytes) to start writing the bytes from.
|
| + double offset;
|
| + // The size of the buffer
|
| + double size;
|
| + // Buffer for the file chunk
|
| + std::vector<char> data;
|
| + private:
|
| + WriteFileOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(WriteFileOperationTranslator);
|
| +};
|
| +
|
| +struct AddWatcherOperationTranslator : public OperationTranslator {
|
| + ~AddWatcherOperationTranslator();
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<AddWatcherOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + std::string file_system_id;
|
| + int request_id;
|
| + std::string entry_path;
|
| + bool recursive;
|
| + private:
|
| + AddWatcherOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(AddWatcherOperationTranslator);
|
| +};
|
| +
|
| +
|
| +struct RemoveWatcherOperationTranslator : public OperationTranslator {
|
| + ~RemoveWatcherOperationTranslator();
|
| + virtual scoped_ptr<PP_FilesystemRequest> ToFilesystemRequest() override;
|
| + static scoped_refptr<RemoveWatcherOperationTranslator> PopulateFromRequest(
|
| + const base::ListValue& request);
|
| + std::string file_system_id;
|
| + int request_id;
|
| + std::string entry_path;
|
| + bool recursive;
|
| + private:
|
| + RemoveWatcherOperationTranslator();
|
| + DISALLOW_COPY_AND_ASSIGN(RemoveWatcherOperationTranslator);
|
| +};
|
| +
|
| +struct PluginToBrowserTranslator{
|
| + ~PluginToBrowserTranslator() {}
|
| + static scoped_ptr<base::ListValue> GenerateMountMessage(
|
| + std::string filesystem_id,
|
| + std::string display_name,
|
| + bool writable,
|
| + int32_t opened_files_limit);
|
| + static scoped_ptr<base::ListValue> GenerateNotifyMessage(
|
| + PP_Var notification_options);
|
| +
|
| + static scoped_ptr<base::ListValue> GenerateSuccessResponse(
|
| + PP_OperationType_Dev operation_type,
|
| + const std::string& filesystem_id,
|
| + int32_t request_id,
|
| + int time_span);
|
| +
|
| + static scoped_ptr<base::ListValue> GenerateFailureResponse(
|
| + PP_OperationType_Dev operation_type,
|
| + int32_t error,
|
| + const std::string& filesystem_id,
|
| + int32_t request_id,
|
| + int time_span);
|
| + static scoped_ptr<base::ListValue> GenerateMetadataResponse(
|
| + struct PP_Var metadata,
|
| + int32_t request_id,
|
| + const std::string& filesystem_id,
|
| + int time_span);
|
| + static scoped_ptr<base::ListValue> GenerateReadDirectoryResponse(
|
| + struct PP_Var entries,
|
| + PP_Bool has_more, int32_t request_id, const std::string& filesystem_id,
|
| + int time_span);
|
| + static scoped_ptr<base::ListValue> GenerateReadFileSuccessResponse(
|
| + uint32_t data_size, bool has_more, int32_t request_id,
|
| + int time_span, const std::string& filesystem_id);
|
| + private:
|
| + static scoped_ptr<base::DictionaryValue> GenerateMetadataListFromPPVar(
|
| + PP_Var metadata);
|
| + PluginToBrowserTranslator(){}
|
| + DISALLOW_COPY_AND_ASSIGN(PluginToBrowserTranslator);
|
| +
|
| +};
|
| +
|
| +}// namespace
|
| +}// namespace proxy
|
| +}// namespace ppapi
|
| +
|
| +#endif // FILESYSTEM_PROVIDER_RESOURCE_H
|
| +
|
|
|