diff options
author | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-19 19:29:24 +0000 |
---|---|---|
committer | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-19 19:29:24 +0000 |
commit | 19331e339db762b810aee2b18226cafada8078bb (patch) | |
tree | 9488b475b489eb71a6ddfb6af8d0f9d06d9c6fe7 | |
parent | 22513e0a3516e64505321dac8eea5046030e7cff (diff) | |
download | chromium_src-19331e339db762b810aee2b18226cafada8078bb.zip chromium_src-19331e339db762b810aee2b18226cafada8078bb.tar.gz chromium_src-19331e339db762b810aee2b18226cafada8078bb.tar.bz2 |
Fully complete progress information of GData operations.
This CL adds
- The path of file transferred in an upload/download operation.
- Upload/download progress (current / total).
- SUCCESS/FAILED status when the operation finished.
BUG=chromium-os:27371
TEST=unit_tests --gtest_filter='*GData*'
Review URL: https://chromiumcodereview.appspot.com/9720012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@127514 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/gdata/gdata.cc | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/gdata/gdata_operation_registry.cc | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/gdata/gdata_operations.cc | 72 | ||||
-rw-r--r-- | chrome/browser/chromeos/gdata/gdata_operations.h | 36 |
4 files changed, 76 insertions, 36 deletions
diff --git a/chrome/browser/chromeos/gdata/gdata.cc b/chrome/browser/chromeos/gdata/gdata.cc index 7bffcb7..ffdee35 100644 --- a/chrome/browser/chromeos/gdata/gdata.cc +++ b/chrome/browser/chromeos/gdata/gdata.cc @@ -244,7 +244,7 @@ void DocumentsService::DownloadFile(const FilePath& virtual_path, const DownloadActionCallback& callback) { StartOperationOnUIThread( new DownloadFileOperation(operation_registry_.get(), profile_, callback, - document_url)); + document_url, virtual_path)); } void DocumentsService::DeleteDocument(const GURL& document_url, diff --git a/chrome/browser/chromeos/gdata/gdata_operation_registry.cc b/chrome/browser/chromeos/gdata/gdata_operation_registry.cc index c7305b9..c993a38 100644 --- a/chrome/browser/chromeos/gdata/gdata_operation_registry.cc +++ b/chrome/browser/chromeos/gdata/gdata_operation_registry.cc @@ -158,7 +158,7 @@ void GDataOperationRegistry::OnOperationStart( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); *id = in_flight_operations_.Add(operation); - DVLOG(1) << "GDataOperation[" << id << "] started."; + DVLOG(1) << "GDataOperation[" << *id << "] started."; FOR_EACH_OBSERVER(Observer, observer_list_, OnProgressUpdate(GetProgressStatusList())); } diff --git a/chrome/browser/chromeos/gdata/gdata_operations.cc b/chrome/browser/chromeos/gdata/gdata_operations.cc index d134a2c..a0df4d8 100644 --- a/chrome/browser/chromeos/gdata/gdata_operations.cc +++ b/chrome/browser/chromeos/gdata/gdata_operations.cc @@ -126,7 +126,8 @@ void AuthOperation::Start() { void AuthOperation::DoCancel() { oauth2_access_token_fetcher_->CancelRequest(); - callback_.Run(GDATA_CANCELLED, std::string()); + if (!callback_.is_null()) + callback_.Run(GDATA_CANCELLED, std::string()); } // Callback for OAuth2AccessTokenFetcher on success. |access_token| is the token @@ -157,6 +158,18 @@ UrlFetchOperationBase::UrlFetchOperationBase(GDataOperationRegistry* registry, save_temp_file_(false) { } +UrlFetchOperationBase::UrlFetchOperationBase( + GDataOperationRegistry* registry, + GDataOperationRegistry::OperationType type, + const FilePath& path, + Profile* profile) + : GDataOperationRegistry::Operation(registry, type, path), + profile_(profile), + relay_proxy_(base::MessageLoopProxy::current()), + re_authenticate_count_(0), + save_temp_file_(false) { +} + UrlFetchOperationBase::~UrlFetchOperationBase() {} void UrlFetchOperationBase::Start(const std::string& auth_token) { @@ -227,12 +240,6 @@ void UrlFetchOperationBase::DoCancel() { RunCallbackOnPrematureFailure(GDATA_CANCELLED); } -void UrlFetchOperationBase::OnURLFetchDownloadProgress(const URLFetcher* source, - int64 current, - int64 total) { - NotifyProgress(current, total); -} - void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) { GDataErrorCode code = static_cast<GDataErrorCode>(source->GetResponseCode()); @@ -250,8 +257,9 @@ void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) { } // Overridden by each specialization - ProcessURLFetchResults(source); - NotifyFinish(GDataOperationRegistry::OPERATION_COMPLETED); + bool success = ProcessURLFetchResults(source); + NotifyFinish(success ? GDataOperationRegistry::OPERATION_COMPLETED + : GDataOperationRegistry::OPERATION_FAILED); } void UrlFetchOperationBase::OnAuthFailed(GDataErrorCode code) { @@ -295,13 +303,14 @@ GURL EntryActionOperation::GetURL() const { return AddStandardUrlParams(document_url_); } -void EntryActionOperation::ProcessURLFetchResults(const URLFetcher* source) { +bool EntryActionOperation::ProcessURLFetchResults(const URLFetcher* source) { if (!callback_.is_null()) { GDataErrorCode code = static_cast<GDataErrorCode>(source->GetResponseCode()); relay_proxy_->PostTask(FROM_HERE, base::Bind(callback_, code, document_url_)); } + return true; } void EntryActionOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) { @@ -321,7 +330,7 @@ GetDataOperation::GetDataOperation(GDataOperationRegistry* registry, GetDataOperation::~GetDataOperation() {} -void GetDataOperation::ProcessURLFetchResults(const URLFetcher* source) { +bool GetDataOperation::ProcessURLFetchResults(const URLFetcher* source) { std::string data; source->GetResponseAsString(&data); scoped_ptr<base::Value> root_value; @@ -345,6 +354,7 @@ void GetDataOperation::ProcessURLFetchResults(const URLFetcher* source) { FROM_HERE, base::Bind(callback_, code, base::Passed(&root_value))); } + return root_value.get() != NULL; } void GetDataOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) { @@ -416,8 +426,12 @@ DownloadFileOperation::DownloadFileOperation( GDataOperationRegistry* registry, Profile* profile, const DownloadActionCallback& callback, - const GURL& document_url) - : UrlFetchOperationBase(registry, profile), + const GURL& document_url, + const FilePath& virtual_path) + : UrlFetchOperationBase(registry, + GDataOperationRegistry::OPERATION_DOWNLOAD, + virtual_path, + profile), callback_(callback), document_url_(document_url) { // Make sure we download the content into a temp file. @@ -431,7 +445,13 @@ GURL DownloadFileOperation::GetURL() const { return document_url_; } -void DownloadFileOperation::ProcessURLFetchResults(const URLFetcher* source) { +void DownloadFileOperation::OnURLFetchDownloadProgress(const URLFetcher* source, + int64 current, + int64 total) { + NotifyProgress(current, total); +} + +bool DownloadFileOperation::ProcessURLFetchResults(const URLFetcher* source) { GDataErrorCode code = static_cast<GDataErrorCode>(source->GetResponseCode()); // Take over the ownership of the the downloaded temp file. @@ -447,6 +467,7 @@ void DownloadFileOperation::ProcessURLFetchResults(const URLFetcher* source) { FROM_HERE, base::Bind(callback_, code, document_url_, temp_file)); } + return code == HTTP_SUCCESS; } void DownloadFileOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) { @@ -705,7 +726,10 @@ InitiateUploadOperation::InitiateUploadOperation( Profile* profile, const InitiateUploadCallback& callback, const InitiateUploadParams& params) - : UrlFetchOperationBase(registry, profile), + : UrlFetchOperationBase(registry, + GDataOperationRegistry::OPERATION_UPLOAD, + params.virtual_path, + profile), callback_(callback), params_(params), initiate_upload_url_(chrome_browser_net::AppendQueryParameter( @@ -720,7 +744,7 @@ GURL InitiateUploadOperation::GetURL() const { return initiate_upload_url_; } -void InitiateUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { +bool InitiateUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { GDataErrorCode code = static_cast<GDataErrorCode>(source->GetResponseCode()); @@ -739,6 +763,7 @@ void InitiateUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { relay_proxy_->PostTask(FROM_HERE, base::Bind(callback_, code, GURL(upload_location))); } + return code == HTTP_SUCCESS; } void InitiateUploadOperation::RunCallbackOnPrematureFailure( @@ -787,7 +812,10 @@ ResumeUploadOperation::ResumeUploadOperation( Profile* profile, const ResumeUploadCallback& callback, const ResumeUploadParams& params) - : UrlFetchOperationBase(registry, profile), + : UrlFetchOperationBase(registry, + GDataOperationRegistry::OPERATION_UPLOAD, + params.virtual_path, + profile), callback_(callback), params_(params) { } @@ -798,7 +826,7 @@ GURL ResumeUploadOperation::GetURL() const { return params_.upload_location; } -void ResumeUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { +bool ResumeUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { GDataErrorCode code = static_cast<GDataErrorCode>(source->GetResponseCode()); net::HttpResponseHeaders* hdrs = source->GetResponseHeaders(); int64 start_range_received = -1; @@ -843,6 +871,7 @@ void ResumeUploadOperation::ProcessURLFetchResults(const URLFetcher* source) { base::Bind(callback_, ResumeUploadResponse(code, start_range_received, end_range_received, resource_id, md5_checksum))); } + return code == HTTP_CREATED || code == HTTP_RESUME_INCOMPLETE; } void ResumeUploadOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) { @@ -884,4 +913,11 @@ bool ResumeUploadOperation::GetContentData(std::string* upload_content_type, return true; } +void ResumeUploadOperation::OnURLFetchUploadProgress( + const content::URLFetcher* source, int64 current, int64 total) { + // Adjust the progress values according to the range currently uploaded. + NotifyProgress(params_.start_range + current, params_.content_length); +} + + } // namespace gdata diff --git a/chrome/browser/chromeos/gdata/gdata_operations.h b/chrome/browser/chromeos/gdata/gdata_operations.h index 2171061..0843ea0 100644 --- a/chrome/browser/chromeos/gdata/gdata_operations.h +++ b/chrome/browser/chromeos/gdata/gdata_operations.h @@ -93,6 +93,10 @@ class UrlFetchOperationBase : public GDataOperationInterface, protected: UrlFetchOperationBase(GDataOperationRegistry* registry, Profile* profile); + UrlFetchOperationBase(GDataOperationRegistry* registry, + GDataOperationRegistry::OperationType type, + const FilePath& path, + Profile* profile); virtual ~UrlFetchOperationBase(); // Gets URL for the request. @@ -111,7 +115,7 @@ class UrlFetchOperationBase : public GDataOperationInterface, // Invoked by OnURLFetchComplete when the operation completes without an // authentication error. Must be implemented by a derived class. - virtual void ProcessURLFetchResults(const content::URLFetcher* source) = 0; + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) = 0; // Invoked by this base class upon an authentication error or cancel by // an user operation. Must be implemented by a derived class. @@ -120,15 +124,6 @@ class UrlFetchOperationBase : public GDataOperationInterface, // Implement GDataOperationRegistry::Operation virtual void DoCancel() OVERRIDE; - // Implement URLFetcherDelegate. - // TODO(kinaba): http://crosbug.com/27370 - // Current URLFetcherDelegate notifies only the progress of "download" - // transfers, and no notification for upload progress in POST/PUT. - // For some GData operations, however, progress of uploading transfer makes - // more sense. We need to add a way to track upload status. - virtual void OnURLFetchDownloadProgress(const content::URLFetcher* source, - int64 current, int64 total) OVERRIDE; - // Overridden from URLFetcherDelegate. virtual void OnURLFetchComplete(const content::URLFetcher* source) OVERRIDE; @@ -161,7 +156,7 @@ class EntryActionOperation : public UrlFetchOperationBase { protected: // Overridden from UrlFetchOperationBase. virtual GURL GetURL() const OVERRIDE; - virtual void ProcessURLFetchResults(const content::URLFetcher* source) + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) OVERRIDE; virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE; @@ -186,7 +181,7 @@ class GetDataOperation : public UrlFetchOperationBase { protected: // Overridden from UrlFetchOperationBase. - virtual void ProcessURLFetchResults(const content::URLFetcher* source) + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) OVERRIDE; virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE; @@ -248,16 +243,21 @@ class DownloadFileOperation : public UrlFetchOperationBase { DownloadFileOperation(GDataOperationRegistry* registry, Profile* profile, const DownloadActionCallback& callback, - const GURL& document_url); + const GURL& document_url, + const FilePath& virtual_path); virtual ~DownloadFileOperation(); protected: // Overridden from UrlFetchOperationBase. virtual GURL GetURL() const OVERRIDE; - virtual void ProcessURLFetchResults(const content::URLFetcher* source) + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) OVERRIDE; virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE; + // Overridden from content::URLFetcherDelegate. + virtual void OnURLFetchDownloadProgress(const content::URLFetcher* source, + int64 current, int64 total) OVERRIDE; + private: DownloadActionCallback callback_; GURL document_url_; @@ -440,7 +440,7 @@ class InitiateUploadOperation : public UrlFetchOperationBase { protected: // Overridden from UrlFetchOperationBase. virtual GURL GetURL() const OVERRIDE; - virtual void ProcessURLFetchResults(const content::URLFetcher* source) + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) OVERRIDE; virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE; @@ -472,7 +472,7 @@ class ResumeUploadOperation : public UrlFetchOperationBase { protected: // Overridden from UrlFetchOperationBase. virtual GURL GetURL() const OVERRIDE; - virtual void ProcessURLFetchResults(const content::URLFetcher* source) + virtual bool ProcessURLFetchResults(const content::URLFetcher* source) OVERRIDE; virtual void RunCallbackOnPrematureFailure(GDataErrorCode code) OVERRIDE; @@ -482,6 +482,10 @@ class ResumeUploadOperation : public UrlFetchOperationBase { virtual bool GetContentData(std::string* upload_content_type, std::string* upload_content) OVERRIDE; + // Overridden from content::UrlFetcherDelegate + virtual void OnURLFetchUploadProgress(const content::URLFetcher* source, + int64 current, int64 total) OVERRIDE; + private: ResumeUploadCallback callback_; ResumeUploadParams params_; |