Chromium Code Reviews| Index: chrome/browser/chromeos/extensions/file_browser_private_api.cc |
| diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
| index c5cc7c48efffa82f9814b60465186aadf858306d..74ffe4436e778aebf27897d50d4e0b59422c75c7 100644 |
| --- a/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
| +++ b/chrome/browser/chromeos/extensions/file_browser_private_api.cc |
| @@ -386,6 +386,112 @@ base::DictionaryValue* CreateValueFromMountPoint(Profile* profile, |
| } |
| #endif // defined(OS_CHROMEOS) |
| +// Delegate used to find file properties. |
| +class FilePropertiesDelegate : public gdata::FindFileDelegate { |
| + public: |
| + FilePropertiesDelegate(); |
| + virtual ~FilePropertiesDelegate(); |
| + |
| + // Builds a dictionary from the GDataFile file property information |
| + void CopyProperties(base::DictionaryValue* property_dict); |
| + |
| + base::PlatformFileError error() const { return error_; } |
| + |
| + private: |
| + // GDataFileSystem::FindFileDelegate overrides. |
| + virtual void OnFileFound(gdata::GDataFile* file) OVERRIDE; |
| + virtual void OnDirectoryFound(const FilePath&, |
| + gdata::GDataDirectory* dir) OVERRIDE; |
| + virtual FindFileTraversalCommand OnEnterDirectory( |
| + const FilePath&, |
| + gdata::GDataDirectory*) OVERRIDE; |
| + virtual void OnError(base::PlatformFileError error) OVERRIDE; |
| + |
| + GURL thumbnail_url_; |
| + GURL edit_url_; |
| + int cache_state_; |
| + base::PlatformFileError error_; |
| +}; |
| + |
| +// FilePropertiesDelegate class implementation. |
| + |
| +FilePropertiesDelegate::FilePropertiesDelegate() |
| + : cache_state_(0), error_(base::PLATFORM_FILE_OK) { |
| +} |
| + |
| +FilePropertiesDelegate::~FilePropertiesDelegate() { } |
| + |
| +void FilePropertiesDelegate::CopyProperties( |
| + base::DictionaryValue* property_dict) { |
| + DCHECK(property_dict); |
| + DCHECK(!property_dict->HasKey("thumbnailUrl")); |
| + DCHECK(!property_dict->HasKey("editUrl")); |
| + DCHECK(!property_dict->HasKey("isPinned")); |
| + DCHECK(!property_dict->HasKey("isPresent")); |
| + DCHECK(!property_dict->HasKey("isDirty")); |
| + DCHECK(!property_dict->HasKey("errorCode")); |
| + |
| + if (error_ != base::PLATFORM_FILE_OK) { |
| + property_dict->SetInteger("errorCode", error_); |
| + return; |
| + } |
| + |
| + property_dict->SetString("thumbnailUrl", thumbnail_url_.spec()); |
| + property_dict->SetString("editUrl", edit_url_.spec()); |
|
zel
2012/03/01 22:16:12
let's check if we even have it - only hosted doc i
|
| + |
| + base::FundamentalValue* pinned = |
| + new base::FundamentalValue(static_cast<bool>(cache_state_ & |
| + gdata::GDataFile::CACHE_STATE_PINNED)); |
| + property_dict->Set("isPinned", pinned); |
| + |
| + base::FundamentalValue* present = |
| + new base::FundamentalValue(static_cast<bool>(cache_state_ & |
| + gdata::GDataFile::CACHE_STATE_PRESENT)); |
| + property_dict->Set("isPresent", present); |
| + |
| + base::FundamentalValue* dirty = |
| + new base::FundamentalValue(static_cast<bool>(cache_state_ & |
| + gdata::GDataFile::CACHE_STATE_DIRTY)); |
| + property_dict->Set("isDirty", dirty); |
| +} |
| + |
| +void FilePropertiesDelegate::OnFileFound(gdata::GDataFile* file) { |
| + DCHECK(!file->file_info().is_directory); |
| + thumbnail_url_ = file->thumbnail_url(); |
| + edit_url_ = file->edit_url(); |
| + cache_state_ = file->cache_state(); |
| +} |
| + |
| +void FilePropertiesDelegate::OnDirectoryFound(const FilePath&, |
| + gdata::GDataDirectory* dir) { |
| + DCHECK(dir->file_info().is_directory); |
| + // We don't set anything here because we don't have any properties for |
| + // directories yet. |
| +} |
| + |
| +gdata::FindFileDelegate::FindFileTraversalCommand |
| +FilePropertiesDelegate::OnEnterDirectory(const FilePath&, |
| + gdata::GDataDirectory*) { |
| + // Keep traversing while doing read only lookups. |
| + return FIND_FILE_CONTINUES; |
| +} |
| + |
| +void FilePropertiesDelegate::OnError(base::PlatformFileError error) { |
| + error_ = error; |
| +} |
| + |
| +FilePath GetVirtualPathFromURL(const GURL& file_url) { |
| + FilePath virtual_path; |
| + fileapi::FileSystemType type = fileapi::kFileSystemTypeUnknown; |
| + GURL file_origin_url; |
| + if (!CrackFileSystemURL(file_url, &file_origin_url, &type, &virtual_path) || |
| + type != fileapi::kFileSystemTypeExternal) { |
| + NOTREACHED(); |
| + return FilePath(); |
| + } |
| + return virtual_path; |
| +} |
| + |
| } // namespace |
| class RequestLocalFileSystemFunction::LocalFileSystemCallbackDispatcher { |
| @@ -1792,3 +1898,47 @@ bool FileDialogStringsFunction::RunImpl() { |
| return true; |
| } |
| + |
| +GetGDataFilePropertiesFunction::GetGDataFilePropertiesFunction() { |
| +} |
| + |
| +GetGDataFilePropertiesFunction::~GetGDataFilePropertiesFunction() { |
| +} |
| + |
| +bool GetGDataFilePropertiesFunction::RunImpl() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (args_->GetSize() != 1) |
| + return false; |
| + |
| + ListValue* path_list = NULL; |
| + args_->GetList(0, &path_list); |
| + DCHECK(path_list); |
| + |
| + std::string file_url; |
| + size_t len = path_list->GetSize(); |
| + FilePathList files; |
| + files.reserve(len); |
| + for (size_t i = 0; i < len; ++i) { |
| + path_list->GetString(i, &file_url); |
| + files.push_back(GetVirtualPathFromURL(GURL(file_url))); |
| + } |
| + |
| + base::ListValue* file_info = new base::ListValue; |
| + result_.reset(file_info); |
| + |
| + gdata::GDataFileSystem* file_system = |
| + gdata::GDataFileSystemFactory::GetForProfile(profile_); |
| + DCHECK(file_system); |
| + |
| + for (FilePathList::const_iterator iter = files.begin(); |
| + iter != files.end(); ++iter) { |
| + scoped_refptr<FilePropertiesDelegate> property_delegate( |
| + new FilePropertiesDelegate()); |
| + file_system->FindFileByPath(*iter, property_delegate); |
| + base::DictionaryValue* property_dict = new base::DictionaryValue; |
| + property_delegate->CopyProperties(property_dict); |
| + file_info->Append(property_dict); |
| + } |
| + |
| + return true; |
| +} |