| Index: chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
|
| diff --git a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
|
| index 239c117e92543a9b612728cd7585ba8addc95124..8579e6f83904e17bc98b8c0683e030eb634e0cd5 100644
|
| --- a/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
|
| +++ b/chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.cc
|
| @@ -9,7 +9,6 @@
|
| #include "base/stringprintf.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/media_galleries/fileapi/filtering_file_enumerator.h"
|
| #include "chrome/browser/media_galleries/fileapi/media_file_system_mount_point_provider.h"
|
| #include "chrome/browser/media_galleries/fileapi/picasa/picasa_album_table_reader.h"
|
| #include "chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider.h"
|
| @@ -26,97 +25,18 @@ namespace picasa {
|
|
|
| namespace {
|
|
|
| -class DirectorySkippingFileEnumerator
|
| - : public fileapi::FileSystemFileUtil::AbstractFileEnumerator {
|
| - public:
|
| - DirectorySkippingFileEnumerator(
|
| - scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator>
|
| - base_enumerator)
|
| - : base_enumerator_(base_enumerator.Pass()) {
|
| - }
|
| - virtual ~DirectorySkippingFileEnumerator() {}
|
| -
|
| - virtual base::FilePath Next() OVERRIDE {
|
| - while (true) {
|
| - base::FilePath next = base_enumerator_->Next();
|
| - if (next.empty() || !base_enumerator_->IsDirectory())
|
| - return next;
|
| - }
|
| - }
|
| -
|
| - virtual int64 Size() OVERRIDE {
|
| - return base_enumerator_->Size();
|
| - }
|
| -
|
| - virtual base::Time LastModifiedTime() OVERRIDE {
|
| - return base_enumerator_->LastModifiedTime();
|
| - }
|
| -
|
| - virtual bool IsDirectory() OVERRIDE {
|
| - DCHECK(!base_enumerator_->IsDirectory());
|
| - return base_enumerator_->IsDirectory();
|
| - }
|
| -
|
| - private:
|
| - // The file enumerator to be wrapped.
|
| - scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator>
|
| - base_enumerator_;
|
| -};
|
| -
|
| -struct VirtualFile {
|
| - VirtualFile(const base::FilePath& path, int64 size,
|
| - const base::Time& last_modified_time, bool is_directory)
|
| - : path(path),
|
| - size(size),
|
| - last_modified_time(last_modified_time),
|
| - is_directory(is_directory) {}
|
| -
|
| - base::FilePath path;
|
| - int64 size;
|
| - base::Time last_modified_time;
|
| - bool is_directory;
|
| -};
|
| -
|
| -class VirtualFileEnumerator
|
| - : public fileapi::FileSystemFileUtil::AbstractFileEnumerator {
|
| - public:
|
| - explicit VirtualFileEnumerator(const std::vector<VirtualFile>& files)
|
| - : files_(files), next_called_(false), index_(0) {}
|
| -
|
| - virtual base::FilePath Next() OVERRIDE {
|
| - if (next_called_ && index_ < files_.size())
|
| - ++index_;
|
| -
|
| - next_called_ = true;
|
| -
|
| - if (index_ >= files_.size())
|
| - return FilePath();
|
| - return files_[index_].path;
|
| - }
|
| -
|
| - virtual int64 Size() OVERRIDE {
|
| - if (index_ >= files_.size())
|
| - return 0;
|
| - return files_[index_].size;
|
| - }
|
| -
|
| - virtual base::Time LastModifiedTime() OVERRIDE {
|
| - if (index_ >= files_.size())
|
| - return base::Time();
|
| - return files_[index_].last_modified_time;
|
| - }
|
| -
|
| - virtual bool IsDirectory() OVERRIDE {
|
| - if (index_ >= files_.size())
|
| - return false;
|
| - return files_[index_].is_directory;
|
| - }
|
| -
|
| - private:
|
| - std::vector<VirtualFile> files_;
|
| - bool next_called_;
|
| - size_t index_;
|
| -};
|
| +fileapi::DirectoryEntry MakeDirectoryEntry(
|
| + const base::FilePath& path,
|
| + int64 size,
|
| + const base::Time& last_modified_time,
|
| + bool is_directory) {
|
| + fileapi::DirectoryEntry entry;
|
| + entry.name = path.BaseName().value();
|
| + entry.is_directory = is_directory;
|
| + entry.size = size;
|
| + entry.last_modified_time = last_modified_time;
|
| + return entry;
|
| +}
|
|
|
| // |error| is only set when the method fails and the return is NULL.
|
| base::PlatformFileError FindAlbumInfo(const std::string& key,
|
| @@ -173,7 +93,7 @@ PicasaFileUtil::PicasaFileUtil() {}
|
|
|
| PicasaFileUtil::~PicasaFileUtil() {}
|
|
|
| -base::PlatformFileError PicasaFileUtil::GetFileInfo(
|
| +base::PlatformFileError PicasaFileUtil::GetFileInfoSync(
|
| FileSystemOperationContext* context, const FileSystemURL& url,
|
| base::PlatformFileInfo* file_info, base::FilePath* platform_path) {
|
| DCHECK(context);
|
| @@ -210,15 +130,15 @@ base::PlatformFileError PicasaFileUtil::GetFileInfo(
|
| }
|
|
|
| if (path_components[0] == kPicasaDirFolders) {
|
| - return NativeMediaFileUtil::GetFileInfo(context, url, file_info,
|
| - platform_path);
|
| + return NativeMediaFileUtil::GetFileInfoSync(context, url, file_info,
|
| + platform_path);
|
| }
|
| break;
|
| case 3:
|
| // NativeMediaFileUtil::GetInfo calls into virtual function
|
| // PicasaFileUtil::GetLocalFilePath, and that will handle both
|
| // album contents and folder contents.
|
| - base::PlatformFileError result = NativeMediaFileUtil::GetFileInfo(
|
| + base::PlatformFileError result = NativeMediaFileUtil::GetFileInfoSync(
|
| context, url, file_info, platform_path);
|
|
|
| DCHECK(path_components[0] == kPicasaDirAlbums ||
|
| @@ -231,33 +151,48 @@ base::PlatformFileError PicasaFileUtil::GetFileInfo(
|
| return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
| }
|
|
|
| -scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator>
|
| -PicasaFileUtil::CreateFileEnumerator(FileSystemOperationContext* context,
|
| - const FileSystemURL& url) {
|
| +base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
|
| + fileapi::FileSystemOperationContext* context,
|
| + const fileapi::FileSystemURL& url,
|
| + EntryList* file_list) {
|
| DCHECK(context);
|
| + DCHECK(file_list);
|
| + DCHECK(file_list->empty());
|
| +
|
| + base::PlatformFileInfo file_info;
|
| + base::FilePath platform_directory_path;
|
| + base::PlatformFileError error = GetFileInfoSync(
|
| + context, url, &file_info, &platform_directory_path);
|
| +
|
| + if (error == base::PLATFORM_FILE_OK && !file_info.is_directory)
|
| + return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
|
| +
|
| + if (error != base::PLATFORM_FILE_OK)
|
| + return error;
|
| +
|
| std::vector<std::string> path_components = GetComponents(url);
|
|
|
| - std::vector<VirtualFile> files;
|
| FilePath folders_path = base::FilePath().AppendASCII(kPicasaDirFolders);
|
|
|
| switch (path_components.size()) {
|
| case 0: {
|
| // Root directory.
|
| FilePath albums_path = base::FilePath().AppendASCII(kPicasaDirAlbums);
|
| - files.push_back(VirtualFile(albums_path, 0, base::Time(), true));
|
| - files.push_back(VirtualFile(folders_path, 0, base::Time(), true));
|
| + file_list->push_back(
|
| + MakeDirectoryEntry(albums_path, 0, base::Time(), true));
|
| + file_list->push_back(
|
| + MakeDirectoryEntry(folders_path, 0, base::Time(), true));
|
| break;
|
| }
|
| case 1:
|
| if (path_components[0] == kPicasaDirAlbums) {
|
| scoped_ptr<AlbumMap> albums = DataProvider()->GetAlbums();
|
| if (!albums)
|
| - return scoped_ptr<AbstractFileEnumerator>(new EmptyFileEnumerator());
|
| + return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
|
|
| - // TODO(tommycli): Use AlbumMap enumerator to avoid copies.
|
| for (AlbumMap::const_iterator it = albums->begin();
|
| it != albums->end(); ++it) {
|
| - files.push_back(VirtualFile(
|
| + file_list->push_back(MakeDirectoryEntry(
|
| folders_path.Append(FilePath::FromUTF8Unsafe(it->first)),
|
| 0,
|
| it->second.timestamp,
|
| @@ -266,12 +201,11 @@ PicasaFileUtil::CreateFileEnumerator(FileSystemOperationContext* context,
|
| } else if (path_components[0] == kPicasaDirFolders) {
|
| scoped_ptr<AlbumMap> folders = DataProvider()->GetFolders();
|
| if (!folders)
|
| - return scoped_ptr<AbstractFileEnumerator>(new EmptyFileEnumerator());
|
| + return base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
|
|
| - // TODO(tommycli): Use AlbumMap enumerator to avoid copies.
|
| for (AlbumMap::const_iterator it = folders->begin();
|
| it != folders->end(); ++it) {
|
| - files.push_back(VirtualFile(
|
| + file_list->push_back(MakeDirectoryEntry(
|
| folders_path.Append(FilePath::FromUTF8Unsafe(it->first)),
|
| 0,
|
| it->second.timestamp,
|
| @@ -284,14 +218,24 @@ PicasaFileUtil::CreateFileEnumerator(FileSystemOperationContext* context,
|
| // TODO(tommycli): Implement album contents.
|
| }
|
|
|
| - if (path_components[0] == kPicasaDirFolders)
|
| - return scoped_ptr<AbstractFileEnumerator>(
|
| - new DirectorySkippingFileEnumerator(
|
| - NativeMediaFileUtil::CreateFileEnumerator(context, url)));
|
| + if (path_components[0] == kPicasaDirFolders) {
|
| + EntryList super_list;
|
| + base::PlatformFileError error =
|
| + NativeMediaFileUtil::ReadDirectorySync(context, url, &super_list);
|
| + if (error != base::PLATFORM_FILE_OK)
|
| + return error;
|
| +
|
| + for (EntryList::const_iterator it = super_list.begin();
|
| + it != super_list.end(); ++it) {
|
| + if (!it->is_directory)
|
| + file_list->push_back(*it);
|
| + }
|
| + }
|
| +
|
| break;
|
| }
|
|
|
| - return scoped_ptr<AbstractFileEnumerator>(new VirtualFileEnumerator(files));
|
| + return base::PLATFORM_FILE_OK;
|
| }
|
|
|
| base::PlatformFileError PicasaFileUtil::GetLocalFilePath(
|
|
|