| Index: chrome/browser/extensions/api/extfs/extfs_api.cc
|
| diff --git a/chrome/browser/extensions/api/extfs/extfs_api.cc b/chrome/browser/extensions/api/extfs/extfs_api.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d4dbb01c953f4367735c05b65bacc767220a9586
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/api/extfs/extfs_api.cc
|
| @@ -0,0 +1,207 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#include "chrome/browser/extensions/api/extfs/extfs_api.h"
|
| +
|
| +#include "chrome/browser/extensions/event_names.h"
|
| +#include "chrome/browser/extensions/event_router.h"
|
| +#include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/common/extensions/api/extfs.h"
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "webkit/browser/blob/file_stream_reader.h"
|
| +#include "webkit/browser/fileapi/external_mount_points.h"
|
| +#include "webkit/browser/fileapi/file_system_url.h"
|
| +#include "webkit/browser/fileapi/remote_file_system_proxy.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +class ExtfsProxy : public fileapi::RemoteFileSystemProxyInterface {
|
| + public:
|
| + ExtfsProxy(EventRouter* event_router,
|
| + const std::string& extension_id,
|
| + const std::string& mount_name)
|
| + : request_id_(0),
|
| + event_router_(event_router),
|
| + extension_id_(extension_id) {
|
| + }
|
| +
|
| + // fileapi::RemoteFileSystemProxyInterface overrides.
|
| + virtual void GetFileInfo(
|
| + const fileapi::FileSystemURL& url,
|
| + const fileapi::FileSystemOperation::GetMetadataCallback& callback)
|
| + OVERRIDE {
|
| + base::FilePath extfs_path(FILE_PATH_LITERAL("/"));
|
| + base::FilePath::FromUTF8Unsafe("/extfs").AppendRelativePath(url.path(),
|
| + &extfs_path);
|
| + LOG(ERROR) << "@@ ExtfsProxy::GetFileInfo: " << extfs_path.value();
|
| +
|
| + get_metadata_callback_map_[request_id_] = callback;
|
| + scoped_ptr<base::ListValue> values(new ListValue());
|
| + values->AppendInteger(request_id_);
|
| + values->AppendString(extfs_path.value());
|
| + scoped_ptr<Event> event(new Event(event_names::kOnGetFileInfo,
|
| + values.Pass()));
|
| +
|
| + event_router_->DispatchEventToExtension(extension_id_, event.Pass());
|
| + ++request_id_;
|
| + }
|
| + void DidGetFileInfo(int request_id,
|
| + const base::PlatformFileError file_error,
|
| + const base::PlatformFileInfo& file_info,
|
| + const base::FilePath& file_path) {
|
| + LOG(ERROR) << "@@ " << __PRETTY_FUNCTION__;
|
| + GetMetadataCallbackMap::iterator iter =
|
| + get_metadata_callback_map_.find(request_id);
|
| + DCHECK(iter != get_metadata_callback_map_.end());
|
| + iter->second.Run(file_error, file_info, file_path);
|
| + get_metadata_callback_map_.erase(iter);
|
| + }
|
| +
|
| + virtual void Copy(
|
| + const fileapi::FileSystemURL& src_url,
|
| + const fileapi::FileSystemURL& dest_url,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void Move(
|
| + const fileapi::FileSystemURL& src_url,
|
| + const fileapi::FileSystemURL& dest_url,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void ReadDirectory(
|
| + const fileapi::FileSystemURL& url,
|
| + const fileapi::FileSystemOperation::ReadDirectoryCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void Remove(
|
| + const fileapi::FileSystemURL& url, bool recursive,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void CreateDirectory(
|
| + const fileapi::FileSystemURL& file_url,
|
| + bool exclusive,
|
| + bool recursive,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void CreateFile(
|
| + const fileapi::FileSystemURL& file_url,
|
| + bool exclusive,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void Truncate(
|
| + const fileapi::FileSystemURL& file_url, int64 length,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void CreateSnapshotFile(
|
| + const fileapi::FileSystemURL& url,
|
| + const fileapi::FileSystemOperation::SnapshotFileCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void CreateWritableSnapshotFile(
|
| + const fileapi::FileSystemURL& url,
|
| + const fileapi::WritableSnapshotFile& callback) OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void OpenFile(
|
| + const fileapi::FileSystemURL& url,
|
| + int file_flags,
|
| + base::ProcessHandle peer_handle,
|
| + const OpenFileCallback& callback) OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void NotifyCloseFile(const fileapi::FileSystemURL& url) OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual void TouchFile(
|
| + const fileapi::FileSystemURL& url,
|
| + const base::Time& last_access_time,
|
| + const base::Time& last_modified_time,
|
| + const fileapi::FileSystemOperation::StatusCallback& callback)
|
| + OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + }
|
| + virtual scoped_ptr<webkit_blob::FileStreamReader> CreateFileStreamReader(
|
| + base::SequencedTaskRunner* file_task_runner,
|
| + const fileapi::FileSystemURL& url,
|
| + int64 offset,
|
| + const base::Time& expected_modification_time) OVERRIDE {
|
| + NOTREACHED() << "@@ not implemented";
|
| + return scoped_ptr<webkit_blob::FileStreamReader>();
|
| + }
|
| +
|
| + protected:
|
| + virtual ~ExtfsProxy() {
|
| + }
|
| +
|
| + private:
|
| + int request_id_;
|
| + EventRouter* event_router_;
|
| + const std::string extension_id_;
|
| + typedef std::map<int,
|
| + fileapi::FileSystemOperation::GetMetadataCallback> GetMetadataCallbackMap;
|
| + GetMetadataCallbackMap get_metadata_callback_map_;
|
| +};
|
| +
|
| +ExtfsProxy* g_extfs_router_;
|
| +
|
| +bool ExtfsAddMountPointFunction::RunImpl() {
|
| + scoped_ptr<api::extfs::AddMountPoint::Params> params(
|
| + api::extfs::AddMountPoint::Params::Create(*args_));
|
| + EXTENSION_FUNCTION_VALIDATE(params.get());
|
| + LOG(ERROR) << "@@ " << __PRETTY_FUNCTION__;
|
| + LOG(ERROR) << "@@ mount_name: " << params->mount_name;
|
| + LOG(ERROR) << "@@ extension_id: " << extension_id();
|
| +
|
| + EventRouter* event_router = ExtensionSystem::Get(profile())->event_router();
|
| + // TODO...
|
| + DCHECK(!g_extfs_router_);
|
| + g_extfs_router_ = new ExtfsProxy(event_router,
|
| + extension_id(),
|
| + params->mount_name);
|
| +
|
| + fileapi::ExternalMountPoints* mount_points =
|
| + content::BrowserContext::GetMountPoints(profile_);
|
| + DCHECK(mount_points);
|
| +
|
| + bool success = mount_points->RegisterRemoteFileSystem(
|
| + "extfs",
|
| + fileapi::kFileSystemTypeDrive,
|
| + g_extfs_router_,
|
| + base::FilePath::FromUTF8Unsafe("/extfs"));
|
| + DCHECK(success);
|
| +
|
| + SetResult(base::Value::CreateBooleanValue(true));
|
| + SendResponse(true);
|
| + return true;
|
| +}
|
| +
|
| +bool ExtfsDidGetFileInfoFunction::RunImpl() {
|
| + scoped_ptr<api::extfs::DidGetFileInfo::Params> params(
|
| + api::extfs::DidGetFileInfo::Params::Create(*args_));
|
| + EXTENSION_FUNCTION_VALIDATE(params.get());
|
| + LOG(ERROR) << "@@ " << __PRETTY_FUNCTION__;
|
| + base::PlatformFileInfo file_info;
|
| + file_info.is_directory = params->entry.is_directory;
|
| + g_extfs_router_->DidGetFileInfo(params->request_id,
|
| + base::PLATFORM_FILE_OK,
|
| + file_info,
|
| + base::FilePath::FromUTF8Unsafe("/"));
|
| + return true;
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|