Chromium Code Reviews| 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/gdata/gdata_wapi_feed_loader.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_wapi_feed_loader.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
| 10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
| 14 #include "base/threading/sequenced_worker_pool.h" | 14 #include "base/threading/sequenced_worker_pool.h" |
| 15 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" | 15 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" |
| 16 #include "chrome/browser/chromeos/gdata/drive_api_parser.h" | |
| 16 #include "chrome/browser/chromeos/gdata/gdata_cache.h" | 17 #include "chrome/browser/chromeos/gdata/gdata_cache.h" |
| 17 #include "chrome/browser/chromeos/gdata/gdata_documents_service.h" | 18 #include "chrome/browser/chromeos/gdata/gdata_documents_service.h" |
| 18 #include "chrome/browser/chromeos/gdata/gdata_util.h" | 19 #include "chrome/browser/chromeos/gdata/gdata_util.h" |
| 19 #include "chrome/browser/chromeos/gdata/gdata_wapi_feed_processor.h" | 20 #include "chrome/browser/chromeos/gdata/gdata_wapi_feed_processor.h" |
| 20 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
| 21 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 22 | 23 |
| 23 using content::BrowserThread; | 24 using content::BrowserThread; |
| 24 | 25 |
| 25 namespace gdata { | 26 namespace gdata { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 } | 130 } |
| 130 | 131 |
| 131 bool UseLevelDB() { | 132 bool UseLevelDB() { |
| 132 return CommandLine::ForCurrentProcess()->HasSwitch( | 133 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 133 switches::kUseLevelDBForGData); | 134 switches::kUseLevelDBForGData); |
| 134 } | 135 } |
| 135 | 136 |
| 136 } // namespace | 137 } // namespace |
| 137 | 138 |
| 138 GetDocumentsParams::GetDocumentsParams( | 139 GetDocumentsParams::GetDocumentsParams( |
| 139 int start_changestamp, | 140 int64 start_changestamp, |
| 140 int root_feed_changestamp, | 141 int64 root_feed_changestamp, |
| 141 std::vector<DocumentFeed*>* feed_list, | 142 std::vector<DocumentFeed*>* feed_list, |
| 142 bool should_fetch_multiple_feeds, | 143 bool should_fetch_multiple_feeds, |
| 143 const FilePath& search_file_path, | 144 const FilePath& search_file_path, |
| 144 const std::string& search_query, | 145 const std::string& search_query, |
| 145 const std::string& directory_resource_id, | 146 const std::string& directory_resource_id, |
| 146 const FindEntryCallback& callback, | 147 const FindEntryCallback& callback, |
| 147 GetDocumentsUiState* ui_state) | 148 GetDocumentsUiState* ui_state) |
| 148 : start_changestamp(start_changestamp), | 149 : start_changestamp(start_changestamp), |
| 149 root_feed_changestamp(root_feed_changestamp), | 150 root_feed_changestamp(root_feed_changestamp), |
| 150 feed_list(feed_list), | 151 feed_list(feed_list), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 observers_.AddObserver(observer); | 213 observers_.AddObserver(observer); |
| 213 } | 214 } |
| 214 | 215 |
| 215 void GDataWapiFeedLoader::RemoveObserver(Observer* observer) { | 216 void GDataWapiFeedLoader::RemoveObserver(Observer* observer) { |
| 216 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 217 observers_.RemoveObserver(observer); | 218 observers_.RemoveObserver(observer); |
| 218 } | 219 } |
| 219 | 220 |
| 220 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( | 221 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( |
| 221 ContentOrigin initial_origin, | 222 ContentOrigin initial_origin, |
| 222 int local_changestamp, | 223 int64 local_changestamp, |
| 223 const FilePath& search_file_path, | 224 const FilePath& search_file_path, |
| 224 const FindEntryCallback& callback) { | 225 const FindEntryCallback& callback) { |
| 225 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 226 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 226 | 227 |
| 227 DVLOG(1) << "ReloadFeedFromServerIfNeeded local_changestamp=" | 228 DVLOG(1) << "ReloadFeedFromServerIfNeeded local_changestamp=" |
| 228 << local_changestamp << ", initial_origin=" << initial_origin; | 229 << local_changestamp << ", initial_origin=" << initial_origin; |
| 229 | 230 |
| 230 // First fetch the latest changestamp to see if there were any new changes | 231 // First fetch the latest changestamp to see if there were any new changes |
| 231 // there at all. | 232 // there at all. |
| 233 if (gdata::util::IsDriveV2ApiEnabled()) { | |
|
satorux1
2012/08/08 13:18:51
I named the file "gdata_wapi_feed_loader.cc", assu
kochi
2012/08/08 16:53:27
I could have a separate file but it turned out tha
| |
| 234 documents_service_->GetAboutResource( | |
| 235 base::Bind(&GDataWapiFeedLoader::OnGetAboutResource, | |
| 236 weak_ptr_factory_.GetWeakPtr(), | |
| 237 initial_origin, | |
| 238 local_changestamp, | |
| 239 search_file_path, | |
| 240 callback)); | |
| 241 return; | |
| 242 } | |
| 243 | |
| 232 documents_service_->GetAccountMetadata( | 244 documents_service_->GetAccountMetadata( |
| 233 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, | 245 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, |
| 234 weak_ptr_factory_.GetWeakPtr(), | 246 weak_ptr_factory_.GetWeakPtr(), |
| 235 initial_origin, | 247 initial_origin, |
| 236 local_changestamp, | 248 local_changestamp, |
| 237 search_file_path, | 249 search_file_path, |
| 238 callback)); | 250 callback)); |
| 239 } | 251 } |
| 240 | 252 |
| 241 void GDataWapiFeedLoader::OnGetAccountMetadata( | 253 void GDataWapiFeedLoader::OnGetAccountMetadata( |
| 242 ContentOrigin initial_origin, | 254 ContentOrigin initial_origin, |
| 243 int local_changestamp, | 255 int64 local_changestamp, |
| 244 const FilePath& search_file_path, | 256 const FilePath& search_file_path, |
| 245 const FindEntryCallback& callback, | 257 const FindEntryCallback& callback, |
| 246 GDataErrorCode status, | 258 GDataErrorCode status, |
| 247 scoped_ptr<base::Value> feed_data) { | 259 scoped_ptr<base::Value> feed_data) { |
| 248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 249 | 261 |
| 250 GDataFileError error = util::GDataToGDataFileError(status); | 262 GDataFileError error = util::GDataToGDataFileError(status); |
| 251 if (error != GDATA_FILE_OK) { | 263 if (error != GDATA_FILE_OK) { |
| 252 // Get changes starting from the next changestamp from what we have locally. | 264 // Get changes starting from the next changestamp from what we have locally. |
| 253 LoadFromServer(initial_origin, | 265 LoadFromServer(initial_origin, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 true, /* should_fetch_multiple_feeds */ | 338 true, /* should_fetch_multiple_feeds */ |
| 327 search_file_path, | 339 search_file_path, |
| 328 std::string() /* no search query */, | 340 std::string() /* no search query */, |
| 329 GURL(), /* feed not explicitly set */ | 341 GURL(), /* feed not explicitly set */ |
| 330 std::string() /* no directory resource ID */, | 342 std::string() /* no directory resource ID */, |
| 331 callback, | 343 callback, |
| 332 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | 344 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, |
| 333 weak_ptr_factory_.GetWeakPtr())); | 345 weak_ptr_factory_.GetWeakPtr())); |
| 334 } | 346 } |
| 335 | 347 |
| 348 void GDataWapiFeedLoader::OnGetAboutResource( | |
| 349 ContentOrigin initial_origin, | |
| 350 int64 local_changestamp, | |
| 351 const FilePath& search_file_path, | |
| 352 const FindEntryCallback& callback, | |
| 353 GDataErrorCode status, | |
| 354 scoped_ptr<base::Value> feed_data) { | |
| 355 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 356 | |
| 357 GDataFileError error = util::GDataToGDataFileError(status); | |
| 358 if (error != GDATA_FILE_OK) { | |
| 359 // Get changes starting from the next changestamp from what we have locally. | |
| 360 LoadFromServer(initial_origin, | |
|
satorux1
2012/08/08 13:18:51
LoadFromServer has too many parameters. Could you
kochi
2012/08/08 16:53:27
Will work on a separate CL.
| |
| 361 local_changestamp + 1, 0, | |
| 362 true, /* should_fetch_multiple_feeds */ | |
| 363 search_file_path, | |
| 364 std::string() /* no search query */, | |
| 365 GURL(), /* feed not explicitly set */ | |
| 366 std::string() /* no directory resource ID */, | |
| 367 callback, | |
| 368 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 369 weak_ptr_factory_.GetWeakPtr())); | |
| 370 return; | |
| 371 } | |
| 372 | |
| 373 scoped_ptr<AboutResource> about_resource; | |
| 374 if (feed_data.get()) | |
| 375 about_resource = AboutResource::CreateFrom(*feed_data); | |
| 376 | |
| 377 if (!about_resource.get()) { | |
| 378 LoadFromServer(initial_origin, | |
| 379 local_changestamp + 1, 0, | |
| 380 true, /* should_fetch_multiple_feeds */ | |
| 381 search_file_path, | |
| 382 std::string() /* no search query */, | |
| 383 GURL(), /* feed not explicitly set */ | |
| 384 std::string() /* no directory resource ID */, | |
| 385 callback, | |
| 386 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 387 weak_ptr_factory_.GetWeakPtr())); | |
| 388 return; | |
| 389 } | |
| 390 | |
| 391 bool changes_detected = true; | |
| 392 int64 largest_changestamp = about_resource->largest_change_id(); | |
| 393 directory_service_->SetRootResourceId(about_resource->root_folder_id()); | |
| 394 | |
| 395 if (local_changestamp >= largest_changestamp) { | |
| 396 if (local_changestamp > largest_changestamp) { | |
| 397 LOG(WARNING) << "Cached client feed is fresher than server, client = " | |
| 398 << local_changestamp | |
| 399 << ", server = " | |
| 400 << largest_changestamp; | |
| 401 } | |
| 402 // If our cache holds the latest state from the server, change the | |
| 403 // state to FROM_SERVER. | |
| 404 directory_service_->set_origin( | |
| 405 initial_origin == FROM_CACHE ? FROM_SERVER : initial_origin); | |
| 406 changes_detected = false; | |
| 407 } | |
| 408 | |
| 409 // No changes detected, continue with search as planned. | |
| 410 if (!changes_detected) { | |
| 411 if (!callback.is_null()) { | |
| 412 directory_service_->FindEntryByPathAndRunSync(search_file_path, | |
| 413 callback); | |
| 414 } | |
| 415 return; | |
| 416 } | |
| 417 | |
| 418 // Load changes from the server. | |
| 419 LoadFromServer(initial_origin, | |
| 420 local_changestamp > 0 ? local_changestamp + 1 : 0, | |
| 421 largest_changestamp, | |
| 422 true, /* should_fetch_multiple_feeds */ | |
| 423 search_file_path, | |
| 424 std::string() /* no search query */, | |
| 425 GURL(), /* feed not explicitly set */ | |
| 426 std::string() /* no directory resource ID */, | |
| 427 callback, | |
| 428 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 429 weak_ptr_factory_.GetWeakPtr())); | |
| 430 } | |
| 431 | |
| 336 void GDataWapiFeedLoader::LoadFromServer( | 432 void GDataWapiFeedLoader::LoadFromServer( |
| 337 ContentOrigin initial_origin, | 433 ContentOrigin initial_origin, |
| 338 int start_changestamp, | 434 int64 start_changestamp, |
| 339 int root_feed_changestamp, | 435 int64 root_feed_changestamp, |
| 340 bool should_fetch_multiple_feeds, | 436 bool should_fetch_multiple_feeds, |
| 341 const FilePath& search_file_path, | 437 const FilePath& search_file_path, |
| 342 const std::string& search_query, | 438 const std::string& search_query, |
| 343 const GURL& feed_to_load, | 439 const GURL& feed_to_load, |
| 344 const std::string& directory_resource_id, | 440 const std::string& directory_resource_id, |
| 345 const FindEntryCallback& entry_found_callback, | 441 const FindEntryCallback& entry_found_callback, |
| 346 const LoadDocumentFeedCallback& feed_load_callback) { | 442 const LoadDocumentFeedCallback& feed_load_callback) { |
| 347 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 443 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 348 | 444 |
| 349 // |feed_list| will contain the list of all collected feed updates that | 445 // |feed_list| will contain the list of all collected feed updates that |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 442 callback.Run(params, GDATA_FILE_ERROR_FAILED); | 538 callback.Run(params, GDATA_FILE_ERROR_FAILED); |
| 443 } | 539 } |
| 444 | 540 |
| 445 return; | 541 return; |
| 446 } | 542 } |
| 447 const bool has_next_feed_url = current_feed->GetNextFeedURL(&next_feed_url); | 543 const bool has_next_feed_url = current_feed->GetNextFeedURL(&next_feed_url); |
| 448 | 544 |
| 449 #ifndef NDEBUG | 545 #ifndef NDEBUG |
| 450 // Save initial root feed for analysis. | 546 // Save initial root feed for analysis. |
| 451 std::string file_name = | 547 std::string file_name = |
| 452 base::StringPrintf("DEBUG_feed_%d.json", | 548 base::StringPrintf("DEBUG_feed_%ld.json", |
| 453 params->start_changestamp); | 549 params->start_changestamp); |
| 454 util::PostBlockingPoolSequencedTask( | 550 util::PostBlockingPoolSequencedTask( |
| 455 FROM_HERE, | 551 FROM_HERE, |
| 456 blocking_task_runner_, | 552 blocking_task_runner_, |
| 457 base::Bind(&SaveFeedOnBlockingPoolForDebugging, | 553 base::Bind(&SaveFeedOnBlockingPoolForDebugging, |
| 458 cache_->GetCacheDirectoryPath( | 554 cache_->GetCacheDirectoryPath( |
| 459 GDataCache::CACHE_TYPE_META).Append(file_name), | 555 GDataCache::CACHE_TYPE_META).Append(file_name), |
| 460 base::Passed(&data))); | 556 base::Passed(&data))); |
| 461 #endif | 557 #endif |
| 462 | 558 |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 util::PostBlockingPoolSequencedTask( | 775 util::PostBlockingPoolSequencedTask( |
| 680 FROM_HERE, | 776 FROM_HERE, |
| 681 blocking_task_runner_, | 777 blocking_task_runner_, |
| 682 base::Bind(&SaveProtoOnBlockingPool, path, | 778 base::Bind(&SaveProtoOnBlockingPool, path, |
| 683 base::Passed(serialized_proto.Pass()))); | 779 base::Passed(serialized_proto.Pass()))); |
| 684 } | 780 } |
| 685 } | 781 } |
| 686 | 782 |
| 687 GDataFileError GDataWapiFeedLoader::UpdateFromFeed( | 783 GDataFileError GDataWapiFeedLoader::UpdateFromFeed( |
| 688 const std::vector<DocumentFeed*>& feed_list, | 784 const std::vector<DocumentFeed*>& feed_list, |
| 689 int start_changestamp, | 785 int64 start_changestamp, |
| 690 int root_feed_changestamp) { | 786 int64 root_feed_changestamp) { |
| 691 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 787 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 692 DVLOG(1) << "Updating directory with a feed"; | 788 DVLOG(1) << "Updating directory with a feed"; |
| 693 | 789 |
| 694 std::set<FilePath> changed_dirs; | 790 std::set<FilePath> changed_dirs; |
| 695 | 791 |
| 696 GDataWapiFeedProcessor feed_processor(directory_service_); | 792 GDataWapiFeedProcessor feed_processor(directory_service_); |
| 697 const GDataFileError error = feed_processor.ApplyFeeds( | 793 const GDataFileError error = feed_processor.ApplyFeeds( |
| 698 feed_list, | 794 feed_list, |
| 699 start_changestamp, | 795 start_changestamp, |
| 700 root_feed_changestamp, | 796 root_feed_changestamp, |
| 701 &changed_dirs); | 797 &changed_dirs); |
| 702 | 798 |
| 703 // Don't send directory content change notification while performing | 799 // Don't send directory content change notification while performing |
| 704 // the initial content retrieval. | 800 // the initial content retrieval. |
| 705 const bool should_notify_directory_changed = (start_changestamp != 0); | 801 const bool should_notify_directory_changed = (start_changestamp != 0); |
| 706 if (should_notify_directory_changed) { | 802 if (should_notify_directory_changed) { |
| 707 for (std::set<FilePath>::iterator dir_iter = changed_dirs.begin(); | 803 for (std::set<FilePath>::iterator dir_iter = changed_dirs.begin(); |
| 708 dir_iter != changed_dirs.end(); ++dir_iter) { | 804 dir_iter != changed_dirs.end(); ++dir_iter) { |
| 709 FOR_EACH_OBSERVER(Observer, observers_, | 805 FOR_EACH_OBSERVER(Observer, observers_, |
| 710 OnDirectoryChanged(*dir_iter)); | 806 OnDirectoryChanged(*dir_iter)); |
| 711 } | 807 } |
| 712 } | 808 } |
| 713 | 809 |
| 714 return error; | 810 return error; |
| 715 } | 811 } |
| 716 | 812 |
| 717 } // namespace gdata | 813 } // namespace gdata |
| OLD | NEW |