| 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 | 
|  |