summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-19 19:29:24 +0000
committerkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-19 19:29:24 +0000
commit19331e339db762b810aee2b18226cafada8078bb (patch)
tree9488b475b489eb71a6ddfb6af8d0f9d06d9c6fe7
parent22513e0a3516e64505321dac8eea5046030e7cff (diff)
downloadchromium_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.cc2
-rw-r--r--chrome/browser/chromeos/gdata/gdata_operation_registry.cc2
-rw-r--r--chrome/browser/chromeos/gdata/gdata_operations.cc72
-rw-r--r--chrome/browser/chromeos/gdata/gdata_operations.h36
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_;