Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_operations.cc

Issue 10808027: gdrive: Get JSON feeds parsing off the UI thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Call NotifyFinish/NotifySuccess after parse. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_operations.h" 5 #include "chrome/browser/chromeos/gdata/gdata_operations.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "chrome/browser/chromeos/gdata/gdata_wapi_parser.h" 10 #include "chrome/browser/chromeos/gdata/gdata_wapi_parser.h"
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 return !get_download_data_callback_.is_null(); 254 return !get_download_data_callback_.is_null();
255 } 255 }
256 256
257 void DownloadFileOperation::OnURLFetchDownloadData( 257 void DownloadFileOperation::OnURLFetchDownloadData(
258 const URLFetcher* source, 258 const URLFetcher* source,
259 scoped_ptr<std::string> download_data) { 259 scoped_ptr<std::string> download_data) {
260 if (!get_download_data_callback_.is_null()) 260 if (!get_download_data_callback_.is_null())
261 get_download_data_callback_.Run(HTTP_SUCCESS, download_data.Pass()); 261 get_download_data_callback_.Run(HTTP_SUCCESS, download_data.Pass());
262 } 262 }
263 263
264 bool DownloadFileOperation::ProcessURLFetchResults( 264 void DownloadFileOperation::ProcessURLFetchResults(
265 const URLFetcher* source) { 265 const URLFetcher* source,
266 const ProcessURLFetchResultsCallBack& result_callback) {
266 GDataErrorCode code = GetErrorCode(source); 267 GDataErrorCode code = GetErrorCode(source);
267 268
268 // Take over the ownership of the the downloaded temp file. 269 // Take over the ownership of the the downloaded temp file.
269 FilePath temp_file; 270 FilePath temp_file;
270 if (code == HTTP_SUCCESS && 271 if (code == HTTP_SUCCESS &&
271 !source->GetResponseAsFilePath(true, // take_ownership 272 !source->GetResponseAsFilePath(true, // take_ownership
272 &temp_file)) { 273 &temp_file)) {
273 code = GDATA_FILE_ERROR; 274 code = GDATA_FILE_ERROR;
274 } 275 }
275 276
276 if (!download_action_callback_.is_null()) 277 if (!download_action_callback_.is_null())
277 download_action_callback_.Run(code, document_url_, temp_file); 278 download_action_callback_.Run(code, document_url_, temp_file);
278 return code == HTTP_SUCCESS; 279 result_callback.Run(code == HTTP_SUCCESS);
279 } 280 }
280 281
281 void DownloadFileOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) { 282 void DownloadFileOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) {
282 if (!download_action_callback_.is_null()) 283 if (!download_action_callback_.is_null())
283 download_action_callback_.Run(code, document_url_, FilePath()); 284 download_action_callback_.Run(code, document_url_, FilePath());
284 } 285 }
285 286
286 //=========================== DeleteDocumentOperation ========================== 287 //=========================== DeleteDocumentOperation ==========================
287 288
288 DeleteDocumentOperation::DeleteDocumentOperation( 289 DeleteDocumentOperation::DeleteDocumentOperation(
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 return URLFetcher::PUT; 471 return URLFetcher::PUT;
471 } 472 }
472 473
473 std::vector<std::string> 474 std::vector<std::string>
474 AuthorizeAppsOperation::GetExtraRequestHeaders() const { 475 AuthorizeAppsOperation::GetExtraRequestHeaders() const {
475 std::vector<std::string> headers; 476 std::vector<std::string> headers;
476 headers.push_back(kIfMatchAllHeader); 477 headers.push_back(kIfMatchAllHeader);
477 return headers; 478 return headers;
478 } 479 }
479 480
480 bool AuthorizeAppsOperation::ProcessURLFetchResults( 481 void AuthorizeAppsOperation::ProcessURLFetchResults(
481 const URLFetcher* source) { 482 const URLFetcher* source,
483 const ProcessURLFetchResultsCallBack& result_callback) {
482 std::string data; 484 std::string data;
483 source->GetResponseAsString(&data); 485 source->GetResponseAsString(&data);
484 return GetDataOperation::ProcessURLFetchResults(source); 486 GetDataOperation::ProcessURLFetchResults(source, result_callback);
485 } 487 }
486 488
487 bool AuthorizeAppsOperation::GetContentData(std::string* upload_content_type, 489 bool AuthorizeAppsOperation::GetContentData(std::string* upload_content_type,
488 std::string* upload_content) { 490 std::string* upload_content) {
489 upload_content_type->assign("application/atom+xml"); 491 upload_content_type->assign("application/atom+xml");
490 XmlWriter xml_writer; 492 XmlWriter xml_writer;
491 xml_writer.StartWriting(); 493 xml_writer.StartWriting();
492 xml_writer.StartElement("entry"); 494 xml_writer.StartElement("entry");
493 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); 495 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom");
494 xml_writer.AddAttribute("xmlns:docs", "http://schemas.google.com/docs/2007"); 496 xml_writer.AddAttribute("xmlns:docs", "http://schemas.google.com/docs/2007");
495 xml_writer.WriteElement("docs:authorizedApp", app_id_); 497 xml_writer.WriteElement("docs:authorizedApp", app_id_);
496 498
497 xml_writer.EndElement(); // Ends "entry" element. 499 xml_writer.EndElement(); // Ends "entry" element.
498 xml_writer.StopWriting(); 500 xml_writer.StopWriting();
499 upload_content->assign(xml_writer.GetWrittenString()); 501 upload_content->assign(xml_writer.GetWrittenString());
500 DVLOG(1) << "AuthorizeAppOperation data: " << *upload_content_type << ", [" 502 DVLOG(1) << "AuthorizeAppOperation data: " << *upload_content_type << ", ["
501 << *upload_content << "]"; 503 << *upload_content << "]";
502 return true; 504 return true;
503 } 505 }
504 506
505 base::Value* AuthorizeAppsOperation::ParseResponse(const std::string& data) { 507 void AuthorizeAppsOperation::ParseResponse(
508 GDataErrorCode fetch_error_code,
509 const std::string& data,
510 const ProcessURLFetchResultsCallBack& result_callback) {
506 // Parse entry XML. 511 // Parse entry XML.
507 XmlReader xml_reader; 512 XmlReader xml_reader;
508 scoped_ptr<DocumentEntry> entry; 513 scoped_ptr<DocumentEntry> entry;
509 if (xml_reader.Load(data)) { 514 if (xml_reader.Load(data)) {
510 while (xml_reader.Read()) { 515 while (xml_reader.Read()) {
511 if (xml_reader.NodeName() == DocumentEntry::GetEntryNodeName()) { 516 if (xml_reader.NodeName() == DocumentEntry::GetEntryNodeName()) {
512 entry.reset(DocumentEntry::CreateFromXml(&xml_reader)); 517 entry.reset(DocumentEntry::CreateFromXml(&xml_reader));
513 break; 518 break;
514 } 519 }
515 } 520 }
516 } 521 }
517 522
518 // From the response, we create a list of the links returned, since those 523 // From the response, we create a list of the links returned, since those
519 // are the only things we are interested in. 524 // are the only things we are interested in.
520 scoped_ptr<base::ListValue> link_list(new ListValue); 525 scoped_ptr<base::ListValue> link_list(new ListValue);
521 const ScopedVector<Link>& feed_links = entry->links(); 526 const ScopedVector<Link>& feed_links = entry->links();
522 for (ScopedVector<Link>::const_iterator iter = feed_links.begin(); 527 for (ScopedVector<Link>::const_iterator iter = feed_links.begin();
523 iter != feed_links.end(); ++iter) { 528 iter != feed_links.end(); ++iter) {
524 if ((*iter)->type() == Link::OPEN_WITH) { 529 if ((*iter)->type() == Link::OPEN_WITH) {
525 base::DictionaryValue* link = new DictionaryValue; 530 base::DictionaryValue* link = new DictionaryValue;
526 link->SetString(std::string("href"), (*iter)->href().spec()); 531 link->SetString(std::string("href"), (*iter)->href().spec());
527 link->SetString(std::string("mime_type"), (*iter)->mime_type()); 532 link->SetString(std::string("mime_type"), (*iter)->mime_type());
528 link->SetString(std::string("title"), (*iter)->title()); 533 link->SetString(std::string("title"), (*iter)->title());
529 link->SetString(std::string("app_id"), (*iter)->app_id()); 534 link->SetString(std::string("app_id"), (*iter)->app_id());
530 link_list->Append(link); 535 link_list->Append(link);
531 } 536 }
532 } 537 }
533 538
534 return link_list.release(); 539 RunCallback(fetch_error_code, link_list.PassAs<base::Value>());
540 result_callback.Run(true);
hashimoto 2012/07/20 04:07:37 nit: Code simply passing true/false is not easy to
yoshiki 2012/07/24 16:58:32 Done.
535 } 541 }
536 542
537 GURL AuthorizeAppsOperation::GetURL() const { 543 GURL AuthorizeAppsOperation::GetURL() const {
538 return document_url_; 544 return document_url_;
539 } 545 }
540 546
541 //======================= AddResourceToDirectoryOperation ====================== 547 //======================= AddResourceToDirectoryOperation ======================
542 548
543 AddResourceToDirectoryOperation::AddResourceToDirectoryOperation( 549 AddResourceToDirectoryOperation::AddResourceToDirectoryOperation(
544 GDataOperationRegistry* registry, 550 GDataOperationRegistry* registry,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 kUploadParamConvertKey, 643 kUploadParamConvertKey,
638 kUploadParamConvertValue)) { 644 kUploadParamConvertValue)) {
639 } 645 }
640 646
641 InitiateUploadOperation::~InitiateUploadOperation() {} 647 InitiateUploadOperation::~InitiateUploadOperation() {}
642 648
643 GURL InitiateUploadOperation::GetURL() const { 649 GURL InitiateUploadOperation::GetURL() const {
644 return initiate_upload_url_; 650 return initiate_upload_url_;
645 } 651 }
646 652
647 bool InitiateUploadOperation::ProcessURLFetchResults( 653 void InitiateUploadOperation::ProcessURLFetchResults(
648 const URLFetcher* source) { 654 const URLFetcher* source,
655 const ProcessURLFetchResultsCallBack& result_callback) {
649 GDataErrorCode code = GetErrorCode(source); 656 GDataErrorCode code = GetErrorCode(source);
650 657
651 std::string upload_location; 658 std::string upload_location;
652 if (code == HTTP_SUCCESS) { 659 if (code == HTTP_SUCCESS) {
653 // Retrieve value of the first "Location" header. 660 // Retrieve value of the first "Location" header.
654 source->GetResponseHeaders()->EnumerateHeader(NULL, 661 source->GetResponseHeaders()->EnumerateHeader(NULL,
655 kUploadResponseLocation, 662 kUploadResponseLocation,
656 &upload_location); 663 &upload_location);
657 } 664 }
658 VLOG(1) << "Got response for [" << params_.title 665 VLOG(1) << "Got response for [" << params_.title
659 << "]: code=" << code 666 << "]: code=" << code
660 << ", location=[" << upload_location << "]"; 667 << ", location=[" << upload_location << "]";
661 668
662 if (!callback_.is_null()) 669 if (!callback_.is_null())
663 callback_.Run(code, GURL(upload_location)); 670 callback_.Run(code, GURL(upload_location));
664 return code == HTTP_SUCCESS; 671 result_callback.Run(code == HTTP_SUCCESS);
665 } 672 }
666 673
667 void InitiateUploadOperation::NotifySuccessToOperationRegistry() { 674 void InitiateUploadOperation::NotifySuccessToOperationRegistry() {
668 NotifySuspend(); 675 NotifySuspend();
669 } 676 }
670 677
671 void InitiateUploadOperation::RunCallbackOnPrematureFailure( 678 void InitiateUploadOperation::RunCallbackOnPrematureFailure(
672 GDataErrorCode code) { 679 GDataErrorCode code) {
673 if (!callback_.is_null()) 680 if (!callback_.is_null())
674 callback_.Run(code, GURL()); 681 callback_.Run(code, GURL());
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 params_(params), 748 params_(params),
742 last_chunk_completed_(false) { 749 last_chunk_completed_(false) {
743 } 750 }
744 751
745 ResumeUploadOperation::~ResumeUploadOperation() {} 752 ResumeUploadOperation::~ResumeUploadOperation() {}
746 753
747 GURL ResumeUploadOperation::GetURL() const { 754 GURL ResumeUploadOperation::GetURL() const {
748 return params_.upload_location; 755 return params_.upload_location;
749 } 756 }
750 757
751 bool ResumeUploadOperation::ProcessURLFetchResults( 758 void ResumeUploadOperation::ProcessURLFetchResults(
752 const URLFetcher* source) { 759 const URLFetcher* source,
760 const ProcessURLFetchResultsCallBack& result_callback) {
753 GDataErrorCode code = GetErrorCode(source); 761 GDataErrorCode code = GetErrorCode(source);
754 net::HttpResponseHeaders* hdrs = source->GetResponseHeaders(); 762 net::HttpResponseHeaders* hdrs = source->GetResponseHeaders();
755 int64 start_range_received = -1; 763 int64 start_range_received = -1;
756 int64 end_range_received = -1; 764 int64 end_range_received = -1;
757 scoped_ptr<DocumentEntry> entry; 765 scoped_ptr<DocumentEntry> entry;
758 766
759 if (code == HTTP_RESUME_INCOMPLETE) { 767 if (code == HTTP_RESUME_INCOMPLETE) {
760 // Retrieve value of the first "Range" header. 768 // Retrieve value of the first "Range" header.
761 std::string range_received; 769 std::string range_received;
762 hdrs->EnumerateHeader(NULL, kUploadResponseRange, &range_received); 770 hdrs->EnumerateHeader(NULL, kUploadResponseRange, &range_received);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 entry.Pass()); 811 entry.Pass());
804 } 812 }
805 813
806 // For a new file, HTTP_CREATED is returned. 814 // For a new file, HTTP_CREATED is returned.
807 // For an existing file, HTTP_SUCCESS is returned. 815 // For an existing file, HTTP_SUCCESS is returned.
808 if ((params_.upload_mode == UPLOAD_NEW_FILE && code == HTTP_CREATED) || 816 if ((params_.upload_mode == UPLOAD_NEW_FILE && code == HTTP_CREATED) ||
809 (params_.upload_mode == UPLOAD_EXISTING_FILE && code == HTTP_SUCCESS)) { 817 (params_.upload_mode == UPLOAD_EXISTING_FILE && code == HTTP_SUCCESS)) {
810 last_chunk_completed_ = true; 818 last_chunk_completed_ = true;
811 } 819 }
812 820
813 return last_chunk_completed_ || code == HTTP_RESUME_INCOMPLETE; 821 result_callback.Run(last_chunk_completed_ || code == HTTP_RESUME_INCOMPLETE);
814 } 822 }
815 823
816 void ResumeUploadOperation::NotifyStartToOperationRegistry() { 824 void ResumeUploadOperation::NotifyStartToOperationRegistry() {
817 NotifyResume(); 825 NotifyResume();
818 } 826 }
819 827
820 void ResumeUploadOperation::NotifySuccessToOperationRegistry() { 828 void ResumeUploadOperation::NotifySuccessToOperationRegistry() {
821 if (last_chunk_completed_) 829 if (last_chunk_completed_)
822 NotifyFinish(GDataOperationRegistry::OPERATION_COMPLETED); 830 NotifyFinish(GDataOperationRegistry::OPERATION_COMPLETED);
823 else 831 else
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 return true; 877 return true;
870 } 878 }
871 879
872 void ResumeUploadOperation::OnURLFetchUploadProgress( 880 void ResumeUploadOperation::OnURLFetchUploadProgress(
873 const URLFetcher* source, int64 current, int64 total) { 881 const URLFetcher* source, int64 current, int64 total) {
874 // Adjust the progress values according to the range currently uploaded. 882 // Adjust the progress values according to the range currently uploaded.
875 NotifyProgress(params_.start_range + current, params_.content_length); 883 NotifyProgress(params_.start_range + current, params_.content_length);
876 } 884 }
877 885
878 } // namespace gdata 886 } // namespace gdata
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698