1// Copyright 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// This file provides file system related API functions.
6
7#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_FILE_SYSTEM_H_
8#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_FILE_SYSTEM_H_
9
10#include <string>
11
12#include "chrome/browser/chromeos/drive/file_errors.h"
13#include "chrome/browser/chromeos/extensions/file_manager/private_api_base.h"
14
15class GURL;
16
17namespace base {
18class FilePath;
19}
20
21namespace storage {
22class FileSystemContext;
23}
24
25namespace file_manager {
26namespace util {
27struct EntryDefinition;
28typedef std::vector<EntryDefinition> EntryDefinitionList;
29}  // namespace util
30}  // namespace file_manager
31
32namespace extensions {
33
34// Implements the chrome.fileManagerPrivate.requestFileSystem method.
35class FileManagerPrivateRequestFileSystemFunction
36    : public LoggedAsyncExtensionFunction {
37 public:
38  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.requestFileSystem",
39                             FILEMANAGERPRIVATE_REQUESTFILESYSTEM)
40
41 protected:
42  virtual ~FileManagerPrivateRequestFileSystemFunction() {}
43
44  // AsyncExtensionFunction overrides.
45  virtual bool RunAsync() OVERRIDE;
46
47 private:
48  void RespondSuccessOnUIThread(const std::string& name,
49                                const GURL& root_url);
50  void RespondFailedOnUIThread(base::File::Error error_code);
51
52  // Called when something goes wrong. Records the error to |error_| per the
53  // error code and reports that the private API function failed.
54  void DidFail(base::File::Error error_code);
55
56  // Sets up file system access permissions to the extension identified by
57  // |child_id|.
58  bool SetupFileSystemAccessPermissions(
59      scoped_refptr<storage::FileSystemContext> file_system_context,
60      int child_id,
61      Profile* profile,
62      scoped_refptr<const extensions::Extension> extension);
63
64  // Called when the entry definition is computed.
65  void OnEntryDefinition(
66      const file_manager::util::EntryDefinition& entry_definition);
67};
68
69// Base class for FileManagerPrivateAddFileWatchFunction and
70// FileManagerPrivateRemoveFileWatchFunction. Although it's called "FileWatch",
71// the class and its sub classes are used only for watching changes in
72// directories.
73class FileWatchFunctionBase : public LoggedAsyncExtensionFunction {
74 protected:
75  virtual ~FileWatchFunctionBase() {}
76
77  // Performs a file watch operation (ex. adds or removes a file watch).
78  virtual void PerformFileWatchOperation(
79      const base::FilePath& local_path,
80      const base::FilePath& virtual_path,
81      const std::string& extension_id) = 0;
82
83  // AsyncExtensionFunction overrides.
84  virtual bool RunAsync() OVERRIDE;
85
86  // Calls SendResponse() with |success| converted to base::Value.
87  void Respond(bool success);
88};
89
90// Implements the chrome.fileManagerPrivate.addFileWatch method.
91// Starts watching changes in directories.
92class FileManagerPrivateAddFileWatchFunction : public FileWatchFunctionBase {
93 public:
94  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.addFileWatch",
95                             FILEMANAGERPRIVATE_ADDFILEWATCH)
96
97 protected:
98  virtual ~FileManagerPrivateAddFileWatchFunction() {}
99
100  // FileWatchFunctionBase override.
101  virtual void PerformFileWatchOperation(
102      const base::FilePath& local_path,
103      const base::FilePath& virtual_path,
104      const std::string& extension_id) OVERRIDE;
105};
106
107
108// Implements the chrome.fileManagerPrivate.removeFileWatch method.
109// Stops watching changes in directories.
110class FileManagerPrivateRemoveFileWatchFunction : public FileWatchFunctionBase {
111 public:
112  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.removeFileWatch",
113                             FILEMANAGERPRIVATE_REMOVEFILEWATCH)
114
115 protected:
116  virtual ~FileManagerPrivateRemoveFileWatchFunction() {}
117
118  // FileWatchFunctionBase override.
119  virtual void PerformFileWatchOperation(
120      const base::FilePath& local_path,
121      const base::FilePath& virtual_path,
122      const std::string& extension_id) OVERRIDE;
123};
124
125// Implements the chrome.fileManagerPrivate.getSizeStats method.
126class FileManagerPrivateGetSizeStatsFunction
127    : public LoggedAsyncExtensionFunction {
128 public:
129  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getSizeStats",
130                             FILEMANAGERPRIVATE_GETSIZESTATS)
131
132 protected:
133  virtual ~FileManagerPrivateGetSizeStatsFunction() {}
134
135  // AsyncExtensionFunction overrides.
136  virtual bool RunAsync() OVERRIDE;
137
138 private:
139  void GetDriveAvailableSpaceCallback(drive::FileError error,
140                                      int64 bytes_total,
141                                      int64 bytes_used);
142
143  void GetSizeStatsCallback(const uint64* total_size,
144                            const uint64* remaining_size);
145};
146
147// Implements the chrome.fileManagerPrivate.validatePathNameLength method.
148class FileManagerPrivateValidatePathNameLengthFunction
149    : public LoggedAsyncExtensionFunction {
150 public:
151  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.validatePathNameLength",
152                             FILEMANAGERPRIVATE_VALIDATEPATHNAMELENGTH)
153
154 protected:
155  virtual ~FileManagerPrivateValidatePathNameLengthFunction() {}
156
157  void OnFilePathLimitRetrieved(size_t current_length, size_t max_length);
158
159  // AsyncExtensionFunction overrides.
160  virtual bool RunAsync() OVERRIDE;
161};
162
163// Implements the chrome.fileManagerPrivate.formatVolume method.
164// Formats Volume given its mount path.
165class FileManagerPrivateFormatVolumeFunction
166    : public LoggedAsyncExtensionFunction {
167 public:
168  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.formatVolume",
169                             FILEMANAGERPRIVATE_FORMATVOLUME)
170
171 protected:
172  virtual ~FileManagerPrivateFormatVolumeFunction() {}
173
174  // AsyncExtensionFunction overrides.
175  virtual bool RunAsync() OVERRIDE;
176};
177
178// Implements the chrome.fileManagerPrivate.startCopy method.
179class FileManagerPrivateStartCopyFunction
180    : public LoggedAsyncExtensionFunction {
181 public:
182  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.startCopy",
183                             FILEMANAGERPRIVATE_STARTCOPY)
184
185 protected:
186  virtual ~FileManagerPrivateStartCopyFunction() {}
187
188  // AsyncExtensionFunction overrides.
189  virtual bool RunAsync() OVERRIDE;
190
191 private:
192  // Part of RunAsync(). Called after Copy() is started on IO thread.
193  void RunAfterStartCopy(int operation_id);
194};
195
196// Implements the chrome.fileManagerPrivate.cancelCopy method.
197class FileManagerPrivateCancelCopyFunction
198    : public LoggedAsyncExtensionFunction {
199 public:
200  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.cancelCopy",
201                             FILEMANAGERPRIVATE_CANCELCOPY)
202
203 protected:
204  virtual ~FileManagerPrivateCancelCopyFunction() {}
205
206  // AsyncExtensionFunction overrides.
207  virtual bool RunAsync() OVERRIDE;
208};
209
210// Implements the chrome.fileManagerPrivateInternal.resolveIsolatedEntries
211// method.
212class FileManagerPrivateInternalResolveIsolatedEntriesFunction
213    : public ChromeAsyncExtensionFunction {
214 public:
215  DECLARE_EXTENSION_FUNCTION(
216      "fileManagerPrivateInternal.resolveIsolatedEntries",
217      FILEMANAGERPRIVATE_RESOLVEISOLATEDENTRIES)
218
219 protected:
220  virtual ~FileManagerPrivateInternalResolveIsolatedEntriesFunction() {}
221
222  // AsyncExtensionFunction overrides.
223  virtual bool RunAsync() OVERRIDE;
224
225 private:
226  void RunAsyncAfterConvertFileDefinitionListToEntryDefinitionList(scoped_ptr<
227      file_manager::util::EntryDefinitionList> entry_definition_list);
228};
229
230}  // namespace extensions
231
232#endif  // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_FILE_SYSTEM_H_
233