Index: google_apis/drive/drive_api_requests.cc |
diff --git a/google_apis/drive/drive_api_requests.cc b/google_apis/drive/drive_api_requests.cc |
index 89f3b7b8bb8059a264a0e31646d48ff0a8825b2d..ce07586ab3c19c18e374f7a11b38f53987dba6c7 100644 |
--- a/google_apis/drive/drive_api_requests.cc |
+++ b/google_apis/drive/drive_api_requests.cc |
@@ -1168,6 +1168,7 @@ BatchUploadRequest::BatchUploadRequest( |
sender_(sender), |
url_generator_(url_generator), |
committed_(false), |
+ last_progress_value_(0), |
weak_ptr_factory_(this) { |
} |
@@ -1255,7 +1256,7 @@ void BatchUploadRequest::MayCompletePrepare() { |
// Build multipart body here. |
std::vector<ContentTypeAndData> parts; |
- for (const auto& child : child_requests_) { |
+ for (auto& child : child_requests_) { |
std::string type; |
std::string data; |
const bool result = child.request->GetContentData(&type, &data); |
@@ -1275,16 +1276,26 @@ void BatchUploadRequest::MayCompletePrepare() { |
NOTREACHED(); |
break; |
} |
+ const std::string header = base::StringPrintf( |
+ kBatchUploadRequestFormat, method.c_str(), url.path().c_str(), |
+ url_generator_.GetBatchUploadUrl().host().c_str(), type.c_str()); |
+ |
+ child.data_offset = header.size(); |
+ child.data_size = data.size(); |
parts.push_back(ContentTypeAndData()); |
parts.back().type = kHttpContentType; |
- parts.back().data = base::StringPrintf( |
- kBatchUploadRequestFormat, method.c_str(), url.path().c_str(), |
- url_generator_.GetBatchUploadUrl().host().c_str(), type.c_str()); |
+ parts.back().data = header; |
parts.back().data.append(data); |
} |
- GenerateMultipartBody(MULTIPART_MIXED, boundary_, parts, &upload_content_); |
+ std::vector<uint64> part_data_offset; |
+ GenerateMultipartBody(MULTIPART_MIXED, boundary_, parts, &upload_content_, |
+ &part_data_offset); |
+ DCHECK(part_data_offset.size() == child_requests_.size()); |
+ for (size_t i = 0; i < child_requests_.size(); ++i) { |
+ child_requests_[i].data_offset += part_data_offset[i]; |
+ } |
prepare_callback_.Run(HTTP_SUCCESS); |
} |
@@ -1351,5 +1362,21 @@ void BatchUploadRequest::RunCallbackOnPrematureFailure(DriveApiErrorCode code) { |
child_requests_.clear(); |
} |
+void BatchUploadRequest::OnURLFetchUploadProgress(const net::URLFetcher* source, |
+ int64 current, |
+ int64 total) { |
+ for (auto child : child_requests_) { |
+ if (child.data_offset <= current && |
+ current <= child.data_offset + child.data_size) { |
+ child.request->OnURLFetchUploadProgress( |
+ source, current - child.data_offset, child.data_size); |
+ } else if (last_progress_value_ < child.data_offset + child.data_size && |
+ child.data_offset + child.data_size < current) { |
+ child.request->OnURLFetchUploadProgress(source, child.data_size, |
+ child.data_size); |
+ } |
+ } |
+ last_progress_value_ = current; |
+} |
} // namespace drive |
} // namespace google_apis |