OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/google_apis/gdata_wapi_requests.h" | |
6 | |
7 #include "base/location.h" | |
8 #include "base/sequenced_task_runner.h" | |
9 #include "base/task_runner_util.h" | |
10 #include "base/values.h" | |
11 #include "chrome/browser/google_apis/gdata_wapi_parser.h" | |
12 #include "chrome/browser/google_apis/gdata_wapi_url_generator.h" | |
13 #include "chrome/browser/google_apis/request_sender.h" | |
14 #include "chrome/browser/google_apis/request_util.h" | |
15 #include "third_party/libxml/chromium/libxml_utils.h" | |
16 | |
17 using net::URLFetcher; | |
18 | |
19 namespace google_apis { | |
20 | |
21 namespace { | |
22 | |
23 // Parses the JSON value to ResourceList. | |
24 scoped_ptr<ResourceList> ParseResourceListOnBlockingPool( | |
25 scoped_ptr<base::Value> value) { | |
26 DCHECK(value); | |
27 | |
28 return ResourceList::ExtractAndParse(*value); | |
29 } | |
30 | |
31 // Runs |callback| with |error| and |resource_list|, but replace the error code | |
32 // with GDATA_PARSE_ERROR, if there was a parsing error. | |
33 void DidParseResourceListOnBlockingPool( | |
34 const GetResourceListCallback& callback, | |
35 GDataErrorCode error, | |
36 scoped_ptr<ResourceList> resource_list) { | |
37 DCHECK(!callback.is_null()); | |
38 | |
39 // resource_list being NULL indicates there was a parsing error. | |
40 if (!resource_list) | |
41 error = GDATA_PARSE_ERROR; | |
42 | |
43 callback.Run(error, resource_list.Pass()); | |
44 } | |
45 | |
46 // Parses the JSON value to ResourceList on the blocking pool and runs | |
47 // |callback| on the UI thread once parsing is done. | |
48 void ParseResourceListAndRun( | |
49 scoped_refptr<base::TaskRunner> blocking_task_runner, | |
50 const GetResourceListCallback& callback, | |
51 GDataErrorCode error, | |
52 scoped_ptr<base::Value> value) { | |
53 DCHECK(!callback.is_null()); | |
54 | |
55 if (!value) { | |
56 callback.Run(error, scoped_ptr<ResourceList>()); | |
57 return; | |
58 } | |
59 | |
60 base::PostTaskAndReplyWithResult( | |
61 blocking_task_runner, | |
62 FROM_HERE, | |
63 base::Bind(&ParseResourceListOnBlockingPool, base::Passed(&value)), | |
64 base::Bind(&DidParseResourceListOnBlockingPool, callback, error)); | |
65 } | |
66 | |
67 // Parses the JSON value to AccountMetadata and runs |callback| on the UI | |
68 // thread once parsing is done. | |
69 void ParseAccounetMetadataAndRun(const GetAccountMetadataCallback& callback, | |
70 GDataErrorCode error, | |
71 scoped_ptr<base::Value> value) { | |
72 DCHECK(!callback.is_null()); | |
73 | |
74 if (!value) { | |
75 callback.Run(error, scoped_ptr<AccountMetadata>()); | |
76 return; | |
77 } | |
78 | |
79 // Parsing AccountMetadata is cheap enough to do on UI thread. | |
80 scoped_ptr<AccountMetadata> entry = | |
81 google_apis::AccountMetadata::CreateFrom(*value); | |
82 if (!entry) { | |
83 callback.Run(GDATA_PARSE_ERROR, scoped_ptr<AccountMetadata>()); | |
84 return; | |
85 } | |
86 | |
87 callback.Run(error, entry.Pass()); | |
88 } | |
89 | |
90 // Parses the |value| to ResourceEntry with error handling. | |
91 // This is designed to be used for ResumeUploadRequest and | |
92 // GetUploadStatusRequest. | |
93 scoped_ptr<ResourceEntry> ParseResourceEntry(scoped_ptr<base::Value> value) { | |
94 scoped_ptr<ResourceEntry> entry; | |
95 if (value.get()) { | |
96 entry = ResourceEntry::ExtractAndParse(*value); | |
97 | |
98 // Note: |value| may be NULL, in particular if the callback is for a | |
99 // failure. | |
100 if (!entry.get()) | |
101 LOG(WARNING) << "Invalid entry received on upload."; | |
102 } | |
103 | |
104 return entry.Pass(); | |
105 } | |
106 | |
107 // Extracts the open link url from the JSON Feed. Used by AuthorizeApp(). | |
108 void ParseOpenLinkAndRun(const std::string& app_id, | |
109 const AuthorizeAppCallback& callback, | |
110 GDataErrorCode error, | |
111 scoped_ptr<base::Value> value) { | |
112 DCHECK(!callback.is_null()); | |
113 | |
114 if (!value) { | |
115 callback.Run(error, GURL()); | |
116 return; | |
117 } | |
118 | |
119 // Parsing ResourceEntry is cheap enough to do on UI thread. | |
120 scoped_ptr<ResourceEntry> resource_entry = ParseResourceEntry(value.Pass()); | |
121 if (!resource_entry) { | |
122 callback.Run(GDATA_PARSE_ERROR, GURL()); | |
123 return; | |
124 } | |
125 | |
126 // Look for the link to open the file with the app with |app_id|. | |
127 const ScopedVector<Link>& resource_links = resource_entry->links(); | |
128 GURL open_link; | |
129 for (size_t i = 0; i < resource_links.size(); ++i) { | |
130 const Link& link = *resource_links[i]; | |
131 if (link.type() == Link::LINK_OPEN_WITH && link.app_id() == app_id) { | |
132 open_link = link.href(); | |
133 break; | |
134 } | |
135 } | |
136 | |
137 if (open_link.is_empty()) | |
138 error = GDATA_OTHER_ERROR; | |
139 | |
140 callback.Run(error, open_link); | |
141 } | |
142 | |
143 } // namespace | |
144 | |
145 //============================ GetResourceListRequest ======================== | |
146 | |
147 GetResourceListRequest::GetResourceListRequest( | |
148 RequestSender* sender, | |
149 const GDataWapiUrlGenerator& url_generator, | |
150 const GURL& override_url, | |
151 int64 start_changestamp, | |
152 const std::string& search_string, | |
153 const std::string& directory_resource_id, | |
154 const GetResourceListCallback& callback) | |
155 : GetDataRequest( | |
156 sender, | |
157 base::Bind(&ParseResourceListAndRun, | |
158 make_scoped_refptr(sender->blocking_task_runner()), | |
159 callback)), | |
160 url_generator_(url_generator), | |
161 override_url_(override_url), | |
162 start_changestamp_(start_changestamp), | |
163 search_string_(search_string), | |
164 directory_resource_id_(directory_resource_id) { | |
165 DCHECK(!callback.is_null()); | |
166 } | |
167 | |
168 GetResourceListRequest::~GetResourceListRequest() {} | |
169 | |
170 GURL GetResourceListRequest::GetURL() const { | |
171 return url_generator_.GenerateResourceListUrl(override_url_, | |
172 start_changestamp_, | |
173 search_string_, | |
174 directory_resource_id_); | |
175 } | |
176 | |
177 //============================ SearchByTitleRequest ========================== | |
178 | |
179 SearchByTitleRequest::SearchByTitleRequest( | |
180 RequestSender* sender, | |
181 const GDataWapiUrlGenerator& url_generator, | |
182 const std::string& title, | |
183 const std::string& directory_resource_id, | |
184 const GetResourceListCallback& callback) | |
185 : GetDataRequest( | |
186 sender, | |
187 base::Bind(&ParseResourceListAndRun, | |
188 make_scoped_refptr(sender->blocking_task_runner()), | |
189 callback)), | |
190 url_generator_(url_generator), | |
191 title_(title), | |
192 directory_resource_id_(directory_resource_id) { | |
193 DCHECK(!callback.is_null()); | |
194 } | |
195 | |
196 SearchByTitleRequest::~SearchByTitleRequest() {} | |
197 | |
198 GURL SearchByTitleRequest::GetURL() const { | |
199 return url_generator_.GenerateSearchByTitleUrl( | |
200 title_, directory_resource_id_); | |
201 } | |
202 | |
203 //============================ GetResourceEntryRequest ======================= | |
204 | |
205 GetResourceEntryRequest::GetResourceEntryRequest( | |
206 RequestSender* sender, | |
207 const GDataWapiUrlGenerator& url_generator, | |
208 const std::string& resource_id, | |
209 const GURL& embed_origin, | |
210 const GetDataCallback& callback) | |
211 : GetDataRequest(sender, callback), | |
212 url_generator_(url_generator), | |
213 resource_id_(resource_id), | |
214 embed_origin_(embed_origin) { | |
215 DCHECK(!callback.is_null()); | |
216 } | |
217 | |
218 GetResourceEntryRequest::~GetResourceEntryRequest() {} | |
219 | |
220 GURL GetResourceEntryRequest::GetURL() const { | |
221 return url_generator_.GenerateEditUrlWithEmbedOrigin( | |
222 resource_id_, embed_origin_); | |
223 } | |
224 | |
225 //========================= GetAccountMetadataRequest ======================== | |
226 | |
227 GetAccountMetadataRequest::GetAccountMetadataRequest( | |
228 RequestSender* sender, | |
229 const GDataWapiUrlGenerator& url_generator, | |
230 const GetAccountMetadataCallback& callback, | |
231 bool include_installed_apps) | |
232 : GetDataRequest(sender, | |
233 base::Bind(&ParseAccounetMetadataAndRun, callback)), | |
234 url_generator_(url_generator), | |
235 include_installed_apps_(include_installed_apps) { | |
236 DCHECK(!callback.is_null()); | |
237 } | |
238 | |
239 GetAccountMetadataRequest::~GetAccountMetadataRequest() {} | |
240 | |
241 GURL GetAccountMetadataRequest::GetURL() const { | |
242 return url_generator_.GenerateAccountMetadataUrl(include_installed_apps_); | |
243 } | |
244 | |
245 //=========================== DeleteResourceRequest ========================== | |
246 | |
247 DeleteResourceRequest::DeleteResourceRequest( | |
248 RequestSender* sender, | |
249 const GDataWapiUrlGenerator& url_generator, | |
250 const EntryActionCallback& callback, | |
251 const std::string& resource_id, | |
252 const std::string& etag) | |
253 : EntryActionRequest(sender, callback), | |
254 url_generator_(url_generator), | |
255 resource_id_(resource_id), | |
256 etag_(etag) { | |
257 DCHECK(!callback.is_null()); | |
258 } | |
259 | |
260 DeleteResourceRequest::~DeleteResourceRequest() {} | |
261 | |
262 GURL DeleteResourceRequest::GetURL() const { | |
263 return url_generator_.GenerateEditUrl(resource_id_); | |
264 } | |
265 | |
266 URLFetcher::RequestType DeleteResourceRequest::GetRequestType() const { | |
267 return URLFetcher::DELETE_REQUEST; | |
268 } | |
269 | |
270 std::vector<std::string> | |
271 DeleteResourceRequest::GetExtraRequestHeaders() const { | |
272 std::vector<std::string> headers; | |
273 headers.push_back(util::GenerateIfMatchHeader(etag_)); | |
274 return headers; | |
275 } | |
276 | |
277 //========================== CreateDirectoryRequest ========================== | |
278 | |
279 CreateDirectoryRequest::CreateDirectoryRequest( | |
280 RequestSender* sender, | |
281 const GDataWapiUrlGenerator& url_generator, | |
282 const GetDataCallback& callback, | |
283 const std::string& parent_resource_id, | |
284 const std::string& directory_title) | |
285 : GetDataRequest(sender, callback), | |
286 url_generator_(url_generator), | |
287 parent_resource_id_(parent_resource_id), | |
288 directory_title_(directory_title) { | |
289 DCHECK(!callback.is_null()); | |
290 } | |
291 | |
292 CreateDirectoryRequest::~CreateDirectoryRequest() {} | |
293 | |
294 GURL CreateDirectoryRequest::GetURL() const { | |
295 return url_generator_.GenerateContentUrl(parent_resource_id_); | |
296 } | |
297 | |
298 URLFetcher::RequestType | |
299 CreateDirectoryRequest::GetRequestType() const { | |
300 return URLFetcher::POST; | |
301 } | |
302 | |
303 bool CreateDirectoryRequest::GetContentData(std::string* upload_content_type, | |
304 std::string* upload_content) { | |
305 upload_content_type->assign("application/atom+xml"); | |
306 XmlWriter xml_writer; | |
307 xml_writer.StartWriting(); | |
308 xml_writer.StartElement("entry"); | |
309 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
310 | |
311 xml_writer.StartElement("category"); | |
312 xml_writer.AddAttribute("scheme", | |
313 "http://schemas.google.com/g/2005#kind"); | |
314 xml_writer.AddAttribute("term", | |
315 "http://schemas.google.com/docs/2007#folder"); | |
316 xml_writer.EndElement(); // Ends "category" element. | |
317 | |
318 xml_writer.WriteElement("title", directory_title_); | |
319 | |
320 xml_writer.EndElement(); // Ends "entry" element. | |
321 xml_writer.StopWriting(); | |
322 upload_content->assign(xml_writer.GetWrittenString()); | |
323 DVLOG(1) << "CreateDirectory data: " << *upload_content_type << ", [" | |
324 << *upload_content << "]"; | |
325 return true; | |
326 } | |
327 | |
328 //============================ CopyHostedDocumentRequest ===================== | |
329 | |
330 CopyHostedDocumentRequest::CopyHostedDocumentRequest( | |
331 RequestSender* sender, | |
332 const GDataWapiUrlGenerator& url_generator, | |
333 const GetDataCallback& callback, | |
334 const std::string& resource_id, | |
335 const std::string& new_title) | |
336 : GetDataRequest(sender, callback), | |
337 url_generator_(url_generator), | |
338 resource_id_(resource_id), | |
339 new_title_(new_title) { | |
340 DCHECK(!callback.is_null()); | |
341 } | |
342 | |
343 CopyHostedDocumentRequest::~CopyHostedDocumentRequest() {} | |
344 | |
345 URLFetcher::RequestType CopyHostedDocumentRequest::GetRequestType() const { | |
346 return URLFetcher::POST; | |
347 } | |
348 | |
349 GURL CopyHostedDocumentRequest::GetURL() const { | |
350 return url_generator_.GenerateResourceListRootUrl(); | |
351 } | |
352 | |
353 bool CopyHostedDocumentRequest::GetContentData( | |
354 std::string* upload_content_type, | |
355 std::string* upload_content) { | |
356 upload_content_type->assign("application/atom+xml"); | |
357 XmlWriter xml_writer; | |
358 xml_writer.StartWriting(); | |
359 xml_writer.StartElement("entry"); | |
360 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
361 | |
362 xml_writer.WriteElement("id", resource_id_); | |
363 xml_writer.WriteElement("title", new_title_); | |
364 | |
365 xml_writer.EndElement(); // Ends "entry" element. | |
366 xml_writer.StopWriting(); | |
367 upload_content->assign(xml_writer.GetWrittenString()); | |
368 DVLOG(1) << "CopyHostedDocumentRequest data: " << *upload_content_type | |
369 << ", [" << *upload_content << "]"; | |
370 return true; | |
371 } | |
372 | |
373 //=========================== RenameResourceRequest ========================== | |
374 | |
375 RenameResourceRequest::RenameResourceRequest( | |
376 RequestSender* sender, | |
377 const GDataWapiUrlGenerator& url_generator, | |
378 const EntryActionCallback& callback, | |
379 const std::string& resource_id, | |
380 const std::string& new_title) | |
381 : EntryActionRequest(sender, callback), | |
382 url_generator_(url_generator), | |
383 resource_id_(resource_id), | |
384 new_title_(new_title) { | |
385 DCHECK(!callback.is_null()); | |
386 } | |
387 | |
388 RenameResourceRequest::~RenameResourceRequest() {} | |
389 | |
390 URLFetcher::RequestType RenameResourceRequest::GetRequestType() const { | |
391 return URLFetcher::PUT; | |
392 } | |
393 | |
394 std::vector<std::string> | |
395 RenameResourceRequest::GetExtraRequestHeaders() const { | |
396 std::vector<std::string> headers; | |
397 headers.push_back(util::kIfMatchAllHeader); | |
398 return headers; | |
399 } | |
400 | |
401 GURL RenameResourceRequest::GetURL() const { | |
402 return url_generator_.GenerateEditUrl(resource_id_); | |
403 } | |
404 | |
405 bool RenameResourceRequest::GetContentData(std::string* upload_content_type, | |
406 std::string* upload_content) { | |
407 upload_content_type->assign("application/atom+xml"); | |
408 XmlWriter xml_writer; | |
409 xml_writer.StartWriting(); | |
410 xml_writer.StartElement("entry"); | |
411 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
412 | |
413 xml_writer.WriteElement("title", new_title_); | |
414 | |
415 xml_writer.EndElement(); // Ends "entry" element. | |
416 xml_writer.StopWriting(); | |
417 upload_content->assign(xml_writer.GetWrittenString()); | |
418 DVLOG(1) << "RenameResourceRequest data: " << *upload_content_type << ", [" | |
419 << *upload_content << "]"; | |
420 return true; | |
421 } | |
422 | |
423 //=========================== AuthorizeAppRequest ========================== | |
424 | |
425 AuthorizeAppRequest::AuthorizeAppRequest( | |
426 RequestSender* sender, | |
427 const GDataWapiUrlGenerator& url_generator, | |
428 const AuthorizeAppCallback& callback, | |
429 const std::string& resource_id, | |
430 const std::string& app_id) | |
431 : GetDataRequest(sender, | |
432 base::Bind(&ParseOpenLinkAndRun, app_id, callback)), | |
433 url_generator_(url_generator), | |
434 resource_id_(resource_id), | |
435 app_id_(app_id) { | |
436 DCHECK(!callback.is_null()); | |
437 } | |
438 | |
439 AuthorizeAppRequest::~AuthorizeAppRequest() {} | |
440 | |
441 URLFetcher::RequestType AuthorizeAppRequest::GetRequestType() const { | |
442 return URLFetcher::PUT; | |
443 } | |
444 | |
445 std::vector<std::string> | |
446 AuthorizeAppRequest::GetExtraRequestHeaders() const { | |
447 std::vector<std::string> headers; | |
448 headers.push_back(util::kIfMatchAllHeader); | |
449 return headers; | |
450 } | |
451 | |
452 bool AuthorizeAppRequest::GetContentData(std::string* upload_content_type, | |
453 std::string* upload_content) { | |
454 upload_content_type->assign("application/atom+xml"); | |
455 XmlWriter xml_writer; | |
456 xml_writer.StartWriting(); | |
457 xml_writer.StartElement("entry"); | |
458 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
459 xml_writer.AddAttribute("xmlns:docs", "http://schemas.google.com/docs/2007"); | |
460 xml_writer.WriteElement("docs:authorizedApp", app_id_); | |
461 | |
462 xml_writer.EndElement(); // Ends "entry" element. | |
463 xml_writer.StopWriting(); | |
464 upload_content->assign(xml_writer.GetWrittenString()); | |
465 DVLOG(1) << "AuthorizeAppRequest data: " << *upload_content_type << ", [" | |
466 << *upload_content << "]"; | |
467 return true; | |
468 } | |
469 | |
470 GURL AuthorizeAppRequest::GetURL() const { | |
471 return url_generator_.GenerateEditUrl(resource_id_); | |
472 } | |
473 | |
474 //======================= AddResourceToDirectoryRequest ====================== | |
475 | |
476 AddResourceToDirectoryRequest::AddResourceToDirectoryRequest( | |
477 RequestSender* sender, | |
478 const GDataWapiUrlGenerator& url_generator, | |
479 const EntryActionCallback& callback, | |
480 const std::string& parent_resource_id, | |
481 const std::string& resource_id) | |
482 : EntryActionRequest(sender, callback), | |
483 url_generator_(url_generator), | |
484 parent_resource_id_(parent_resource_id), | |
485 resource_id_(resource_id) { | |
486 DCHECK(!callback.is_null()); | |
487 } | |
488 | |
489 AddResourceToDirectoryRequest::~AddResourceToDirectoryRequest() {} | |
490 | |
491 GURL AddResourceToDirectoryRequest::GetURL() const { | |
492 return url_generator_.GenerateContentUrl(parent_resource_id_); | |
493 } | |
494 | |
495 URLFetcher::RequestType | |
496 AddResourceToDirectoryRequest::GetRequestType() const { | |
497 return URLFetcher::POST; | |
498 } | |
499 | |
500 bool AddResourceToDirectoryRequest::GetContentData( | |
501 std::string* upload_content_type, std::string* upload_content) { | |
502 upload_content_type->assign("application/atom+xml"); | |
503 XmlWriter xml_writer; | |
504 xml_writer.StartWriting(); | |
505 xml_writer.StartElement("entry"); | |
506 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
507 | |
508 xml_writer.WriteElement( | |
509 "id", url_generator_.GenerateEditUrlWithoutParams(resource_id_).spec()); | |
510 | |
511 xml_writer.EndElement(); // Ends "entry" element. | |
512 xml_writer.StopWriting(); | |
513 upload_content->assign(xml_writer.GetWrittenString()); | |
514 DVLOG(1) << "AddResourceToDirectoryRequest data: " << *upload_content_type | |
515 << ", [" << *upload_content << "]"; | |
516 return true; | |
517 } | |
518 | |
519 //==================== RemoveResourceFromDirectoryRequest ==================== | |
520 | |
521 RemoveResourceFromDirectoryRequest::RemoveResourceFromDirectoryRequest( | |
522 RequestSender* sender, | |
523 const GDataWapiUrlGenerator& url_generator, | |
524 const EntryActionCallback& callback, | |
525 const std::string& parent_resource_id, | |
526 const std::string& document_resource_id) | |
527 : EntryActionRequest(sender, callback), | |
528 url_generator_(url_generator), | |
529 resource_id_(document_resource_id), | |
530 parent_resource_id_(parent_resource_id) { | |
531 DCHECK(!callback.is_null()); | |
532 } | |
533 | |
534 RemoveResourceFromDirectoryRequest::~RemoveResourceFromDirectoryRequest() { | |
535 } | |
536 | |
537 GURL RemoveResourceFromDirectoryRequest::GetURL() const { | |
538 return url_generator_.GenerateResourceUrlForRemoval( | |
539 parent_resource_id_, resource_id_); | |
540 } | |
541 | |
542 URLFetcher::RequestType | |
543 RemoveResourceFromDirectoryRequest::GetRequestType() const { | |
544 return URLFetcher::DELETE_REQUEST; | |
545 } | |
546 | |
547 std::vector<std::string> | |
548 RemoveResourceFromDirectoryRequest::GetExtraRequestHeaders() const { | |
549 std::vector<std::string> headers; | |
550 headers.push_back(util::kIfMatchAllHeader); | |
551 return headers; | |
552 } | |
553 | |
554 //======================= InitiateUploadNewFileRequest ======================= | |
555 | |
556 InitiateUploadNewFileRequest::InitiateUploadNewFileRequest( | |
557 RequestSender* sender, | |
558 const GDataWapiUrlGenerator& url_generator, | |
559 const InitiateUploadCallback& callback, | |
560 const std::string& content_type, | |
561 int64 content_length, | |
562 const std::string& parent_resource_id, | |
563 const std::string& title) | |
564 : InitiateUploadRequestBase(sender, callback, content_type, content_length), | |
565 url_generator_(url_generator), | |
566 parent_resource_id_(parent_resource_id), | |
567 title_(title) { | |
568 } | |
569 | |
570 InitiateUploadNewFileRequest::~InitiateUploadNewFileRequest() {} | |
571 | |
572 GURL InitiateUploadNewFileRequest::GetURL() const { | |
573 return url_generator_.GenerateInitiateUploadNewFileUrl(parent_resource_id_); | |
574 } | |
575 | |
576 net::URLFetcher::RequestType | |
577 InitiateUploadNewFileRequest::GetRequestType() const { | |
578 return net::URLFetcher::POST; | |
579 } | |
580 | |
581 bool InitiateUploadNewFileRequest::GetContentData( | |
582 std::string* upload_content_type, | |
583 std::string* upload_content) { | |
584 upload_content_type->assign("application/atom+xml"); | |
585 XmlWriter xml_writer; | |
586 xml_writer.StartWriting(); | |
587 xml_writer.StartElement("entry"); | |
588 xml_writer.AddAttribute("xmlns", "http://www.w3.org/2005/Atom"); | |
589 xml_writer.AddAttribute("xmlns:docs", | |
590 "http://schemas.google.com/docs/2007"); | |
591 xml_writer.WriteElement("title", title_); | |
592 xml_writer.EndElement(); // Ends "entry" element. | |
593 xml_writer.StopWriting(); | |
594 upload_content->assign(xml_writer.GetWrittenString()); | |
595 DVLOG(1) << "InitiateUploadNewFile: " << *upload_content_type << ", [" | |
596 << *upload_content << "]"; | |
597 return true; | |
598 } | |
599 | |
600 //===================== InitiateUploadExistingFileRequest ==================== | |
601 | |
602 InitiateUploadExistingFileRequest::InitiateUploadExistingFileRequest( | |
603 RequestSender* sender, | |
604 const GDataWapiUrlGenerator& url_generator, | |
605 const InitiateUploadCallback& callback, | |
606 const std::string& content_type, | |
607 int64 content_length, | |
608 const std::string& resource_id, | |
609 const std::string& etag) | |
610 : InitiateUploadRequestBase(sender, callback, content_type, content_length), | |
611 url_generator_(url_generator), | |
612 resource_id_(resource_id), | |
613 etag_(etag) { | |
614 } | |
615 | |
616 InitiateUploadExistingFileRequest::~InitiateUploadExistingFileRequest() {} | |
617 | |
618 GURL InitiateUploadExistingFileRequest::GetURL() const { | |
619 return url_generator_.GenerateInitiateUploadExistingFileUrl(resource_id_); | |
620 } | |
621 | |
622 net::URLFetcher::RequestType | |
623 InitiateUploadExistingFileRequest::GetRequestType() const { | |
624 return net::URLFetcher::PUT; | |
625 } | |
626 | |
627 bool InitiateUploadExistingFileRequest::GetContentData( | |
628 std::string* upload_content_type, | |
629 std::string* upload_content) { | |
630 // According to the document there is no need to send the content-type. | |
631 // However, the server would return 500 server error without the | |
632 // content-type. | |
633 // As its workaround, send "text/plain" content-type here. | |
634 *upload_content_type = "text/plain"; | |
635 *upload_content = ""; | |
636 return true; | |
637 } | |
638 | |
639 std::vector<std::string> | |
640 InitiateUploadExistingFileRequest::GetExtraRequestHeaders() const { | |
641 std::vector<std::string> headers( | |
642 InitiateUploadRequestBase::GetExtraRequestHeaders()); | |
643 headers.push_back(util::GenerateIfMatchHeader(etag_)); | |
644 return headers; | |
645 } | |
646 | |
647 //============================ ResumeUploadRequest =========================== | |
648 | |
649 ResumeUploadRequest::ResumeUploadRequest( | |
650 RequestSender* sender, | |
651 const UploadRangeCallback& callback, | |
652 const ProgressCallback& progress_callback, | |
653 const GURL& upload_location, | |
654 int64 start_position, | |
655 int64 end_position, | |
656 int64 content_length, | |
657 const std::string& content_type, | |
658 const base::FilePath& local_file_path) | |
659 : ResumeUploadRequestBase(sender, | |
660 upload_location, | |
661 start_position, | |
662 end_position, | |
663 content_length, | |
664 content_type, | |
665 local_file_path), | |
666 callback_(callback), | |
667 progress_callback_(progress_callback) { | |
668 DCHECK(!callback_.is_null()); | |
669 } | |
670 | |
671 ResumeUploadRequest::~ResumeUploadRequest() {} | |
672 | |
673 void ResumeUploadRequest::OnRangeRequestComplete( | |
674 const UploadRangeResponse& response, scoped_ptr<base::Value> value) { | |
675 callback_.Run(response, ParseResourceEntry(value.Pass())); | |
676 } | |
677 | |
678 void ResumeUploadRequest::OnURLFetchUploadProgress( | |
679 const URLFetcher* source, int64 current, int64 total) { | |
680 if (!progress_callback_.is_null()) | |
681 progress_callback_.Run(current, total); | |
682 } | |
683 | |
684 //========================== GetUploadStatusRequest ========================== | |
685 | |
686 GetUploadStatusRequest::GetUploadStatusRequest( | |
687 RequestSender* sender, | |
688 const UploadRangeCallback& callback, | |
689 const GURL& upload_url, | |
690 int64 content_length) | |
691 : GetUploadStatusRequestBase(sender, upload_url, content_length), | |
692 callback_(callback) { | |
693 DCHECK(!callback.is_null()); | |
694 } | |
695 | |
696 GetUploadStatusRequest::~GetUploadStatusRequest() {} | |
697 | |
698 void GetUploadStatusRequest::OnRangeRequestComplete( | |
699 const UploadRangeResponse& response, scoped_ptr<base::Value> value) { | |
700 callback_.Run(response, ParseResourceEntry(value.Pass())); | |
701 } | |
702 | |
703 //========================== DownloadFileRequest ========================== | |
704 | |
705 DownloadFileRequest::DownloadFileRequest( | |
706 RequestSender* sender, | |
707 const GDataWapiUrlGenerator& url_generator, | |
708 const DownloadActionCallback& download_action_callback, | |
709 const GetContentCallback& get_content_callback, | |
710 const ProgressCallback& progress_callback, | |
711 const std::string& resource_id, | |
712 const base::FilePath& output_file_path) | |
713 : DownloadFileRequestBase( | |
714 sender, | |
715 download_action_callback, | |
716 get_content_callback, | |
717 progress_callback, | |
718 url_generator.GenerateDownloadFileUrl(resource_id), | |
719 output_file_path) { | |
720 } | |
721 | |
722 DownloadFileRequest::~DownloadFileRequest() { | |
723 } | |
724 | |
725 } // namespace google_apis | |
OLD | NEW |