| Index: chrome/browser/drive/fake_drive_service.cc
|
| diff --git a/chrome/browser/drive/fake_drive_service.cc b/chrome/browser/drive/fake_drive_service.cc
|
| deleted file mode 100644
|
| index a524b8750773b06926c9600edb72da14ee08ab3f..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/drive/fake_drive_service.cc
|
| +++ /dev/null
|
| @@ -1,1787 +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/fake_drive_service.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/files/file_util.h"
|
| -#include "base/json/json_string_value_serializer.h"
|
| -#include "base/logging.h"
|
| -#include "base/md5.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/string_tokenizer.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/drive/drive_api_util.h"
|
| -#include "google_apis/drive/drive_api_parser.h"
|
| -#include "google_apis/drive/test_util.h"
|
| -#include "net/base/escape.h"
|
| -#include "net/base/url_util.h"
|
| -
|
| -using google_apis::AboutResource;
|
| -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::ChangeResource;
|
| -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_FILE_ERROR;
|
| -using google_apis::DRIVE_NO_CONNECTION;
|
| -using google_apis::DRIVE_OTHER_ERROR;
|
| -using google_apis::DriveApiErrorCode;
|
| -using google_apis::GetContentCallback;
|
| -using google_apis::GetShareUrlCallback;
|
| -using google_apis::HTTP_BAD_REQUEST;
|
| -using google_apis::HTTP_CREATED;
|
| -using google_apis::HTTP_FORBIDDEN;
|
| -using google_apis::HTTP_NOT_FOUND;
|
| -using google_apis::HTTP_NO_CONTENT;
|
| -using google_apis::HTTP_PRECONDITION;
|
| -using google_apis::HTTP_RESUME_INCOMPLETE;
|
| -using google_apis::HTTP_SUCCESS;
|
| -using google_apis::InitiateUploadCallback;
|
| -using google_apis::ParentReference;
|
| -using google_apis::ProgressCallback;
|
| -using google_apis::UploadRangeResponse;
|
| -using google_apis::drive::UploadRangeCallback;
|
| -namespace test_util = google_apis::test_util;
|
| -
|
| -namespace drive {
|
| -namespace {
|
| -
|
| -// Returns true if the entry matches with the search query.
|
| -// Supports queries consist of following format.
|
| -// - Phrases quoted by double/single quotes
|
| -// - AND search for multiple words/phrases segmented by space
|
| -// - Limited attribute search. Only "title:" is supported.
|
| -bool EntryMatchWithQuery(const ChangeResource& entry,
|
| - const std::string& query) {
|
| - base::StringTokenizer tokenizer(query, " ");
|
| - tokenizer.set_quote_chars("\"'");
|
| - while (tokenizer.GetNext()) {
|
| - std::string key, value;
|
| - const std::string& token = tokenizer.token();
|
| - if (token.find(':') == std::string::npos) {
|
| - base::TrimString(token, "\"'", &value);
|
| - } else {
|
| - base::StringTokenizer key_value(token, ":");
|
| - key_value.set_quote_chars("\"'");
|
| - if (!key_value.GetNext())
|
| - return false;
|
| - key = key_value.token();
|
| - if (!key_value.GetNext())
|
| - return false;
|
| - base::TrimString(key_value.token(), "\"'", &value);
|
| - }
|
| -
|
| - // TODO(peria): Deal with other attributes than title.
|
| - if (!key.empty() && key != "title")
|
| - return false;
|
| - // Search query in the title.
|
| - if (!entry.file() ||
|
| - entry.file()->title().find(value) == std::string::npos)
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void ScheduleUploadRangeCallback(const UploadRangeCallback& callback,
|
| - int64 start_position,
|
| - int64 end_position,
|
| - DriveApiErrorCode error,
|
| - scoped_ptr<FileResource> entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - UploadRangeResponse(error,
|
| - start_position,
|
| - end_position),
|
| - base::Passed(&entry)));
|
| -}
|
| -
|
| -void FileListCallbackAdapter(const FileListCallback& callback,
|
| - DriveApiErrorCode error,
|
| - scoped_ptr<ChangeList> change_list) {
|
| - scoped_ptr<FileList> file_list;
|
| - if (!change_list) {
|
| - callback.Run(error, file_list.Pass());
|
| - return;
|
| - }
|
| -
|
| - file_list.reset(new FileList);
|
| - file_list->set_next_link(change_list->next_link());
|
| - for (size_t i = 0; i < change_list->items().size(); ++i) {
|
| - const ChangeResource& entry = *change_list->items()[i];
|
| - if (entry.file())
|
| - file_list->mutable_items()->push_back(new FileResource(*entry.file()));
|
| - }
|
| - callback.Run(error, file_list.Pass());
|
| -}
|
| -
|
| -bool UserHasWriteAccess(google_apis::drive::PermissionRole user_permission) {
|
| - switch (user_permission) {
|
| - case google_apis::drive::PERMISSION_ROLE_OWNER:
|
| - case google_apis::drive::PERMISSION_ROLE_WRITER:
|
| - return true;
|
| - case google_apis::drive::PERMISSION_ROLE_READER:
|
| - case google_apis::drive::PERMISSION_ROLE_COMMENTER:
|
| - break;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void CallFileResouceCallback(const FileResourceCallback& callback,
|
| - const UploadRangeResponse& response,
|
| - scoped_ptr<FileResource> entry) {
|
| - callback.Run(response.code, entry.Pass());
|
| -}
|
| -
|
| -struct CallResumeUpload {
|
| - CallResumeUpload() {}
|
| - ~CallResumeUpload() {}
|
| -
|
| - void Run(DriveApiErrorCode code, const GURL& upload_url) {
|
| - if (service) {
|
| - service->ResumeUpload(
|
| - upload_url,
|
| - /* start position */ 0,
|
| - /* end position */ content_length,
|
| - content_length,
|
| - content_type,
|
| - local_file_path,
|
| - base::Bind(&CallFileResouceCallback, callback),
|
| - progress_callback);
|
| - }
|
| - }
|
| -
|
| - base::WeakPtr<FakeDriveService> service;
|
| - int64 content_length;
|
| - std::string content_type;
|
| - base::FilePath local_file_path;
|
| - FileResourceCallback callback;
|
| - ProgressCallback progress_callback;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -struct FakeDriveService::EntryInfo {
|
| - EntryInfo() : user_permission(google_apis::drive::PERMISSION_ROLE_OWNER) {}
|
| -
|
| - google_apis::ChangeResource change_resource;
|
| - GURL share_url;
|
| - std::string content_data;
|
| -
|
| - // Behaves in the same way as "userPermission" described in
|
| - // https://developers.google.com/drive/v2/reference/files
|
| - google_apis::drive::PermissionRole user_permission;
|
| -};
|
| -
|
| -struct FakeDriveService::UploadSession {
|
| - std::string content_type;
|
| - int64 content_length;
|
| - std::string parent_resource_id;
|
| - std::string resource_id;
|
| - std::string etag;
|
| - std::string title;
|
| -
|
| - int64 uploaded_size;
|
| -
|
| - UploadSession()
|
| - : content_length(0),
|
| - uploaded_size(0) {}
|
| -
|
| - UploadSession(
|
| - std::string content_type,
|
| - int64 content_length,
|
| - std::string parent_resource_id,
|
| - std::string resource_id,
|
| - std::string etag,
|
| - std::string title)
|
| - : content_type(content_type),
|
| - content_length(content_length),
|
| - parent_resource_id(parent_resource_id),
|
| - resource_id(resource_id),
|
| - etag(etag),
|
| - title(title),
|
| - uploaded_size(0) {
|
| - }
|
| -};
|
| -
|
| -FakeDriveService::FakeDriveService()
|
| - : about_resource_(new AboutResource),
|
| - published_date_seq_(0),
|
| - next_upload_sequence_number_(0),
|
| - default_max_results_(0),
|
| - resource_id_count_(0),
|
| - file_list_load_count_(0),
|
| - change_list_load_count_(0),
|
| - directory_load_count_(0),
|
| - about_resource_load_count_(0),
|
| - app_list_load_count_(0),
|
| - blocked_file_list_load_count_(0),
|
| - offline_(false),
|
| - never_return_all_file_list_(false),
|
| - share_url_base_("https://share_url/"),
|
| - weak_ptr_factory_(this) {
|
| - about_resource_->set_largest_change_id(654321);
|
| - about_resource_->set_quota_bytes_total(9876543210);
|
| - about_resource_->set_quota_bytes_used_aggregate(6789012345);
|
| - about_resource_->set_root_folder_id(GetRootResourceId());
|
| -}
|
| -
|
| -FakeDriveService::~FakeDriveService() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - STLDeleteValues(&entries_);
|
| -}
|
| -
|
| -bool FakeDriveService::LoadAppListForDriveApi(
|
| - const std::string& relative_path) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - // Load JSON data, which must be a dictionary.
|
| - scoped_ptr<base::Value> value = test_util::LoadJSONFile(relative_path);
|
| - CHECK_EQ(base::Value::TYPE_DICTIONARY, value->GetType());
|
| - app_info_value_.reset(
|
| - static_cast<base::DictionaryValue*>(value.release()));
|
| - return app_info_value_;
|
| -}
|
| -
|
| -void FakeDriveService::AddApp(const std::string& app_id,
|
| - const std::string& app_name,
|
| - const std::string& product_id,
|
| - const std::string& create_url,
|
| - bool is_removable) {
|
| - if (app_json_template_.empty()) {
|
| - base::FilePath path =
|
| - test_util::GetTestFilePath("drive/applist_app_template.json");
|
| - CHECK(base::ReadFileToString(path, &app_json_template_));
|
| - }
|
| -
|
| - std::string app_json = app_json_template_;
|
| - ReplaceSubstringsAfterOffset(&app_json, 0, "$AppId", app_id);
|
| - ReplaceSubstringsAfterOffset(&app_json, 0, "$AppName", app_name);
|
| - ReplaceSubstringsAfterOffset(&app_json, 0, "$ProductId", product_id);
|
| - ReplaceSubstringsAfterOffset(&app_json, 0, "$CreateUrl", create_url);
|
| - ReplaceSubstringsAfterOffset(
|
| - &app_json, 0, "$Removable", is_removable ? "true" : "false");
|
| -
|
| - JSONStringValueDeserializer json(app_json);
|
| - std::string error_message;
|
| - scoped_ptr<base::Value> value(json.Deserialize(NULL, &error_message));
|
| - CHECK_EQ(base::Value::TYPE_DICTIONARY, value->GetType());
|
| -
|
| - base::ListValue* item_list;
|
| - CHECK(app_info_value_->GetListWithoutPathExpansion("items", &item_list));
|
| - item_list->Append(value.release());
|
| -}
|
| -
|
| -void FakeDriveService::RemoveAppByProductId(const std::string& product_id) {
|
| - base::ListValue* item_list;
|
| - CHECK(app_info_value_->GetListWithoutPathExpansion("items", &item_list));
|
| - for (size_t i = 0; i < item_list->GetSize(); ++i) {
|
| - base::DictionaryValue* item;
|
| - CHECK(item_list->GetDictionary(i, &item));
|
| - const char kKeyProductId[] = "productId";
|
| - std::string item_product_id;
|
| - if (item->GetStringWithoutPathExpansion(kKeyProductId, &item_product_id) &&
|
| - product_id == item_product_id) {
|
| - item_list->Remove(i, NULL);
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool FakeDriveService::HasApp(const std::string& app_id) const {
|
| - base::ListValue* item_list;
|
| - CHECK(app_info_value_->GetListWithoutPathExpansion("items", &item_list));
|
| - for (size_t i = 0; i < item_list->GetSize(); ++i) {
|
| - base::DictionaryValue* item;
|
| - CHECK(item_list->GetDictionary(i, &item));
|
| - const char kKeyId[] = "id";
|
| - std::string item_id;
|
| - if (item->GetStringWithoutPathExpansion(kKeyId, &item_id) &&
|
| - item_id == app_id) {
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -void FakeDriveService::SetQuotaValue(int64 used, int64 total) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - about_resource_->set_quota_bytes_used_aggregate(used);
|
| - about_resource_->set_quota_bytes_total(total);
|
| -}
|
| -
|
| -GURL FakeDriveService::GetFakeLinkUrl(const std::string& resource_id) {
|
| - return GURL("https://fake_server/" + net::EscapePath(resource_id));
|
| -}
|
| -
|
| -void FakeDriveService::Initialize(const std::string& account_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -}
|
| -
|
| -void FakeDriveService::AddObserver(DriveServiceObserver* observer) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -}
|
| -
|
| -void FakeDriveService::RemoveObserver(DriveServiceObserver* observer) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -}
|
| -
|
| -bool FakeDriveService::CanSendRequest() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return true;
|
| -}
|
| -
|
| -bool FakeDriveService::HasAccessToken() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return true;
|
| -}
|
| -
|
| -void FakeDriveService::RequestAccessToken(const AuthStatusCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| - callback.Run(google_apis::HTTP_NOT_MODIFIED, "fake_access_token");
|
| -}
|
| -
|
| -bool FakeDriveService::HasRefreshToken() const {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - return true;
|
| -}
|
| -
|
| -void FakeDriveService::ClearAccessToken() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -}
|
| -
|
| -void FakeDriveService::ClearRefreshToken() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -}
|
| -
|
| -std::string FakeDriveService::GetRootResourceId() const {
|
| - return "fake_root";
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetAllFileList(
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (never_return_all_file_list_) {
|
| - ++blocked_file_list_load_count_;
|
| - return CancelCallback();
|
| - }
|
| -
|
| - GetChangeListInternal(0, // start changestamp
|
| - std::string(), // empty search query
|
| - std::string(), // no directory resource id,
|
| - 0, // start offset
|
| - default_max_results_,
|
| - &file_list_load_count_,
|
| - base::Bind(&FileListCallbackAdapter, callback));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetFileListInDirectory(
|
| - const std::string& directory_resource_id,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!directory_resource_id.empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - GetChangeListInternal(0, // start changestamp
|
| - std::string(), // empty search query
|
| - directory_resource_id,
|
| - 0, // start offset
|
| - default_max_results_,
|
| - &directory_load_count_,
|
| - base::Bind(&FileListCallbackAdapter, callback));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::Search(
|
| - const std::string& search_query,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!search_query.empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - GetChangeListInternal(0, // start changestamp
|
| - search_query,
|
| - std::string(), // no directory resource id,
|
| - 0, // start offset
|
| - default_max_results_,
|
| - NULL,
|
| - base::Bind(&FileListCallbackAdapter, callback));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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());
|
| -
|
| - // Note: the search implementation here doesn't support quotation unescape,
|
| - // so don't escape here.
|
| - GetChangeListInternal(0, // start changestamp
|
| - base::StringPrintf("title:'%s'", title.c_str()),
|
| - directory_resource_id,
|
| - 0, // start offset
|
| - default_max_results_,
|
| - NULL,
|
| - base::Bind(&FileListCallbackAdapter, callback));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetChangeList(
|
| - int64 start_changestamp,
|
| - const ChangeListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - GetChangeListInternal(start_changestamp,
|
| - std::string(), // empty search query
|
| - std::string(), // no directory resource id,
|
| - 0, // start offset
|
| - default_max_results_,
|
| - &change_list_load_count_,
|
| - callback);
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetRemainingChangeList(
|
| - const GURL& next_link,
|
| - const ChangeListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!next_link.is_empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - // "changestamp", "q", "parent" and "start-offset" are parameters to
|
| - // implement "paging" of the result on FakeDriveService.
|
| - // The URL should be the one filled in GetChangeListInternal of the
|
| - // previous method invocation, so it should start with "http://localhost/?".
|
| - // See also GetChangeListInternal.
|
| - DCHECK_EQ(next_link.host(), "localhost");
|
| - DCHECK_EQ(next_link.path(), "/");
|
| -
|
| - int64 start_changestamp = 0;
|
| - std::string search_query;
|
| - std::string directory_resource_id;
|
| - int start_offset = 0;
|
| - int max_results = default_max_results_;
|
| - base::StringPairs parameters;
|
| - if (base::SplitStringIntoKeyValuePairs(
|
| - next_link.query(), '=', '&', ¶meters)) {
|
| - for (size_t i = 0; i < parameters.size(); ++i) {
|
| - if (parameters[i].first == "changestamp") {
|
| - base::StringToInt64(parameters[i].second, &start_changestamp);
|
| - } else if (parameters[i].first == "q") {
|
| - search_query =
|
| - net::UnescapeURLComponent(parameters[i].second,
|
| - net::UnescapeRule::URL_SPECIAL_CHARS);
|
| - } else if (parameters[i].first == "parent") {
|
| - directory_resource_id =
|
| - net::UnescapeURLComponent(parameters[i].second,
|
| - net::UnescapeRule::URL_SPECIAL_CHARS);
|
| - } else if (parameters[i].first == "start-offset") {
|
| - base::StringToInt(parameters[i].second, &start_offset);
|
| - } else if (parameters[i].first == "max-results") {
|
| - base::StringToInt(parameters[i].second, &max_results);
|
| - }
|
| - }
|
| - }
|
| -
|
| - GetChangeListInternal(start_changestamp, search_query, directory_resource_id,
|
| - start_offset, max_results, NULL, callback);
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetRemainingFileList(
|
| - const GURL& next_link,
|
| - const FileListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!next_link.is_empty());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - return GetRemainingChangeList(
|
| - next_link, base::Bind(&FileListCallbackAdapter, callback));
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetFileResource(
|
| - const std::string& resource_id,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (entry && entry->change_resource.file()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, base::Passed(make_scoped_ptr(
|
| - new FileResource(*entry->change_resource.file())))));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetShareUrl(
|
| - const std::string& resource_id,
|
| - const GURL& /* embed_origin */,
|
| - const GetShareUrlCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, entry->share_url));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND, GURL()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetAboutResource(
|
| - const AboutResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - scoped_ptr<AboutResource> null;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION, base::Passed(&null)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ++about_resource_load_count_;
|
| - scoped_ptr<AboutResource> about_resource(new AboutResource(*about_resource_));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - HTTP_SUCCESS, base::Passed(&about_resource)));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetAppList(const AppListCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| - DCHECK(app_info_value_);
|
| -
|
| - if (offline_) {
|
| - scoped_ptr<AppList> null;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(&null)));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ++app_list_load_count_;
|
| - scoped_ptr<AppList> app_list(AppList::CreateFrom(*app_info_value_));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, base::Passed(&app_list)));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::DeleteResource(
|
| - const std::string& resource_id,
|
| - const std::string& etag,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, DRIVE_NO_CONNECTION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - const FileResource* file = change->file();
|
| - if (change->is_deleted()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!etag.empty() && etag != file->etag()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_PRECONDITION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - change->set_deleted(true);
|
| - AddNewChangestamp(change);
|
| - change->set_file(scoped_ptr<FileResource>());
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::TrashResource(
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, DRIVE_NO_CONNECTION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - FileResource* file = change->mutable_file();
|
| - if (change->is_deleted() || file->labels().is_trashed()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - file->mutable_labels()->set_trashed(true);
|
| - AddNewChangestamp(change);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_SUCCESS));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(download_action_callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::FilePath()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry || entry->change_resource.file()->IsHostedDocument()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(download_action_callback, HTTP_NOT_FOUND, base::FilePath()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - const FileResource* file = entry->change_resource.file();
|
| - const std::string& content_data = entry->content_data;
|
| - int64 file_size = file->file_size();
|
| - DCHECK_EQ(static_cast<size_t>(file_size), content_data.size());
|
| -
|
| - if (!get_content_callback.is_null()) {
|
| - const int64 kBlockSize = 5;
|
| - for (int64 i = 0; i < file_size; i += kBlockSize) {
|
| - const int64 size = std::min(kBlockSize, file_size - i);
|
| - scoped_ptr<std::string> content_for_callback(
|
| - new std::string(content_data.substr(i, size)));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(get_content_callback, HTTP_SUCCESS,
|
| - base::Passed(&content_for_callback)));
|
| - }
|
| - }
|
| -
|
| - if (!test_util::WriteStringToFile(local_cache_path, content_data)) {
|
| - // Failed to write the content.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(download_action_callback,
|
| - DRIVE_FILE_ERROR, base::FilePath()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!progress_callback.is_null()) {
|
| - // See also the comment in ResumeUpload(). For testing that clients
|
| - // can handle the case progress_callback is called multiple times,
|
| - // here we invoke the callback twice.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(progress_callback, file_size / 2, file_size));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(progress_callback, file_size, file_size));
|
| - }
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(download_action_callback,
|
| - HTTP_SUCCESS,
|
| - local_cache_path));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::CopyResource(
|
| - const std::string& resource_id,
|
| - const std::string& in_parent_resource_id,
|
| - const std::string& new_title,
|
| - const base::Time& last_modified,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - const std::string& parent_resource_id = in_parent_resource_id.empty() ?
|
| - GetRootResourceId() : in_parent_resource_id;
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Make a copy and set the new resource ID and the new title.
|
| - scoped_ptr<EntryInfo> copied_entry(new EntryInfo);
|
| - copied_entry->content_data = entry->content_data;
|
| - copied_entry->share_url = entry->share_url;
|
| - copied_entry->change_resource.set_file(
|
| - make_scoped_ptr(new FileResource(*entry->change_resource.file())));
|
| -
|
| - ChangeResource* new_change = &copied_entry->change_resource;
|
| - FileResource* new_file = new_change->mutable_file();
|
| - const std::string new_resource_id = GetNewResourceId();
|
| - new_change->set_file_id(new_resource_id);
|
| - new_file->set_file_id(new_resource_id);
|
| - new_file->set_title(new_title);
|
| -
|
| - ParentReference parent;
|
| - parent.set_file_id(parent_resource_id);
|
| - parent.set_parent_link(GetFakeLinkUrl(parent_resource_id));
|
| - std::vector<ParentReference> parents;
|
| - parents.push_back(parent);
|
| - *new_file->mutable_parents() = parents;
|
| -
|
| - if (!last_modified.is_null())
|
| - new_file->set_modified_date(last_modified);
|
| -
|
| - AddNewChangestamp(new_change);
|
| - UpdateETag(new_file);
|
| -
|
| - // Add the new entry to the map.
|
| - entries_[new_resource_id] = copied_entry.release();
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - HTTP_SUCCESS,
|
| - base::Passed(make_scoped_ptr(new FileResource(*new_file)))));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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 google_apis::FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!UserHasWriteAccess(entry->user_permission)) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_FORBIDDEN,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - FileResource* file = change->mutable_file();
|
| -
|
| - if (!new_title.empty())
|
| - file->set_title(new_title);
|
| -
|
| - // Set parent if necessary.
|
| - if (!parent_resource_id.empty()) {
|
| - ParentReference parent;
|
| - parent.set_file_id(parent_resource_id);
|
| - parent.set_parent_link(GetFakeLinkUrl(parent_resource_id));
|
| -
|
| - std::vector<ParentReference> parents;
|
| - parents.push_back(parent);
|
| - *file->mutable_parents() = parents;
|
| - }
|
| -
|
| - if (!last_modified.is_null())
|
| - file->set_modified_date(last_modified);
|
| -
|
| - if (!last_viewed_by_me.is_null())
|
| - file->set_last_viewed_by_me_date(last_viewed_by_me);
|
| -
|
| - AddNewChangestamp(change);
|
| - UpdateETag(file);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS,
|
| - base::Passed(make_scoped_ptr(new FileResource(*file)))));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::AddResourceToDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, DRIVE_NO_CONNECTION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - // On the real Drive server, resources do not necessary shape a tree
|
| - // structure. That is, each resource can have multiple parent.
|
| - // We mimic the behavior here; AddResourceToDirectoy just adds
|
| - // one more parent, not overwriting old ones.
|
| - ParentReference parent;
|
| - parent.set_file_id(parent_resource_id);
|
| - parent.set_parent_link(GetFakeLinkUrl(parent_resource_id));
|
| - change->mutable_file()->mutable_parents()->push_back(parent);
|
| -
|
| - AddNewChangestamp(change);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_SUCCESS));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::RemoveResourceFromDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& resource_id,
|
| - const EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, DRIVE_NO_CONNECTION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - FileResource* file = change->mutable_file();
|
| - std::vector<ParentReference>* parents = file->mutable_parents();
|
| - for (size_t i = 0; i < parents->size(); ++i) {
|
| - if ((*parents)[i].file_id() == parent_resource_id) {
|
| - parents->erase(parents->begin() + i);
|
| - AddNewChangestamp(change);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| - }
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::AddNewDirectory(
|
| - const std::string& parent_resource_id,
|
| - const std::string& directory_title,
|
| - const AddNewDirectoryOptions& options,
|
| - const FileResourceCallback& callback) {
|
| - return AddNewDirectoryWithResourceId(
|
| - "",
|
| - parent_resource_id.empty() ? GetRootResourceId() : parent_resource_id,
|
| - directory_title,
|
| - options,
|
| - callback);
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (parent_resource_id != GetRootResourceId() &&
|
| - !entries_.count(parent_resource_id)) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - GURL session_url = GetNewUploadSessionUrl();
|
| - upload_sessions_[session_url] =
|
| - UploadSession(content_type, content_length,
|
| - parent_resource_id,
|
| - "", // resource_id
|
| - "", // etag
|
| - title);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, session_url));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, DRIVE_NO_CONNECTION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!UserHasWriteAccess(entry->user_permission)) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_FORBIDDEN, GURL()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - FileResource* file = entry->change_resource.mutable_file();
|
| - if (!options.etag.empty() && options.etag != file->etag()) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_PRECONDITION, GURL()));
|
| - return CancelCallback();
|
| - }
|
| - // TODO(hashimoto): Update |file|'s metadata with |options|.
|
| -
|
| - GURL session_url = GetNewUploadSessionUrl();
|
| - upload_sessions_[session_url] =
|
| - UploadSession(content_type, content_length,
|
| - "", // parent_resource_id
|
| - resource_id,
|
| - file->etag(),
|
| - "" /* title */);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, session_url));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::GetUploadStatus(
|
| - const GURL& upload_url,
|
| - int64 content_length,
|
| - const UploadRangeCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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());
|
| -
|
| - FileResourceCallback completion_callback
|
| - = base::Bind(&ScheduleUploadRangeCallback,
|
| - callback, start_position, end_position);
|
| -
|
| - if (offline_) {
|
| - completion_callback.Run(DRIVE_NO_CONNECTION, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!upload_sessions_.count(upload_url)) {
|
| - completion_callback.Run(HTTP_NOT_FOUND, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - UploadSession* session = &upload_sessions_[upload_url];
|
| -
|
| - // Chunks are required to be sent in such a ways that they fill from the start
|
| - // of the not-yet-uploaded part with no gaps nor overlaps.
|
| - if (session->uploaded_size != start_position) {
|
| - completion_callback.Run(HTTP_BAD_REQUEST, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - if (!progress_callback.is_null()) {
|
| - // In the real GDataWapi/Drive DriveService, progress is reported in
|
| - // nondeterministic timing. In this fake implementation, we choose to call
|
| - // it twice per one ResumeUpload. This is for making sure that client code
|
| - // works fine even if the callback is invoked more than once; it is the
|
| - // crucial difference of the progress callback from others.
|
| - // Note that progress is notified in the relative offset in each chunk.
|
| - const int64 chunk_size = end_position - start_position;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(progress_callback, chunk_size / 2, chunk_size));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(progress_callback, chunk_size, chunk_size));
|
| - }
|
| -
|
| - if (content_length != end_position) {
|
| - session->uploaded_size = end_position;
|
| - completion_callback.Run(HTTP_RESUME_INCOMPLETE, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - std::string content_data;
|
| - if (!base::ReadFileToString(local_file_path, &content_data)) {
|
| - session->uploaded_size = end_position;
|
| - completion_callback.Run(DRIVE_FILE_ERROR, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| - session->uploaded_size = end_position;
|
| -
|
| - // |resource_id| is empty if the upload is for new file.
|
| - if (session->resource_id.empty()) {
|
| - DCHECK(!session->parent_resource_id.empty());
|
| - DCHECK(!session->title.empty());
|
| - const EntryInfo* new_entry = AddNewEntry(
|
| - "", // auto generate resource id.
|
| - session->content_type,
|
| - content_data,
|
| - session->parent_resource_id,
|
| - session->title,
|
| - false); // shared_with_me
|
| - if (!new_entry) {
|
| - completion_callback.Run(HTTP_NOT_FOUND, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - completion_callback.Run(HTTP_CREATED, make_scoped_ptr(
|
| - new FileResource(*new_entry->change_resource.file())));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(session->resource_id);
|
| - if (!entry) {
|
| - completion_callback.Run(HTTP_NOT_FOUND, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - FileResource* file = change->mutable_file();
|
| - if (file->etag().empty() || session->etag != file->etag()) {
|
| - completion_callback.Run(HTTP_PRECONDITION, scoped_ptr<FileResource>());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - file->set_md5_checksum(base::MD5String(content_data));
|
| - entry->content_data = content_data;
|
| - file->set_file_size(end_position);
|
| - AddNewChangestamp(change);
|
| - UpdateETag(file);
|
| -
|
| - completion_callback.Run(HTTP_SUCCESS, make_scoped_ptr(
|
| - new FileResource(*file)));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::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 FileResourceCallback& callback,
|
| - const ProgressCallback& progress_callback) {
|
| - CallResumeUpload* const call_resume_upload = new CallResumeUpload();
|
| - call_resume_upload->service = weak_ptr_factory_.GetWeakPtr();
|
| - call_resume_upload->content_type = content_type;
|
| - call_resume_upload->content_length = content_length;
|
| - call_resume_upload->local_file_path = local_file_path;
|
| - call_resume_upload->callback = callback;
|
| - call_resume_upload->progress_callback = progress_callback;
|
| - InitiateUploadNewFile(
|
| - content_type,
|
| - content_length,
|
| - parent_resource_id,
|
| - title,
|
| - options,
|
| - base::Bind(&CallResumeUpload::Run, base::Owned(call_resume_upload)));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::MultipartUploadExistingFile(
|
| - const std::string& content_type,
|
| - int64 content_length,
|
| - const std::string& resource_id,
|
| - const base::FilePath& local_file_path,
|
| - const UploadExistingFileOptions& options,
|
| - const FileResourceCallback& callback,
|
| - const ProgressCallback& progress_callback) {
|
| - CallResumeUpload* const call_resume_upload = new CallResumeUpload();
|
| - call_resume_upload->service = weak_ptr_factory_.GetWeakPtr();
|
| - call_resume_upload->content_type = content_type;
|
| - call_resume_upload->content_length = content_length;
|
| - call_resume_upload->local_file_path = local_file_path;
|
| - call_resume_upload->callback = callback;
|
| - call_resume_upload->progress_callback = progress_callback;
|
| - InitiateUploadExistingFile(
|
| - content_type,
|
| - content_length,
|
| - resource_id,
|
| - options,
|
| - base::Bind(&CallResumeUpload::Run, base::Owned(call_resume_upload)));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::AuthorizeApp(
|
| - const std::string& resource_id,
|
| - const std::string& app_id,
|
| - const AuthorizeAppCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (entries_.count(resource_id) == 0) {
|
| - callback.Run(google_apis::HTTP_NOT_FOUND, GURL());
|
| - return CancelCallback();
|
| - }
|
| -
|
| - callback.Run(HTTP_SUCCESS,
|
| - GURL(base::StringPrintf(open_url_format_.c_str(),
|
| - resource_id.c_str(),
|
| - app_id.c_str())));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::UninstallApp(
|
| - const std::string& app_id,
|
| - const google_apis::EntryActionCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, google_apis::DRIVE_NO_CONNECTION));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - // Find app_id from app_info_value_ and delete.
|
| - base::ListValue* items = NULL;
|
| - if (!app_info_value_->GetList("items", &items)) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, google_apis::HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - for (size_t i = 0; i < items->GetSize(); ++i) {
|
| - base::DictionaryValue* item = NULL;
|
| - std::string id;
|
| - if (items->GetDictionary(i, &item) && item->GetString("id", &id) &&
|
| - id == app_id) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - items->Remove(i, NULL) ? google_apis::HTTP_NO_CONTENT
|
| - : google_apis::HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| - }
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, google_apis::HTTP_NOT_FOUND));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -void FakeDriveService::AddNewFile(const std::string& content_type,
|
| - const std::string& content_data,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - bool shared_with_me,
|
| - const FileResourceCallback& callback) {
|
| - AddNewFileWithResourceId("", content_type, content_data, parent_resource_id,
|
| - title, shared_with_me, callback);
|
| -}
|
| -
|
| -void FakeDriveService::AddNewFileWithResourceId(
|
| - const std::string& resource_id,
|
| - const std::string& content_type,
|
| - const std::string& content_data,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - bool shared_with_me,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return;
|
| - }
|
| -
|
| - const EntryInfo* new_entry = AddNewEntry(resource_id,
|
| - content_type,
|
| - content_data,
|
| - parent_resource_id,
|
| - title,
|
| - shared_with_me);
|
| - if (!new_entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return;
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_CREATED,
|
| - base::Passed(make_scoped_ptr(
|
| - new FileResource(*new_entry->change_resource.file())))));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -CancelCallback FakeDriveService::AddNewDirectoryWithResourceId(
|
| - const std::string& resource_id,
|
| - 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());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - const EntryInfo* new_entry = AddNewEntry(resource_id,
|
| - util::kDriveFolderMimeType,
|
| - "", // content_data
|
| - parent_resource_id,
|
| - directory_title,
|
| - false); // shared_with_me
|
| - if (!new_entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return CancelCallback();
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_CREATED,
|
| - base::Passed(make_scoped_ptr(
|
| - new FileResource(*new_entry->change_resource.file())))));
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FakeDriveService::NotifyObservers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return CancelCallback();
|
| -}
|
| -
|
| -void FakeDriveService::SetLastModifiedTime(
|
| - const std::string& resource_id,
|
| - const base::Time& last_modified_time,
|
| - const FileResourceCallback& callback) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return;
|
| - }
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_NOT_FOUND,
|
| - base::Passed(scoped_ptr<FileResource>())));
|
| - return;
|
| - }
|
| -
|
| - ChangeResource* change = &entry->change_resource;
|
| - FileResource* file = change->mutable_file();
|
| - file->set_modified_date(last_modified_time);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS,
|
| - base::Passed(make_scoped_ptr(new FileResource(*file)))));
|
| -}
|
| -
|
| -google_apis::DriveApiErrorCode FakeDriveService::SetUserPermission(
|
| - const std::string& resource_id,
|
| - google_apis::drive::PermissionRole user_permission) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| - if (!entry)
|
| - return HTTP_NOT_FOUND;
|
| -
|
| - entry->user_permission = user_permission;
|
| - return HTTP_SUCCESS;
|
| -}
|
| -
|
| -void FakeDriveService::AddChangeObserver(ChangeObserver* change_observer) {
|
| - change_observers_.AddObserver(change_observer);
|
| -}
|
| -
|
| -void FakeDriveService::RemoveChangeObserver(ChangeObserver* change_observer) {
|
| - change_observers_.RemoveObserver(change_observer);
|
| -}
|
| -
|
| -FakeDriveService::EntryInfo* FakeDriveService::FindEntryByResourceId(
|
| - const std::string& resource_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - EntryInfoMap::iterator it = entries_.find(resource_id);
|
| - // Deleted entries don't have FileResource.
|
| - return it != entries_.end() && it->second->change_resource.file() ?
|
| - it->second : NULL;
|
| -}
|
| -
|
| -std::string FakeDriveService::GetNewResourceId() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - ++resource_id_count_;
|
| - return base::StringPrintf("resource_id_%d", resource_id_count_);
|
| -}
|
| -
|
| -void FakeDriveService::UpdateETag(google_apis::FileResource* file) {
|
| - file->set_etag(
|
| - "etag_" + base::Int64ToString(about_resource_->largest_change_id()));
|
| -}
|
| -
|
| -void FakeDriveService::AddNewChangestamp(google_apis::ChangeResource* change) {
|
| - about_resource_->set_largest_change_id(
|
| - about_resource_->largest_change_id() + 1);
|
| - change->set_change_id(about_resource_->largest_change_id());
|
| -}
|
| -
|
| -const FakeDriveService::EntryInfo* FakeDriveService::AddNewEntry(
|
| - const std::string& given_resource_id,
|
| - const std::string& content_type,
|
| - const std::string& content_data,
|
| - const std::string& parent_resource_id,
|
| - const std::string& title,
|
| - bool shared_with_me) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - if (!parent_resource_id.empty() &&
|
| - parent_resource_id != GetRootResourceId() &&
|
| - !entries_.count(parent_resource_id)) {
|
| - return NULL;
|
| - }
|
| -
|
| - const std::string resource_id =
|
| - given_resource_id.empty() ? GetNewResourceId() : given_resource_id;
|
| - if (entries_.count(resource_id))
|
| - return NULL;
|
| - GURL upload_url = GURL("https://xxx/upload/" + resource_id);
|
| -
|
| - scoped_ptr<EntryInfo> new_entry(new EntryInfo);
|
| - ChangeResource* new_change = &new_entry->change_resource;
|
| - FileResource* new_file = new FileResource;
|
| - new_change->set_file(make_scoped_ptr(new_file));
|
| -
|
| - // Set the resource ID and the title
|
| - new_change->set_file_id(resource_id);
|
| - new_file->set_file_id(resource_id);
|
| - new_file->set_title(title);
|
| - // Set the contents, size and MD5 for a file.
|
| - if (content_type != util::kDriveFolderMimeType &&
|
| - !util::IsKnownHostedDocumentMimeType(content_type)) {
|
| - new_entry->content_data = content_data;
|
| - new_file->set_file_size(content_data.size());
|
| - new_file->set_md5_checksum(base::MD5String(content_data));
|
| - }
|
| -
|
| - if (shared_with_me) {
|
| - // Set current time to mark the file as shared_with_me.
|
| - new_file->set_shared_with_me_date(base::Time::Now());
|
| - }
|
| -
|
| - std::string escaped_resource_id = net::EscapePath(resource_id);
|
| -
|
| - // Set mime type.
|
| - new_file->set_mime_type(content_type);
|
| -
|
| - // Set alternate link if needed.
|
| - if (content_type == util::kGoogleDocumentMimeType)
|
| - new_file->set_alternate_link(GURL("https://document_alternate_link"));
|
| -
|
| - // Set parents.
|
| - if (!parent_resource_id.empty()) {
|
| - ParentReference parent;
|
| - parent.set_file_id(parent_resource_id);
|
| - parent.set_parent_link(GetFakeLinkUrl(parent.file_id()));
|
| - std::vector<ParentReference> parents;
|
| - parents.push_back(parent);
|
| - *new_file->mutable_parents() = parents;
|
| - }
|
| -
|
| - new_entry->share_url = net::AppendOrReplaceQueryParameter(
|
| - share_url_base_, "name", title);
|
| -
|
| - AddNewChangestamp(new_change);
|
| - UpdateETag(new_file);
|
| -
|
| - base::Time published_date =
|
| - base::Time() + base::TimeDelta::FromMilliseconds(++published_date_seq_);
|
| - new_file->set_created_date(published_date);
|
| -
|
| - EntryInfo* raw_new_entry = new_entry.release();
|
| - entries_[resource_id] = raw_new_entry;
|
| - return raw_new_entry;
|
| -}
|
| -
|
| -void FakeDriveService::GetChangeListInternal(
|
| - int64 start_changestamp,
|
| - const std::string& search_query,
|
| - const std::string& directory_resource_id,
|
| - int start_offset,
|
| - int max_results,
|
| - int* load_counter,
|
| - const ChangeListCallback& callback) {
|
| - if (offline_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - DRIVE_NO_CONNECTION,
|
| - base::Passed(scoped_ptr<ChangeList>())));
|
| - return;
|
| - }
|
| -
|
| - // Filter out entries per parameters like |directory_resource_id| and
|
| - // |search_query|.
|
| - ScopedVector<ChangeResource> entries;
|
| - int num_entries_matched = 0;
|
| - for (EntryInfoMap::iterator it = entries_.begin(); it != entries_.end();
|
| - ++it) {
|
| - const ChangeResource& entry = it->second->change_resource;
|
| - bool should_exclude = false;
|
| -
|
| - // If |directory_resource_id| is set, exclude the entry if it's not in
|
| - // the target directory.
|
| - if (!directory_resource_id.empty()) {
|
| - // Get the parent resource ID of the entry.
|
| - std::string parent_resource_id;
|
| - if (entry.file() && !entry.file()->parents().empty())
|
| - parent_resource_id = entry.file()->parents()[0].file_id();
|
| -
|
| - if (directory_resource_id != parent_resource_id)
|
| - should_exclude = true;
|
| - }
|
| -
|
| - // If |search_query| is set, exclude the entry if it does not contain the
|
| - // search query in the title.
|
| - if (!should_exclude && !search_query.empty() &&
|
| - !EntryMatchWithQuery(entry, search_query)) {
|
| - should_exclude = true;
|
| - }
|
| -
|
| - // If |start_changestamp| is set, exclude the entry if the
|
| - // changestamp is older than |largest_changestamp|.
|
| - // See https://developers.google.com/google-apps/documents-list/
|
| - // #retrieving_all_changes_since_a_given_changestamp
|
| - if (start_changestamp > 0 && entry.change_id() < start_changestamp)
|
| - should_exclude = true;
|
| -
|
| - // If the caller requests other list than change list by specifying
|
| - // zero-|start_changestamp|, exclude deleted entry from the result.
|
| - const bool deleted = entry.is_deleted() ||
|
| - (entry.file() && entry.file()->labels().is_trashed());
|
| - if (!start_changestamp && deleted)
|
| - should_exclude = true;
|
| -
|
| - // The entry matched the criteria for inclusion.
|
| - if (!should_exclude)
|
| - ++num_entries_matched;
|
| -
|
| - // If |start_offset| is set, exclude the entry if the entry is before the
|
| - // start index. <= instead of < as |num_entries_matched| was
|
| - // already incremented.
|
| - if (start_offset > 0 && num_entries_matched <= start_offset)
|
| - should_exclude = true;
|
| -
|
| - if (!should_exclude) {
|
| - scoped_ptr<ChangeResource> entry_copied(new ChangeResource);
|
| - entry_copied->set_change_id(entry.change_id());
|
| - entry_copied->set_file_id(entry.file_id());
|
| - entry_copied->set_deleted(entry.is_deleted());
|
| - if (entry.file()) {
|
| - entry_copied->set_file(
|
| - make_scoped_ptr(new FileResource(*entry.file())));
|
| - }
|
| - entry_copied->set_modification_date(entry.modification_date());
|
| - entries.push_back(entry_copied.release());
|
| - }
|
| - }
|
| -
|
| - scoped_ptr<ChangeList> change_list(new ChangeList);
|
| - if (start_changestamp > 0 && start_offset == 0) {
|
| - change_list->set_largest_change_id(about_resource_->largest_change_id());
|
| - }
|
| -
|
| - // If |max_results| is set, trim the entries if the number exceeded the max
|
| - // results.
|
| - if (max_results > 0 && entries.size() > static_cast<size_t>(max_results)) {
|
| - entries.erase(entries.begin() + max_results, entries.end());
|
| - // Adds the next URL.
|
| - // Here, we embed information which is needed for continuing the
|
| - // GetChangeList request in the next invocation into url query
|
| - // parameters.
|
| - GURL next_url(base::StringPrintf(
|
| - "http://localhost/?start-offset=%d&max-results=%d",
|
| - start_offset + max_results,
|
| - max_results));
|
| - if (start_changestamp > 0) {
|
| - next_url = net::AppendOrReplaceQueryParameter(
|
| - next_url, "changestamp",
|
| - base::Int64ToString(start_changestamp).c_str());
|
| - }
|
| - if (!search_query.empty()) {
|
| - next_url = net::AppendOrReplaceQueryParameter(
|
| - next_url, "q", search_query);
|
| - }
|
| - if (!directory_resource_id.empty()) {
|
| - next_url = net::AppendOrReplaceQueryParameter(
|
| - next_url, "parent", directory_resource_id);
|
| - }
|
| -
|
| - change_list->set_next_link(next_url);
|
| - }
|
| - *change_list->mutable_items() = entries.Pass();
|
| -
|
| - if (load_counter)
|
| - *load_counter += 1;
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, HTTP_SUCCESS, base::Passed(&change_list)));
|
| -}
|
| -
|
| -GURL FakeDriveService::GetNewUploadSessionUrl() {
|
| - return GURL("https://upload_session_url/" +
|
| - base::Int64ToString(next_upload_sequence_number_++));
|
| -}
|
| -
|
| -google_apis::CancelCallback FakeDriveService::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());
|
| -
|
| - NOTREACHED();
|
| - return CancelCallback();
|
| -}
|
| -
|
| -scoped_ptr<BatchRequestConfiguratorInterface>
|
| -FakeDriveService::StartBatchRequest() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - NOTREACHED();
|
| - return scoped_ptr<BatchRequestConfiguratorInterface>();
|
| -}
|
| -
|
| -void FakeDriveService::NotifyObservers() {
|
| - FOR_EACH_OBSERVER(ChangeObserver, change_observers_, OnNewChangeAvailable());
|
| -}
|
| -
|
| -} // namespace drive
|
|
|