Chromium Code Reviews| 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) |
|
Lei Zhang
2013/06/03 10:05:46
Should check this case first.
vandebo (ex-Chrome)
2013/06/03 19:15:26
Done.
|
| + 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( |