| 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/drive_api_requests.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/callback.h" | |
| 9 #include "base/json/json_writer.h" | |
| 10 #include "base/location.h" | |
| 11 #include "base/sequenced_task_runner.h" | |
| 12 #include "base/task_runner_util.h" | |
| 13 #include "base/values.h" | |
| 14 #include "chrome/browser/google_apis/drive_api_parser.h" | |
| 15 #include "chrome/browser/google_apis/request_sender.h" | |
| 16 #include "chrome/browser/google_apis/request_util.h" | |
| 17 #include "chrome/browser/google_apis/time_util.h" | |
| 18 #include "net/base/url_util.h" | |
| 19 | |
| 20 namespace google_apis { | |
| 21 namespace { | |
| 22 | |
| 23 const char kContentTypeApplicationJson[] = "application/json"; | |
| 24 const char kParentLinkKind[] = "drive#fileLink"; | |
| 25 | |
| 26 // Parses the JSON value to a resource typed |T| and runs |callback| on the UI | |
| 27 // thread once parsing is done. | |
| 28 template<typename T> | |
| 29 void ParseJsonAndRun( | |
| 30 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback, | |
| 31 GDataErrorCode error, | |
| 32 scoped_ptr<base::Value> value) { | |
| 33 DCHECK(!callback.is_null()); | |
| 34 | |
| 35 scoped_ptr<T> resource; | |
| 36 if (value) { | |
| 37 resource = T::CreateFrom(*value); | |
| 38 if (!resource) { | |
| 39 // Failed to parse the JSON value, although the JSON value is available, | |
| 40 // so let the callback know the parsing error. | |
| 41 error = GDATA_PARSE_ERROR; | |
| 42 } | |
| 43 } | |
| 44 | |
| 45 callback.Run(error, resource.Pass()); | |
| 46 } | |
| 47 | |
| 48 // Thin adapter of T::CreateFrom. | |
| 49 template<typename T> | |
| 50 scoped_ptr<T> ParseJsonOnBlockingPool(scoped_ptr<base::Value> value) { | |
| 51 return T::CreateFrom(*value); | |
| 52 } | |
| 53 | |
| 54 // Runs |callback| with given |error| and |value|. If |value| is null, | |
| 55 // overwrites |error| to GDATA_PARSE_ERROR. | |
| 56 template<typename T> | |
| 57 void ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask( | |
| 58 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback, | |
| 59 GDataErrorCode error, scoped_ptr<T> value) { | |
| 60 if (!value) | |
| 61 error = GDATA_PARSE_ERROR; | |
| 62 callback.Run(error, value.Pass()); | |
| 63 } | |
| 64 | |
| 65 // Parses the JSON value to a resource typed |T| and runs |callback| on | |
| 66 // blocking pool, and then run on the current thread. | |
| 67 // TODO(hidehiko): Move this and ParseJsonAndRun defined above into base with | |
| 68 // merging the tasks running on blocking pool into one. | |
| 69 template<typename T> | |
| 70 void ParseJsonOnBlockingPoolAndRun( | |
| 71 scoped_refptr<base::TaskRunner> blocking_task_runner, | |
| 72 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback, | |
| 73 GDataErrorCode error, | |
| 74 scoped_ptr<base::Value> value) { | |
| 75 DCHECK(!callback.is_null()); | |
| 76 | |
| 77 if (!value) { | |
| 78 callback.Run(error, scoped_ptr<T>()); | |
| 79 return; | |
| 80 } | |
| 81 | |
| 82 base::PostTaskAndReplyWithResult( | |
| 83 blocking_task_runner, | |
| 84 FROM_HERE, | |
| 85 base::Bind(&ParseJsonOnBlockingPool<T>, base::Passed(&value)), | |
| 86 base::Bind(&ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask<T>, | |
| 87 callback, error)); | |
| 88 } | |
| 89 | |
| 90 // Parses the JSON value to FileResource instance and runs |callback| on the | |
| 91 // UI thread once parsing is done. | |
| 92 // This is customized version of ParseJsonAndRun defined above to adapt the | |
| 93 // remaining response type. | |
| 94 void ParseFileResourceWithUploadRangeAndRun( | |
| 95 const drive::UploadRangeCallback& callback, | |
| 96 const UploadRangeResponse& response, | |
| 97 scoped_ptr<base::Value> value) { | |
| 98 DCHECK(!callback.is_null()); | |
| 99 | |
| 100 scoped_ptr<FileResource> file_resource; | |
| 101 if (value) { | |
| 102 file_resource = FileResource::CreateFrom(*value); | |
| 103 if (!file_resource) { | |
| 104 callback.Run( | |
| 105 UploadRangeResponse(GDATA_PARSE_ERROR, | |
| 106 response.start_position_received, | |
| 107 response.end_position_received), | |
| 108 scoped_ptr<FileResource>()); | |
| 109 return; | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 callback.Run(response, file_resource.Pass()); | |
| 114 } | |
| 115 | |
| 116 } // namespace | |
| 117 | |
| 118 namespace drive { | |
| 119 | |
| 120 //============================ DriveApiDataRequest =========================== | |
| 121 | |
| 122 DriveApiDataRequest::DriveApiDataRequest(RequestSender* sender, | |
| 123 const GetDataCallback& callback) | |
| 124 : GetDataRequest(sender, callback) { | |
| 125 } | |
| 126 | |
| 127 DriveApiDataRequest::~DriveApiDataRequest() { | |
| 128 } | |
| 129 | |
| 130 GURL DriveApiDataRequest::GetURL() const { | |
| 131 GURL url = GetURLInternal(); | |
| 132 if (!fields_.empty()) | |
| 133 url = net::AppendOrReplaceQueryParameter(url, "fields", fields_); | |
| 134 return url; | |
| 135 } | |
| 136 | |
| 137 //=============================== FilesGetRequest ============================= | |
| 138 | |
| 139 FilesGetRequest::FilesGetRequest( | |
| 140 RequestSender* sender, | |
| 141 const DriveApiUrlGenerator& url_generator, | |
| 142 const FileResourceCallback& callback) | |
| 143 : DriveApiDataRequest( | |
| 144 sender, | |
| 145 base::Bind(&ParseJsonAndRun<FileResource>, callback)), | |
| 146 url_generator_(url_generator) { | |
| 147 DCHECK(!callback.is_null()); | |
| 148 } | |
| 149 | |
| 150 FilesGetRequest::~FilesGetRequest() {} | |
| 151 | |
| 152 GURL FilesGetRequest::GetURLInternal() const { | |
| 153 return url_generator_.GetFilesGetUrl(file_id_); | |
| 154 } | |
| 155 | |
| 156 //============================ FilesInsertRequest ============================ | |
| 157 | |
| 158 FilesInsertRequest::FilesInsertRequest( | |
| 159 RequestSender* sender, | |
| 160 const DriveApiUrlGenerator& url_generator, | |
| 161 const FileResourceCallback& callback) | |
| 162 : DriveApiDataRequest( | |
| 163 sender, | |
| 164 base::Bind(&ParseJsonAndRun<FileResource>, callback)), | |
| 165 url_generator_(url_generator) { | |
| 166 DCHECK(!callback.is_null()); | |
| 167 } | |
| 168 | |
| 169 FilesInsertRequest::~FilesInsertRequest() {} | |
| 170 | |
| 171 net::URLFetcher::RequestType FilesInsertRequest::GetRequestType() const { | |
| 172 return net::URLFetcher::POST; | |
| 173 } | |
| 174 | |
| 175 bool FilesInsertRequest::GetContentData(std::string* upload_content_type, | |
| 176 std::string* upload_content) { | |
| 177 *upload_content_type = kContentTypeApplicationJson; | |
| 178 | |
| 179 base::DictionaryValue root; | |
| 180 | |
| 181 if (!mime_type_.empty()) | |
| 182 root.SetString("mimeType", mime_type_); | |
| 183 | |
| 184 if (!parents_.empty()) { | |
| 185 base::ListValue* parents_value = new base::ListValue; | |
| 186 for (size_t i = 0; i < parents_.size(); ++i) { | |
| 187 base::DictionaryValue* parent = new base::DictionaryValue; | |
| 188 parent->SetString("id", parents_[i]); | |
| 189 parents_value->Append(parent); | |
| 190 } | |
| 191 root.Set("parents", parents_value); | |
| 192 } | |
| 193 | |
| 194 if (!title_.empty()) | |
| 195 root.SetString("title", title_); | |
| 196 | |
| 197 base::JSONWriter::Write(&root, upload_content); | |
| 198 DVLOG(1) << "FilesInsert data: " << *upload_content_type << ", [" | |
| 199 << *upload_content << "]"; | |
| 200 return true; | |
| 201 } | |
| 202 | |
| 203 GURL FilesInsertRequest::GetURLInternal() const { | |
| 204 return url_generator_.GetFilesInsertUrl(); | |
| 205 } | |
| 206 | |
| 207 //============================== FilesPatchRequest ============================ | |
| 208 | |
| 209 FilesPatchRequest::FilesPatchRequest( | |
| 210 RequestSender* sender, | |
| 211 const DriveApiUrlGenerator& url_generator, | |
| 212 const FileResourceCallback& callback) | |
| 213 : DriveApiDataRequest( | |
| 214 sender, | |
| 215 base::Bind(&ParseJsonAndRun<FileResource>, callback)), | |
| 216 url_generator_(url_generator), | |
| 217 set_modified_date_(false), | |
| 218 update_viewed_date_(true) { | |
| 219 DCHECK(!callback.is_null()); | |
| 220 } | |
| 221 | |
| 222 FilesPatchRequest::~FilesPatchRequest() {} | |
| 223 | |
| 224 net::URLFetcher::RequestType FilesPatchRequest::GetRequestType() const { | |
| 225 return net::URLFetcher::PATCH; | |
| 226 } | |
| 227 | |
| 228 std::vector<std::string> FilesPatchRequest::GetExtraRequestHeaders() const { | |
| 229 std::vector<std::string> headers; | |
| 230 headers.push_back(util::kIfMatchAllHeader); | |
| 231 return headers; | |
| 232 } | |
| 233 | |
| 234 GURL FilesPatchRequest::GetURLInternal() const { | |
| 235 return url_generator_.GetFilesPatchUrl( | |
| 236 file_id_, set_modified_date_, update_viewed_date_); | |
| 237 } | |
| 238 | |
| 239 bool FilesPatchRequest::GetContentData(std::string* upload_content_type, | |
| 240 std::string* upload_content) { | |
| 241 if (title_.empty() && | |
| 242 modified_date_.is_null() && | |
| 243 last_viewed_by_me_date_.is_null() && | |
| 244 parents_.empty()) | |
| 245 return false; | |
| 246 | |
| 247 *upload_content_type = kContentTypeApplicationJson; | |
| 248 | |
| 249 base::DictionaryValue root; | |
| 250 if (!title_.empty()) | |
| 251 root.SetString("title", title_); | |
| 252 | |
| 253 if (!modified_date_.is_null()) | |
| 254 root.SetString("modifiedDate", util::FormatTimeAsString(modified_date_)); | |
| 255 | |
| 256 if (!last_viewed_by_me_date_.is_null()) { | |
| 257 root.SetString("lastViewedByMeDate", | |
| 258 util::FormatTimeAsString(last_viewed_by_me_date_)); | |
| 259 } | |
| 260 | |
| 261 if (!parents_.empty()) { | |
| 262 base::ListValue* parents_value = new base::ListValue; | |
| 263 for (size_t i = 0; i < parents_.size(); ++i) { | |
| 264 base::DictionaryValue* parent = new base::DictionaryValue; | |
| 265 parent->SetString("id", parents_[i]); | |
| 266 parents_value->Append(parent); | |
| 267 } | |
| 268 root.Set("parents", parents_value); | |
| 269 } | |
| 270 | |
| 271 base::JSONWriter::Write(&root, upload_content); | |
| 272 DVLOG(1) << "FilesPatch data: " << *upload_content_type << ", [" | |
| 273 << *upload_content << "]"; | |
| 274 return true; | |
| 275 } | |
| 276 | |
| 277 //============================= FilesCopyRequest ============================== | |
| 278 | |
| 279 FilesCopyRequest::FilesCopyRequest( | |
| 280 RequestSender* sender, | |
| 281 const DriveApiUrlGenerator& url_generator, | |
| 282 const FileResourceCallback& callback) | |
| 283 : DriveApiDataRequest( | |
| 284 sender, | |
| 285 base::Bind(&ParseJsonAndRun<FileResource>, callback)), | |
| 286 url_generator_(url_generator) { | |
| 287 DCHECK(!callback.is_null()); | |
| 288 } | |
| 289 | |
| 290 FilesCopyRequest::~FilesCopyRequest() { | |
| 291 } | |
| 292 | |
| 293 net::URLFetcher::RequestType FilesCopyRequest::GetRequestType() const { | |
| 294 return net::URLFetcher::POST; | |
| 295 } | |
| 296 | |
| 297 GURL FilesCopyRequest::GetURLInternal() const { | |
| 298 return url_generator_.GetFilesCopyUrl(file_id_); | |
| 299 } | |
| 300 | |
| 301 bool FilesCopyRequest::GetContentData(std::string* upload_content_type, | |
| 302 std::string* upload_content) { | |
| 303 if (parents_.empty() && title_.empty()) | |
| 304 return false; | |
| 305 | |
| 306 *upload_content_type = kContentTypeApplicationJson; | |
| 307 | |
| 308 base::DictionaryValue root; | |
| 309 | |
| 310 if (!modified_date_.is_null()) | |
| 311 root.SetString("modifiedDate", util::FormatTimeAsString(modified_date_)); | |
| 312 | |
| 313 if (!parents_.empty()) { | |
| 314 base::ListValue* parents_value = new base::ListValue; | |
| 315 for (size_t i = 0; i < parents_.size(); ++i) { | |
| 316 base::DictionaryValue* parent = new base::DictionaryValue; | |
| 317 parent->SetString("id", parents_[i]); | |
| 318 parents_value->Append(parent); | |
| 319 } | |
| 320 root.Set("parents", parents_value); | |
| 321 } | |
| 322 | |
| 323 if (!title_.empty()) | |
| 324 root.SetString("title", title_); | |
| 325 | |
| 326 base::JSONWriter::Write(&root, upload_content); | |
| 327 DVLOG(1) << "FilesCopy data: " << *upload_content_type << ", [" | |
| 328 << *upload_content << "]"; | |
| 329 return true; | |
| 330 } | |
| 331 | |
| 332 //============================= FilesListRequest ============================= | |
| 333 | |
| 334 FilesListRequest::FilesListRequest( | |
| 335 RequestSender* sender, | |
| 336 const DriveApiUrlGenerator& url_generator, | |
| 337 const FileListCallback& callback) | |
| 338 : DriveApiDataRequest( | |
| 339 sender, | |
| 340 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>, | |
| 341 make_scoped_refptr(sender->blocking_task_runner()), | |
| 342 callback)), | |
| 343 url_generator_(url_generator), | |
| 344 max_results_(100) { | |
| 345 DCHECK(!callback.is_null()); | |
| 346 } | |
| 347 | |
| 348 FilesListRequest::~FilesListRequest() {} | |
| 349 | |
| 350 GURL FilesListRequest::GetURLInternal() const { | |
| 351 return url_generator_.GetFilesListUrl(max_results_, page_token_, q_); | |
| 352 } | |
| 353 | |
| 354 //======================== FilesListNextPageRequest ========================= | |
| 355 | |
| 356 FilesListNextPageRequest::FilesListNextPageRequest( | |
| 357 RequestSender* sender, | |
| 358 const FileListCallback& callback) | |
| 359 : DriveApiDataRequest( | |
| 360 sender, | |
| 361 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>, | |
| 362 make_scoped_refptr(sender->blocking_task_runner()), | |
| 363 callback)) { | |
| 364 DCHECK(!callback.is_null()); | |
| 365 } | |
| 366 | |
| 367 FilesListNextPageRequest::~FilesListNextPageRequest() { | |
| 368 } | |
| 369 | |
| 370 GURL FilesListNextPageRequest::GetURLInternal() const { | |
| 371 return next_link_; | |
| 372 } | |
| 373 | |
| 374 //============================ FilesTrashRequest ============================= | |
| 375 | |
| 376 FilesTrashRequest::FilesTrashRequest( | |
| 377 RequestSender* sender, | |
| 378 const DriveApiUrlGenerator& url_generator, | |
| 379 const FileResourceCallback& callback) | |
| 380 : DriveApiDataRequest( | |
| 381 sender, | |
| 382 base::Bind(&ParseJsonAndRun<FileResource>, callback)), | |
| 383 url_generator_(url_generator) { | |
| 384 DCHECK(!callback.is_null()); | |
| 385 } | |
| 386 | |
| 387 FilesTrashRequest::~FilesTrashRequest() {} | |
| 388 | |
| 389 net::URLFetcher::RequestType FilesTrashRequest::GetRequestType() const { | |
| 390 return net::URLFetcher::POST; | |
| 391 } | |
| 392 | |
| 393 GURL FilesTrashRequest::GetURLInternal() const { | |
| 394 return url_generator_.GetFilesTrashUrl(file_id_); | |
| 395 } | |
| 396 | |
| 397 //============================== AboutGetRequest ============================= | |
| 398 | |
| 399 AboutGetRequest::AboutGetRequest( | |
| 400 RequestSender* sender, | |
| 401 const DriveApiUrlGenerator& url_generator, | |
| 402 const AboutResourceCallback& callback) | |
| 403 : DriveApiDataRequest( | |
| 404 sender, | |
| 405 base::Bind(&ParseJsonAndRun<AboutResource>, callback)), | |
| 406 url_generator_(url_generator) { | |
| 407 DCHECK(!callback.is_null()); | |
| 408 } | |
| 409 | |
| 410 AboutGetRequest::~AboutGetRequest() {} | |
| 411 | |
| 412 GURL AboutGetRequest::GetURLInternal() const { | |
| 413 return url_generator_.GetAboutGetUrl(); | |
| 414 } | |
| 415 | |
| 416 //============================ ChangesListRequest =========================== | |
| 417 | |
| 418 ChangesListRequest::ChangesListRequest( | |
| 419 RequestSender* sender, | |
| 420 const DriveApiUrlGenerator& url_generator, | |
| 421 const ChangeListCallback& callback) | |
| 422 : DriveApiDataRequest( | |
| 423 sender, | |
| 424 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>, | |
| 425 make_scoped_refptr(sender->blocking_task_runner()), | |
| 426 callback)), | |
| 427 url_generator_(url_generator), | |
| 428 include_deleted_(true), | |
| 429 max_results_(100), | |
| 430 start_change_id_(0) { | |
| 431 DCHECK(!callback.is_null()); | |
| 432 } | |
| 433 | |
| 434 ChangesListRequest::~ChangesListRequest() {} | |
| 435 | |
| 436 GURL ChangesListRequest::GetURLInternal() const { | |
| 437 return url_generator_.GetChangesListUrl( | |
| 438 include_deleted_, max_results_, page_token_, start_change_id_); | |
| 439 } | |
| 440 | |
| 441 //======================== ChangesListNextPageRequest ========================= | |
| 442 | |
| 443 ChangesListNextPageRequest::ChangesListNextPageRequest( | |
| 444 RequestSender* sender, | |
| 445 const ChangeListCallback& callback) | |
| 446 : DriveApiDataRequest( | |
| 447 sender, | |
| 448 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>, | |
| 449 make_scoped_refptr(sender->blocking_task_runner()), | |
| 450 callback)) { | |
| 451 DCHECK(!callback.is_null()); | |
| 452 } | |
| 453 | |
| 454 ChangesListNextPageRequest::~ChangesListNextPageRequest() { | |
| 455 } | |
| 456 | |
| 457 GURL ChangesListNextPageRequest::GetURLInternal() const { | |
| 458 return next_link_; | |
| 459 } | |
| 460 | |
| 461 //============================== AppsListRequest =========================== | |
| 462 | |
| 463 AppsListRequest::AppsListRequest( | |
| 464 RequestSender* sender, | |
| 465 const DriveApiUrlGenerator& url_generator, | |
| 466 const AppListCallback& callback) | |
| 467 : DriveApiDataRequest( | |
| 468 sender, | |
| 469 base::Bind(&ParseJsonAndRun<AppList>, callback)), | |
| 470 url_generator_(url_generator) { | |
| 471 DCHECK(!callback.is_null()); | |
| 472 } | |
| 473 | |
| 474 AppsListRequest::~AppsListRequest() {} | |
| 475 | |
| 476 GURL AppsListRequest::GetURLInternal() const { | |
| 477 return url_generator_.GetAppsListUrl(); | |
| 478 } | |
| 479 | |
| 480 //========================== ChildrenInsertRequest ============================ | |
| 481 | |
| 482 ChildrenInsertRequest::ChildrenInsertRequest( | |
| 483 RequestSender* sender, | |
| 484 const DriveApiUrlGenerator& url_generator, | |
| 485 const EntryActionCallback& callback) | |
| 486 : EntryActionRequest(sender, callback), | |
| 487 url_generator_(url_generator) { | |
| 488 DCHECK(!callback.is_null()); | |
| 489 } | |
| 490 | |
| 491 ChildrenInsertRequest::~ChildrenInsertRequest() {} | |
| 492 | |
| 493 net::URLFetcher::RequestType ChildrenInsertRequest::GetRequestType() const { | |
| 494 return net::URLFetcher::POST; | |
| 495 } | |
| 496 | |
| 497 GURL ChildrenInsertRequest::GetURL() const { | |
| 498 return url_generator_.GetChildrenInsertUrl(folder_id_); | |
| 499 } | |
| 500 | |
| 501 bool ChildrenInsertRequest::GetContentData(std::string* upload_content_type, | |
| 502 std::string* upload_content) { | |
| 503 *upload_content_type = kContentTypeApplicationJson; | |
| 504 | |
| 505 base::DictionaryValue root; | |
| 506 root.SetString("id", id_); | |
| 507 | |
| 508 base::JSONWriter::Write(&root, upload_content); | |
| 509 DVLOG(1) << "InsertResource data: " << *upload_content_type << ", [" | |
| 510 << *upload_content << "]"; | |
| 511 return true; | |
| 512 } | |
| 513 | |
| 514 //========================== ChildrenDeleteRequest ============================ | |
| 515 | |
| 516 ChildrenDeleteRequest::ChildrenDeleteRequest( | |
| 517 RequestSender* sender, | |
| 518 const DriveApiUrlGenerator& url_generator, | |
| 519 const EntryActionCallback& callback) | |
| 520 : EntryActionRequest(sender, callback), | |
| 521 url_generator_(url_generator) { | |
| 522 DCHECK(!callback.is_null()); | |
| 523 } | |
| 524 | |
| 525 ChildrenDeleteRequest::~ChildrenDeleteRequest() {} | |
| 526 | |
| 527 net::URLFetcher::RequestType ChildrenDeleteRequest::GetRequestType() const { | |
| 528 return net::URLFetcher::DELETE_REQUEST; | |
| 529 } | |
| 530 | |
| 531 GURL ChildrenDeleteRequest::GetURL() const { | |
| 532 return url_generator_.GetChildrenDeleteUrl(child_id_, folder_id_); | |
| 533 } | |
| 534 | |
| 535 //======================= InitiateUploadNewFileRequest ======================= | |
| 536 | |
| 537 InitiateUploadNewFileRequest::InitiateUploadNewFileRequest( | |
| 538 RequestSender* sender, | |
| 539 const DriveApiUrlGenerator& url_generator, | |
| 540 const std::string& content_type, | |
| 541 int64 content_length, | |
| 542 const std::string& parent_resource_id, | |
| 543 const std::string& title, | |
| 544 const InitiateUploadCallback& callback) | |
| 545 : InitiateUploadRequestBase(sender, | |
| 546 callback, | |
| 547 content_type, | |
| 548 content_length), | |
| 549 url_generator_(url_generator), | |
| 550 parent_resource_id_(parent_resource_id), | |
| 551 title_(title) { | |
| 552 } | |
| 553 | |
| 554 InitiateUploadNewFileRequest::~InitiateUploadNewFileRequest() {} | |
| 555 | |
| 556 GURL InitiateUploadNewFileRequest::GetURL() const { | |
| 557 return url_generator_.GetInitiateUploadNewFileUrl(); | |
| 558 } | |
| 559 | |
| 560 net::URLFetcher::RequestType | |
| 561 InitiateUploadNewFileRequest::GetRequestType() const { | |
| 562 return net::URLFetcher::POST; | |
| 563 } | |
| 564 | |
| 565 bool InitiateUploadNewFileRequest::GetContentData( | |
| 566 std::string* upload_content_type, | |
| 567 std::string* upload_content) { | |
| 568 *upload_content_type = kContentTypeApplicationJson; | |
| 569 | |
| 570 base::DictionaryValue root; | |
| 571 root.SetString("title", title_); | |
| 572 | |
| 573 // Fill parent link. | |
| 574 { | |
| 575 scoped_ptr<base::DictionaryValue> parent(new base::DictionaryValue); | |
| 576 parent->SetString("kind", kParentLinkKind); | |
| 577 parent->SetString("id", parent_resource_id_); | |
| 578 | |
| 579 scoped_ptr<base::ListValue> parents(new base::ListValue); | |
| 580 parents->Append(parent.release()); | |
| 581 | |
| 582 root.Set("parents", parents.release()); | |
| 583 } | |
| 584 | |
| 585 base::JSONWriter::Write(&root, upload_content); | |
| 586 | |
| 587 DVLOG(1) << "InitiateUploadNewFile data: " << *upload_content_type << ", [" | |
| 588 << *upload_content << "]"; | |
| 589 return true; | |
| 590 } | |
| 591 | |
| 592 //===================== InitiateUploadExistingFileRequest ==================== | |
| 593 | |
| 594 InitiateUploadExistingFileRequest::InitiateUploadExistingFileRequest( | |
| 595 RequestSender* sender, | |
| 596 const DriveApiUrlGenerator& url_generator, | |
| 597 const std::string& content_type, | |
| 598 int64 content_length, | |
| 599 const std::string& resource_id, | |
| 600 const std::string& etag, | |
| 601 const InitiateUploadCallback& callback) | |
| 602 : InitiateUploadRequestBase(sender, | |
| 603 callback, | |
| 604 content_type, | |
| 605 content_length), | |
| 606 url_generator_(url_generator), | |
| 607 resource_id_(resource_id), | |
| 608 etag_(etag) { | |
| 609 } | |
| 610 | |
| 611 InitiateUploadExistingFileRequest::~InitiateUploadExistingFileRequest() {} | |
| 612 | |
| 613 GURL InitiateUploadExistingFileRequest::GetURL() const { | |
| 614 return url_generator_.GetInitiateUploadExistingFileUrl(resource_id_); | |
| 615 } | |
| 616 | |
| 617 net::URLFetcher::RequestType | |
| 618 InitiateUploadExistingFileRequest::GetRequestType() const { | |
| 619 return net::URLFetcher::PUT; | |
| 620 } | |
| 621 | |
| 622 std::vector<std::string> | |
| 623 InitiateUploadExistingFileRequest::GetExtraRequestHeaders() const { | |
| 624 std::vector<std::string> headers( | |
| 625 InitiateUploadRequestBase::GetExtraRequestHeaders()); | |
| 626 headers.push_back(util::GenerateIfMatchHeader(etag_)); | |
| 627 return headers; | |
| 628 } | |
| 629 | |
| 630 //============================ ResumeUploadRequest =========================== | |
| 631 | |
| 632 ResumeUploadRequest::ResumeUploadRequest( | |
| 633 RequestSender* sender, | |
| 634 const GURL& upload_location, | |
| 635 int64 start_position, | |
| 636 int64 end_position, | |
| 637 int64 content_length, | |
| 638 const std::string& content_type, | |
| 639 const base::FilePath& local_file_path, | |
| 640 const UploadRangeCallback& callback, | |
| 641 const ProgressCallback& progress_callback) | |
| 642 : ResumeUploadRequestBase(sender, | |
| 643 upload_location, | |
| 644 start_position, | |
| 645 end_position, | |
| 646 content_length, | |
| 647 content_type, | |
| 648 local_file_path), | |
| 649 callback_(callback), | |
| 650 progress_callback_(progress_callback) { | |
| 651 DCHECK(!callback_.is_null()); | |
| 652 } | |
| 653 | |
| 654 ResumeUploadRequest::~ResumeUploadRequest() {} | |
| 655 | |
| 656 void ResumeUploadRequest::OnRangeRequestComplete( | |
| 657 const UploadRangeResponse& response, | |
| 658 scoped_ptr<base::Value> value) { | |
| 659 DCHECK(CalledOnValidThread()); | |
| 660 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass()); | |
| 661 } | |
| 662 | |
| 663 void ResumeUploadRequest::OnURLFetchUploadProgress( | |
| 664 const net::URLFetcher* source, int64 current, int64 total) { | |
| 665 if (!progress_callback_.is_null()) | |
| 666 progress_callback_.Run(current, total); | |
| 667 } | |
| 668 | |
| 669 //========================== GetUploadStatusRequest ========================== | |
| 670 | |
| 671 GetUploadStatusRequest::GetUploadStatusRequest( | |
| 672 RequestSender* sender, | |
| 673 const GURL& upload_url, | |
| 674 int64 content_length, | |
| 675 const UploadRangeCallback& callback) | |
| 676 : GetUploadStatusRequestBase(sender, | |
| 677 upload_url, | |
| 678 content_length), | |
| 679 callback_(callback) { | |
| 680 DCHECK(!callback.is_null()); | |
| 681 } | |
| 682 | |
| 683 GetUploadStatusRequest::~GetUploadStatusRequest() {} | |
| 684 | |
| 685 void GetUploadStatusRequest::OnRangeRequestComplete( | |
| 686 const UploadRangeResponse& response, | |
| 687 scoped_ptr<base::Value> value) { | |
| 688 DCHECK(CalledOnValidThread()); | |
| 689 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass()); | |
| 690 } | |
| 691 | |
| 692 //========================== DownloadFileRequest ========================== | |
| 693 | |
| 694 DownloadFileRequest::DownloadFileRequest( | |
| 695 RequestSender* sender, | |
| 696 const DriveApiUrlGenerator& url_generator, | |
| 697 const std::string& resource_id, | |
| 698 const base::FilePath& output_file_path, | |
| 699 const DownloadActionCallback& download_action_callback, | |
| 700 const GetContentCallback& get_content_callback, | |
| 701 const ProgressCallback& progress_callback) | |
| 702 : DownloadFileRequestBase( | |
| 703 sender, | |
| 704 download_action_callback, | |
| 705 get_content_callback, | |
| 706 progress_callback, | |
| 707 url_generator.GenerateDownloadFileUrl(resource_id), | |
| 708 output_file_path) { | |
| 709 } | |
| 710 | |
| 711 DownloadFileRequest::~DownloadFileRequest() { | |
| 712 } | |
| 713 | |
| 714 } // namespace drive | |
| 715 } // namespace google_apis | |
| OLD | NEW |