blob: 09af7dab594fbbdf4e46235e5eaa60c18ac892ed [file] [log] [blame]
// 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.
#ifndef GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_
#define GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "url/gurl.h"
namespace base {
class Value;
template <class StructType>
class JSONValueConverter;
namespace internal {
template <class NestedType>
class RepeatedMessageConverter;
} // namespace internal
} // namespace base
namespace google_apis {
// About resource represents the account information about the current user.
// https://developers.google.com/drive/v2/reference/about
class AboutResource {
public:
AboutResource();
~AboutResource();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<AboutResource>* converter);
// Creates about resource from parsed JSON.
static std::unique_ptr<AboutResource> CreateFrom(const base::Value& value);
// Returns the largest change ID number.
int64_t largest_change_id() const { return largest_change_id_; }
// Returns total number of quota bytes.
int64_t quota_bytes_total() const { return quota_bytes_total_; }
// Returns the number of quota bytes used.
int64_t quota_bytes_used_aggregate() const {
return quota_bytes_used_aggregate_;
}
// Returns root folder ID.
const std::string& root_folder_id() const { return root_folder_id_; }
void set_largest_change_id(int64_t largest_change_id) {
largest_change_id_ = largest_change_id;
}
void set_quota_bytes_total(int64_t quota_bytes_total) {
quota_bytes_total_ = quota_bytes_total;
}
void set_quota_bytes_used_aggregate(int64_t quota_bytes_used_aggregate) {
quota_bytes_used_aggregate_ = quota_bytes_used_aggregate;
}
void set_root_folder_id(const std::string& root_folder_id) {
root_folder_id_ = root_folder_id;
}
private:
friend class DriveAPIParserTest;
FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, AboutResourceParser);
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
int64_t largest_change_id_;
int64_t quota_bytes_total_;
int64_t quota_bytes_used_aggregate_;
std::string root_folder_id_;
// This class is copyable on purpose.
};
// Capabilities of a Team Drive indicate the permissions granted to the user
// for the Team Drive and items within the Team Drive.
// See "capabilities" in
// https://developers.google.com/drive/v2/reference/teamdrives#resource.
class TeamDriveCapabilities {
public:
TeamDriveCapabilities();
TeamDriveCapabilities(const TeamDriveCapabilities& src);
~TeamDriveCapabilities();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<TeamDriveCapabilities>* converter);
// Creates Team Drive resource from parsed JSON.
static std::unique_ptr<TeamDriveCapabilities>
CreateFrom(const base::Value& value);
// Whether the current user can add children to folders in this Team Drive.
bool can_add_children() const { return can_add_children_; }
void set_can_add_children(bool can_add_children) {
can_add_children_ = can_add_children;
}
// Whether the current user can comment on files in this Team Drive.
bool can_comment() const { return can_comment_; }
void set_can_comment(bool can_comment) { can_comment_ = can_comment; }
// Whether files in this Team Drive can be copied by the current user.
bool can_copy() const { return can_copy_; }
void set_can_copy(bool can_copy) { can_copy_ = can_copy; }
// Whether this Team Drive can be deleted by the current user.
bool can_delete_team_drive() const { return can_delete_team_drive_; }
void set_can_delete_team_drive(bool can_delete_team_drive) {
can_delete_team_drive_ = can_delete_team_drive;
}
// Whether files in this Team Drive can be edited by the current user.
bool can_download() const { return can_download_; }
void set_can_download(bool can_download) { can_download_ = can_download; }
// Whether files in this Team Drive can be edited by current user.
bool can_edit() const { return can_edit_; }
void set_can_edit(bool can_edit) { can_edit_ = can_edit; }
// Whether the current user can list the children of folders in this Team
// Drive.
bool can_list_children() const { return can_list_children_; }
void set_can_list_children(bool can_list_children) {
can_list_children_ = can_list_children;
}
// Whether the current user can add members to this Team Drive or remove them
// or change their role.
bool can_manage_members() const { return can_manage_members_; }
void set_can_manage_members(bool can_manage_members) {
can_manage_members_ = can_manage_members;
}
// Whether the current user has read access to the Revisions resource of files
// in this Team Drive.
bool can_read_revisions() const { return can_read_revisions_; }
void set_can_read_revisions(bool can_read_revisions) {
can_read_revisions_ = can_read_revisions;
}
// Whether the current user can remove children from folders in this Team
// Drive.
bool can_remove_children() const { return can_remove_children_; }
void set_can_remove_children(bool can_remove_children) {
can_remove_children_ = can_remove_children;
}
// Whether files or folders in this Team Drive can be renamed by the current
// user.
bool can_rename() const { return can_rename_; }
void set_can_rename(bool can_rename) { can_rename_ = can_rename; }
// Whether this Team Drive can be renamed by the current user.
bool can_rename_team_drive() const { return can_rename_team_drive_; }
void set_can_rename_team_drive(bool can_rename_team_drive) {
can_rename_team_drive_ = can_rename_team_drive;
}
// Whether files or folders in this Team Drive can be shared by the current
// user.
bool can_share() const { return can_share_; }
void set_can_share(bool can_share) { can_share_ = can_share; }
private:
bool can_add_children_;
bool can_comment_;
bool can_copy_;
bool can_delete_team_drive_;
bool can_download_;
bool can_edit_;
bool can_list_children_;
bool can_manage_members_;
bool can_read_revisions_;
bool can_remove_children_;
bool can_rename_;
bool can_rename_team_drive_;
bool can_share_;
};
// Team Drive resource represents the metadata about Team Drive itself, such as
// the name.
class TeamDriveResource {
public:
TeamDriveResource();
~TeamDriveResource();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<TeamDriveResource>* converter);
// Creates Team Drive resource from parsed JSON.
static std::unique_ptr<TeamDriveResource>
CreateFrom(const base::Value& value);
// The ID of this Team Drive. The ID is the same as the top-level folder for
// this Team Drive.
const std::string& id() const { return id_; }
void set_id(const std::string& id) { id_ = id; }
// The name of this Team Drive.
const std::string& name() const { return name_; }
void set_name(const std::string& name) { name_ = name; }
// Capabilities the current user has on this Team Drive.
const TeamDriveCapabilities& capabilities() const { return capabilities_; }
void set_capabilities(const TeamDriveCapabilities& capabilities) {
capabilities_ = capabilities;
}
private:
friend class DriveAPIParserTest;
FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, TeamDriveResourceParser);
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
std::string id_;
std::string name_;
TeamDriveCapabilities capabilities_;
};
// TeamDriveList represents a collection of Team Drives.
// https://developers.google.com/drive/v2/reference/teamdrives/list
class TeamDriveList {
public:
TeamDriveList();
TeamDriveList(const TeamDriveList&) = delete;
TeamDriveList& operator=(const TeamDriveList&) = delete;
~TeamDriveList();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<TeamDriveList>* converter);
// Returns true if the |value| has kind field for TeamDriveList.
static bool HasTeamDriveListKind(const base::Value& value);
// Creates file list from parsed JSON.
static std::unique_ptr<TeamDriveList> CreateFrom(const base::Value& value);
// Returns a page token for the next page of Team Drives.
const std::string& next_page_token() const { return next_page_token_; }
void set_next_page_token(const std::string& next_page_token) {
this->next_page_token_ = next_page_token;
}
// Returns a set of Team Drives in this list.
const std::vector<std::unique_ptr<TeamDriveResource>>& items() const {
return items_;
}
std::vector<std::unique_ptr<TeamDriveResource>>* mutable_items() {
return &items_;
}
private:
friend class DriveAPIParserTest;
FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, TeamDriveListParser);
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
std::string next_page_token_;
std::vector<std::unique_ptr<TeamDriveResource>> items_;
};
// ParentReference represents a directory.
// https://developers.google.com/drive/v2/reference/parents
class ParentReference {
public:
ParentReference();
~ParentReference();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<ParentReference>* converter);
// Creates parent reference from parsed JSON.
static std::unique_ptr<ParentReference> CreateFrom(const base::Value& value);
// Returns the file id of the reference.
const std::string& file_id() const { return file_id_; }
void set_file_id(const std::string& file_id) { file_id_ = file_id; }
private:
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
std::string file_id_;
};
// FileLabels represents labels for file or folder.
// https://developers.google.com/drive/v2/reference/files
class FileLabels {
public:
FileLabels();
~FileLabels();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<FileLabels>* converter);
// Creates about resource from parsed JSON.
static std::unique_ptr<FileLabels> CreateFrom(const base::Value& value);
// Whether this file has been trashed.
bool is_trashed() const { return trashed_; }
// Whether this file is starred by the user.
bool is_starred() const { return starred_; }
void set_trashed(bool trashed) { trashed_ = trashed; }
void set_starred(bool starred) { starred_ = starred; }
private:
friend class FileResource;
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
bool trashed_;
bool starred_;
};
// ImageMediaMetadata represents image metadata for a file.
// https://developers.google.com/drive/v2/reference/files
class ImageMediaMetadata {
public:
ImageMediaMetadata();
~ImageMediaMetadata();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<ImageMediaMetadata>* converter);
// Creates about resource from parsed JSON.
static std::unique_ptr<ImageMediaMetadata> CreateFrom(
const base::Value& value);
// Width of the image in pixels.
int width() const { return width_; }
// Height of the image in pixels.
int height() const { return height_; }
// Rotation of the image in clockwise degrees.
int rotation() const { return rotation_; }
void set_width(int width) { width_ = width; }
void set_height(int height) { height_ = height; }
void set_rotation(int rotation) { rotation_ = rotation; }
private:
friend class FileResource;
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
int width_;
int height_;
int rotation_;
};
// Capabilities of a file resource indicate the permissions granted to the user
// for the file (or items within the folder).
// See "capabilities" in
// https://developers.google.com/drive/v2/reference/files#resource.
class FileResourceCapabilities {
public:
FileResourceCapabilities();
FileResourceCapabilities(const FileResourceCapabilities& src);
~FileResourceCapabilities();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<FileResourceCapabilities>* converter);
// Creates a FileResourceCapabilities from parsed JSON.
static std::unique_ptr<FileResourceCapabilities> CreateFrom(
const base::Value& value);
// Whether the current user can add children to this folder. This is always
// false when the item is not a folder.
bool can_add_children() const { return can_add_children_; }
void set_can_add_children(bool can_add_children) {
can_add_children_ = can_add_children;
}
// Whether the current user can change the restricted download label of this
// file.
bool can_change_restricted_download() const {
return can_change_restricted_download_;
}
void set_can_change_restricted_download(bool can_change_restricted_download) {
can_change_restricted_download_ = can_change_restricted_download;
}
// Whether the current user can comment on this file.
bool can_comment() const { return can_comment_; }
void set_can_comment(bool can_comment) { can_comment_ = can_comment; }
// Whether the current user can copy this file. For a Team Drive item, whether
// the current user can copy non-folder descendants of this item, or this item
// itself if it is not a folder.
bool can_copy() const { return can_copy_; }
void set_can_copy(bool can_copy) { can_copy_ = can_copy; }
// Whether the current user can delete this file.
bool can_delete() const { return can_delete_; }
void set_can_delete(bool can_delete) { can_delete_ = can_delete; }
// Whether the current user can download this file.
bool can_download() const { return can_download_; }
void set_can_download(bool can_download) { can_download_ = can_download; }
// Whether the current user can edit this file.
bool can_edit() const { return can_edit_; }
void set_can_edit(bool can_edit) { can_edit_ = can_edit; }
// Whether the current user can list the children of this folder. This is
// always false when the item is not a folder.
bool can_list_children() const { return can_list_children_; }
void set_can_list_children(bool can_list_children) {
can_list_children_ = can_list_children;
}
// Whether the current user can move this item into a Team Drive. If the item
// is in a Team Drive, this field is equivalent to canMoveTeamDriveItem.
bool can_move_item_into_team_drive() const {
return can_move_item_into_team_drive_;
}
void set_can_move_item_into_team_drive(bool can_move_item_into_team_drive) {
can_move_item_into_team_drive_ = can_move_item_into_team_drive;
}
// Whether the current user can move this Team Drive item by changing its
// parent. Note that a request to change the parent for this item may still
// fail depending on the new parent that is being added. Only populated for
// Team Drive files.
bool can_move_team_drive_item() const { return can_move_team_drive_item_; }
void set_can_move_team_drive_item(bool can_move_team_drive_item) {
can_move_team_drive_item_ = can_move_team_drive_item;
}
// Whether the current user can read the revisions resource of this file. For
// a Team Drive item, whether revisions of non-folder descendants of this
// item, or this item itself if it is not a folder, can be read.
bool can_read_revisions() const { return can_read_revisions_; }
void set_can_read_revisions(bool can_read_revisions) {
can_read_revisions_ = can_read_revisions;
}
// Whether the current user can read the Team Drive to which this file
// belongs. Only populated for Team Drive files.
bool can_read_team_drive() const { return can_read_team_drive_; }
void set_can_read_team_drive(bool can_read_team_drive) {
can_read_team_drive_ = can_read_team_drive;
}
// Whether the current user can remove children from this folder. This is
// always false when the item is not a folder.
bool can_remove_children() const { return can_remove_children_; }
void set_can_remove_children(bool can_remove_children) {
can_remove_children_ = can_remove_children;
}
// Whether the current user can rename this file.
bool can_rename() const { return can_rename_; }
void set_can_rename(bool can_rename) { can_rename_ = can_rename; }
// Whether the current user can modify the sharing settings for this file.
bool can_share() const { return can_share_; }
void set_can_share(bool can_share) { can_share_ = can_share; }
// Whether the current user can move this file to trash.
bool can_trash() const { return can_trash_; }
void set_can_trash(bool can_trash) { can_trash_ = can_trash; }
// Whether the current user can restore this file from trash.
bool can_untrash() const { return can_untrash_; }
void set_can_untrash(bool can_untrash) { can_untrash_ = can_untrash; }
private:
bool can_add_children_;
bool can_change_restricted_download_;
bool can_comment_;
bool can_copy_;
bool can_delete_;
bool can_download_;
bool can_edit_;
bool can_list_children_;
bool can_move_item_into_team_drive_;
bool can_move_team_drive_item_;
bool can_read_revisions_;
bool can_read_team_drive_;
bool can_remove_children_;
bool can_rename_;
bool can_share_;
bool can_trash_;
bool can_untrash_;
};
// FileResource represents a file or folder metadata in Drive.
// https://developers.google.com/drive/v2/reference/files
class FileResource {
public:
// Link to open a file resource on a web app with |app_id|.
struct OpenWithLink {
std::string app_id;
GURL open_url;
};
FileResource();
FileResource(const FileResource& other);
~FileResource();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<FileResource>* converter);
// Creates file resource from parsed JSON.
static std::unique_ptr<FileResource> CreateFrom(const base::Value& value);
// Returns true if this is a directory.
// Note: "folder" is used elsewhere in this file to match Drive API reference,
// but outside this file we use "directory" to match HTML5 filesystem API.
bool IsDirectory() const;
// Returns true if this is a hosted document.
// A hosted document is a document in one of Google Docs formats (Documents,
// Spreadsheets, Slides, ...) whose content is not exposed via the API. It is
// available only as |alternate_link()| to the document hosted on the server.
bool IsHostedDocument() const;
// Returns file ID. This is unique in all files in Google Drive.
const std::string& file_id() const { return file_id_; }
// Returns ETag for this file.
const std::string& etag() const { return etag_; }
// Returns the title of this file.
const std::string& title() const { return title_; }
// Returns MIME type of this file.
const std::string& mime_type() const { return mime_type_; }
// Returns labels for this file.
const FileLabels& labels() const { return labels_; }
// Returns image media metadata for this file.
const ImageMediaMetadata& image_media_metadata() const {
return image_media_metadata_;
}
// Returns created time of this file.
const base::Time& created_date() const { return created_date_; }
// Returns modified time of this file.
const base::Time& modified_date() const { return modified_date_; }
// Returns last modified time by the user.
const base::Time& modified_by_me_date() const { return modified_by_me_date_; }
// Returns last access time by the user.
const base::Time& last_viewed_by_me_date() const {
return last_viewed_by_me_date_;
}
// Returns time when the file was shared with the user.
const base::Time& shared_with_me_date() const {
return shared_with_me_date_;
}
// Returns the 'shared' attribute of the file.
bool shared() const { return shared_; }
// Returns MD5 checksum of this file.
const std::string& md5_checksum() const { return md5_checksum_; }
// Returns the size of this file in bytes.
int64_t file_size() const { return file_size_; }
// Return the link to open the file in Google editor or viewer.
// E.g. Google Document, Google Spreadsheet.
const GURL& alternate_link() const { return alternate_link_; }
// Returns URL to the share dialog UI.
const GURL& share_link() const { return share_link_; }
// Returns parent references (directories) of this file.
const std::vector<ParentReference>& parents() const { return parents_; }
// Returns the list of links to open the resource with a web app.
const std::vector<OpenWithLink>& open_with_links() const {
return open_with_links_;
}
void set_file_id(const std::string& file_id) {
file_id_ = file_id;
}
void set_etag(const std::string& etag) {
etag_ = etag;
}
void set_title(const std::string& title) {
title_ = title;
}
void set_mime_type(const std::string& mime_type) {
mime_type_ = mime_type;
}
FileLabels* mutable_labels() {
return &labels_;
}
ImageMediaMetadata* mutable_image_media_metadata() {
return &image_media_metadata_;
}
void set_created_date(const base::Time& created_date) {
created_date_ = created_date;
}
void set_modified_date(const base::Time& modified_date) {
modified_date_ = modified_date;
}
void set_modified_by_me_date(const base::Time& modified_by_me_date) {
modified_by_me_date_ = modified_by_me_date;
}
void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
last_viewed_by_me_date_ = last_viewed_by_me_date;
}
void set_shared_with_me_date(const base::Time& shared_with_me_date) {
shared_with_me_date_ = shared_with_me_date;
}
void set_shared(bool shared) {
shared_ = shared;
}
void set_md5_checksum(const std::string& md5_checksum) {
md5_checksum_ = md5_checksum;
}
void set_file_size(int64_t file_size) { file_size_ = file_size; }
void set_alternate_link(const GURL& alternate_link) {
alternate_link_ = alternate_link;
}
void set_share_link(const GURL& share_link) {
share_link_ = share_link;
}
std::vector<ParentReference>* mutable_parents() { return &parents_; }
std::vector<OpenWithLink>* mutable_open_with_links() {
return &open_with_links_;
}
// Capabilities the current user has on this file resource.
const FileResourceCapabilities& capabilities() const { return capabilities_; }
void set_capabilities(const FileResourceCapabilities& capabilities) {
capabilities_ = capabilities;
}
// ID of the Team Drive the file resides in. Will be empty if the file
// is not in a team drive.
const std::string& team_drive_id() const { return team_drive_id_; }
void set_team_drive_id(const std::string& team_drive_id) {
team_drive_id_ = team_drive_id;
}
private:
friend class base::internal::RepeatedMessageConverter<FileResource>;
friend class ChangeResource;
friend class FileList;
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
std::string file_id_;
std::string etag_;
std::string title_;
std::string mime_type_;
FileLabels labels_;
ImageMediaMetadata image_media_metadata_;
base::Time created_date_;
base::Time modified_date_;
base::Time modified_by_me_date_;
base::Time last_viewed_by_me_date_;
base::Time shared_with_me_date_;
bool shared_;
std::string md5_checksum_;
int64_t file_size_;
GURL alternate_link_;
GURL share_link_;
std::vector<ParentReference> parents_;
std::vector<OpenWithLink> open_with_links_;
FileResourceCapabilities capabilities_;
std::string team_drive_id_;
};
// FileList represents a collection of files and folders.
// https://developers.google.com/drive/v2/reference/files/list
class FileList {
public:
FileList();
FileList(const FileList&) = delete;
FileList& operator=(const FileList&) = delete;
~FileList();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<FileList>* converter);
// Returns true if the |value| has kind field for FileList.
static bool HasFileListKind(const base::Value& value);
// Creates file list from parsed JSON.
static std::unique_ptr<FileList> CreateFrom(const base::Value& value);
// Returns a link to the next page of files. The URL includes the next page
// token.
const GURL& next_link() const { return next_link_; }
// Returns a set of files in this list.
const std::vector<std::unique_ptr<FileResource>>& items() const {
return items_;
}
std::vector<std::unique_ptr<FileResource>>* mutable_items() {
return &items_;
}
void set_next_link(const GURL& next_link) {
next_link_ = next_link;
}
private:
friend class DriveAPIParserTest;
FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, FileListParser);
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
GURL next_link_;
std::vector<std::unique_ptr<FileResource>> items_;
};
// ChangeResource represents a change in a file.
// https://developers.google.com/drive/v2/reference/changes
class ChangeResource {
public:
enum ChangeType {
UNKNOWN, // Uninitialized state.
FILE,
TEAM_DRIVE,
};
ChangeResource();
ChangeResource(const ChangeResource&) = delete;
ChangeResource& operator=(const ChangeResource&) = delete;
~ChangeResource();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<ChangeResource>* converter);
// Creates change resource from parsed JSON.
static std::unique_ptr<ChangeResource> CreateFrom(const base::Value& value);
// Returns change ID for this change. This is a monotonically increasing
// number.
int64_t change_id() const { return change_id_; }
// Returns whether this is a change of a file or a team drive.
ChangeType type() const { return type_; }
// Returns a string file ID for corresponding file of the change.
// Valid only when type == FILE.
const std::string& file_id() const {
DCHECK_EQ(FILE, type_);
return file_id_;
}
// Returns true if this file is deleted in the change.
bool is_deleted() const { return deleted_; }
// Returns FileResource of the file which the change refers to.
// Valid only when type == FILE.
const FileResource* file() const {
DCHECK_EQ(FILE, type_);
return file_.get();
}
FileResource* mutable_file() {
DCHECK_EQ(FILE, type_);
return file_.get();
}
// Returns TeamDriveResource which the change refers to.
// Valid only when type == TEAM_DRIVE.
const TeamDriveResource* team_drive() const {
DCHECK_EQ(TEAM_DRIVE, type_);
return team_drive_.get();
}
TeamDriveResource* mutable_team_drive() {
DCHECK_EQ(TEAM_DRIVE, type_);
return team_drive_.get();
}
// Returns the ID of the Team Drive. Valid only when type == TEAM_DRIVE.
const std::string& team_drive_id() const {
DCHECK_EQ(TEAM_DRIVE, type_);
return team_drive_id_;
}
// Returns the time of this modification.
const base::Time& modification_date() const { return modification_date_; }
void set_change_id(int64_t change_id) { change_id_ = change_id; }
void set_type(ChangeType type) { type_ = type; }
void set_file_id(const std::string& file_id) {
file_id_ = file_id;
}
void set_deleted(bool deleted) {
deleted_ = deleted;
}
void set_file(std::unique_ptr<FileResource> file) { file_ = std::move(file); }
void set_team_drive(std::unique_ptr<TeamDriveResource> team_drive) {
team_drive_ = std::move(team_drive);
}
void set_team_drive_id(const std::string& team_drive_id) {
team_drive_id_ = team_drive_id;
}
void set_modification_date(const base::Time& modification_date) {
modification_date_ = modification_date;
}
private:
friend class base::internal::RepeatedMessageConverter<ChangeResource>;
friend class ChangeList;
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
// Extracts the change type from the given string. Returns false and does
// not change |result| when |type_name| has an unrecognizable value.
static bool GetType(base::StringPiece type_name,
ChangeResource::ChangeType* result);
int64_t change_id_;
ChangeType type_;
std::string file_id_;
bool deleted_;
std::unique_ptr<FileResource> file_;
base::Time modification_date_;
std::string team_drive_id_;
std::unique_ptr<TeamDriveResource> team_drive_;
};
// ChangeList represents a set of changes in the drive.
// https://developers.google.com/drive/v2/reference/changes/list
class ChangeList {
public:
ChangeList();
ChangeList(const ChangeList&) = delete;
ChangeList& operator=(const ChangeList&) = delete;
~ChangeList();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<ChangeList>* converter);
// Returns true if the |value| has kind field for ChangeList.
static bool HasChangeListKind(const base::Value& value);
// Creates change list from parsed JSON.
static std::unique_ptr<ChangeList> CreateFrom(const base::Value& value);
// Returns a link to the next page of files. The URL includes the next page
// token.
const GURL& next_link() const { return next_link_; }
// Returns the largest change ID number.
int64_t largest_change_id() const { return largest_change_id_; }
// Returns the new start page token, only if the end of current change list
// was reached.
const std::string& new_start_page_token() const {
return new_start_page_token_;
}
// Returns a set of changes in this list.
const std::vector<std::unique_ptr<ChangeResource>>& items() const {
return items_;
}
std::vector<std::unique_ptr<ChangeResource>>* mutable_items() {
return &items_;
}
void set_next_link(const GURL& next_link) {
next_link_ = next_link;
}
void set_largest_change_id(int64_t largest_change_id) {
largest_change_id_ = largest_change_id;
}
void set_new_start_page_token(const std::string& new_start_page_token) {
new_start_page_token_ = new_start_page_token;
}
private:
friend class DriveAPIParserTest;
FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, ChangeListParser);
// Parses and initializes data members from content of |value|.
// Return false if parsing fails.
bool Parse(const base::Value& value);
GURL next_link_;
int64_t largest_change_id_;
std::string new_start_page_token_;
std::vector<std::unique_ptr<ChangeResource>> items_;
};
// StartPageToken represets the starting pageToken for listing changes in the
// users corpus or in a team drive.
// https://developers.google.com/drive/v2/reference/changes/getStartPageToken
class StartPageToken {
public:
StartPageToken();
~StartPageToken();
// Registers the mapping between JSON field names and the members in this
// class.
static void RegisterJSONConverter(
base::JSONValueConverter<StartPageToken>* converter);
// Creates StartPageToken from parsed JSON
static std::unique_ptr<StartPageToken> CreateFrom(const base::Value& value);
const std::string& start_page_token() const { return start_page_token_; }
void set_start_page_token(const std::string& token) {
start_page_token_ = token;
}
private:
// Pareses and initializes data members from content of |value|.
// Returns false if parsing fails.
bool Parse(const base::Value& value);
std::string start_page_token_;
};
} // namespace google_apis
#endif // GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_