| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h" | 5 #include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 } | 34 } |
| 35 ready_callbacks->clear(); | 35 ready_callbacks->clear(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 } // namespace | 38 } // namespace |
| 39 | 39 |
| 40 PicasaDataProvider::PicasaDataProvider(const base::FilePath& database_path) | 40 PicasaDataProvider::PicasaDataProvider(const base::FilePath& database_path) |
| 41 : database_path_(database_path), | 41 : database_path_(database_path), |
| 42 state_(STALE_DATA_STATE), | 42 state_(STALE_DATA_STATE), |
| 43 weak_factory_(this) { | 43 weak_factory_(this) { |
| 44 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 44 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 45 | 45 |
| 46 StartFilePathWatchOnMediaTaskRunner( | 46 StartFilePathWatchOnMediaTaskRunner( |
| 47 database_path_.DirName().AppendASCII(kPicasaTempDirName), | 47 database_path_.DirName().AppendASCII(kPicasaTempDirName), |
| 48 base::Bind(&PicasaDataProvider::OnTempDirWatchStarted, | 48 base::Bind(&PicasaDataProvider::OnTempDirWatchStarted, |
| 49 weak_factory_.GetWeakPtr()), | 49 weak_factory_.GetWeakPtr()), |
| 50 base::Bind(&PicasaDataProvider::OnTempDirChanged, | 50 base::Bind(&PicasaDataProvider::OnTempDirChanged, |
| 51 weak_factory_.GetWeakPtr())); | 51 weak_factory_.GetWeakPtr())); |
| 52 } | 52 } |
| 53 | 53 |
| 54 PicasaDataProvider::~PicasaDataProvider() {} | 54 PicasaDataProvider::~PicasaDataProvider() {} |
| 55 | 55 |
| 56 void PicasaDataProvider::RefreshData(DataType needed_data, | 56 void PicasaDataProvider::RefreshData(DataType needed_data, |
| 57 const ReadyCallback& ready_callback) { | 57 const ReadyCallback& ready_callback) { |
| 58 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 58 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 59 // TODO(tommycli): Need to watch the database_path_ folder and handle | 59 // TODO(tommycli): Need to watch the database_path_ folder and handle |
| 60 // rereading the data when it changes. | 60 // rereading the data when it changes. |
| 61 | 61 |
| 62 if (state_ == INVALID_DATA_STATE) { | 62 if (state_ == INVALID_DATA_STATE) { |
| 63 ready_callback.Run(false /* success */); | 63 ready_callback.Run(false /* success */); |
| 64 return; | 64 return; |
| 65 } | 65 } |
| 66 | 66 |
| 67 if (needed_data == LIST_OF_ALBUMS_AND_FOLDERS_DATA) { | 67 if (needed_data == LIST_OF_ALBUMS_AND_FOLDERS_DATA) { |
| 68 if (state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || | 68 if (state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || |
| 69 state_ == ALBUMS_IMAGES_FRESH_STATE) { | 69 state_ == ALBUMS_IMAGES_FRESH_STATE) { |
| 70 ready_callback.Run(true /* success */); | 70 ready_callback.Run(true /* success */); |
| 71 return; | 71 return; |
| 72 } | 72 } |
| 73 album_list_ready_callbacks_.push_back(ready_callback); | 73 album_list_ready_callbacks_.push_back(ready_callback); |
| 74 } else { | 74 } else { |
| 75 if (state_ == ALBUMS_IMAGES_FRESH_STATE) { | 75 if (state_ == ALBUMS_IMAGES_FRESH_STATE) { |
| 76 ready_callback.Run(true /* success */); | 76 ready_callback.Run(true /* success */); |
| 77 return; | 77 return; |
| 78 } | 78 } |
| 79 albums_index_ready_callbacks_.push_back(ready_callback); | 79 albums_index_ready_callbacks_.push_back(ready_callback); |
| 80 } | 80 } |
| 81 DoRefreshIfNecessary(); | 81 DoRefreshIfNecessary(); |
| 82 } | 82 } |
| 83 | 83 |
| 84 std::unique_ptr<AlbumMap> PicasaDataProvider::GetFolders() { | 84 std::unique_ptr<AlbumMap> PicasaDataProvider::GetFolders() { |
| 85 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 85 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 86 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || | 86 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || |
| 87 state_ == ALBUMS_IMAGES_FRESH_STATE); | 87 state_ == ALBUMS_IMAGES_FRESH_STATE); |
| 88 return base::WrapUnique(new AlbumMap(folder_map_)); | 88 return base::WrapUnique(new AlbumMap(folder_map_)); |
| 89 } | 89 } |
| 90 | 90 |
| 91 std::unique_ptr<AlbumMap> PicasaDataProvider::GetAlbums() { | 91 std::unique_ptr<AlbumMap> PicasaDataProvider::GetAlbums() { |
| 92 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 92 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 93 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || | 93 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE || |
| 94 state_ == ALBUMS_IMAGES_FRESH_STATE); | 94 state_ == ALBUMS_IMAGES_FRESH_STATE); |
| 95 return base::WrapUnique(new AlbumMap(album_map_)); | 95 return base::WrapUnique(new AlbumMap(album_map_)); |
| 96 } | 96 } |
| 97 | 97 |
| 98 std::unique_ptr<AlbumImages> PicasaDataProvider::FindAlbumImages( | 98 std::unique_ptr<AlbumImages> PicasaDataProvider::FindAlbumImages( |
| 99 const std::string& key, | 99 const std::string& key, |
| 100 base::File::Error* error) { | 100 base::File::Error* error) { |
| 101 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 101 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 102 DCHECK(state_ == ALBUMS_IMAGES_FRESH_STATE); | 102 DCHECK(state_ == ALBUMS_IMAGES_FRESH_STATE); |
| 103 DCHECK(error); | 103 DCHECK(error); |
| 104 | 104 |
| 105 AlbumImagesMap::const_iterator it = albums_images_.find(key); | 105 AlbumImagesMap::const_iterator it = albums_images_.find(key); |
| 106 | 106 |
| 107 if (it == albums_images_.end()) { | 107 if (it == albums_images_.end()) { |
| 108 *error = base::File::FILE_ERROR_NOT_FOUND; | 108 *error = base::File::FILE_ERROR_NOT_FOUND; |
| 109 return std::unique_ptr<AlbumImages>(); | 109 return std::unique_ptr<AlbumImages>(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 *error = base::File::FILE_OK; | 112 *error = base::File::FILE_OK; |
| 113 return base::WrapUnique(new AlbumImages(it->second)); | 113 return base::WrapUnique(new AlbumImages(it->second)); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void PicasaDataProvider::InvalidateData() { | 116 void PicasaDataProvider::InvalidateData() { |
| 117 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 117 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 118 | 118 |
| 119 // Set data state to stale and ignore responses from any in-flight processes. | 119 // Set data state to stale and ignore responses from any in-flight processes. |
| 120 // TODO(tommycli): Implement and call Cancel function for these | 120 // TODO(tommycli): Implement and call Cancel function for these |
| 121 // UtilityProcessHostClients to actually kill the in-flight processes. | 121 // UtilityProcessHostClients to actually kill the in-flight processes. |
| 122 state_ = STALE_DATA_STATE; | 122 state_ = STALE_DATA_STATE; |
| 123 album_table_reader_ = NULL; | 123 album_table_reader_ = NULL; |
| 124 albums_indexer_ = NULL; | 124 albums_indexer_ = NULL; |
| 125 | 125 |
| 126 DoRefreshIfNecessary(); | 126 DoRefreshIfNecessary(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 void PicasaDataProvider::OnTempDirWatchStarted( | 129 void PicasaDataProvider::OnTempDirWatchStarted( |
| 130 std::unique_ptr<base::FilePathWatcher> temp_dir_watcher) { | 130 std::unique_ptr<base::FilePathWatcher> temp_dir_watcher) { |
| 131 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 131 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 132 temp_dir_watcher_.reset(temp_dir_watcher.release()); | 132 temp_dir_watcher_.reset(temp_dir_watcher.release()); |
| 133 } | 133 } |
| 134 | 134 |
| 135 void PicasaDataProvider::OnTempDirChanged(const base::FilePath& temp_dir_path, | 135 void PicasaDataProvider::OnTempDirChanged(const base::FilePath& temp_dir_path, |
| 136 bool error) { | 136 bool error) { |
| 137 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 137 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 138 if (base::IsDirectoryEmpty(temp_dir_path)) | 138 if (base::IsDirectoryEmpty(temp_dir_path)) |
| 139 InvalidateData(); | 139 InvalidateData(); |
| 140 } | 140 } |
| 141 | 141 |
| 142 void PicasaDataProvider::DoRefreshIfNecessary() { | 142 void PicasaDataProvider::DoRefreshIfNecessary() { |
| 143 DCHECK(state_ != INVALID_DATA_STATE); | 143 DCHECK(state_ != INVALID_DATA_STATE); |
| 144 DCHECK(state_ != ALBUMS_IMAGES_FRESH_STATE); | 144 DCHECK(state_ != ALBUMS_IMAGES_FRESH_STATE); |
| 145 DCHECK(!(album_table_reader_.get() && albums_indexer_.get())); | 145 DCHECK(!(album_table_reader_.get() && albums_indexer_.get())); |
| 146 | 146 |
| 147 if (album_list_ready_callbacks_.empty() && | 147 if (album_list_ready_callbacks_.empty() && |
| (...skipping 19 matching lines...) Expand all Loading... |
| 167 weak_factory_.GetWeakPtr(), | 167 weak_factory_.GetWeakPtr(), |
| 168 albums_indexer_)); | 168 albums_indexer_)); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 void PicasaDataProvider::OnAlbumTableReaderDone( | 172 void PicasaDataProvider::OnAlbumTableReaderDone( |
| 173 scoped_refptr<SafePicasaAlbumTableReader> reader, | 173 scoped_refptr<SafePicasaAlbumTableReader> reader, |
| 174 bool parse_success, | 174 bool parse_success, |
| 175 const std::vector<AlbumInfo>& albums, | 175 const std::vector<AlbumInfo>& albums, |
| 176 const std::vector<AlbumInfo>& folders) { | 176 const std::vector<AlbumInfo>& folders) { |
| 177 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 177 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 178 // If the reader has already been deemed stale, ignore the result. | 178 // If the reader has already been deemed stale, ignore the result. |
| 179 if (reader.get() != album_table_reader_.get()) | 179 if (reader.get() != album_table_reader_.get()) |
| 180 return; | 180 return; |
| 181 album_table_reader_ = NULL; | 181 album_table_reader_ = NULL; |
| 182 | 182 |
| 183 DCHECK(state_ == STALE_DATA_STATE); | 183 DCHECK(state_ == STALE_DATA_STATE); |
| 184 | 184 |
| 185 if (!parse_success) { | 185 if (!parse_success) { |
| 186 // If we didn't get the list successfully, fail all those waiting for | 186 // If we didn't get the list successfully, fail all those waiting for |
| 187 // the albums indexer also. | 187 // the albums indexer also. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 200 RunAllCallbacks(&album_list_ready_callbacks_, parse_success); | 200 RunAllCallbacks(&album_list_ready_callbacks_, parse_success); |
| 201 | 201 |
| 202 // Chain from this process onto refreshing the albums images if necessary. | 202 // Chain from this process onto refreshing the albums images if necessary. |
| 203 DoRefreshIfNecessary(); | 203 DoRefreshIfNecessary(); |
| 204 } | 204 } |
| 205 | 205 |
| 206 void PicasaDataProvider::OnAlbumsIndexerDone( | 206 void PicasaDataProvider::OnAlbumsIndexerDone( |
| 207 scoped_refptr<SafePicasaAlbumsIndexer> indexer, | 207 scoped_refptr<SafePicasaAlbumsIndexer> indexer, |
| 208 bool success, | 208 bool success, |
| 209 const picasa::AlbumImagesMap& albums_images) { | 209 const picasa::AlbumImagesMap& albums_images) { |
| 210 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); | 210 MediaFileSystemBackend::AssertCurrentlyOnMediaSequence(); |
| 211 // If the indexer has already been deemed stale, ignore the result. | 211 // If the indexer has already been deemed stale, ignore the result. |
| 212 if (indexer.get() != albums_indexer_.get()) | 212 if (indexer.get() != albums_indexer_.get()) |
| 213 return; | 213 return; |
| 214 albums_indexer_ = NULL; | 214 albums_indexer_ = NULL; |
| 215 | 215 |
| 216 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE); | 216 DCHECK(state_ == LIST_OF_ALBUMS_AND_FOLDERS_FRESH_STATE); |
| 217 | 217 |
| 218 if (success) { | 218 if (success) { |
| 219 state_ = ALBUMS_IMAGES_FRESH_STATE; | 219 state_ = ALBUMS_IMAGES_FRESH_STATE; |
| 220 | 220 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 if (total_counts[name] != 1) { | 258 if (total_counts[name] != 1) { |
| 259 name = base::StringPrintf("%s (%d)", name.c_str(), | 259 name = base::StringPrintf("%s (%d)", name.c_str(), |
| 260 ++current_counts[name]); | 260 ++current_counts[name]); |
| 261 } | 261 } |
| 262 | 262 |
| 263 result_map->insert(std::pair<std::string, AlbumInfo>(name, info_list[i])); | 263 result_map->insert(std::pair<std::string, AlbumInfo>(name, info_list[i])); |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 | 266 |
| 267 } // namespace picasa | 267 } // namespace picasa |
| OLD | NEW |