| Index: chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
|
| diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
|
| index ba42b9f3f9dc9f2a6b4f3604829e2036024d2bdc..34dff8ad9e16cee121d3994ed549a23533449c4e 100644
|
| --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
|
| +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
|
| @@ -11,6 +11,8 @@
|
| #include "chrome/browser/chromeos/file_manager/file_tasks.h"
|
| #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
|
| #include "chrome/browser/chromeos/file_manager/url_util.h"
|
| +#include "chrome/browser/chromeos/file_system_provider/mount_path_util.h"
|
| +#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h"
|
| #include "chrome/browser/chromeos/fileapi/file_system_backend.h"
|
| #include "chrome/browser/chromeos/profiles/profile_helper.h"
|
| #include "chrome/browser/drive/drive_app_registry.h"
|
| @@ -29,13 +31,16 @@
|
|
|
| using content::BrowserThread;
|
|
|
| +using chromeos::file_system_provider::EntryMetadata;
|
| +using chromeos::file_system_provider::ProvidedFileSystemInterface;
|
| +using chromeos::file_system_provider::util::FileSystemURLParser;
|
| +using extensions::api::file_browser_private::EntryProperties;
|
| using file_manager::util::EntryDefinition;
|
| using file_manager::util::EntryDefinitionCallback;
|
| using file_manager::util::EntryDefinitionList;
|
| using file_manager::util::EntryDefinitionListCallback;
|
| using file_manager::util::FileDefinition;
|
| using file_manager::util::FileDefinitionList;
|
| -using extensions::api::file_browser_private::EntryProperties;
|
|
|
| namespace extensions {
|
| namespace {
|
| @@ -54,9 +59,9 @@ const char kDriveConnectionReasonNoService[] = "no_service";
|
|
|
| // Copies properties from |entry_proto| to |properties|. |shared_with_me| is
|
| // given from the running profile.
|
| -void FillEntryPropertiesValue(const drive::ResourceEntry& entry_proto,
|
| - bool shared_with_me,
|
| - EntryProperties* properties) {
|
| +void FillEntryPropertiesValueForDrive(const drive::ResourceEntry& entry_proto,
|
| + bool shared_with_me,
|
| + EntryProperties* properties) {
|
| properties->shared_with_me.reset(new bool(shared_with_me));
|
| properties->shared.reset(new bool(entry_proto.shared()));
|
|
|
| @@ -154,6 +159,8 @@ class SingleEntryPropertiesGetterForDrive {
|
| static void Start(const base::FilePath local_path,
|
| Profile* const profile,
|
| const ResultCallback& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| SingleEntryPropertiesGetterForDrive* instance =
|
| new SingleEntryPropertiesGetterForDrive(local_path, profile, callback);
|
| instance->StartProcess();
|
| @@ -164,19 +171,6 @@ class SingleEntryPropertiesGetterForDrive {
|
| virtual ~SingleEntryPropertiesGetterForDrive() {}
|
|
|
| private:
|
| - // Given parameters.
|
| - const ResultCallback callback_;
|
| - const base::FilePath local_path_;
|
| - Profile* const running_profile_;
|
| -
|
| - // Values used in the process.
|
| - scoped_ptr<EntryProperties> properties_;
|
| - Profile* file_owner_profile_;
|
| - base::FilePath file_path_;
|
| - scoped_ptr<drive::ResourceEntry> owner_resource_entry_;
|
| -
|
| - base::WeakPtrFactory<SingleEntryPropertiesGetterForDrive> weak_ptr_factory_;
|
| -
|
| SingleEntryPropertiesGetterForDrive(const base::FilePath local_path,
|
| Profile* const profile,
|
| const ResultCallback& callback)
|
| @@ -190,10 +184,6 @@ class SingleEntryPropertiesGetterForDrive {
|
| DCHECK(profile);
|
| }
|
|
|
| - base::WeakPtr<SingleEntryPropertiesGetterForDrive> GetWeakPtr() {
|
| - return weak_ptr_factory_.GetWeakPtr();
|
| - }
|
| -
|
| void StartProcess() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| @@ -219,7 +209,7 @@ class SingleEntryPropertiesGetterForDrive {
|
| file_system->GetResourceEntry(
|
| file_path_,
|
| base::Bind(&SingleEntryPropertiesGetterForDrive::OnGetFileInfo,
|
| - GetWeakPtr()));
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void OnGetFileInfo(drive::FileError error,
|
| @@ -250,7 +240,7 @@ class SingleEntryPropertiesGetterForDrive {
|
| file_system->GetPathFromResourceId(
|
| owner_resource_entry_->resource_id(),
|
| base::Bind(&SingleEntryPropertiesGetterForDrive::OnGetRunningPath,
|
| - GetWeakPtr()));
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void OnGetRunningPath(drive::FileError error,
|
| @@ -274,7 +264,7 @@ class SingleEntryPropertiesGetterForDrive {
|
| file_system->GetResourceEntry(
|
| file_path,
|
| base::Bind(&SingleEntryPropertiesGetterForDrive::OnGetShareInfo,
|
| - GetWeakPtr()));
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void OnGetShareInfo(drive::FileError error,
|
| @@ -286,14 +276,14 @@ class SingleEntryPropertiesGetterForDrive {
|
| return;
|
| }
|
|
|
| - DCHECK(entry);
|
| + DCHECK(entry.get());
|
| StartParseFileInfo(entry->shared_with_me());
|
| }
|
|
|
| void StartParseFileInfo(bool shared_with_me) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - FillEntryPropertiesValue(
|
| + FillEntryPropertiesValueForDrive(
|
| *owner_resource_entry_, shared_with_me, properties_.get());
|
|
|
| drive::FileSystemInterface* const file_system =
|
| @@ -307,7 +297,7 @@ class SingleEntryPropertiesGetterForDrive {
|
| }
|
|
|
| // The properties meaningful for directories are already filled in
|
| - // FillEntryPropertiesValue().
|
| + // FillEntryPropertiesValueForDrive().
|
| if (!owner_resource_entry_->has_file_specific_info()) {
|
| CompleteGetEntryProperties(drive::FILE_ERROR_OK);
|
| return;
|
| @@ -350,9 +340,107 @@ class SingleEntryPropertiesGetterForDrive {
|
| DCHECK(!callback_.is_null());
|
|
|
| callback_.Run(properties_.Pass(), drive::FileErrorToBaseFileError(error));
|
| + BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
|
| + }
|
| +
|
| + // Given parameters.
|
| + const ResultCallback callback_;
|
| + const base::FilePath local_path_;
|
| + Profile* const running_profile_;
|
| +
|
| + // Values used in the process.
|
| + scoped_ptr<EntryProperties> properties_;
|
| + Profile* file_owner_profile_;
|
| + base::FilePath file_path_;
|
| + scoped_ptr<drive::ResourceEntry> owner_resource_entry_;
|
| +
|
| + base::WeakPtrFactory<SingleEntryPropertiesGetterForDrive> weak_ptr_factory_;
|
| +}; // class SingleEntryPropertiesGetterForDrive
|
| +
|
| +class SingleEntryPropertiesGetterForFileSystemProvider {
|
| + public:
|
| + typedef base::Callback<void(scoped_ptr<EntryProperties> properties,
|
| + base::File::Error error)> ResultCallback;
|
|
|
| - delete this;
|
| + // Creates an instance and starts the process.
|
| + static void Start(const storage::FileSystemURL file_system_url,
|
| + const ResultCallback& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + SingleEntryPropertiesGetterForFileSystemProvider* instance =
|
| + new SingleEntryPropertiesGetterForFileSystemProvider(file_system_url,
|
| + callback);
|
| + instance->StartProcess();
|
| +
|
| + // The instance will be destroyed by itself.
|
| + }
|
| +
|
| + virtual ~SingleEntryPropertiesGetterForFileSystemProvider() {}
|
| +
|
| + private:
|
| + SingleEntryPropertiesGetterForFileSystemProvider(
|
| + const storage::FileSystemURL& file_system_url,
|
| + const ResultCallback& callback)
|
| + : callback_(callback),
|
| + file_system_url_(file_system_url),
|
| + properties_(new EntryProperties),
|
| + weak_ptr_factory_(this) {
|
| + DCHECK(!callback_.is_null());
|
| + }
|
| +
|
| + void StartProcess() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + FileSystemURLParser parser(file_system_url_);
|
| + if (!parser.Parse()) {
|
| + CompleteGetEntryProperties(base::File::FILE_ERROR_NOT_FOUND);
|
| + return;
|
| + }
|
| +
|
| + parser.file_system()->GetMetadata(
|
| + parser.file_path(),
|
| + ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL,
|
| + base::Bind(&SingleEntryPropertiesGetterForFileSystemProvider::
|
| + OnGetMetadataCompleted,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| +
|
| + void OnGetMetadataCompleted(scoped_ptr<EntryMetadata> metadata,
|
| + base::File::Error result) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + if (result != base::File::FILE_OK) {
|
| + CompleteGetEntryProperties(result);
|
| + return;
|
| + }
|
| +
|
| + properties_->file_size.reset(new double(metadata->size));
|
| + properties_->last_modified_time.reset(
|
| + new double(metadata->modification_time.ToJsTime()));
|
| +
|
| + if (!metadata->thumbnail.empty())
|
| + properties_->thumbnail_url.reset(new std::string(metadata->thumbnail));
|
| +
|
| + CompleteGetEntryProperties(base::File::FILE_OK);
|
| + }
|
| +
|
| + void CompleteGetEntryProperties(base::File::Error result) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!callback_.is_null());
|
| +
|
| + callback_.Run(properties_.Pass(), result);
|
| + BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
|
| + }
|
| +
|
| + // Given parameters.
|
| + const ResultCallback callback_;
|
| + const storage::FileSystemURL file_system_url_;
|
| +
|
| + // Values used in the process.
|
| + scoped_ptr<EntryProperties> properties_;
|
| +
|
| + base::WeakPtrFactory<SingleEntryPropertiesGetterForFileSystemProvider>
|
| + weak_ptr_factory_;
|
| }; // class SingleEntryPropertiesGetterForDrive
|
|
|
| } // namespace
|
| @@ -393,14 +481,18 @@ bool FileBrowserPrivateGetEntryPropertiesFunction::RunAsync() {
|
| i));
|
| break;
|
| case storage::kFileSystemTypeProvided:
|
| - // TODO(mtomasz): Add support for provided file systems.
|
| - NOTIMPLEMENTED();
|
| + SingleEntryPropertiesGetterForFileSystemProvider::Start(
|
| + file_system_url,
|
| + base::Bind(&FileBrowserPrivateGetEntryPropertiesFunction::
|
| + CompleteGetEntryProperties,
|
| + this,
|
| + i));
|
| break;
|
| default:
|
| LOG(ERROR) << "Not supported file system type.";
|
| CompleteGetEntryProperties(i,
|
| - make_scoped_ptr(new EntryProperties),
|
| - base::File::FILE_ERROR_INVALID_OPERATION);
|
| + make_scoped_ptr(new EntryProperties),
|
| + base::File::FILE_ERROR_INVALID_OPERATION);
|
| }
|
| }
|
|
|
|
|