// Copyright (c) 2011 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 CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_
#pragma once
#include <map>
#include <string>
#include <vector>
#include "base/platform_file.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/ui/shell_dialogs.h"
#include "googleurl/src/url_util.h"
#include "webkit/fileapi/file_system_callback_dispatcher.h"
class GURL;
class HtmlDialogView;
// Implements the chrome.fileBrowserPrivate.requestLocalFileSystem method.
class RequestLocalFileSystemFunction : public AsyncExtensionFunction {
protected:
friend class LocalFileSystemCallbackDispatcher;
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
void RespondSuccessOnUIThread(const std::string& name,
const GURL& root_path);
void RespondFailedOnUIThread(base::PlatformFileError error_code);
void RequestOnFileThread(const GURL& source_url, int child_id);
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.requestLocalFileSystem");
};
// Implements the chrome.fileBrowserPrivate.getFileTasks method.
class GetFileTasksFileBrowserFunction : public AsyncExtensionFunction {
protected:
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getFileTasks");
};
// Implements the chrome.fileBrowserPrivate.executeTask method.
class ExecuteTasksFileBrowserFunction : public AsyncExtensionFunction {
protected:
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
private:
struct FileDefinition {
GURL target_file_url;
FilePath virtual_path;
bool is_directory;
};
typedef std::vector<FileDefinition> FileDefinitionList;
friend class ExecuteTasksFileSystemCallbackDispatcher;
// Initates execution of context menu tasks identified with |task_id| for
// each element of |files_list|.
bool InitiateFileTaskExecution(const std::string& task_id,
ListValue* files_list);
void RequestFileEntryOnFileThread(const GURL& source_url,
const std::string& task_id,
const std::vector<GURL>& file_urls);
void RespondFailedOnUIThread(base::PlatformFileError error_code);
void ExecuteFileActionsOnUIThread(const std::string& task_id,
const std::string& file_system_name,
const GURL& file_system_root,
const FileDefinitionList& file_list);
void ExecuteFailedOnUIThread();
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.executeTask");
};
// Parent class for the chromium extension APIs for the file dialog.
class FileDialogFunction
: public AsyncExtensionFunction {
public:
FileDialogFunction();
// Register/unregister callbacks.
// When file selection events occur in a tab, we'll call back the
// appropriate listener with the right params.
class Callback {
public:
Callback(SelectFileDialog::Listener* listener,
HtmlDialogView* dialog,
void* params)
: listener_(listener),
dialog_(dialog),
params_(params) {
}
SelectFileDialog::Listener* listener() const { return listener_; }
HtmlDialogView* dialog() const { return dialog_; }
void* params() const { return params_; }
bool IsNull() const { return listener_ == NULL; }
static void Add(int32 tab_id,
SelectFileDialog::Listener* listener,
HtmlDialogView* dialog,
void* params);
static void Remove(int32 tab_id);
static const Callback& Find(int32 tab_id);
static const Callback& null() { return null_; }
private:
SelectFileDialog::Listener* listener_;
HtmlDialogView* dialog_;
void* params_;
// statics.
typedef std::map<int32, Callback> Map;
static Map map_;
static Callback null_;
};
protected:
typedef std::vector<GURL> UrlList;
typedef std::vector<FilePath> FilePathList;
virtual ~FileDialogFunction();
// Convert virtual paths to local paths on the file thread.
void GetLocalPathsOnFileThread(const UrlList& file_urls,
const std::string& internal_task_id);
// Callback with converted local paths.
virtual void GetLocalPathsResponseOnUIThread(const FilePathList& files,
const std::string& internal_task_id) {}
// Get the callback for the hosting tab.
const Callback& GetCallback() const;
// Closes the dialog window containing the file dialog HtmlDialogView.
void CloseDialog(HtmlDialogView* dialog);
private:
// Figure out the tab_id of the hosting tab.
int32 GetTabId() const;
};
// Select a single file. Closes the dialog window.
class SelectFileFunction
: public FileDialogFunction {
public:
SelectFileFunction() {}
protected:
virtual ~SelectFileFunction() {}
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
// FileDialogFunction overrides.
virtual void GetLocalPathsResponseOnUIThread(
const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFile");
};
// View multiple selected files. Window stays open.
class ViewFilesFunction
: public FileDialogFunction {
public:
ViewFilesFunction();
protected:
virtual ~ViewFilesFunction();
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
// FileDialogFunction overrides.
virtual void GetLocalPathsResponseOnUIThread(
const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.viewFiles");
};
// Select multiple files. Closes the dialog window.
class SelectFilesFunction
: public FileDialogFunction {
public:
SelectFilesFunction();
protected:
virtual ~SelectFilesFunction();
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
// FileDialogFunction overrides.
virtual void GetLocalPathsResponseOnUIThread(
const FilePathList& files, const std::string& internal_task_id) OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFiles");
};
// Cancel file selection Dialog. Closes the dialog window.
class CancelFileDialogFunction
: public FileDialogFunction {
public:
CancelFileDialogFunction() {}
protected:
virtual ~CancelFileDialogFunction() {}
// AsyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.cancelDialog");
};
// File Dialog Strings.
class FileDialogStringsFunction : public SyncExtensionFunction {
public:
FileDialogStringsFunction() {}
protected:
virtual ~FileDialogStringsFunction() {}
// SyncExtensionFunction overrides.
virtual bool RunImpl() OVERRIDE;
private:
DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getStrings");
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_