17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_FILE_REF_HOST_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_FILE_REF_HOST_H_
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_file_info.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_time.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/host_message_context.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/resource_host.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass PepperFileRefHost;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class PepperFileSystemBrowserHost;
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Internal and external filesystems have very different codepaths for
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// performing FileRef operations. The logic is split into separate classes
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// to make it easier to read.
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class PepperFileRefBackend {
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~PepperFileRefBackend();
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t MakeDirectory(ppapi::host::ReplyMessageContext context,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int32_t make_directory_flags) = 0;
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t Touch(ppapi::host::ReplyMessageContext context,
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        PP_Time last_accessed_time,
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        PP_Time last_modified_time) = 0;
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t Delete(ppapi::host::ReplyMessageContext context) = 0;
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t Rename(ppapi::host::ReplyMessageContext context,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         PepperFileRefHost* new_file_ref) = 0;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t Query(ppapi::host::ReplyMessageContext context) = 0;
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t ReadDirectoryEntries(
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ppapi::host::ReplyMessageContext context) = 0;
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual int32_t GetAbsolutePath(ppapi::host::ReplyMessageContext context) = 0;
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual storage::FileSystemURL GetFileSystemURL() const = 0;
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual base::FilePath GetExternalFilePath() const = 0;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns an error from the pp_errors.h enum.
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual int32_t CanRead() const = 0;
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual int32_t CanWrite() const = 0;
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual int32_t CanCreate() const = 0;
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual int32_t CanReadWrite() const = 0;
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CONTENT_EXPORT PepperFileRefHost
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public ppapi::host::ResourceHost,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public base::SupportsWeakPtr<PepperFileRefHost> {
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PepperFileRefHost(BrowserPpapiHost* host,
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    PP_Instance instance,
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    PP_Resource resource,
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    PP_Resource file_system,
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    const std::string& internal_path);
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PepperFileRefHost(BrowserPpapiHost* host,
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    PP_Instance instance,
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    PP_Resource resource,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    const base::FilePath& external_path);
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~PepperFileRefHost();
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ResourceHost overrides.
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual int32_t OnResourceMessageReceived(
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const IPC::Message& msg,
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ppapi::host::HostMessageContext* context) OVERRIDE;
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsFileRefHost() OVERRIDE;
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Required to support Rename().
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PP_FileSystemType GetFileSystemType() const;
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL GetFileSystemURL() const;
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Required to support FileIO.
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::FilePath GetExternalFilePath() const;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<PepperFileSystemBrowserHost> GetFileSystemHost() const;
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int32_t CanRead() const;
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int32_t CanWrite() const;
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int32_t CanCreate() const;
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int32_t CanReadWrite() const;
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnMakeDirectory(ppapi::host::HostMessageContext* context,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          int32_t make_directory_flags);
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnTouch(ppapi::host::HostMessageContext* context,
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  PP_Time last_access_time,
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  PP_Time last_modified_time);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnDelete(ppapi::host::HostMessageContext* context);
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnRename(ppapi::host::HostMessageContext* context,
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   PP_Resource new_file_ref);
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnQuery(ppapi::host::HostMessageContext* context);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnReadDirectoryEntries(ppapi::host::HostMessageContext* context);
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int32_t OnGetAbsolutePath(ppapi::host::HostMessageContext* context);
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserPpapiHost* host_;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<PepperFileRefBackend> backend_;
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<PepperFileSystemBrowserHost> file_system_host_;
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PP_FileSystemType fs_type_;
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PepperFileRefHost);
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_FILE_REF_HOST_H_
113