• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_
6 #define PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_
7 
8 #include <map>
9 #include <queue>
10 #include <string>
11 
12 #include "base/memory/ref_counted.h"
13 #include "ppapi/c/pp_file_info.h"
14 #include "ppapi/c/pp_resource.h"
15 #include "ppapi/c/private/ppb_isolated_file_system_private.h"
16 #include "ppapi/proxy/connection.h"
17 #include "ppapi/proxy/plugin_resource.h"
18 #include "ppapi/proxy/ppapi_proxy_export.h"
19 #include "ppapi/proxy/resource_message_params.h"
20 #include "ppapi/thunk/ppb_file_system_api.h"
21 
22 namespace ppapi {
23 
24 class TrackedCallback;
25 
26 namespace proxy {
27 
28 class PPAPI_PROXY_EXPORT FileSystemResource
29     : public PluginResource,
30       public NON_EXPORTED_BASE(thunk::PPB_FileSystem_API) {
31  public:
32   // Creates a new FileSystemResource. The resource must be subsequently opened
33   // via Open() before use.
34   FileSystemResource(Connection connection,
35                      PP_Instance instance,
36                      PP_FileSystemType type);
37   // Creates a FileSystemResource, attached to an existing pending host
38   // resource. The |pending_renderer_id| and |pending_browser_id| must be
39   // already-opened file systems.
40   FileSystemResource(Connection connection,
41                      PP_Instance instance,
42                      int pending_renderer_id,
43                      int pending_browser_id,
44                      PP_FileSystemType type);
45   virtual ~FileSystemResource();
46 
47   // Resource overrides.
48   virtual thunk::PPB_FileSystem_API* AsPPB_FileSystem_API() OVERRIDE;
49 
50   // PPB_FileSystem_API implementation.
51   virtual int32_t Open(int64_t expected_size,
52                        scoped_refptr<TrackedCallback> callback) OVERRIDE;
53   virtual PP_FileSystemType GetType() OVERRIDE;
54   virtual void OpenQuotaFile(PP_Resource file_io) OVERRIDE;
55   virtual void CloseQuotaFile(PP_Resource file_io) OVERRIDE;
56   typedef base::Callback<void(int64_t)> RequestQuotaCallback;
57   virtual int64_t RequestQuota(int64_t amount,
58                                const RequestQuotaCallback& callback) OVERRIDE;
59 
60   int32_t InitIsolatedFileSystem(const std::string& fsid,
61                                  PP_IsolatedFileSystemType_Private type,
62                                  const base::Callback<void(int32_t)>& callback);
63  private:
64   struct QuotaRequest {
65     QuotaRequest(int64_t amount,
66                  const RequestQuotaCallback& callback);
67     ~QuotaRequest();
68 
69     int64_t amount;
70     RequestQuotaCallback callback;
71   };
72 
73   // Called when the host has responded to our open request.
74   void OpenComplete(scoped_refptr<TrackedCallback> callback,
75                     const ResourceMessageReplyParams& params);
76 
77   // Called when the host has responded to our InitIsolatedFileSystem request.
78   void InitIsolatedFileSystemComplete(
79       const base::Callback<void(int32_t)>& callback,
80       const ResourceMessageReplyParams& params);
81 
82   void ReserveQuota(int64_t amount);
83   typedef std::map<int32_t, int64_t> OffsetMap;
84   void ReserveQuotaComplete(const ResourceMessageReplyParams& params,
85                             int64_t amount,
86                             const OffsetMap& max_written_offsets);
87 
88   PP_FileSystemType type_;
89   bool called_open_;
90   uint32_t callback_count_;
91   int32_t callback_result_;
92 
93   std::set<PP_Resource> files_;
94   std::queue<QuotaRequest> pending_quota_requests_;
95   int64_t reserved_quota_;
96   bool reserving_quota_;
97 
98   DISALLOW_COPY_AND_ASSIGN(FileSystemResource);
99 };
100 
101 }  // namespace proxy
102 }  // namespace ppapi
103 
104 #endif  // PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_
105