| Index: chrome/browser/drive/drive_api_service.cc
|
| diff --git a/chrome/browser/drive/drive_api_service.cc b/chrome/browser/drive/drive_api_service.cc
|
| deleted file mode 100644
|
| index 6a875adc47bce9e8501a40620231e736553a0cb8..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/drive/drive_api_service.cc
|
| +++ /dev/null
|
| @@ -1,872 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/drive/drive_api_service.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "chrome/browser/drive/drive_api_util.h"
|
| -#include "google_apis/drive/auth_service.h"
|
| -#include "google_apis/drive/base_requests.h"
|
| -#include "google_apis/drive/drive_api_parser.h"
|
| -#include "google_apis/drive/drive_api_requests.h"
|
| -#include "google_apis/drive/files_list_request_runner.h"
|
| -#include "google_apis/drive/request_sender.h"
|
| -#include "google_apis/google_api_keys.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -
|
| -using google_apis::AboutResourceCallback;
|
| -using google_apis::AppList;
|
| -using google_apis::AppListCallback;
|
| -using google_apis::AuthStatusCallback;
|
| -using google_apis::AuthorizeAppCallback;
|
| -using google_apis::CancelCallback;
|
| -using google_apis::ChangeList;
|
| -using google_apis::ChangeListCallback;
|
| -using google_apis::DownloadActionCallback;
|
| -using google_apis::EntryActionCallback;
|
| -using google_apis::FileList;
|
| -using google_apis::FileListCallback;
|
| -using google_apis::FileResource;
|
| -using google_apis::FileResourceCallback;
|
| -using google_apis::DRIVE_OTHER_ERROR;
|
| -using google_apis::DRIVE_PARSE_ERROR;
|
| -using google_apis::DriveApiErrorCode;
|
| -using google_apis::GetContentCallback;
|
| -using google_apis::GetShareUrlCallback;
|
| -using google_apis::HTTP_NOT_IMPLEMENTED;
|
| -using google_apis::HTTP_SUCCESS;
|
| -using google_apis::InitiateUploadCallback;
|
| -using google_apis::ProgressCallback;
|
| -using google_apis::RequestSender;
|
| -using google_apis::FilesListRequestRunner;
|
| -using google_apis::UploadRangeResponse;
|
| -using google_apis::drive::AboutGetRequest;
|
| -using google_apis::drive::AppsListRequest;
|
| -using google_apis::drive::ChangesListRequest;
|
| -using google_apis::drive::ChangesListNextPageRequest;
|
| -using google_apis::drive::ChildrenDeleteRequest;
|
| -using google_apis::drive::ChildrenInsertRequest;
|
| -using google_apis::drive::DownloadFileRequest;
|
| -using google_apis::drive::FilesCopyRequest;
|
| -using google_apis::drive::FilesGetRequest;
|
| -using google_apis::drive::FilesInsertRequest;
|
| -using google_apis::drive::FilesPatchRequest;
|
| -using google_apis::drive::FilesListRequest;
|
| -using google_apis::drive::FilesListNextPageRequest;
|
| -using google_apis::drive::FilesDeleteRequest;
|
| -using google_apis::drive::FilesTrashRequest;
|
| -using google_apis::drive::GetUploadStatusRequest;
|
| -using google_apis::drive::InitiateUploadExistingFileRequest;
|
| -using google_apis::drive::InitiateUploadNewFileRequest;
|
| -using google_apis::drive::ResumeUploadRequest;
|
| -using google_apis::drive::UploadRangeCallback;
|
| -
|
| -namespace drive {
|
| -
|
| -namespace {
|
| -
|
| -// OAuth2 scopes for Drive API.
|
| -const char kDriveScope[] = "https://www.googleapis.com/auth/drive";
|
| -const char kDriveAppsReadonlyScope[] =
|
| - "https://www.googleapis.com/auth/drive.apps.readonly";
|
| -const char kDriveAppsScope[] = "https://www.googleapis.com/auth/drive.apps";
|
| -const char kDocsListScope[] = "https://docs.google.com/feeds/";
|
| -
|
| -// Mime type to create a directory.
|
| -const char kFolderMimeType[] = "application/vnd.google-apps.folder";
|
| -
|
| -// Max number of file entries to be fetched in a single http request.
|
| -//
|
| -// The larger the number is,
|
| -// - The total running time to fetch the whole file list will become shorter.
|
| -// - The running time for a single request tends to become longer.
|
| -// Since the file list fetching is a completely background task, for our side,
|
| -// only the total time matters. However, the server seems to have a time limit
|
| -// per single request, which disables us to set the largest value (1000).
|
| -// TODO(kinaba): make it larger when the server gets faster.
|
| -const int kMaxNumFilesResourcePerRequest = 300;
|
| -const int kMaxNumFilesResourcePerRequestForSearch = 100;
|
| -
|
| -// For performance, we declare all fields we use.
|
| -const char kAboutResourceFields[] =
|
| - "kind,quotaBytesTotal,quotaBytesUsedAggregate,largestChangeId,rootFolderId";
|
| -const char kFileResourceFields[] =
|
| - "kind,id,title,createdDate,sharedWithMeDate,mimeType,"
|
| - "md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width,"
|
| - "imageMediaMetadata/height,imageMediaMetadata/rotation,etag,"
|
| - "parents(id,parentLink),alternateLink,"
|
| - "modifiedDate,lastViewedByMeDate,shared";
|
| -const char kFileResourceOpenWithLinksFields[] =
|
| - "kind,id,openWithLinks/*";
|
| -const char kFileResourceShareLinkFields[] =
|
| - "kind,id,shareLink";
|
| -const char kFileListFields[] =
|
| - "kind,items(kind,id,title,createdDate,sharedWithMeDate,"
|
| - "mimeType,md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width,"
|
| - "imageMediaMetadata/height,imageMediaMetadata/rotation,etag,"
|
| - "parents(id,parentLink),alternateLink,"
|
| - "modifiedDate,lastViewedByMeDate,shared),nextLink";
|
| -const char kChangeListFields[] =
|
| - "kind,items(file(kind,id,title,createdDate,sharedWithMeDate,"
|
| - "mimeType,md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width,"
|
| - "imageMediaMetadata/height,imageMediaMetadata/rotation,etag,"
|
| - "parents(id,parentLink),alternateLink,modifiedDate,"
|
| - "lastViewedByMeDate,shared),deleted,id,fileId,modificationDate),nextLink,"
|
| - "largestChangeId";
|
| -
|
| -void ExtractOpenUrlAndRun(const std::string& app_id,
|
| - const AuthorizeAppCallback& callback,
|
| - DriveApiErrorCode error,
|
| - scoped_ptr<FileResource> value) {
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (!value) {
|
| - callback.Run(error, GURL());
|
| - return;
|
| - }
|
| -
|
| - const std::vector<FileResource::OpenWithLink>& open_with_links =
|
| - value->open_with_links();
|
| - for (size_t i = 0; i < open_with_links.size(); ++i) {
|
| - if (open_with_links[i].app_id == app_id) {
|
| - callback.Run(HTTP_SUCCESS, open_with_links[i].open_url);
|
| - return;
|
| - }
|
| - }
|
| -
|
| - // Not found.
|
| - callback.Run(DRIVE_OTHER_ERROR, GURL());
|
| -}
|
| -
|
| -void ExtractShareUrlAndRun(const GetShareUrlCallback& callback,
|
| - DriveApiErrorCode error,
|
| - scoped_ptr<FileResource> value) {
|
| - callback.Run(error, value ? value->share_link() : GURL());
|
| -}
|
| -
|
| -// Ignores the |entry|, and runs the |callback|.
|
| -void EntryActionCallbackAdapter(
|
| - const EntryActionCallback& callback,
|
| - DriveApiErrorCode error, scoped_ptr<FileResource> entry) {
|
| - callback.Run(error);
|
| -}
|
| -
|
| -// The resource ID for the root directory for Drive API is defined in the spec:
|
| -// https://developers.google.com/drive/folder
|
| -const char kDriveApiRootDirectoryResourceId[] = "root";
|
| -
|
| -} // namespace
|
| -
|
| -BatchRequestConfigurator::BatchRequestConfigurator(
|
| - const base::WeakPtr<google_apis::drive::BatchUploadRequest>& batch_request,
|
| - base::SequencedTaskRunner* task_runner,
|
| - const google_apis::DriveApiUrlGenerator& url_generator,
|
| - const google_apis::CancelCallback& cancel_callback)
|
| - : batch_request_(batch_request),
|
| - task_runner_(task_runner),
|
| - url_generator_(url_generator),
|
| - cancel_callback_(cancel_callback) {
|
| -}
|
| -
|
| -BatchRequestConfigurator::~BatchRequestConfigurator() {
|
| - // The batch requst has not been committed.
|
| - if (batch_request_)
|
| - cancel_callback_.Run();
|
| -}
|
| -
|
| -google_apis::CancelCallback BatchRequestConfigurator::MultipartUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const base::FilePath& local_file_path,
|
| - const UploadNewFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - scoped_ptr<google_apis::BatchableDelegate> delegate(
|
| - new google_apis::drive::MultipartUploadNewFileDelegate(
|
| - task_runner_.get(), title, parent_resource_id, content_type,
|
| - content_length, options.modified_date, options.last_viewed_by_me_date,
|
| - local_file_path, options.properties, url_generator_, callback,
|
| - progress_callback));
|
| - // Batch request can be null when pre-authorization for the requst is failed
|
| - // in request sender.
|
| - if (batch_request_)
|
| - batch_request_->AddRequest(delegate.release());
|
| - else
|
| - delegate->NotifyError(DRIVE_OTHER_ERROR);
|
| - return cancel_callback_;
|
| -}
|
| -
|
| -google_apis::CancelCallback
|
| -BatchRequestConfigurator::MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const UploadExistingFileOptions& options,
|
| - const google_apis::FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - scoped_ptr<google_apis::BatchableDelegate> delegate(
|
| - new google_apis::drive::MultipartUploadExistingFileDelegate(
|
| - task_runner_.get(), options.title, resource_id,
|
| - options.parent_resource_id, content_type, content_length,
|
| - options.modified_date, options.last_viewed_by_me_date,
|
| - local_file_path, options.etag, options.properties, url_generator_,
|
| - callback, progress_callback));
|
| - // Batch request can be null when pre-authorization for the requst is failed
|
| - // in request sender.
|
| - if (batch_request_)
|
| - batch_request_->AddRequest(delegate.release());
|
| - else
|
| - delegate->NotifyError(DRIVE_OTHER_ERROR);
|
| - return cancel_callback_;
|
| -}
|
| -
|
| -void BatchRequestConfigurator::Commit() {
|
| - DCHECK(CalledOnValidThread());
|
| - if (!batch_request_)
|
| - return;
|
| - batch_request_->Commit();
|
| - batch_request_.reset();
|
| -}
|
| -
|
| -DriveAPIService::DriveAPIService(
|
| - OAuth2TokenService* oauth2_token_service,
|
| - net::URLRequestContextGetter* url_request_context_getter,
|
| - base::SequencedTaskRunner* blocking_task_runner,
|
| - const GURL& base_url,
|
| - const GURL& base_download_url,
|
| - const std::string& custom_user_agent)
|
| - : oauth2_token_service_(oauth2_token_service),
|
| - url_request_context_getter_(url_request_context_getter),
|
| - blocking_task_runner_(blocking_task_runner),
|
| - url_generator_(base_url, base_download_url),
|
| - custom_user_agent_(custom_user_agent) {
|
| -}
|
| -
|
| -DriveAPIService::~DriveAPIService() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (sender_.get())
|
| - sender_->auth_service()->RemoveObserver(this);
|
| -}
|
| -
|
| -void DriveAPIService::Initialize(const std::string& account_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - std::vector<std::string> scopes;
|
| - scopes.push_back(kDriveScope);
|
| - scopes.push_back(kDriveAppsReadonlyScope);
|
| - scopes.push_back(kDriveAppsScope);
|
| -
|
| - // Note: The following scope is used to support GetShareUrl on Drive API v2.
|
| - // Unfortunately, there is no support on Drive API v2, so we need to fall back
|
| - // to GData WAPI for the GetShareUrl.
|
| - scopes.push_back(kDocsListScope);
|
| -
|
| - sender_.reset(new RequestSender(
|
| - new google_apis::AuthService(oauth2_token_service_,
|
| - account_id,
|
| - url_request_context_getter_.get(),
|
| - scopes),
|
| - url_request_context_getter_.get(),
|
| - blocking_task_runner_.get(),
|
| - custom_user_agent_));
|
| - sender_->auth_service()->AddObserver(this);
|
| -
|
| - files_list_request_runner_.reset(
|
| - new FilesListRequestRunner(sender_.get(), url_generator_));
|
| -}
|
| -
|
| -void DriveAPIService::AddObserver(DriveServiceObserver* observer) {
|
| - observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void DriveAPIService::RemoveObserver(DriveServiceObserver* observer) {
|
| - observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -bool DriveAPIService::CanSendRequest() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - return HasRefreshToken();
|
| -}
|
| -
|
| -std::string DriveAPIService::GetRootResourceId() const {
|
| - return kDriveApiRootDirectoryResourceId;
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetAllFileList(
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesListRequest* request = new FilesListRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_max_results(kMaxNumFilesResourcePerRequest);
|
| - request->set_q("trashed = false"); // Exclude trashed files.
|
| - request->set_fields(kFileListFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetFileListInDirectory(
|
| - const std::string& directory_resource_id,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!directory_resource_id.empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // Because children.list method on Drive API v2 returns only the list of
|
| - // children's references, but we need all file resource list.
|
| - // So, here we use files.list method instead, with setting parents query.
|
| - // After the migration from GData WAPI to Drive API v2, we should clean the
|
| - // code up by moving the responsibility to include "parents" in the query
|
| - // to client side.
|
| - // We aren't interested in files in trash in this context, neither.
|
| - return files_list_request_runner_->CreateAndStartWithSizeBackoff(
|
| - kMaxNumFilesResourcePerRequest,
|
| - base::StringPrintf(
|
| - "'%s' in parents and trashed = false",
|
| - util::EscapeQueryStringValue(directory_resource_id).c_str()),
|
| - kFileListFields, callback);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::Search(
|
| - const std::string& search_query,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!search_query.empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return files_list_request_runner_->CreateAndStartWithSizeBackoff(
|
| - kMaxNumFilesResourcePerRequestForSearch,
|
| - util::TranslateQuery(search_query), kFileListFields, callback);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::SearchByTitle(
|
| - const std::string& title,
|
| - const std::string& directory_resource_id,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!title.empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - std::string query;
|
| - base::StringAppendF(&query, "title = '%s'",
|
| - util::EscapeQueryStringValue(title).c_str());
|
| - if (!directory_resource_id.empty()) {
|
| - base::StringAppendF(
|
| - &query, " and '%s' in parents",
|
| - util::EscapeQueryStringValue(directory_resource_id).c_str());
|
| - }
|
| - query += " and trashed = false";
|
| -
|
| - FilesListRequest* request = new FilesListRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_max_results(kMaxNumFilesResourcePerRequest);
|
| - request->set_q(query);
|
| - request->set_fields(kFileListFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetChangeList(
|
| - int64 start_changestamp,
|
| - const ChangeListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - ChangesListRequest* request = new ChangesListRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_max_results(kMaxNumFilesResourcePerRequest);
|
| - request->set_start_change_id(start_changestamp);
|
| - request->set_fields(kChangeListFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetRemainingChangeList(
|
| - const GURL& next_link,
|
| - const ChangeListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!next_link.is_empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - ChangesListNextPageRequest* request = new ChangesListNextPageRequest(
|
| - sender_.get(), callback);
|
| - request->set_next_link(next_link);
|
| - request->set_fields(kChangeListFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetRemainingFileList(
|
| - const GURL& next_link,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!next_link.is_empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesListNextPageRequest* request = new FilesListNextPageRequest(
|
| - sender_.get(), callback);
|
| - request->set_next_link(next_link);
|
| - request->set_fields(kFileListFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetFileResource(
|
| - const std::string& resource_id,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesGetRequest* request = new FilesGetRequest(
|
| - sender_.get(), url_generator_, google_apis::IsGoogleChromeAPIKeyUsed(),
|
| - callback);
|
| - request->set_file_id(resource_id);
|
| - request->set_fields(kFileResourceFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetShareUrl(
|
| - const std::string& resource_id,
|
| - const GURL& embed_origin,
|
| - const GetShareUrlCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (!google_apis::IsGoogleChromeAPIKeyUsed()) {
|
| - LOG(ERROR) << "Only the official build of Chrome OS can open share dialogs "
|
| - << "from the file manager.";
|
| - }
|
| -
|
| - FilesGetRequest* request = new FilesGetRequest(
|
| - sender_.get(), url_generator_, google_apis::IsGoogleChromeAPIKeyUsed(),
|
| - base::Bind(&ExtractShareUrlAndRun, callback));
|
| - request->set_file_id(resource_id);
|
| - request->set_fields(kFileResourceShareLinkFields);
|
| - request->set_embed_origin(embed_origin);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetAboutResource(
|
| - const AboutResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - AboutGetRequest* request =
|
| - new AboutGetRequest(sender_.get(), url_generator_, callback);
|
| - request->set_fields(kAboutResourceFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetAppList(const AppListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return sender_->StartRequestWithAuthRetry(
|
| - new AppsListRequest(sender_.get(), url_generator_,
|
| - google_apis::IsGoogleChromeAPIKeyUsed(), callback));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::DownloadFile(
|
| - const base::FilePath& local_cache_path,
|
| - const std::string& resource_id,
|
| - const DownloadActionCallback& download_action_callback,
|
| - const GetContentCallback& get_content_callback,
|
| - const ProgressCallback& progress_callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!download_action_callback.is_null());
|
| - // get_content_callback may be null.
|
| -
|
| - return sender_->StartRequestWithAuthRetry(new DownloadFileRequest(
|
| - sender_.get(), url_generator_, resource_id, local_cache_path,
|
| - download_action_callback, get_content_callback, progress_callback));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::DeleteResource(
|
| - const std::string& resource_id,
|
| - const std::string& etag,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesDeleteRequest* request = new FilesDeleteRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_file_id(resource_id);
|
| - request->set_etag(etag);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::TrashResource(
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesTrashRequest* request = new FilesTrashRequest(
|
| - sender_.get(), url_generator_,
|
| - base::Bind(&EntryActionCallbackAdapter, callback));
|
| - request->set_file_id(resource_id);
|
| - request->set_fields(kFileResourceFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::AddNewDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& directory_title,
|
| - const AddNewDirectoryOptions& options,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesInsertRequest* request = new FilesInsertRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_last_viewed_by_me_date(options.last_viewed_by_me_date);
|
| - request->set_mime_type(kFolderMimeType);
|
| - request->set_modified_date(options.modified_date);
|
| - request->add_parent(parent_resource_id);
|
| - request->set_title(directory_title);
|
| - request->set_properties(options.properties);
|
| - request->set_fields(kFileResourceFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::CopyResource(
|
| - const std::string& resource_id,
|
| - const std::string& parent_resource_id,
|
| - const std::string& new_title,
|
| - const base::Time& last_modified,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesCopyRequest* request = new FilesCopyRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_file_id(resource_id);
|
| - request->add_parent(parent_resource_id);
|
| - request->set_title(new_title);
|
| - request->set_modified_date(last_modified);
|
| - request->set_fields(kFileResourceFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::UpdateResource(
|
| - const std::string& resource_id,
|
| - const std::string& parent_resource_id,
|
| - const std::string& new_title,
|
| - const base::Time& last_modified,
|
| - const base::Time& last_viewed_by_me,
|
| - const google_apis::drive::Properties& properties,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - FilesPatchRequest* request = new FilesPatchRequest(
|
| - sender_.get(), url_generator_, callback);
|
| - request->set_file_id(resource_id);
|
| - request->set_title(new_title);
|
| - if (!parent_resource_id.empty())
|
| - request->add_parent(parent_resource_id);
|
| - if (!last_modified.is_null()) {
|
| - // Need to set setModifiedDate to true to overwrite modifiedDate.
|
| - request->set_set_modified_date(true);
|
| - request->set_modified_date(last_modified);
|
| - }
|
| - if (!last_viewed_by_me.is_null()) {
|
| - // Need to set updateViewedDate to false, otherwise the lastViewedByMeDate
|
| - // will be set to the request time (not the specified time via request).
|
| - request->set_update_viewed_date(false);
|
| - request->set_last_viewed_by_me_date(last_viewed_by_me);
|
| - }
|
| - request->set_fields(kFileResourceFields);
|
| - request->set_properties(properties);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::AddResourceToDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - ChildrenInsertRequest* request =
|
| - new ChildrenInsertRequest(sender_.get(), url_generator_, callback);
|
| - request->set_folder_id(parent_resource_id);
|
| - request->set_id(resource_id);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::RemoveResourceFromDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - ChildrenDeleteRequest* request =
|
| - new ChildrenDeleteRequest(sender_.get(), url_generator_, callback);
|
| - request->set_child_id(resource_id);
|
| - request->set_folder_id(parent_resource_id);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::InitiateUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const UploadNewFileOptions& options,
|
| - const InitiateUploadCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - InitiateUploadNewFileRequest* request =
|
| - new InitiateUploadNewFileRequest(sender_.get(),
|
| - url_generator_,
|
| - content_type,
|
| - content_length,
|
| - parent_resource_id,
|
| - title,
|
| - callback);
|
| - request->set_modified_date(options.modified_date);
|
| - request->set_last_viewed_by_me_date(options.last_viewed_by_me_date);
|
| - request->set_properties(options.properties);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::InitiateUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const UploadExistingFileOptions& options,
|
| - const InitiateUploadCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - InitiateUploadExistingFileRequest* request =
|
| - new InitiateUploadExistingFileRequest(sender_.get(),
|
| - url_generator_,
|
| - content_type,
|
| - content_length,
|
| - resource_id,
|
| - options.etag,
|
| - callback);
|
| - request->set_parent_resource_id(options.parent_resource_id);
|
| - request->set_title(options.title);
|
| - request->set_modified_date(options.modified_date);
|
| - request->set_last_viewed_by_me_date(options.last_viewed_by_me_date);
|
| - request->set_properties(options.properties);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::ResumeUpload(
|
| - const GURL& upload_url,
|
| - int64 start_position,
|
| - int64 end_position,
|
| - int64 content_length,
|
| - const std::string& content_type,
|
| - const base::FilePath& local_file_path,
|
| - const UploadRangeCallback& callback,
|
| - const ProgressCallback& progress_callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return sender_->StartRequestWithAuthRetry(new ResumeUploadRequest(
|
| - sender_.get(), upload_url, start_position, end_position, content_length,
|
| - content_type, local_file_path, callback, progress_callback));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::GetUploadStatus(
|
| - const GURL& upload_url,
|
| - int64 content_length,
|
| - const UploadRangeCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return sender_->StartRequestWithAuthRetry(new GetUploadStatusRequest(
|
| - sender_.get(), upload_url, content_length, callback));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::MultipartUploadNewFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - const base::FilePath& local_file_path,
|
| - const drive::UploadNewFileOptions& options,
|
| - const FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return sender_->StartRequestWithAuthRetry(
|
| - new google_apis::drive::SingleBatchableDelegateRequest(
|
| - sender_.get(),
|
| - new google_apis::drive::MultipartUploadNewFileDelegate(
|
| - sender_->blocking_task_runner(), title, parent_resource_id,
|
| - content_type, content_length, options.modified_date,
|
| - options.last_viewed_by_me_date, local_file_path,
|
| - options.properties, url_generator_, callback,
|
| - progress_callback)));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const drive::UploadExistingFileOptions& options,
|
| - const FileResourceCallback& callback,
|
| - const google_apis::ProgressCallback& progress_callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return sender_->StartRequestWithAuthRetry(
|
| - new google_apis::drive::SingleBatchableDelegateRequest(
|
| - sender_.get(),
|
| - new google_apis::drive::MultipartUploadExistingFileDelegate(
|
| - sender_->blocking_task_runner(), options.title, resource_id,
|
| - options.parent_resource_id, content_type, content_length,
|
| - options.modified_date, options.last_viewed_by_me_date,
|
| - local_file_path, options.etag, options.properties, url_generator_,
|
| - callback, progress_callback)));
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::AuthorizeApp(
|
| - const std::string& resource_id,
|
| - const std::string& app_id,
|
| - const AuthorizeAppCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // Files.Authorize is only available for whitelisted clients like official
|
| - // Google Chrome. In other cases, we fall back to Files.Get that returns the
|
| - // same value as Files.Authorize without doing authorization. In that case,
|
| - // the app can open if it was authorized by other means (from whitelisted
|
| - // clients or drive.google.com web UI.)
|
| - if (google_apis::IsGoogleChromeAPIKeyUsed()) {
|
| - google_apis::drive::FilesAuthorizeRequest* request =
|
| - new google_apis::drive::FilesAuthorizeRequest(
|
| - sender_.get(), url_generator_,
|
| - base::Bind(&ExtractOpenUrlAndRun, app_id, callback));
|
| - request->set_app_id(app_id);
|
| - request->set_file_id(resource_id);
|
| - request->set_fields(kFileResourceOpenWithLinksFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| - } else {
|
| - FilesGetRequest* request = new FilesGetRequest(
|
| - sender_.get(), url_generator_, google_apis::IsGoogleChromeAPIKeyUsed(),
|
| - base::Bind(&ExtractOpenUrlAndRun, app_id, callback));
|
| - request->set_file_id(resource_id);
|
| - request->set_fields(kFileResourceOpenWithLinksFields);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| - }
|
| -}
|
| -
|
| -CancelCallback DriveAPIService::UninstallApp(
|
| - const std::string& app_id,
|
| - const google_apis::EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - google_apis::drive::AppsDeleteRequest* request =
|
| - new google_apis::drive::AppsDeleteRequest(sender_.get(), url_generator_,
|
| - callback);
|
| - request->set_app_id(app_id);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -google_apis::CancelCallback DriveAPIService::AddPermission(
|
| - const std::string& resource_id,
|
| - const std::string& email,
|
| - google_apis::drive::PermissionRole role,
|
| - const google_apis::EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - google_apis::drive::PermissionsInsertRequest* request =
|
| - new google_apis::drive::PermissionsInsertRequest(sender_.get(),
|
| - url_generator_,
|
| - callback);
|
| - request->set_id(resource_id);
|
| - request->set_role(role);
|
| - request->set_type(google_apis::drive::PERMISSION_TYPE_USER);
|
| - request->set_value(email);
|
| - return sender_->StartRequestWithAuthRetry(request);
|
| -}
|
| -
|
| -bool DriveAPIService::HasAccessToken() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return sender_->auth_service()->HasAccessToken();
|
| -}
|
| -
|
| -void DriveAPIService::RequestAccessToken(const AuthStatusCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - const std::string access_token = sender_->auth_service()->access_token();
|
| - if (!access_token.empty()) {
|
| - callback.Run(google_apis::HTTP_NOT_MODIFIED, access_token);
|
| - return;
|
| - }
|
| -
|
| - // Retrieve the new auth token.
|
| - sender_->auth_service()->StartAuthentication(callback);
|
| -}
|
| -
|
| -bool DriveAPIService::HasRefreshToken() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return sender_->auth_service()->HasRefreshToken();
|
| -}
|
| -
|
| -void DriveAPIService::ClearAccessToken() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - sender_->auth_service()->ClearAccessToken();
|
| -}
|
| -
|
| -void DriveAPIService::ClearRefreshToken() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - sender_->auth_service()->ClearRefreshToken();
|
| -}
|
| -
|
| -void DriveAPIService::OnOAuth2RefreshTokenChanged() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (CanSendRequest()) {
|
| - FOR_EACH_OBSERVER(
|
| - DriveServiceObserver, observers_, OnReadyToSendRequests());
|
| - } else if (!HasRefreshToken()) {
|
| - FOR_EACH_OBSERVER(
|
| - DriveServiceObserver, observers_, OnRefreshTokenInvalid());
|
| - }
|
| -}
|
| -
|
| -scoped_ptr<BatchRequestConfiguratorInterface>
|
| -DriveAPIService::StartBatchRequest() {
|
| - scoped_ptr<google_apis::drive::BatchUploadRequest> request(
|
| - new google_apis::drive::BatchUploadRequest(sender_.get(),
|
| - url_generator_));
|
| - const base::WeakPtr<google_apis::drive::BatchUploadRequest> weak_ref =
|
| - request->GetWeakPtrAsBatchUploadRequest();
|
| - // Have sender_ manage the lifetime of the request.
|
| - // TODO(hirono): Currently we need to pass the ownership of the request to
|
| - // RequestSender before the request is committed because the request has a
|
| - // reference to RequestSender and we should ensure to delete the request when
|
| - // the sender is deleted. Resolve the circulating dependency and fix it.
|
| - const google_apis::CancelCallback callback =
|
| - sender_->StartRequestWithAuthRetry(request.release());
|
| - return make_scoped_ptr<BatchRequestConfiguratorInterface>(
|
| - new BatchRequestConfigurator(weak_ref, sender_->blocking_task_runner(),
|
| - url_generator_, callback));
|
| -}
|
| -
|
| -} // namespace drive
|
|
|