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

Side by Side Diff: google_apis/drive/base_requests.cc

Issue 1130183003: Notify upload progress from batch request to its child requests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments and fix msan test. Created 5 years, 7 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
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | google_apis/drive/drive_api_requests.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "google_apis/drive/base_requests.h" 5 #include "google_apis/drive/base_requests.h"
6 6
7 #include "base/files/file_util.h" 7 #include "base/files/file_util.h"
8 #include "base/json/json_reader.h" 8 #include "base/json/json_reader.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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 std::string* upload_content_type, 121 std::string* upload_content_type,
122 std::string* upload_content_data) { 122 std::string* upload_content_data) {
123 std::vector<google_apis::ContentTypeAndData> parts(2); 123 std::vector<google_apis::ContentTypeAndData> parts(2);
124 parts[0].type = kJsonMimeType; 124 parts[0].type = kJsonMimeType;
125 parts[0].data = metadata_json; 125 parts[0].data = metadata_json;
126 parts[1].type = content_type; 126 parts[1].type = content_type;
127 if (!ReadFileToString(path, &parts[1].data)) 127 if (!ReadFileToString(path, &parts[1].data))
128 return false; 128 return false;
129 129
130 google_apis::ContentTypeAndData output; 130 google_apis::ContentTypeAndData output;
131 GenerateMultipartBody( 131 GenerateMultipartBody(google_apis::MULTIPART_RELATED, predetermined_boundary,
132 google_apis::MULTIPART_RELATED, predetermined_boundary, parts, &output); 132 parts, &output, nullptr);
133 upload_content_type->swap(output.type); 133 upload_content_type->swap(output.type);
134 upload_content_data->swap(output.data); 134 upload_content_data->swap(output.data);
135 return true; 135 return true;
136 } 136 }
137 137
138 } // namespace 138 } // namespace
139 139
140 namespace google_apis { 140 namespace google_apis {
141 141
142 scoped_ptr<base::Value> ParseJson(const std::string& json) { 142 scoped_ptr<base::Value> ParseJson(const std::string& json) {
(...skipping 16 matching lines...) Expand all
159 } 159 }
160 LOG(WARNING) << "Error while parsing entry response: " << error_message 160 LOG(WARNING) << "Error while parsing entry response: " << error_message
161 << ", code: " << error_code << ", json:\n" << trimmed_json; 161 << ", code: " << error_code << ", json:\n" << trimmed_json;
162 } 162 }
163 return value.Pass(); 163 return value.Pass();
164 } 164 }
165 165
166 void GenerateMultipartBody(MultipartType multipart_type, 166 void GenerateMultipartBody(MultipartType multipart_type,
167 const std::string& predetermined_boundary, 167 const std::string& predetermined_boundary,
168 const std::vector<ContentTypeAndData>& parts, 168 const std::vector<ContentTypeAndData>& parts,
169 ContentTypeAndData* output) { 169 ContentTypeAndData* output,
170 std::vector<uint64>* data_offset) {
170 std::string boundary; 171 std::string boundary;
171 // Generate random boundary. 172 // Generate random boundary.
172 if (predetermined_boundary.empty()) { 173 if (predetermined_boundary.empty()) {
173 while (true) { 174 while (true) {
174 boundary.resize(kBoundarySize); 175 boundary.resize(kBoundarySize);
175 for (int i = 0; i < kBoundarySize; ++i) { 176 for (int i = 0; i < kBoundarySize; ++i) {
176 // Subtract 2 from the array size to exclude '\0', and to turn the size 177 // Subtract 2 from the array size to exclude '\0', and to turn the size
177 // into the last index. 178 // into the last index.
178 const int last_char_index = arraysize(kBoundaryCharacters) - 2; 179 const int last_char_index = arraysize(kBoundaryCharacters) - 2;
179 boundary[i] = kBoundaryCharacters[base::RandInt(0, last_char_index)]; 180 boundary[i] = kBoundaryCharacters[base::RandInt(0, last_char_index)];
(...skipping 15 matching lines...) Expand all
195 switch (multipart_type) { 196 switch (multipart_type) {
196 case MULTIPART_RELATED: 197 case MULTIPART_RELATED:
197 output->type = kMultipartRelatedMimeTypePrefix + boundary; 198 output->type = kMultipartRelatedMimeTypePrefix + boundary;
198 break; 199 break;
199 case MULTIPART_MIXED: 200 case MULTIPART_MIXED:
200 output->type = kMultipartMixedMimeTypePrefix + boundary; 201 output->type = kMultipartMixedMimeTypePrefix + boundary;
201 break; 202 break;
202 } 203 }
203 204
204 output->data.clear(); 205 output->data.clear();
206 if (data_offset)
207 data_offset->clear();
205 for (auto& part : parts) { 208 for (auto& part : parts) {
206 output->data.append(base::StringPrintf( 209 output->data.append(base::StringPrintf(
207 kMultipartItemHeaderFormat, boundary.c_str(), part.type.c_str())); 210 kMultipartItemHeaderFormat, boundary.c_str(), part.type.c_str()));
211 if (data_offset)
212 data_offset->push_back(output->data.size());
208 output->data.append(part.data); 213 output->data.append(part.data);
209 output->data.append("\n"); 214 output->data.append("\n");
210 } 215 }
211 output->data.append( 216 output->data.append(
212 base::StringPrintf(kMultipartFooterFormat, boundary.c_str())); 217 base::StringPrintf(kMultipartFooterFormat, boundary.c_str()));
213 } 218 }
214 219
215 //=========================== ResponseWriter ================================== 220 //=========================== ResponseWriter ==================================
216 ResponseWriter::ResponseWriter(base::SequencedTaskRunner* file_task_runner, 221 ResponseWriter::ResponseWriter(base::SequencedTaskRunner* file_task_runner,
217 const base::FilePath& file_path, 222 const base::FilePath& file_path,
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 download_action_callback_.Run(code, temp_file); 1015 download_action_callback_.Run(code, temp_file);
1011 OnProcessURLFetchResultsComplete(); 1016 OnProcessURLFetchResultsComplete();
1012 } 1017 }
1013 1018
1014 void DownloadFileRequestBase::RunCallbackOnPrematureFailure( 1019 void DownloadFileRequestBase::RunCallbackOnPrematureFailure(
1015 DriveApiErrorCode code) { 1020 DriveApiErrorCode code) {
1016 download_action_callback_.Run(code, base::FilePath()); 1021 download_action_callback_.Run(code, base::FilePath());
1017 } 1022 }
1018 1023
1019 } // namespace google_apis 1024 } // namespace google_apis
OLDNEW
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | google_apis/drive/drive_api_requests.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698