• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_
6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_
7 #pragma once
8 
9 #include <map>
10 #include <string>
11 #include <vector>
12 
13 #include "base/platform_file.h"
14 #include "chrome/browser/extensions/extension_function.h"
15 #include "chrome/browser/ui/shell_dialogs.h"
16 #include "googleurl/src/url_util.h"
17 #include "webkit/fileapi/file_system_callback_dispatcher.h"
18 
19 class GURL;
20 class HtmlDialogView;
21 
22 // Implements the chrome.fileBrowserPrivate.requestLocalFileSystem method.
23 class RequestLocalFileSystemFunction : public AsyncExtensionFunction {
24  protected:
25   friend class LocalFileSystemCallbackDispatcher;
26   // AsyncExtensionFunction overrides.
27   virtual bool RunImpl() OVERRIDE;
28   void RespondSuccessOnUIThread(const std::string& name,
29                                 const GURL& root_path);
30   void RespondFailedOnUIThread(base::PlatformFileError error_code);
31   void RequestOnFileThread(const GURL& source_url, int child_id);
32   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.requestLocalFileSystem");
33 };
34 
35 // Implements the chrome.fileBrowserPrivate.getFileTasks method.
36 class GetFileTasksFileBrowserFunction : public AsyncExtensionFunction {
37  protected:
38   // AsyncExtensionFunction overrides.
39   virtual bool RunImpl() OVERRIDE;
40 
41  private:
42   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getFileTasks");
43 };
44 
45 
46 // Implements the chrome.fileBrowserPrivate.executeTask method.
47 class ExecuteTasksFileBrowserFunction : public AsyncExtensionFunction {
48  protected:
49   // AsyncExtensionFunction overrides.
50   virtual bool RunImpl() OVERRIDE;
51 
52  private:
53   struct FileDefinition {
54     GURL target_file_url;
55     FilePath virtual_path;
56     bool is_directory;
57   };
58   typedef std::vector<FileDefinition> FileDefinitionList;
59   friend class ExecuteTasksFileSystemCallbackDispatcher;
60   // Initates execution of context menu tasks identified with |task_id| for
61   // each element of |files_list|.
62   bool InitiateFileTaskExecution(const std::string& task_id,
63                                  ListValue* files_list);
64   void RequestFileEntryOnFileThread(const GURL& source_url,
65                                     const std::string& task_id,
66                                     const std::vector<GURL>& file_urls);
67   void RespondFailedOnUIThread(base::PlatformFileError error_code);
68   void ExecuteFileActionsOnUIThread(const std::string& task_id,
69                                     const std::string& file_system_name,
70                                     const GURL& file_system_root,
71                                     const FileDefinitionList& file_list);
72   void ExecuteFailedOnUIThread();
73   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.executeTask");
74 };
75 
76 // Parent class for the chromium extension APIs for the file dialog.
77 class FileDialogFunction
78     : public AsyncExtensionFunction {
79  public:
80   FileDialogFunction();
81 
82   // Register/unregister callbacks.
83   // When file selection events occur in a tab, we'll call back the
84   // appropriate listener with the right params.
85   class Callback {
86    public:
Callback(SelectFileDialog::Listener * listener,HtmlDialogView * dialog,void * params)87     Callback(SelectFileDialog::Listener* listener,
88              HtmlDialogView* dialog,
89              void* params)
90         : listener_(listener),
91           dialog_(dialog),
92           params_(params) {
93     }
listener()94     SelectFileDialog::Listener* listener() const { return listener_; }
dialog()95     HtmlDialogView* dialog() const { return dialog_; }
params()96     void* params() const { return params_; }
IsNull()97     bool IsNull() const { return listener_ == NULL; }
98 
99     static void Add(int32 tab_id,
100                     SelectFileDialog::Listener* listener,
101                     HtmlDialogView* dialog,
102                     void* params);
103     static void Remove(int32 tab_id);
104     static const Callback& Find(int32 tab_id);
null()105     static const Callback& null() { return null_; }
106 
107    private:
108 
109     SelectFileDialog::Listener* listener_;
110     HtmlDialogView* dialog_;
111     void* params_;
112 
113     // statics.
114     typedef std::map<int32, Callback> Map;
115     static Map map_;
116     static Callback null_;
117   };
118 
119  protected:
120   typedef std::vector<GURL> UrlList;
121   typedef std::vector<FilePath> FilePathList;
122 
123   virtual ~FileDialogFunction();
124 
125   // Convert virtual paths to local paths on the file thread.
126   void GetLocalPathsOnFileThread(const UrlList& file_urls,
127                                  const std::string& internal_task_id);
128 
129   // Callback with converted local paths.
GetLocalPathsResponseOnUIThread(const FilePathList & files,const std::string & internal_task_id)130   virtual void GetLocalPathsResponseOnUIThread(const FilePathList& files,
131       const std::string& internal_task_id) {}
132 
133   // Get the callback for the hosting tab.
134   const Callback& GetCallback() const;
135 
136   // Closes the dialog window containing the file dialog HtmlDialogView.
137   void CloseDialog(HtmlDialogView* dialog);
138 
139  private:
140   // Figure out the tab_id of the hosting tab.
141   int32 GetTabId() const;
142 };
143 
144 // Select a single file.  Closes the dialog window.
145 class SelectFileFunction
146     : public FileDialogFunction {
147  public:
SelectFileFunction()148   SelectFileFunction() {}
149 
150  protected:
~SelectFileFunction()151   virtual ~SelectFileFunction() {}
152 
153   // AsyncExtensionFunction overrides.
154   virtual bool RunImpl() OVERRIDE;
155 
156   // FileDialogFunction overrides.
157   virtual void GetLocalPathsResponseOnUIThread(
158       const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
159 
160  private:
161   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFile");
162 };
163 
164 // View multiple selected files.  Window stays open.
165 class ViewFilesFunction
166     : public FileDialogFunction {
167  public:
168   ViewFilesFunction();
169 
170  protected:
171   virtual ~ViewFilesFunction();
172 
173   // AsyncExtensionFunction overrides.
174   virtual bool RunImpl() OVERRIDE;
175 
176   // FileDialogFunction overrides.
177   virtual void GetLocalPathsResponseOnUIThread(
178       const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
179 
180  private:
181   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.viewFiles");
182 };
183 
184 // Select multiple files.  Closes the dialog window.
185 class SelectFilesFunction
186     : public FileDialogFunction {
187  public:
188   SelectFilesFunction();
189 
190  protected:
191   virtual ~SelectFilesFunction();
192 
193   // AsyncExtensionFunction overrides.
194   virtual bool RunImpl() OVERRIDE;
195 
196   // FileDialogFunction overrides.
197   virtual void GetLocalPathsResponseOnUIThread(
198       const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
199 
200  private:
201   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFiles");
202 };
203 
204 // Cancel file selection Dialog.  Closes the dialog window.
205 class CancelFileDialogFunction
206     : public FileDialogFunction {
207  public:
CancelFileDialogFunction()208   CancelFileDialogFunction() {}
209 
210  protected:
~CancelFileDialogFunction()211   virtual ~CancelFileDialogFunction() {}
212 
213   // AsyncExtensionFunction overrides.
214   virtual bool RunImpl() OVERRIDE;
215 
216  private:
217   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.cancelDialog");
218 };
219 
220 // File Dialog Strings.
221 class FileDialogStringsFunction : public SyncExtensionFunction {
222  public:
FileDialogStringsFunction()223   FileDialogStringsFunction() {}
224 
225  protected:
~FileDialogStringsFunction()226   virtual ~FileDialogStringsFunction() {}
227 
228   // SyncExtensionFunction overrides.
229   virtual bool RunImpl() OVERRIDE;
230 
231  private:
232   DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getStrings");
233 };
234 
235 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_
236