| 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/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 } | 131 } |
| 132 } | 132 } |
| 133 | 133 |
| 134 bool UseLevelDB() { | 134 bool UseLevelDB() { |
| 135 return CommandLine::ForCurrentProcess()->HasSwitch( | 135 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 136 switches::kUseLevelDBForGData); | 136 switches::kUseLevelDBForGData); |
| 137 } | 137 } |
| 138 | 138 |
| 139 } // namespace | 139 } // namespace |
| 140 | 140 |
| 141 LoadRootFeedParams::LoadRootFeedParams( | |
| 142 bool should_load_from_server, | |
| 143 const FileOperationCallback& callback) | |
| 144 : should_load_from_server(should_load_from_server), | |
| 145 load_error(GDATA_FILE_OK), | |
| 146 load_start_time(base::Time::Now()), | |
| 147 callback(callback) { | |
| 148 } | |
| 149 | |
| 150 LoadRootFeedParams::~LoadRootFeedParams() { | |
| 151 } | |
| 152 | |
| 153 GetDocumentsParams::GetDocumentsParams( | 141 GetDocumentsParams::GetDocumentsParams( |
| 154 int64 start_changestamp, | 142 int64 start_changestamp, |
| 155 int64 root_feed_changestamp, | 143 int64 root_feed_changestamp, |
| 156 std::vector<DocumentFeed*>* feed_list, | 144 std::vector<DocumentFeed*>* feed_list, |
| 157 bool should_fetch_multiple_feeds, | |
| 158 const std::string& search_query, | 145 const std::string& search_query, |
| 159 const std::string& directory_resource_id, | 146 const std::string& directory_resource_id, |
| 160 const FileOperationCallback& callback, | 147 const FileOperationCallback& callback, |
| 161 GetDocumentsUiState* ui_state) | 148 GetDocumentsUiState* ui_state) |
| 162 : start_changestamp(start_changestamp), | 149 : start_changestamp(start_changestamp), |
| 163 root_feed_changestamp(root_feed_changestamp), | 150 root_feed_changestamp(root_feed_changestamp), |
| 164 feed_list(feed_list), | 151 feed_list(feed_list), |
| 165 should_fetch_multiple_feeds(should_fetch_multiple_feeds), | |
| 166 search_query(search_query), | 152 search_query(search_query), |
| 167 directory_resource_id(directory_resource_id), | 153 directory_resource_id(directory_resource_id), |
| 168 callback(callback), | 154 callback(callback), |
| 169 ui_state(ui_state) { | 155 ui_state(ui_state) { |
| 170 } | 156 } |
| 171 | 157 |
| 172 GetDocumentsParams::~GetDocumentsParams() { | 158 GetDocumentsParams::~GetDocumentsParams() { |
| 173 STLDeleteElements(feed_list.get()); | 159 STLDeleteElements(feed_list.get()); |
| 174 } | 160 } |
| 175 | 161 |
| 162 LoadRootFeedParams::LoadRootFeedParams( |
| 163 bool should_load_from_server, |
| 164 const FileOperationCallback& callback) |
| 165 : should_load_from_server(should_load_from_server), |
| 166 load_error(GDATA_FILE_OK), |
| 167 load_start_time(base::Time::Now()), |
| 168 callback(callback) { |
| 169 } |
| 170 |
| 171 LoadRootFeedParams::~LoadRootFeedParams() { |
| 172 } |
| 173 |
| 174 // Defines set of parameters for calling GDataWapiFeedLoader::LoadFromServer(). |
| 175 // Value of |start_changestamp| determines the type of feed to load - 0 means |
| 176 // root feed, every other value would trigger delta feed. |
| 177 // In the case of loading the root feed we use |root_feed_changestamp| as its |
| 178 // initial changestamp value since it does not come with that info. |
| 179 // |
| 180 // When all feeds are loaded, |feed_load_callback| is invoked with the retrieved |
| 181 // feeds. Then |load_finished_callback| is invoked with the error code. |
| 182 // |
| 183 // If invoked as a part of content search, query will be set in |search_query|. |
| 184 // If |feed_to_load| is set, this is feed url that will be used to load feed. |
| 185 // |
| 186 // |load_finished_callback| may be null. |
| 187 // |feed_load_callback| must not be null. |
| 188 struct GDataWapiFeedLoader::LoadFeedParams { |
| 189 LoadFeedParams(ContentOrigin initial_origin, |
| 190 const LoadDocumentFeedCallback& feed_load_callback) |
| 191 : initial_origin(initial_origin), |
| 192 start_changestamp(0), |
| 193 root_feed_changestamp(0), |
| 194 feed_load_callback(feed_load_callback) {} |
| 195 ~LoadFeedParams() {} |
| 196 |
| 197 ContentOrigin initial_origin; |
| 198 int64 start_changestamp; |
| 199 int64 root_feed_changestamp; |
| 200 std::string search_query; |
| 201 GURL feed_to_load; |
| 202 std::string directory_resource_id; |
| 203 FileOperationCallback load_finished_callback; |
| 204 const LoadDocumentFeedCallback feed_load_callback; |
| 205 }; |
| 206 |
| 176 // Defines set of parameters sent to callback OnNotifyDocumentFeedFetched(). | 207 // Defines set of parameters sent to callback OnNotifyDocumentFeedFetched(). |
| 177 // This is a trick to update the number of fetched documents frequently on | 208 // This is a trick to update the number of fetched documents frequently on |
| 178 // UI. Due to performance reason, we need to fetch a number of files at | 209 // UI. Due to performance reason, we need to fetch a number of files at |
| 179 // a time. However, it'll take long time, and a user has no way to know | 210 // a time. However, it'll take long time, and a user has no way to know |
| 180 // the current update state. In order to make users confortable, | 211 // the current update state. In order to make users confortable, |
| 181 // we increment the number of fetched documents with more frequent but smaller | 212 // we increment the number of fetched documents with more frequent but smaller |
| 182 // steps than actual fetching. | 213 // steps than actual fetching. |
| 183 struct GetDocumentsUiState { | 214 struct GetDocumentsUiState { |
| 184 explicit GetDocumentsUiState(base::TimeTicks start_time) | 215 explicit GetDocumentsUiState(base::TimeTicks start_time) |
| 185 : num_fetched_documents(0), | 216 : num_fetched_documents(0), |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 } | 297 } |
| 267 | 298 |
| 268 void GDataWapiFeedLoader::OnGetAccountMetadata( | 299 void GDataWapiFeedLoader::OnGetAccountMetadata( |
| 269 ContentOrigin initial_origin, | 300 ContentOrigin initial_origin, |
| 270 int64 local_changestamp, | 301 int64 local_changestamp, |
| 271 const FileOperationCallback& callback, | 302 const FileOperationCallback& callback, |
| 272 GDataErrorCode status, | 303 GDataErrorCode status, |
| 273 scoped_ptr<base::Value> feed_data) { | 304 scoped_ptr<base::Value> feed_data) { |
| 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 275 | 306 |
| 307 LoadFeedParams params(initial_origin, |
| 308 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, |
| 309 weak_ptr_factory_.GetWeakPtr())); |
| 310 params.start_changestamp = local_changestamp + 1; |
| 311 params.load_finished_callback = callback; |
| 312 |
| 276 GDataFileError error = util::GDataToGDataFileError(status); | 313 GDataFileError error = util::GDataToGDataFileError(status); |
| 277 if (error != GDATA_FILE_OK) { | 314 if (error != GDATA_FILE_OK) { |
| 278 // Get changes starting from the next changestamp from what we have locally. | 315 // Get changes starting from the next changestamp from what we have locally. |
| 279 LoadFromServer(initial_origin, | 316 LoadFromServer(params); |
| 280 local_changestamp + 1, 0, | |
| 281 true, /* should_fetch_multiple_feeds */ | |
| 282 std::string() /* no search query */, | |
| 283 GURL(), /* feed not explicitly set */ | |
| 284 std::string() /* no directory resource ID */, | |
| 285 callback, | |
| 286 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 287 weak_ptr_factory_.GetWeakPtr())); | |
| 288 return; | 317 return; |
| 289 } | 318 } |
| 290 | 319 |
| 291 scoped_ptr<AccountMetadataFeed> account_metadata; | 320 scoped_ptr<AccountMetadataFeed> account_metadata; |
| 292 if (feed_data.get()) { | 321 if (feed_data.get()) { |
| 293 account_metadata = AccountMetadataFeed::CreateFrom(*feed_data); | 322 account_metadata = AccountMetadataFeed::CreateFrom(*feed_data); |
| 294 #ifndef NDEBUG | 323 #ifndef NDEBUG |
| 295 // Save account metadata feed for analysis. | 324 // Save account metadata feed for analysis. |
| 296 const FilePath path = | 325 const FilePath path = |
| 297 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( | 326 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( |
| 298 kAccountMetadataFile); | 327 kAccountMetadataFile); |
| 299 util::PostBlockingPoolSequencedTask( | 328 util::PostBlockingPoolSequencedTask( |
| 300 FROM_HERE, | 329 FROM_HERE, |
| 301 blocking_task_runner_, | 330 blocking_task_runner_, |
| 302 base::Bind(&SaveFeedOnBlockingPoolForDebugging, | 331 base::Bind(&SaveFeedOnBlockingPoolForDebugging, |
| 303 path, base::Passed(&feed_data))); | 332 path, base::Passed(&feed_data))); |
| 304 #endif | 333 #endif |
| 305 } | 334 } |
| 306 | 335 |
| 307 if (!account_metadata.get()) { | 336 if (!account_metadata.get()) { |
| 308 LoadFromServer(initial_origin, | 337 LoadFromServer(params); |
| 309 local_changestamp + 1, 0, | |
| 310 true, /* should_fetch_multiple_feeds */ | |
| 311 std::string() /* no search query */, | |
| 312 GURL(), /* feed not explicitly set */ | |
| 313 std::string() /* no directory resource ID */, | |
| 314 callback, | |
| 315 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 316 weak_ptr_factory_.GetWeakPtr())); | |
| 317 return; | 338 return; |
| 318 } | 339 } |
| 319 | 340 |
| 320 webapps_registry_->UpdateFromFeed(*account_metadata.get()); | 341 webapps_registry_->UpdateFromFeed(*account_metadata.get()); |
| 321 | 342 |
| 322 bool changes_detected = true; | 343 bool changes_detected = true; |
| 323 if (local_changestamp >= account_metadata->largest_changestamp()) { | 344 if (local_changestamp >= account_metadata->largest_changestamp()) { |
| 324 if (local_changestamp > account_metadata->largest_changestamp()) { | 345 if (local_changestamp > account_metadata->largest_changestamp()) { |
| 325 LOG(WARNING) << "Cached client feed is fresher than server, client = " | 346 LOG(WARNING) << "Cached client feed is fresher than server, client = " |
| 326 << local_changestamp | 347 << local_changestamp |
| 327 << ", server = " | 348 << ", server = " |
| 328 << account_metadata->largest_changestamp(); | 349 << account_metadata->largest_changestamp(); |
| 329 } | 350 } |
| 330 // If our cache holds the latest state from the server, change the | 351 // If our cache holds the latest state from the server, change the |
| 331 // state to FROM_SERVER. | 352 // state to FROM_SERVER. |
| 332 directory_service_->set_origin( | 353 directory_service_->set_origin( |
| 333 initial_origin == FROM_CACHE ? FROM_SERVER : initial_origin); | 354 initial_origin == FROM_CACHE ? FROM_SERVER : initial_origin); |
| 334 changes_detected = false; | 355 changes_detected = false; |
| 335 } | 356 } |
| 336 | 357 |
| 337 // No changes detected, tell the client that the loading was successful. | 358 // No changes detected, tell the client that the loading was successful. |
| 338 if (!changes_detected) { | 359 if (!changes_detected) { |
| 339 if (!callback.is_null()) | 360 if (!callback.is_null()) |
| 340 callback.Run(GDATA_FILE_OK); | 361 callback.Run(GDATA_FILE_OK); |
| 341 return; | 362 return; |
| 342 } | 363 } |
| 343 | 364 |
| 344 // Load changes from the server. | 365 // Load changes from the server. |
| 345 LoadFromServer(initial_origin, | 366 params.start_changestamp = local_changestamp > 0 ? local_changestamp + 1 : 0; |
| 346 local_changestamp > 0 ? local_changestamp + 1 : 0, | 367 params.root_feed_changestamp = account_metadata->largest_changestamp(); |
| 347 account_metadata->largest_changestamp(), | 368 LoadFromServer(params); |
| 348 true, /* should_fetch_multiple_feeds */ | |
| 349 std::string() /* no search query */, | |
| 350 GURL(), /* feed not explicitly set */ | |
| 351 std::string() /* no directory resource ID */, | |
| 352 callback, | |
| 353 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 354 weak_ptr_factory_.GetWeakPtr())); | |
| 355 } | 369 } |
| 356 | 370 |
| 357 void GDataWapiFeedLoader::OnGetAboutResource( | 371 void GDataWapiFeedLoader::OnGetAboutResource( |
| 358 ContentOrigin initial_origin, | 372 ContentOrigin initial_origin, |
| 359 int64 local_changestamp, | 373 int64 local_changestamp, |
| 360 const FileOperationCallback& callback, | 374 const FileOperationCallback& callback, |
| 361 GDataErrorCode status, | 375 GDataErrorCode status, |
| 362 scoped_ptr<base::Value> feed_data) { | 376 scoped_ptr<base::Value> feed_data) { |
| 363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 377 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 364 | 378 |
| 379 LoadFeedParams params(initial_origin, |
| 380 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, |
| 381 weak_ptr_factory_.GetWeakPtr())); |
| 382 params.load_finished_callback = callback; |
| 383 |
| 365 GDataFileError error = util::GDataToGDataFileError(status); | 384 GDataFileError error = util::GDataToGDataFileError(status); |
| 366 if (error != GDATA_FILE_OK) { | 385 if (error != GDATA_FILE_OK) { |
| 367 // Get changes starting from the next changestamp from what we have locally. | 386 // Get changes starting from the next changestamp from what we have locally. |
| 368 LoadFromServer(initial_origin, | 387 LoadFromServer(params); |
| 369 local_changestamp + 1, 0, | |
| 370 true, /* should_fetch_multiple_feeds */ | |
| 371 std::string() /* no search query */, | |
| 372 GURL(), /* feed not explicitly set */ | |
| 373 std::string() /* no directory resource ID */, | |
| 374 callback, | |
| 375 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 376 weak_ptr_factory_.GetWeakPtr())); | |
| 377 return; | 388 return; |
| 378 } | 389 } |
| 379 | 390 |
| 380 scoped_ptr<AboutResource> about_resource; | 391 scoped_ptr<AboutResource> about_resource; |
| 381 if (feed_data.get()) | 392 if (feed_data.get()) |
| 382 about_resource = AboutResource::CreateFrom(*feed_data); | 393 about_resource = AboutResource::CreateFrom(*feed_data); |
| 383 | 394 |
| 384 if (!about_resource.get()) { | 395 if (!about_resource.get()) { |
| 385 LoadFromServer(initial_origin, | 396 LoadFromServer(params); |
| 386 local_changestamp + 1, 0, | |
| 387 true, /* should_fetch_multiple_feeds */ | |
| 388 std::string() /* no search query */, | |
| 389 GURL(), /* feed not explicitly set */ | |
| 390 std::string() /* no directory resource ID */, | |
| 391 callback, | |
| 392 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 393 weak_ptr_factory_.GetWeakPtr())); | |
| 394 return; | 397 return; |
| 395 } | 398 } |
| 396 | 399 |
| 397 bool changes_detected = true; | 400 bool changes_detected = true; |
| 398 int64 largest_changestamp = about_resource->largest_change_id(); | 401 int64 largest_changestamp = about_resource->largest_change_id(); |
| 399 directory_service_->InitializeRootEntry(about_resource->root_folder_id()); | 402 directory_service_->InitializeRootEntry(about_resource->root_folder_id()); |
| 400 | 403 |
| 401 if (local_changestamp >= largest_changestamp) { | 404 if (local_changestamp >= largest_changestamp) { |
| 402 if (local_changestamp > largest_changestamp) { | 405 if (local_changestamp > largest_changestamp) { |
| 403 LOG(WARNING) << "Cached client feed is fresher than server, client = " | 406 LOG(WARNING) << "Cached client feed is fresher than server, client = " |
| 404 << local_changestamp | 407 << local_changestamp |
| 405 << ", server = " | 408 << ", server = " |
| 406 << largest_changestamp; | 409 << largest_changestamp; |
| 407 } | 410 } |
| 408 // If our cache holds the latest state from the server, change the | 411 // If our cache holds the latest state from the server, change the |
| 409 // state to FROM_SERVER. | 412 // state to FROM_SERVER. |
| 410 directory_service_->set_origin( | 413 directory_service_->set_origin( |
| 411 initial_origin == FROM_CACHE ? FROM_SERVER : initial_origin); | 414 initial_origin == FROM_CACHE ? FROM_SERVER : initial_origin); |
| 412 changes_detected = false; | 415 changes_detected = false; |
| 413 } | 416 } |
| 414 | 417 |
| 415 // No changes detected, tell the client that the loading was successful. | 418 // No changes detected, tell the client that the loading was successful. |
| 416 if (!changes_detected) { | 419 if (!changes_detected) { |
| 417 if (!callback.is_null()) | 420 if (!callback.is_null()) |
| 418 callback.Run(GDATA_FILE_OK); | 421 callback.Run(GDATA_FILE_OK); |
| 419 return; | 422 return; |
| 420 } | 423 } |
| 421 | 424 |
| 422 // Load changes from the server. | 425 // Load changes from the server. |
| 423 LoadFromServer(initial_origin, | 426 params.start_changestamp = local_changestamp > 0 ? local_changestamp + 1 : 0; |
| 424 local_changestamp > 0 ? local_changestamp + 1 : 0, | 427 params.root_feed_changestamp = largest_changestamp; |
| 425 largest_changestamp, | 428 LoadFromServer(params); |
| 426 true, /* should_fetch_multiple_feeds */ | |
| 427 std::string() /* no search query */, | |
| 428 GURL(), /* feed not explicitly set */ | |
| 429 std::string() /* no directory resource ID */, | |
| 430 callback, | |
| 431 base::Bind(&GDataWapiFeedLoader::OnFeedFromServerLoaded, | |
| 432 weak_ptr_factory_.GetWeakPtr())); | |
| 433 } | 429 } |
| 434 | 430 |
| 435 void GDataWapiFeedLoader::OnGetApplicationList( | 431 void GDataWapiFeedLoader::OnGetApplicationList( |
| 436 GDataErrorCode status, | 432 GDataErrorCode status, |
| 437 scoped_ptr<base::Value> json) { | 433 scoped_ptr<base::Value> json) { |
| 438 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 434 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 439 | 435 |
| 440 GDataFileError error = util::GDataToGDataFileError(status); | 436 GDataFileError error = util::GDataToGDataFileError(status); |
| 441 if (error != GDATA_FILE_OK) | 437 if (error != GDATA_FILE_OK) |
| 442 return; | 438 return; |
| 443 | 439 |
| 444 if (json.get()) { | 440 if (json.get()) { |
| 445 scoped_ptr<AppList> applist(AppList::CreateFrom(*json)); | 441 scoped_ptr<AppList> applist(AppList::CreateFrom(*json)); |
| 446 if (applist.get()) { | 442 if (applist.get()) { |
| 447 VLOG(1) << "applist get success"; | 443 VLOG(1) << "applist get success"; |
| 448 webapps_registry_->UpdateFromApplicationList(*applist.get()); | 444 webapps_registry_->UpdateFromApplicationList(*applist.get()); |
| 449 } | 445 } |
| 450 } | 446 } |
| 451 } | 447 } |
| 452 | 448 |
| 453 // TODO(kochi): Fix too many parameters. http://crbug.com/141359 | 449 void GDataWapiFeedLoader::LoadFromServer(const LoadFeedParams& params) { |
| 454 void GDataWapiFeedLoader::LoadFromServer( | |
| 455 ContentOrigin initial_origin, | |
| 456 int64 start_changestamp, | |
| 457 int64 root_feed_changestamp, | |
| 458 bool should_fetch_multiple_feeds, | |
| 459 const std::string& search_query, | |
| 460 const GURL& feed_to_load, | |
| 461 const std::string& directory_resource_id, | |
| 462 const FileOperationCallback& load_finished_callback, | |
| 463 const LoadDocumentFeedCallback& feed_load_callback) { | |
| 464 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 450 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 465 DCHECK(!feed_load_callback.is_null()); | |
| 466 | 451 |
| 467 // |feed_list| will contain the list of all collected feed updates that | 452 // |feed_list| will contain the list of all collected feed updates that |
| 468 // we will receive through calls of DocumentsService::GetDocuments(). | 453 // we will receive through calls of DocumentsService::GetDocuments(). |
| 469 scoped_ptr<std::vector<DocumentFeed*> > feed_list( | 454 scoped_ptr<std::vector<DocumentFeed*> > feed_list( |
| 470 new std::vector<DocumentFeed*>); | 455 new std::vector<DocumentFeed*>); |
| 471 const base::TimeTicks start_time = base::TimeTicks::Now(); | 456 const base::TimeTicks start_time = base::TimeTicks::Now(); |
| 472 | 457 |
| 473 if (gdata::util::IsDriveV2ApiEnabled()) { | 458 if (gdata::util::IsDriveV2ApiEnabled()) { |
| 474 documents_service_->GetChangelist( | 459 documents_service_->GetChangelist( |
| 475 feed_to_load, | 460 params.feed_to_load, |
| 476 start_changestamp, | 461 params.start_changestamp, |
| 477 base::Bind(&GDataWapiFeedLoader::OnGetChangelist, | 462 base::Bind(&GDataWapiFeedLoader::OnGetChangelist, |
| 478 weak_ptr_factory_.GetWeakPtr(), | 463 weak_ptr_factory_.GetWeakPtr(), |
| 479 initial_origin, | 464 params.initial_origin, |
| 480 feed_load_callback, | 465 params.feed_load_callback, |
| 481 base::Owned(new GetDocumentsParams( | 466 base::Owned(new GetDocumentsParams( |
| 482 start_changestamp, | 467 params.start_changestamp, |
| 483 root_feed_changestamp, | 468 params.root_feed_changestamp, |
| 484 feed_list.release(), | 469 feed_list.release(), |
| 485 should_fetch_multiple_feeds, | 470 params.search_query, |
| 486 search_query, | 471 params.directory_resource_id, |
| 487 directory_resource_id, | 472 params.load_finished_callback, |
| 488 load_finished_callback, | |
| 489 NULL)), | 473 NULL)), |
| 490 start_time)); | 474 start_time)); |
| 491 return; | 475 return; |
| 492 } | 476 } |
| 493 | 477 |
| 494 documents_service_->GetDocuments( | 478 documents_service_->GetDocuments( |
| 495 feed_to_load, | 479 params.feed_to_load, |
| 496 start_changestamp, | 480 params.start_changestamp, |
| 497 search_query, | 481 params.search_query, |
| 498 directory_resource_id, | 482 params.directory_resource_id, |
| 499 base::Bind(&GDataWapiFeedLoader::OnGetDocuments, | 483 base::Bind(&GDataWapiFeedLoader::OnGetDocuments, |
| 500 weak_ptr_factory_.GetWeakPtr(), | 484 weak_ptr_factory_.GetWeakPtr(), |
| 501 initial_origin, | 485 params.initial_origin, |
| 502 feed_load_callback, | 486 params.feed_load_callback, |
| 503 base::Owned(new GetDocumentsParams(start_changestamp, | 487 base::Owned( |
| 504 root_feed_changestamp, | 488 new GetDocumentsParams(params.start_changestamp, |
| 505 feed_list.release(), | 489 params.root_feed_changestamp, |
| 506 should_fetch_multiple_feeds, | 490 feed_list.release(), |
| 507 search_query, | 491 params.search_query, |
| 508 directory_resource_id, | 492 params.directory_resource_id, |
| 509 load_finished_callback, | 493 params.load_finished_callback, |
| 510 NULL)), | 494 NULL)), |
| 511 start_time)); | 495 start_time)); |
| 512 } | 496 } |
| 513 | 497 |
| 498 void GDataWapiFeedLoader::LoadDirectoryFromServer( |
| 499 ContentOrigin initial_origin, |
| 500 const std::string& directory_resource_id, |
| 501 const LoadDocumentFeedCallback& feed_load_callback) { |
| 502 LoadFeedParams params(initial_origin, feed_load_callback); |
| 503 params.directory_resource_id = directory_resource_id; |
| 504 LoadFromServer(params); |
| 505 } |
| 506 |
| 507 void GDataWapiFeedLoader::SearchFromServer( |
| 508 ContentOrigin initial_origin, |
| 509 const std::string& search_query, |
| 510 const GURL& next_feed, |
| 511 const LoadDocumentFeedCallback& feed_load_callback) { |
| 512 LoadFeedParams params(initial_origin, feed_load_callback); |
| 513 params.search_query = search_query; |
| 514 params.feed_to_load = next_feed; |
| 515 LoadFromServer(params); |
| 516 } |
| 517 |
| 514 void GDataWapiFeedLoader::OnFeedFromServerLoaded(GetDocumentsParams* params, | 518 void GDataWapiFeedLoader::OnFeedFromServerLoaded(GetDocumentsParams* params, |
| 515 GDataFileError error) { | 519 GDataFileError error) { |
| 516 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 520 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 517 | 521 |
| 518 if (error != GDATA_FILE_OK) { | 522 if (error != GDATA_FILE_OK) { |
| 519 if (!params->callback.is_null()) | 523 if (!params->callback.is_null()) |
| 520 params->callback.Run(error); | 524 params->callback.Run(error); |
| 521 return; | 525 return; |
| 522 } | 526 } |
| 523 | 527 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 | 598 |
| 595 // Add the current feed to the list of collected feeds for this directory. | 599 // Add the current feed to the list of collected feeds for this directory. |
| 596 params->feed_list->push_back(current_feed.release()); | 600 params->feed_list->push_back(current_feed.release()); |
| 597 | 601 |
| 598 // Compute and notify the number of entries fetched so far. | 602 // Compute and notify the number of entries fetched so far. |
| 599 int num_accumulated_entries = 0; | 603 int num_accumulated_entries = 0; |
| 600 for (size_t i = 0; i < params->feed_list->size(); ++i) | 604 for (size_t i = 0; i < params->feed_list->size(); ++i) |
| 601 num_accumulated_entries += params->feed_list->at(i)->entries().size(); | 605 num_accumulated_entries += params->feed_list->at(i)->entries().size(); |
| 602 | 606 |
| 603 // Check if we need to collect more data to complete the directory list. | 607 // Check if we need to collect more data to complete the directory list. |
| 604 if (params->should_fetch_multiple_feeds && has_next_feed_url && | 608 if (has_next_feed_url && !next_feed_url.is_empty()) { |
| 605 !next_feed_url.is_empty()) { | |
| 606 // Post an UI update event to make the UI smoother. | 609 // Post an UI update event to make the UI smoother. |
| 607 GetDocumentsUiState* ui_state = params->ui_state.get(); | 610 GetDocumentsUiState* ui_state = params->ui_state.get(); |
| 608 if (ui_state == NULL) { | 611 if (ui_state == NULL) { |
| 609 ui_state = new GetDocumentsUiState(base::TimeTicks::Now()); | 612 ui_state = new GetDocumentsUiState(base::TimeTicks::Now()); |
| 610 params->ui_state.reset(ui_state); | 613 params->ui_state.reset(ui_state); |
| 611 } | 614 } |
| 612 DCHECK(ui_state); | 615 DCHECK(ui_state); |
| 613 | 616 |
| 614 if ((ui_state->num_fetched_documents - ui_state->num_showing_documents) | 617 if ((ui_state->num_fetched_documents - ui_state->num_showing_documents) |
| 615 < kFetchUiUpdateStep) { | 618 < kFetchUiUpdateStep) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 631 params->directory_resource_id, | 634 params->directory_resource_id, |
| 632 base::Bind(&GDataWapiFeedLoader::OnGetDocuments, | 635 base::Bind(&GDataWapiFeedLoader::OnGetDocuments, |
| 633 weak_ptr_factory_.GetWeakPtr(), | 636 weak_ptr_factory_.GetWeakPtr(), |
| 634 initial_origin, | 637 initial_origin, |
| 635 callback, | 638 callback, |
| 636 base::Owned( | 639 base::Owned( |
| 637 new GetDocumentsParams( | 640 new GetDocumentsParams( |
| 638 params->start_changestamp, | 641 params->start_changestamp, |
| 639 params->root_feed_changestamp, | 642 params->root_feed_changestamp, |
| 640 params->feed_list.release(), | 643 params->feed_list.release(), |
| 641 params->should_fetch_multiple_feeds, | |
| 642 params->search_query, | 644 params->search_query, |
| 643 params->directory_resource_id, | 645 params->directory_resource_id, |
| 644 params->callback, | 646 params->callback, |
| 645 params->ui_state.release())), | 647 params->ui_state.release())), |
| 646 start_time)); | 648 start_time)); |
| 647 return; | 649 return; |
| 648 } | 650 } |
| 649 | 651 |
| 650 // Notify the observers that all document feeds are fetched. | 652 // Notify the observers that all document feeds are fetched. |
| 651 FOR_EACH_OBSERVER(Observer, observers_, | 653 FOR_EACH_OBSERVER(Observer, observers_, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 scoped_ptr<DocumentFeed> feed = | 713 scoped_ptr<DocumentFeed> feed = |
| 712 DocumentFeed::CreateFromChangeList(*current_feed); | 714 DocumentFeed::CreateFromChangeList(*current_feed); |
| 713 params->feed_list->push_back(feed.release()); | 715 params->feed_list->push_back(feed.release()); |
| 714 | 716 |
| 715 // Compute and notify the number of entries fetched so far. | 717 // Compute and notify the number of entries fetched so far. |
| 716 int num_accumulated_entries = 0; | 718 int num_accumulated_entries = 0; |
| 717 for (size_t i = 0; i < params->feed_list->size(); ++i) | 719 for (size_t i = 0; i < params->feed_list->size(); ++i) |
| 718 num_accumulated_entries += params->feed_list->at(i)->entries().size(); | 720 num_accumulated_entries += params->feed_list->at(i)->entries().size(); |
| 719 | 721 |
| 720 // Check if we need to collect more data to complete the directory list. | 722 // Check if we need to collect more data to complete the directory list. |
| 721 if (params->should_fetch_multiple_feeds && has_next_feed) { | 723 if (has_next_feed) { |
| 722 | 724 |
| 723 // Post an UI update event to make the UI smoother. | 725 // Post an UI update event to make the UI smoother. |
| 724 GetDocumentsUiState* ui_state = params->ui_state.get(); | 726 GetDocumentsUiState* ui_state = params->ui_state.get(); |
| 725 if (ui_state == NULL) { | 727 if (ui_state == NULL) { |
| 726 ui_state = new GetDocumentsUiState(base::TimeTicks::Now()); | 728 ui_state = new GetDocumentsUiState(base::TimeTicks::Now()); |
| 727 params->ui_state.reset(ui_state); | 729 params->ui_state.reset(ui_state); |
| 728 } | 730 } |
| 729 DCHECK(ui_state); | 731 DCHECK(ui_state); |
| 730 | 732 |
| 731 if ((ui_state->num_fetched_documents - ui_state->num_showing_documents) | 733 if ((ui_state->num_fetched_documents - ui_state->num_showing_documents) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 746 params->start_changestamp, | 748 params->start_changestamp, |
| 747 base::Bind(&GDataWapiFeedLoader::OnGetChangelist, | 749 base::Bind(&GDataWapiFeedLoader::OnGetChangelist, |
| 748 weak_ptr_factory_.GetWeakPtr(), | 750 weak_ptr_factory_.GetWeakPtr(), |
| 749 initial_origin, | 751 initial_origin, |
| 750 callback, | 752 callback, |
| 751 base::Owned( | 753 base::Owned( |
| 752 new GetDocumentsParams( | 754 new GetDocumentsParams( |
| 753 params->start_changestamp, | 755 params->start_changestamp, |
| 754 params->root_feed_changestamp, | 756 params->root_feed_changestamp, |
| 755 params->feed_list.release(), | 757 params->feed_list.release(), |
| 756 params->should_fetch_multiple_feeds, | |
| 757 params->search_query, | 758 params->search_query, |
| 758 params->directory_resource_id, | 759 params->directory_resource_id, |
| 759 params->callback, | 760 params->callback, |
| 760 NULL)), | 761 NULL)), |
| 761 start_time)); | 762 start_time)); |
| 762 return; | 763 return; |
| 763 } | 764 } |
| 764 | 765 |
| 765 // Notify the observers that all document feeds are fetched. | 766 // Notify the observers that all document feeds are fetched. |
| 766 FOR_EACH_OBSERVER(Observer, observers_, | 767 FOR_EACH_OBSERVER(Observer, observers_, |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 dir_iter != changed_dirs.end(); ++dir_iter) { | 953 dir_iter != changed_dirs.end(); ++dir_iter) { |
| 953 FOR_EACH_OBSERVER(Observer, observers_, | 954 FOR_EACH_OBSERVER(Observer, observers_, |
| 954 OnDirectoryChanged(*dir_iter)); | 955 OnDirectoryChanged(*dir_iter)); |
| 955 } | 956 } |
| 956 } | 957 } |
| 957 | 958 |
| 958 return error; | 959 return error; |
| 959 } | 960 } |
| 960 | 961 |
| 961 } // namespace gdata | 962 } // namespace gdata |
| OLD | NEW |