OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/drive/change_list_loader.h" | 5 #include "chrome/browser/chromeos/drive/change_list_loader.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "chrome/browser/chromeos/drive/change_list_loader_observer.h" | 13 #include "chrome/browser/chromeos/drive/change_list_loader_observer.h" |
14 #include "chrome/browser/chromeos/drive/change_list_processor.h" | 14 #include "chrome/browser/chromeos/drive/change_list_processor.h" |
15 #include "chrome/browser/chromeos/drive/file_system_util.h" | 15 #include "chrome/browser/chromeos/drive/file_system_util.h" |
16 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 16 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
17 #include "chrome/browser/chromeos/drive/logging.h" | 17 #include "chrome/browser/chromeos/drive/logging.h" |
18 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 18 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
19 #include "chrome/browser/drive/drive_api_util.h" | 19 #include "chrome/browser/drive/drive_api_util.h" |
| 20 #include "chrome/browser/drive/drive_service_interface.h" |
20 #include "chrome/browser/google_apis/drive_api_parser.h" | 21 #include "chrome/browser/google_apis/drive_api_parser.h" |
21 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
22 #include "url/gurl.h" | 23 #include "url/gurl.h" |
23 | 24 |
24 using content::BrowserThread; | 25 using content::BrowserThread; |
25 | 26 |
26 namespace drive { | 27 namespace drive { |
27 namespace internal { | 28 namespace internal { |
28 | 29 |
29 typedef base::Callback<void(FileError, ScopedVector<ChangeList>)> | 30 typedef base::Callback<void(FileError, ScopedVector<ChangeList>)> |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 int64 start_change_id_; | 172 int64 start_change_id_; |
172 ScopedVector<ChangeList> change_lists_; | 173 ScopedVector<ChangeList> change_lists_; |
173 base::WeakPtrFactory<DeltaFeedFetcher> weak_ptr_factory_; | 174 base::WeakPtrFactory<DeltaFeedFetcher> weak_ptr_factory_; |
174 DISALLOW_COPY_AND_ASSIGN(DeltaFeedFetcher); | 175 DISALLOW_COPY_AND_ASSIGN(DeltaFeedFetcher); |
175 }; | 176 }; |
176 | 177 |
177 // Fetches the resource entries in the directory with |directory_resource_id|. | 178 // Fetches the resource entries in the directory with |directory_resource_id|. |
178 class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { | 179 class FastFetchFeedFetcher : public ChangeListLoader::FeedFetcher { |
179 public: | 180 public: |
180 FastFetchFeedFetcher(JobScheduler* scheduler, | 181 FastFetchFeedFetcher(JobScheduler* scheduler, |
| 182 DriveServiceInterface* drive_service, |
181 const std::string& directory_resource_id, | 183 const std::string& directory_resource_id, |
182 const std::string& root_folder_id) | 184 const std::string& root_folder_id) |
183 : scheduler_(scheduler), | 185 : scheduler_(scheduler), |
| 186 drive_service_(drive_service), |
184 directory_resource_id_(directory_resource_id), | 187 directory_resource_id_(directory_resource_id), |
185 root_folder_id_(root_folder_id), | 188 root_folder_id_(root_folder_id), |
186 weak_ptr_factory_(this) { | 189 weak_ptr_factory_(this) { |
187 } | 190 } |
188 | 191 |
189 virtual ~FastFetchFeedFetcher() { | 192 virtual ~FastFetchFeedFetcher() { |
190 } | 193 } |
191 | 194 |
192 virtual void Run(const FeedFetcherCallback& callback) OVERRIDE { | 195 virtual void Run(const FeedFetcherCallback& callback) OVERRIDE { |
193 if (util::IsDriveV2ApiEnabled() && root_folder_id_.empty()) { | 196 if (util::IsDriveV2ApiEnabled() && root_folder_id_.empty()) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 weak_ptr_factory_.GetWeakPtr(), callback)); | 275 weak_ptr_factory_.GetWeakPtr(), callback)); |
273 return; | 276 return; |
274 } | 277 } |
275 | 278 |
276 // Note: The fetcher is managed by ChangeListLoader, and the instance | 279 // Note: The fetcher is managed by ChangeListLoader, and the instance |
277 // will be deleted in the callback. Do not touch the fields after this | 280 // will be deleted in the callback. Do not touch the fields after this |
278 // invocation. | 281 // invocation. |
279 callback.Run(FILE_ERROR_OK, change_lists_.Pass()); | 282 callback.Run(FILE_ERROR_OK, change_lists_.Pass()); |
280 } | 283 } |
281 | 284 |
| 285 // Fixes resource IDs in |change_list| into the format that |drive_service_| |
| 286 // can understand. Note that |change_list| contains IDs in GData WAPI format |
| 287 // since currently we always use WAPI for fast fetch, regardless of the flag. |
282 void FixResourceIdInChangeList(ChangeList* change_list) { | 288 void FixResourceIdInChangeList(ChangeList* change_list) { |
283 std::vector<ResourceEntry>* entries = change_list->mutable_entries(); | 289 std::vector<ResourceEntry>* entries = change_list->mutable_entries(); |
284 for (size_t i = 0; i < entries->size(); ++i) { | 290 for (size_t i = 0; i < entries->size(); ++i) { |
285 ResourceEntry* entry = &(*entries)[i]; | 291 ResourceEntry* entry = &(*entries)[i]; |
286 if (entry->has_resource_id()) { | 292 if (entry->has_resource_id()) |
287 entry->set_resource_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( | 293 entry->set_resource_id(FixResourceId(entry->resource_id())); |
288 entry->resource_id())); | |
289 } | |
290 | 294 |
291 // Currently parent local id is the parent's resource id. | 295 // Currently parent local id is the parent's resource id. |
292 // It will be replaced by actual local id. (crbug.com/260514). | 296 // It will be replaced by actual local id. (crbug.com/260514). |
293 if (entry->has_parent_local_id()) { | 297 if (entry->has_parent_local_id()) |
294 entry->set_parent_local_id(UpgradeResourceIdFromGDataWapiToDriveApiV2( | 298 entry->set_parent_local_id(FixResourceId(entry->parent_local_id())); |
295 entry->parent_local_id())); | |
296 } | |
297 } | 299 } |
298 } | 300 } |
299 | 301 |
300 std::string UpgradeResourceIdFromGDataWapiToDriveApiV2( | 302 std::string FixResourceId(const std::string& resource_id) { |
301 const std::string& resource_id) { | |
302 if (resource_id == util::kWapiRootDirectoryResourceId) | 303 if (resource_id == util::kWapiRootDirectoryResourceId) |
303 return root_folder_id_; | 304 return root_folder_id_; |
304 return drive::util::CanonicalizeResourceId(resource_id); | 305 return drive_service_->CanonicalizeResourceId(resource_id); |
305 } | 306 } |
306 | 307 |
307 JobScheduler* scheduler_; | 308 JobScheduler* scheduler_; |
| 309 DriveServiceInterface* drive_service_; |
308 std::string directory_resource_id_; | 310 std::string directory_resource_id_; |
309 std::string root_folder_id_; | 311 std::string root_folder_id_; |
310 ScopedVector<ChangeList> change_lists_; | 312 ScopedVector<ChangeList> change_lists_; |
311 base::WeakPtrFactory<FastFetchFeedFetcher> weak_ptr_factory_; | 313 base::WeakPtrFactory<FastFetchFeedFetcher> weak_ptr_factory_; |
312 DISALLOW_COPY_AND_ASSIGN(FastFetchFeedFetcher); | 314 DISALLOW_COPY_AND_ASSIGN(FastFetchFeedFetcher); |
313 }; | 315 }; |
314 | 316 |
315 } // namespace | 317 } // namespace |
316 | 318 |
317 ChangeListLoader::ChangeListLoader( | 319 ChangeListLoader::ChangeListLoader( |
318 base::SequencedTaskRunner* blocking_task_runner, | 320 base::SequencedTaskRunner* blocking_task_runner, |
319 ResourceMetadata* resource_metadata, | 321 ResourceMetadata* resource_metadata, |
320 JobScheduler* scheduler) | 322 JobScheduler* scheduler, |
| 323 DriveServiceInterface* drive_service) |
321 : blocking_task_runner_(blocking_task_runner), | 324 : blocking_task_runner_(blocking_task_runner), |
322 resource_metadata_(resource_metadata), | 325 resource_metadata_(resource_metadata), |
323 scheduler_(scheduler), | 326 scheduler_(scheduler), |
| 327 drive_service_(drive_service), |
324 last_known_remote_changestamp_(0), | 328 last_known_remote_changestamp_(0), |
325 loaded_(false), | 329 loaded_(false), |
326 weak_ptr_factory_(this) { | 330 weak_ptr_factory_(this) { |
327 } | 331 } |
328 | 332 |
329 ChangeListLoader::~ChangeListLoader() { | 333 ChangeListLoader::~ChangeListLoader() { |
330 STLDeleteElements(&fast_fetch_feed_fetcher_set_); | 334 STLDeleteElements(&fast_fetch_feed_fetcher_set_); |
331 } | 335 } |
332 | 336 |
333 bool ChangeListLoader::IsRefreshing() const { | 337 bool ChangeListLoader::IsRefreshing() const { |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 &ChangeListLoader | 766 &ChangeListLoader |
763 ::DoLoadGrandRootDirectoryFromServerAfterGetResourceEntryByPath, | 767 ::DoLoadGrandRootDirectoryFromServerAfterGetResourceEntryByPath, |
764 weak_ptr_factory_.GetWeakPtr(), | 768 weak_ptr_factory_.GetWeakPtr(), |
765 directory_fetch_info, | 769 directory_fetch_info, |
766 callback)); | 770 callback)); |
767 return; | 771 return; |
768 } | 772 } |
769 | 773 |
770 FastFetchFeedFetcher* fetcher = new FastFetchFeedFetcher( | 774 FastFetchFeedFetcher* fetcher = new FastFetchFeedFetcher( |
771 scheduler_, | 775 scheduler_, |
| 776 drive_service_, |
772 directory_fetch_info.resource_id(), | 777 directory_fetch_info.resource_id(), |
773 root_folder_id_); | 778 root_folder_id_); |
774 fast_fetch_feed_fetcher_set_.insert(fetcher); | 779 fast_fetch_feed_fetcher_set_.insert(fetcher); |
775 fetcher->Run( | 780 fetcher->Run( |
776 base::Bind(&ChangeListLoader::DoLoadDirectoryFromServerAfterLoad, | 781 base::Bind(&ChangeListLoader::DoLoadDirectoryFromServerAfterLoad, |
777 weak_ptr_factory_.GetWeakPtr(), | 782 weak_ptr_factory_.GetWeakPtr(), |
778 directory_fetch_info, | 783 directory_fetch_info, |
779 callback, | 784 callback, |
780 fetcher)); | 785 fetcher)); |
781 } | 786 } |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 FOR_EACH_OBSERVER(ChangeListLoaderObserver, observers_, | 973 FOR_EACH_OBSERVER(ChangeListLoaderObserver, observers_, |
969 OnDirectoryChanged(*dir_iter)); | 974 OnDirectoryChanged(*dir_iter)); |
970 } | 975 } |
971 } | 976 } |
972 | 977 |
973 callback.Run(); | 978 callback.Run(); |
974 } | 979 } |
975 | 980 |
976 } // namespace internal | 981 } // namespace internal |
977 } // namespace drive | 982 } // namespace drive |
OLD | NEW |