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 "google_apis/drive/drive_api_requests.h" | 5 #include "google_apis/drive/drive_api_requests.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 base::StringPiece TrimTransportPadding(const base::StringPiece& piece) { | 156 base::StringPiece TrimTransportPadding(const base::StringPiece& piece) { |
157 size_t trim_size = 0; | 157 size_t trim_size = 0; |
158 while (trim_size < piece.size() && | 158 while (trim_size < piece.size() && |
159 (piece[piece.size() - 1 - trim_size] == ' ' || | 159 (piece[piece.size() - 1 - trim_size] == ' ' || |
160 piece[piece.size() - 1 - trim_size] == '\t')) { | 160 piece[piece.size() - 1 - trim_size] == '\t')) { |
161 ++trim_size; | 161 ++trim_size; |
162 } | 162 } |
163 return piece.substr(0, piece.size() - trim_size); | 163 return piece.substr(0, piece.size() - trim_size); |
164 } | 164 } |
165 | 165 |
166 void EmptyClosure(scoped_ptr<BatchableDelegate>) { | |
167 } | |
168 | |
166 } // namespace | 169 } // namespace |
167 | 170 |
168 MultipartHttpResponse::MultipartHttpResponse() : code(HTTP_SUCCESS) { | 171 MultipartHttpResponse::MultipartHttpResponse() : code(HTTP_SUCCESS) { |
169 } | 172 } |
170 | 173 |
171 MultipartHttpResponse::~MultipartHttpResponse() { | 174 MultipartHttpResponse::~MultipartHttpResponse() { |
172 } | 175 } |
173 | 176 |
174 // The |response| must be multipart/mixed format that contains child HTTP | 177 // The |response| must be multipart/mixed format that contains child HTTP |
175 // response of drive batch request. | 178 // response of drive batch request. |
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
964 | 967 |
965 GetUploadStatusRequest::~GetUploadStatusRequest() {} | 968 GetUploadStatusRequest::~GetUploadStatusRequest() {} |
966 | 969 |
967 void GetUploadStatusRequest::OnRangeRequestComplete( | 970 void GetUploadStatusRequest::OnRangeRequestComplete( |
968 const UploadRangeResponse& response, | 971 const UploadRangeResponse& response, |
969 scoped_ptr<base::Value> value) { | 972 scoped_ptr<base::Value> value) { |
970 DCHECK(CalledOnValidThread()); | 973 DCHECK(CalledOnValidThread()); |
971 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass()); | 974 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass()); |
972 } | 975 } |
973 | 976 |
974 //======================= MultipartUploadNewFileRequest ======================= | 977 //======================= MultipartUploadNewFileDelegate ======================= |
975 | 978 |
976 MultipartUploadNewFileRequest::MultipartUploadNewFileRequest( | 979 MultipartUploadNewFileDelegate::MultipartUploadNewFileDelegate( |
977 RequestSender* sender, | 980 RequestSender* sender, |
978 const std::string& title, | 981 const std::string& title, |
979 const std::string& parent_resource_id, | 982 const std::string& parent_resource_id, |
980 const std::string& content_type, | 983 const std::string& content_type, |
981 int64 content_length, | 984 int64 content_length, |
982 const base::Time& modified_date, | 985 const base::Time& modified_date, |
983 const base::Time& last_viewed_by_me_date, | 986 const base::Time& last_viewed_by_me_date, |
984 const base::FilePath& local_file_path, | 987 const base::FilePath& local_file_path, |
985 const Properties& properties, | 988 const Properties& properties, |
986 const DriveApiUrlGenerator& url_generator, | 989 const DriveApiUrlGenerator& url_generator, |
987 const FileResourceCallback& callback, | 990 const FileResourceCallback& callback, |
988 const ProgressCallback& progress_callback) | 991 const ProgressCallback& progress_callback) |
989 : MultipartUploadRequestBase( | 992 : MultipartUploadRequestBase( |
990 sender, | 993 sender->blocking_task_runner(), |
991 CreateMultipartUploadMetadataJson(title, | 994 CreateMultipartUploadMetadataJson(title, |
992 parent_resource_id, | 995 parent_resource_id, |
993 modified_date, | 996 modified_date, |
994 last_viewed_by_me_date, | 997 last_viewed_by_me_date, |
995 properties), | 998 properties), |
996 content_type, | 999 content_type, |
997 content_length, | 1000 content_length, |
998 local_file_path, | 1001 local_file_path, |
999 callback, | 1002 callback, |
1000 progress_callback), | 1003 progress_callback), |
1001 has_modified_date_(!modified_date.is_null()), | 1004 has_modified_date_(!modified_date.is_null()), |
1002 url_generator_(url_generator) { | 1005 url_generator_(url_generator) { |
1003 } | 1006 } |
1004 | 1007 |
1005 MultipartUploadNewFileRequest::~MultipartUploadNewFileRequest() { | 1008 MultipartUploadNewFileDelegate::~MultipartUploadNewFileDelegate() { |
1006 } | 1009 } |
1007 | 1010 |
1008 GURL MultipartUploadNewFileRequest::GetURL() const { | 1011 GURL MultipartUploadNewFileDelegate::GetURL() const { |
1009 return url_generator_.GetMultipartUploadNewFileUrl(has_modified_date_); | 1012 return url_generator_.GetMultipartUploadNewFileUrl(has_modified_date_); |
1010 } | 1013 } |
1011 | 1014 |
1012 net::URLFetcher::RequestType MultipartUploadNewFileRequest::GetRequestType() | 1015 net::URLFetcher::RequestType MultipartUploadNewFileDelegate::GetRequestType() |
1013 const { | 1016 const { |
1014 return net::URLFetcher::POST; | 1017 return net::URLFetcher::POST; |
1015 } | 1018 } |
1016 | 1019 |
1017 //======================= MultipartUploadExistingFileRequest =================== | 1020 //====================== MultipartUploadExistingFileDelegate =================== |
1018 | 1021 |
1019 MultipartUploadExistingFileRequest::MultipartUploadExistingFileRequest( | 1022 MultipartUploadExistingFileDelegate::MultipartUploadExistingFileDelegate( |
1020 RequestSender* sender, | 1023 RequestSender* sender, |
1021 const std::string& title, | 1024 const std::string& title, |
1022 const std::string& resource_id, | 1025 const std::string& resource_id, |
1023 const std::string& parent_resource_id, | 1026 const std::string& parent_resource_id, |
1024 const std::string& content_type, | 1027 const std::string& content_type, |
1025 int64 content_length, | 1028 int64 content_length, |
1026 const base::Time& modified_date, | 1029 const base::Time& modified_date, |
1027 const base::Time& last_viewed_by_me_date, | 1030 const base::Time& last_viewed_by_me_date, |
1028 const base::FilePath& local_file_path, | 1031 const base::FilePath& local_file_path, |
1029 const std::string& etag, | 1032 const std::string& etag, |
1030 const Properties& properties, | 1033 const Properties& properties, |
1031 const DriveApiUrlGenerator& url_generator, | 1034 const DriveApiUrlGenerator& url_generator, |
1032 const FileResourceCallback& callback, | 1035 const FileResourceCallback& callback, |
1033 const ProgressCallback& progress_callback) | 1036 const ProgressCallback& progress_callback) |
1034 : MultipartUploadRequestBase( | 1037 : MultipartUploadRequestBase( |
1035 sender, | 1038 sender->blocking_task_runner(), |
1036 CreateMultipartUploadMetadataJson(title, | 1039 CreateMultipartUploadMetadataJson(title, |
1037 parent_resource_id, | 1040 parent_resource_id, |
1038 modified_date, | 1041 modified_date, |
1039 last_viewed_by_me_date, | 1042 last_viewed_by_me_date, |
1040 properties), | 1043 properties), |
1041 content_type, | 1044 content_type, |
1042 content_length, | 1045 content_length, |
1043 local_file_path, | 1046 local_file_path, |
1044 callback, | 1047 callback, |
1045 progress_callback), | 1048 progress_callback), |
1046 resource_id_(resource_id), | 1049 resource_id_(resource_id), |
1047 etag_(etag), | 1050 etag_(etag), |
1048 has_modified_date_(!modified_date.is_null()), | 1051 has_modified_date_(!modified_date.is_null()), |
1049 url_generator_(url_generator) { | 1052 url_generator_(url_generator) { |
1050 } | 1053 } |
1051 | 1054 |
1052 MultipartUploadExistingFileRequest::~MultipartUploadExistingFileRequest() { | 1055 MultipartUploadExistingFileDelegate::~MultipartUploadExistingFileDelegate() { |
1053 } | 1056 } |
1054 | 1057 |
1055 std::vector<std::string> | 1058 std::vector<std::string> |
1056 MultipartUploadExistingFileRequest::GetExtraRequestHeaders() const { | 1059 MultipartUploadExistingFileDelegate::GetExtraRequestHeaders() const { |
1057 std::vector<std::string> headers( | 1060 std::vector<std::string> headers( |
1058 MultipartUploadRequestBase::GetExtraRequestHeaders()); | 1061 MultipartUploadRequestBase::GetExtraRequestHeaders()); |
1059 headers.push_back(util::GenerateIfMatchHeader(etag_)); | 1062 headers.push_back(util::GenerateIfMatchHeader(etag_)); |
1060 return headers; | 1063 return headers; |
1061 } | 1064 } |
1062 | 1065 |
1063 GURL MultipartUploadExistingFileRequest::GetURL() const { | 1066 GURL MultipartUploadExistingFileDelegate::GetURL() const { |
1064 return url_generator_.GetMultipartUploadExistingFileUrl(resource_id_, | 1067 return url_generator_.GetMultipartUploadExistingFileUrl(resource_id_, |
1065 has_modified_date_); | 1068 has_modified_date_); |
1066 } | 1069 } |
1067 | 1070 |
1068 net::URLFetcher::RequestType | 1071 net::URLFetcher::RequestType |
1069 MultipartUploadExistingFileRequest::GetRequestType() const { | 1072 MultipartUploadExistingFileDelegate::GetRequestType() const { |
1070 return net::URLFetcher::PUT; | 1073 return net::URLFetcher::PUT; |
1071 } | 1074 } |
1072 | 1075 |
1073 //========================== DownloadFileRequest ========================== | 1076 //========================== DownloadFileRequest ========================== |
1074 | 1077 |
1075 DownloadFileRequest::DownloadFileRequest( | 1078 DownloadFileRequest::DownloadFileRequest( |
1076 RequestSender* sender, | 1079 RequestSender* sender, |
1077 const DriveApiUrlGenerator& url_generator, | 1080 const DriveApiUrlGenerator& url_generator, |
1078 const std::string& resource_id, | 1081 const std::string& resource_id, |
1079 const base::FilePath& output_file_path, | 1082 const base::FilePath& output_file_path, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1152 list->AppendString("commenter"); | 1155 list->AppendString("commenter"); |
1153 root.Set("additionalRoles", list); | 1156 root.Set("additionalRoles", list); |
1154 } | 1157 } |
1155 break; | 1158 break; |
1156 } | 1159 } |
1157 root.SetString("value", value_); | 1160 root.SetString("value", value_); |
1158 base::JSONWriter::Write(&root, upload_content); | 1161 base::JSONWriter::Write(&root, upload_content); |
1159 return true; | 1162 return true; |
1160 } | 1163 } |
1161 | 1164 |
1165 //======================= SingleBatchableDelegateRequest ======================= | |
1166 | |
1167 SingleBatchableDelegateRequest::SingleBatchableDelegateRequest( | |
1168 RequestSender* sender, | |
1169 BatchableDelegate* delegate) | |
1170 : UrlFetchRequestBase(sender), | |
1171 delegate_(delegate), | |
1172 weak_ptr_factory_(this) { | |
1173 } | |
1174 | |
1175 SingleBatchableDelegateRequest::~SingleBatchableDelegateRequest() { | |
1176 } | |
1177 | |
1178 GURL SingleBatchableDelegateRequest::GetURL() const { | |
1179 return delegate_->GetURL(); | |
1180 } | |
1181 | |
1182 net::URLFetcher::RequestType SingleBatchableDelegateRequest::GetRequestType() | |
1183 const { | |
1184 return delegate_->GetRequestType(); | |
1185 } | |
1186 | |
1187 std::vector<std::string> | |
1188 SingleBatchableDelegateRequest::GetExtraRequestHeaders() const { | |
1189 return delegate_->GetExtraRequestHeaders(); | |
1190 } | |
1191 | |
1192 void SingleBatchableDelegateRequest::Prepare(const PrepareCallback& callback) { | |
1193 delegate_->Prepare(callback); | |
1194 } | |
1195 | |
1196 bool SingleBatchableDelegateRequest::GetContentData( | |
1197 std::string* upload_content_type, | |
1198 std::string* upload_content) { | |
1199 return delegate_->GetContentData(upload_content_type, upload_content); | |
1200 } | |
1201 | |
1202 void SingleBatchableDelegateRequest::ProcessURLFetchResults( | |
1203 const net::URLFetcher* source) { | |
1204 delegate_->NotifyResult( | |
1205 GetErrorCode(), response_writer()->data(), | |
1206 base::Bind( | |
1207 &SingleBatchableDelegateRequest::OnProcessURLFetchResultsComplete, | |
1208 weak_ptr_factory_.GetWeakPtr())); | |
1209 } | |
1210 | |
1211 void SingleBatchableDelegateRequest::RunCallbackOnPrematureFailure( | |
1212 DriveApiErrorCode code) { | |
1213 delegate_->NotifyError(code); | |
1214 } | |
1215 | |
1216 void SingleBatchableDelegateRequest::OnURLFetchUploadProgress( | |
1217 const net::URLFetcher* source, | |
1218 int64 current, | |
1219 int64 total) { | |
1220 delegate_->NotifyUploadProgress(source, current, total); | |
1221 } | |
1222 | |
1162 //========================== BatchUploadRequest ========================== | 1223 //========================== BatchUploadRequest ========================== |
1163 | 1224 |
1225 BatchUploadChildEntry::BatchUploadChildEntry(BatchableDelegate* request) | |
1226 : request(request), prepared(false), data_offset(0), data_size(0) { | |
1227 } | |
1228 | |
1229 BatchUploadChildEntry::~BatchUploadChildEntry() { | |
1230 } | |
1231 | |
1164 BatchUploadRequest::BatchUploadRequest( | 1232 BatchUploadRequest::BatchUploadRequest( |
1165 RequestSender* sender, | 1233 RequestSender* sender, |
1166 const DriveApiUrlGenerator& url_generator) | 1234 const DriveApiUrlGenerator& url_generator) |
1167 : UrlFetchRequestBase(sender), | 1235 : UrlFetchRequestBase(sender), |
1168 sender_(sender), | 1236 sender_(sender), |
1169 url_generator_(url_generator), | 1237 url_generator_(url_generator), |
1170 committed_(false), | 1238 committed_(false), |
1171 last_progress_value_(0), | 1239 last_progress_value_(0), |
1172 weak_ptr_factory_(this) { | 1240 weak_ptr_factory_(this) { |
1173 } | 1241 } |
1174 | 1242 |
1175 BatchUploadRequest::~BatchUploadRequest() { | 1243 BatchUploadRequest::~BatchUploadRequest() { |
1176 for (const auto& child : child_requests_) { | |
1177 // Request will be deleted in |RequestFinished| method. | |
1178 sender_->RequestFinished(child.request); | |
1179 } | |
1180 } | 1244 } |
1181 | 1245 |
1182 void BatchUploadRequest::SetBoundaryForTesting(const std::string& boundary) { | 1246 void BatchUploadRequest::SetBoundaryForTesting(const std::string& boundary) { |
1183 boundary_ = boundary; | 1247 boundary_ = boundary; |
1184 } | 1248 } |
1185 | 1249 |
1186 void BatchUploadRequest::AddRequest(BatchableRequestBase* request) { | 1250 void BatchUploadRequest::AddRequest(BatchableDelegate* request) { |
1187 DCHECK(CalledOnValidThread()); | 1251 DCHECK(CalledOnValidThread()); |
1188 DCHECK(request); | 1252 DCHECK(request); |
1189 DCHECK(GetChildEntry(request) == child_requests_.end()); | 1253 DCHECK(GetChildEntry(request) == child_requests_.end()); |
1190 DCHECK(!committed_); | 1254 DCHECK(!committed_); |
1191 child_requests_.push_back(BatchUploadChildEntry(request)); | 1255 child_requests_.push_back(new BatchUploadChildEntry(request)); |
1192 request->Prepare(base::Bind(&BatchUploadRequest::OnChildRequestPrepared, | 1256 request->Prepare(base::Bind(&BatchUploadRequest::OnChildRequestPrepared, |
1193 weak_ptr_factory_.GetWeakPtr(), request)); | 1257 weak_ptr_factory_.GetWeakPtr(), request)); |
1194 } | 1258 } |
1195 | 1259 |
1196 void BatchUploadRequest::OnChildRequestPrepared(RequestID request_id, | 1260 void BatchUploadRequest::OnChildRequestPrepared(RequestID request_id, |
1197 DriveApiErrorCode result) { | 1261 DriveApiErrorCode result) { |
1198 DCHECK(CalledOnValidThread()); | 1262 DCHECK(CalledOnValidThread()); |
1199 auto const child = GetChildEntry(request_id); | 1263 auto const child = GetChildEntry(request_id); |
1200 DCHECK(child != child_requests_.end()); | 1264 DCHECK(child != child_requests_.end()); |
1201 if (IsSuccessfulDriveApiErrorCode(result)) { | 1265 if (IsSuccessfulDriveApiErrorCode(result)) { |
1202 child->prepared = true; | 1266 (*child)->prepared = true; |
1203 } else { | 1267 } else { |
1204 child->request->RunCallbackOnPrematureFailure(result); | 1268 (*child)->request->NotifyError(result); |
1205 sender_->RequestFinished(child->request); | |
1206 child_requests_.erase(child); | 1269 child_requests_.erase(child); |
1207 } | 1270 } |
1208 MayCompletePrepare(); | 1271 MayCompletePrepare(); |
1209 } | 1272 } |
1210 | 1273 |
1211 void BatchUploadRequest::Commit() { | 1274 void BatchUploadRequest::Commit() { |
1212 DCHECK(CalledOnValidThread()); | 1275 DCHECK(CalledOnValidThread()); |
1213 DCHECK(!committed_); | 1276 DCHECK(!committed_); |
1214 if (child_requests_.empty()) { | 1277 if (child_requests_.empty()) { |
1215 Cancel(); | 1278 Cancel(); |
1216 } else { | 1279 } else { |
1217 committed_ = true; | 1280 committed_ = true; |
1218 MayCompletePrepare(); | 1281 MayCompletePrepare(); |
1219 } | 1282 } |
1220 } | 1283 } |
1221 | 1284 |
1222 void BatchUploadRequest::Prepare(const PrepareCallback& callback) { | 1285 void BatchUploadRequest::Prepare(const PrepareCallback& callback) { |
1223 DCHECK(CalledOnValidThread()); | 1286 DCHECK(CalledOnValidThread()); |
1224 DCHECK(!callback.is_null()); | 1287 DCHECK(!callback.is_null()); |
1225 prepare_callback_ = callback; | 1288 prepare_callback_ = callback; |
1226 MayCompletePrepare(); | 1289 MayCompletePrepare(); |
1227 } | 1290 } |
1228 | 1291 |
1229 void BatchUploadRequest::Cancel() { | 1292 void BatchUploadRequest::Cancel() { |
1230 for (auto& child : child_requests_) { | |
1231 // Request cancel should delete the request instance. | |
1232 child.request->Cancel(); | |
1233 } | |
1234 child_requests_.clear(); | 1293 child_requests_.clear(); |
1235 UrlFetchRequestBase::Cancel(); | 1294 UrlFetchRequestBase::Cancel(); |
1236 } | 1295 } |
1237 | 1296 |
1238 // Obtains corresponding child entry of |request_id|. Returns NULL if the | 1297 // Obtains corresponding child entry of |request_id|. Returns NULL if the |
1239 // entry is not found. | 1298 // entry is not found. |
1240 std::vector<BatchUploadChildEntry>::iterator BatchUploadRequest::GetChildEntry( | 1299 ScopedVector<BatchUploadChildEntry>::iterator BatchUploadRequest::GetChildEntry( |
1241 RequestID request_id) { | 1300 RequestID request_id) { |
1242 for (auto it = child_requests_.begin(); it != child_requests_.end(); ++it) { | 1301 for (auto it = child_requests_.begin(); it != child_requests_.end(); ++it) { |
1243 if (it->request == request_id) | 1302 if ((*it)->request.get() == request_id) |
1244 return it; | 1303 return it; |
1245 } | 1304 } |
1246 return child_requests_.end(); | 1305 return child_requests_.end(); |
1247 } | 1306 } |
1248 | 1307 |
1249 void BatchUploadRequest::MayCompletePrepare() { | 1308 void BatchUploadRequest::MayCompletePrepare() { |
1250 if (!committed_ || prepare_callback_.is_null()) | 1309 if (!committed_ || prepare_callback_.is_null()) |
1251 return; | 1310 return; |
1252 for (const auto& child : child_requests_) { | 1311 for (const auto& child : child_requests_) { |
1253 if (!child.prepared) | 1312 if (!child->prepared) |
1254 return; | 1313 return; |
1255 } | 1314 } |
1256 | 1315 |
1257 // Build multipart body here. | 1316 // Build multipart body here. |
1258 std::vector<ContentTypeAndData> parts; | 1317 std::vector<ContentTypeAndData> parts; |
1259 for (auto& child : child_requests_) { | 1318 for (auto& child : child_requests_) { |
1260 std::string type; | 1319 std::string type; |
1261 std::string data; | 1320 std::string data; |
1262 const bool result = child.request->GetContentData(&type, &data); | 1321 const bool result = child->request->GetContentData(&type, &data); |
1263 // Upload request must have content data. | 1322 // Upload request must have content data. |
1264 DCHECK(result); | 1323 DCHECK(result); |
1265 | 1324 |
1266 const GURL url = child.request->GetURL(); | 1325 const GURL url = child->request->GetURL(); |
1267 std::string method; | 1326 std::string method; |
1268 switch (child.request->GetRequestType()) { | 1327 switch (child->request->GetRequestType()) { |
1269 case net::URLFetcher::POST: | 1328 case net::URLFetcher::POST: |
1270 method = "POST"; | 1329 method = "POST"; |
1271 break; | 1330 break; |
1272 case net::URLFetcher::PUT: | 1331 case net::URLFetcher::PUT: |
1273 method = "PUT"; | 1332 method = "PUT"; |
1274 break; | 1333 break; |
1275 default: | 1334 default: |
1276 NOTREACHED(); | 1335 NOTREACHED(); |
1277 break; | 1336 break; |
1278 } | 1337 } |
1279 const std::string header = base::StringPrintf( | 1338 const std::string header = base::StringPrintf( |
1280 kBatchUploadRequestFormat, method.c_str(), url.path().c_str(), | 1339 kBatchUploadRequestFormat, method.c_str(), url.path().c_str(), |
1281 url_generator_.GetBatchUploadUrl().host().c_str(), type.c_str()); | 1340 url_generator_.GetBatchUploadUrl().host().c_str(), type.c_str()); |
1282 | 1341 |
1283 child.data_offset = header.size(); | 1342 child->data_offset = header.size(); |
1284 child.data_size = data.size(); | 1343 child->data_size = data.size(); |
1285 | 1344 |
1286 parts.push_back(ContentTypeAndData()); | 1345 parts.push_back(ContentTypeAndData()); |
1287 parts.back().type = kHttpContentType; | 1346 parts.back().type = kHttpContentType; |
1288 parts.back().data = header; | 1347 parts.back().data = header; |
1289 parts.back().data.append(data); | 1348 parts.back().data.append(data); |
1290 } | 1349 } |
1291 | 1350 |
1292 std::vector<uint64> part_data_offset; | 1351 std::vector<uint64> part_data_offset; |
1293 GenerateMultipartBody(MULTIPART_MIXED, boundary_, parts, &upload_content_, | 1352 GenerateMultipartBody(MULTIPART_MIXED, boundary_, parts, &upload_content_, |
1294 &part_data_offset); | 1353 &part_data_offset); |
1295 DCHECK(part_data_offset.size() == child_requests_.size()); | 1354 DCHECK(part_data_offset.size() == child_requests_.size()); |
1296 for (size_t i = 0; i < child_requests_.size(); ++i) { | 1355 for (size_t i = 0; i < child_requests_.size(); ++i) { |
1297 child_requests_[i].data_offset += part_data_offset[i]; | 1356 child_requests_[i]->data_offset += part_data_offset[i]; |
1298 } | 1357 } |
1299 prepare_callback_.Run(HTTP_SUCCESS); | 1358 prepare_callback_.Run(HTTP_SUCCESS); |
1300 } | 1359 } |
1301 | 1360 |
1302 bool BatchUploadRequest::GetContentData(std::string* upload_content_type, | 1361 bool BatchUploadRequest::GetContentData(std::string* upload_content_type, |
1303 std::string* upload_content_data) { | 1362 std::string* upload_content_data) { |
1304 upload_content_type->assign(upload_content_.type); | 1363 upload_content_type->assign(upload_content_.type); |
1305 upload_content_data->assign(upload_content_.data); | 1364 upload_content_data->assign(upload_content_.data); |
1306 return true; | 1365 return true; |
1307 } | 1366 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1339 std::vector<MultipartHttpResponse> parts; | 1398 std::vector<MultipartHttpResponse> parts; |
1340 if (!ParseMultipartResponse(content_type, response_writer()->data(), | 1399 if (!ParseMultipartResponse(content_type, response_writer()->data(), |
1341 &parts) || | 1400 &parts) || |
1342 child_requests_.size() != parts.size()) { | 1401 child_requests_.size() != parts.size()) { |
1343 RunCallbackOnPrematureFailure(DRIVE_PARSE_ERROR); | 1402 RunCallbackOnPrematureFailure(DRIVE_PARSE_ERROR); |
1344 sender_->RequestFinished(this); | 1403 sender_->RequestFinished(this); |
1345 return; | 1404 return; |
1346 } | 1405 } |
1347 | 1406 |
1348 for (size_t i = 0; i < parts.size(); ++i) { | 1407 for (size_t i = 0; i < parts.size(); ++i) { |
1349 child_requests_[i].request->ProcessURLFetchResults(parts[i].code, | 1408 BatchableDelegate* const delegate = child_requests_[i]->request.get(); |
1350 parts[i].body); | 1409 // Pass onwership of |delegate| so that it is deleted after notifying. |
kinaba
2015/05/14 04:16:40
I think there's a room for improvement on this com
hirono
2015/05/14 04:43:12
Thank you for the suggestion. I just copied the co
| |
1410 delegate->NotifyResult( | |
1411 parts[i].code, parts[i].body, | |
1412 base::Bind(&EmptyClosure, base::Passed(&child_requests_[i]->request))); | |
1351 } | 1413 } |
1414 child_requests_.clear(); | |
1352 | 1415 |
1353 child_requests_.clear(); | |
1354 sender_->RequestFinished(this); | 1416 sender_->RequestFinished(this); |
1355 } | 1417 } |
1356 | 1418 |
1357 void BatchUploadRequest::RunCallbackOnPrematureFailure(DriveApiErrorCode code) { | 1419 void BatchUploadRequest::RunCallbackOnPrematureFailure(DriveApiErrorCode code) { |
1358 for (auto child : child_requests_) { | 1420 for (auto child : child_requests_) { |
1359 child.request->RunCallbackOnPrematureFailure(code); | 1421 child->request->NotifyError(code); |
1360 sender_->RequestFinished(child.request); | |
1361 } | 1422 } |
1362 child_requests_.clear(); | 1423 child_requests_.clear(); |
1363 } | 1424 } |
1364 | 1425 |
1365 void BatchUploadRequest::OnURLFetchUploadProgress(const net::URLFetcher* source, | 1426 void BatchUploadRequest::OnURLFetchUploadProgress(const net::URLFetcher* source, |
1366 int64 current, | 1427 int64 current, |
1367 int64 total) { | 1428 int64 total) { |
1368 for (auto child : child_requests_) { | 1429 for (auto child : child_requests_) { |
1369 if (child.data_offset <= current && | 1430 if (child->data_offset <= current && |
1370 current <= child.data_offset + child.data_size) { | 1431 current <= child->data_offset + child->data_size) { |
1371 child.request->OnURLFetchUploadProgress( | 1432 child->request->NotifyUploadProgress(source, current - child->data_offset, |
1372 source, current - child.data_offset, child.data_size); | 1433 child->data_size); |
1373 } else if (last_progress_value_ < child.data_offset + child.data_size && | 1434 } else if (last_progress_value_ < child->data_offset + child->data_size && |
1374 child.data_offset + child.data_size < current) { | 1435 child->data_offset + child->data_size < current) { |
1375 child.request->OnURLFetchUploadProgress(source, child.data_size, | 1436 child->request->NotifyUploadProgress(source, child->data_size, |
1376 child.data_size); | 1437 child->data_size); |
1377 } | 1438 } |
1378 } | 1439 } |
1379 last_progress_value_ = current; | 1440 last_progress_value_ = current; |
1380 } | 1441 } |
1381 } // namespace drive | 1442 } // namespace drive |
1382 } // namespace google_apis | 1443 } // namespace google_apis |
OLD | NEW |