gdata_wapi_service.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/gdata_wapi_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/drive_api_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google_apis/auth_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/drive_api_parser.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/google_apis/gdata_errorcode.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/gdata_wapi_parser.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/google_apis/gdata_wapi_requests.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/gdata_wapi_url_generator.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/google_apis/request_sender.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AboutResource;
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using google_apis::AboutResourceCallback;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AccountMetadata;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AddResourceToDirectoryRequest;
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AppList;
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using google_apis::AppListCallback;
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using google_apis::AuthService;
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing google_apis::AuthStatusCallback;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AuthorizeAppCallback;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::AuthorizeAppRequest;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::CancelCallback;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::CopyHostedDocumentRequest;
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::CreateDirectoryRequest;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::DeleteResourceRequest;
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::DownloadActionCallback;
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::DownloadFileRequest;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::EntryActionCallback;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GDATA_PARSE_ERROR;
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)using google_apis::GDataErrorCode;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetAccountMetadataRequest;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetContentCallback;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetResourceEntryCallback;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetResourceEntryRequest;
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetResourceListCallback;
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetResourceListRequest;
50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing google_apis::GetShareUrlCallback;
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::GetUploadStatusRequest;
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::HTTP_NOT_IMPLEMENTED;
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::InitiateUploadCallback;
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::InitiateUploadExistingFileRequest;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::InitiateUploadNewFileRequest;
56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing google_apis::Link;
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::ProgressCallback;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::RemoveResourceFromDirectoryRequest;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::RenameResourceRequest;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::RequestSender;
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::ResourceEntry;
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::ResumeUploadRequest;
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::SearchByTitleRequest;
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing google_apis::UploadRangeCallback;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OAuth2 scopes for the documents API.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSpreadsheetsScope[] = "https://spreadsheets.google.com/feeds/";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUserContentScope[] = "https://docs.googleusercontent.com/";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Parses the JSON value to ResourceEntry runs |callback|.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParseResourceEntryAndRun(const GetResourceEntryCallback& callback,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              GDataErrorCode error,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              scoped_ptr<base::Value> value) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!value) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback.Run(error, scoped_ptr<ResourceEntry>());
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parsing ResourceEntry is cheap enough to do on UI thread.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceEntry> entry =
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      google_apis::ResourceEntry::ExtractAndParse(*value);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!entry) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback.Run(GDATA_PARSE_ERROR, scoped_ptr<ResourceEntry>());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(error, entry.Pass());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ConvertAboutResourceAndRun(
97424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AboutResourceCallback& callback,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GDataErrorCode error,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<AccountMetadata> account_metadata) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AboutResource> about_resource;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (account_metadata) {
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    about_resource = util::ConvertAccountMetadataToAboutResource(
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        *account_metadata, util::kWapiRootDirectoryResourceId);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(error, about_resource.Pass());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ConvertAppListAndRun(
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AppListCallback& callback,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GDataErrorCode error,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<AccountMetadata> account_metadata) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AppList> app_list;
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (account_metadata)
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    app_list = util::ConvertAccountMetadataToAppList(*account_metadata);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(error, app_list.Pass());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Returns the argument string.
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)std::string Identity(const std::string& resource_id) { return resource_id; }
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GDataWapiService::GDataWapiService(
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    OAuth2TokenService* oauth2_token_service,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter,
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::TaskRunner* blocking_task_runner,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& base_url,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const GURL& base_download_url,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& custom_user_agent)
138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : oauth2_token_service_(oauth2_token_service),
139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      url_request_context_getter_(url_request_context_getter),
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      blocking_task_runner_(blocking_task_runner),
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      url_generator_(base_url, base_download_url),
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      custom_user_agent_(custom_user_agent) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDataWapiService::~GDataWapiService() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (sender_.get())
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    sender_->auth_service()->RemoveObserver(this);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void GDataWapiService::Initialize(const std::string& account_id) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> scopes;
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scopes.push_back(util::kDocsListScope);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scopes.push_back(kSpreadsheetsScope);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scopes.push_back(kUserContentScope);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drive App scope is required for even WAPI v3 apps access.
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scopes.push_back(util::kDriveAppsScope);
1619ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  sender_.reset(new RequestSender(
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new AuthService(oauth2_token_service_,
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      account_id,
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      url_request_context_getter_.get(),
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      scopes),
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      url_request_context_getter_.get(),
1679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      blocking_task_runner_.get(),
1689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      custom_user_agent_));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sender_->auth_service()->AddObserver(this);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GDataWapiService::AddObserver(DriveServiceObserver* observer) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(observer);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GDataWapiService::RemoveObserver(DriveServiceObserver* observer) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.RemoveObserver(observer);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GDataWapiService::CanSendRequest() const {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HasRefreshToken();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ResourceIdCanonicalizer GDataWapiService::GetResourceIdCanonicalizer() const {
188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return base::Bind(&Identity);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GDataWapiService::GetRootResourceId() const {
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return util::kWapiRootDirectoryResourceId;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Because GData WAPI support is expected to be gone somehow soon by migration
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// to the Drive API v2, so we'll reuse GetResourceListRequest to implement
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// following methods, instead of cleaning the request class.
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetAllResourceList(
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetResourceListCallback& callback) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetResourceListRequest(sender_.get(),
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 url_generator_,
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 GURL(),         // No override url
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 0,              // start changestamp
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // empty search query
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // no directory resource id
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 callback));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetResourceListInDirectory(
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& directory_resource_id,
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetResourceListCallback& callback) {
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!directory_resource_id.empty());
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetResourceListRequest(sender_.get(),
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 url_generator_,
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 GURL(),         // No override url
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 0,              // start changestamp
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // empty search query
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 directory_resource_id,
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 callback));
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::Search(
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& search_query,
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GetResourceListCallback& callback) {
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!search_query.empty());
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetResourceListRequest(sender_.get(),
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 url_generator_,
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 GURL(),         // No override url
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 0,              // start changestamp
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 search_query,
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // no directory resource id
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 callback));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::SearchByTitle(
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& title,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& directory_resource_id,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GetResourceListCallback& callback) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!title.empty());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new SearchByTitleRequest(sender_.get(),
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               url_generator_,
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               title,
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               directory_resource_id,
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               callback));
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetChangeList(
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int64 start_changestamp,
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GetResourceListCallback& callback) {
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetResourceListRequest(sender_.get(),
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 url_generator_,
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 GURL(),         // No override url
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 start_changestamp,
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // empty search query
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 std::string(),  // no directory resource id
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 callback));
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CancelCallback GDataWapiService::GetRemainingChangeList(
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GURL& next_link,
282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const GetResourceListCallback& callback) {
283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!next_link.is_empty());
285424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(!callback.is_null());
286424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetRemainingResourceList(next_link, callback);
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CancelCallback GDataWapiService::GetRemainingFileList(
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GURL& next_link,
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const GetResourceListCallback& callback) {
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!next_link.is_empty());
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(!callback.is_null());
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetRemainingResourceList(next_link, callback);
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetResourceEntry(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_id,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new GetResourceEntryRequest(sender_.get(),
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  url_generator_,
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  resource_id,
310bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                  GURL(),
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  base::Bind(&ParseResourceEntryAndRun,
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             callback)));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochCancelCallback GDataWapiService::GetShareUrl(
316bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const std::string& resource_id,
317bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GURL& embed_origin,
318bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GetShareUrlCallback& callback) {
319bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
320bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(!callback.is_null());
321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return sender_->StartRequestWithRetry(
323bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      new GetResourceEntryRequest(sender_.get(),
324bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                  url_generator_,
325bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                  resource_id,
326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                  embed_origin,
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  base::Bind(&util::ParseShareUrlAndRun,
328bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                             callback)));
329bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
330bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetAboutResource(
332424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AboutResourceCallback& callback) {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetAccountMetadataRequest(
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          sender_.get(),
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          url_generator_,
340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          base::Bind(&ConvertAboutResourceAndRun, callback),
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          false));  // Exclude installed apps.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)CancelCallback GDataWapiService::GetAppList(const AppListCallback& callback) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new GetAccountMetadataRequest(sender_.get(),
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    url_generator_,
351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    base::Bind(&ConvertAppListAndRun, callback),
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    true));  // Include installed apps.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::DownloadFile(
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& local_cache_path,
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& resource_id,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadActionCallback& download_action_callback,
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetContentCallback& get_content_callback,
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ProgressCallback& progress_callback) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!download_action_callback.is_null());
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // get_content_callback and progress_callback may be null.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new DownloadFileRequest(sender_.get(),
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              url_generator_,
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              download_action_callback,
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              get_content_callback,
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              progress_callback,
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              resource_id,
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              local_cache_path));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::DeleteResource(
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& resource_id,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& etag,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const EntryActionCallback& callback) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new DeleteResourceRequest(sender_.get(),
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                url_generator_,
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                callback,
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                resource_id,
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                etag));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::AddNewDirectory(
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& parent_resource_id,
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& directory_title,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new CreateDirectoryRequest(sender_.get(),
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 url_generator_,
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 base::Bind(&ParseResourceEntryAndRun,
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            callback),
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 parent_resource_id,
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 directory_title));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::CopyResource(
40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& resource_id,
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& parent_resource_id,
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& new_title,
41068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::Time& last_modified,
41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!callback.is_null());
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // GData WAPI doesn't support "copy" of regular files.
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This method should never be called if GData WAPI is enabled.
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Instead, client code should download the file (if needed) and upload it.
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTREACHED();
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return CancelCallback();
42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::CopyHostedDocument(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_id,
4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& new_title,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new CopyHostedDocumentRequest(sender_.get(),
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    url_generator_,
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    base::Bind(&ParseResourceEntryAndRun,
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                               callback),
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    resource_id,
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    new_title));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)CancelCallback GDataWapiService::MoveResource(
4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::string& resource_id,
4403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::string& parent_resource_id,
4413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::string& new_title,
44268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::Time& last_modified,
4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const google_apis::GetResourceEntryCallback& callback) {
4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(!callback.is_null());
4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // GData WAPI doesn't support to "move" resources.
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This method should never be called if GData WAPI is enabled.
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Instead, client code should rename the file, add new parent, and then
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // remove the old parent.
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NOTREACHED();
4523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CancelCallback();
4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::RenameResource(
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& resource_id,
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& new_title,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const EntryActionCallback& callback) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new RenameResourceRequest(sender_.get(),
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                url_generator_,
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                callback,
466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                resource_id,
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                new_title));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::TouchResource(
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string& resource_id,
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::Time& modified_date,
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::Time& last_viewed_by_me_date,
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!modified_date.is_null());
47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!last_viewed_by_me_date.is_null());
47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!callback.is_null());
47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
48090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Unfortunately, there is no way to support this method on GData WAPI.
48190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // So, this should always return an error.
48290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
48390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      FROM_HERE,
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(callback, HTTP_NOT_IMPLEMENTED,
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Passed(scoped_ptr<ResourceEntry>())));
4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return base::Bind(&base::DoNothing);
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::AddResourceToDirectory(
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& parent_resource_id,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& resource_id,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const EntryActionCallback& callback) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new AddResourceToDirectoryRequest(sender_.get(),
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        url_generator_,
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        callback,
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        parent_resource_id,
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        resource_id));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::RemoveResourceFromDirectory(
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& parent_resource_id,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_id,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const EntryActionCallback& callback) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new RemoveResourceFromDirectoryRequest(sender_.get(),
513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             url_generator_,
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             callback,
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             parent_resource_id,
516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                             resource_id));
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::InitiateUploadNewFile(
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& content_type,
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 content_length,
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& parent_resource_id,
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& title,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const InitiateUploadCallback& callback) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!parent_resource_id.empty());
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new InitiateUploadNewFileRequest(sender_.get(),
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       url_generator_,
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       callback,
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       content_type,
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       content_length,
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       parent_resource_id,
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       title));
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::InitiateUploadExistingFile(
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& content_type,
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 content_length,
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& resource_id,
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& etag,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const InitiateUploadCallback& callback) {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!resource_id.empty());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new InitiateUploadExistingFileRequest(sender_.get(),
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            url_generator_,
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            callback,
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            content_type,
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            content_length,
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            resource_id,
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                            etag));
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::ResumeUpload(
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& upload_url,
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 start_position,
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 end_position,
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 content_length,
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& content_type,
565a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const base::FilePath& local_file_path,
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const UploadRangeCallback& callback,
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ProgressCallback& progress_callback) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new ResumeUploadRequest(sender_.get(),
573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              callback,
574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              progress_callback,
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              upload_url,
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              start_position,
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              end_position,
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              content_length,
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              content_type,
580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              local_file_path));
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::GetUploadStatus(
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& upload_url,
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 content_length,
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const UploadRangeCallback& callback) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new GetUploadStatusRequest(sender_.get(),
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 callback,
593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 upload_url,
594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 content_length));
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CancelCallback GDataWapiService::AuthorizeApp(
5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& resource_id,
5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& app_id,
6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const AuthorizeAppCallback& callback) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!callback.is_null());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return sender_->StartRequestWithRetry(
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new AuthorizeAppRequest(sender_.get(),
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              url_generator_,
607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              callback,
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              resource_id,
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              app_id));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CancelCallback GDataWapiService::GetResourceListInDirectoryByWapi(
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& directory_resource_id,
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const google_apis::GetResourceListCallback& callback) {
61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetResourceListInDirectory(directory_resource_id, callback);
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CancelCallback GDataWapiService::GetRemainingResourceList(
61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GURL& next_link,
62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const google_apis::GetResourceListCallback& callback) {
62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!next_link.is_empty());
62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!callback.is_null());
62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return sender_->StartRequestWithRetry(
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new GetResourceListRequest(sender_.get(),
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 url_generator_,
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 next_link,
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 0,              // start changestamp
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 std::string(),  // empty search query
63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 std::string(),  // no directory resource id
63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 callback));
63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GDataWapiService::HasAccessToken() const {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return sender_->auth_service()->HasAccessToken();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GDataWapiService::RequestAccessToken(const AuthStatusCallback& callback) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(!callback.is_null());
6447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string access_token = sender_->auth_service()->access_token();
6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!access_token.empty()) {
6477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    callback.Run(google_apis::HTTP_NOT_MODIFIED, access_token);
6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Retrieve the new auth token.
6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  sender_->auth_service()->StartAuthentication(callback);
6537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
6547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool GDataWapiService::HasRefreshToken() const {
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return sender_->auth_service()->HasRefreshToken();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GDataWapiService::ClearAccessToken() {
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  sender_->auth_service()->ClearAccessToken();
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GDataWapiService::ClearRefreshToken() {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  sender_->auth_service()->ClearRefreshToken();
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GDataWapiService::OnOAuth2RefreshTokenChanged() {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (CanSendRequest()) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FOR_EACH_OBSERVER(
674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DriveServiceObserver, observers_, OnReadyToSendRequests());
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (!HasRefreshToken()) {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOR_EACH_OBSERVER(
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DriveServiceObserver, observers_, OnRefreshTokenInvalid());
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace drive
682