| 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 |