// 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 #include #include #include #include #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 JSONValueConverter; namespace internal { template 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* converter); // Creates about resource from parsed JSON. static std::unique_ptr 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* converter); // Creates Team Drive resource from parsed JSON. static std::unique_ptr 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* converter); // Creates Team Drive resource from parsed JSON. static std::unique_ptr 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* 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 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>& items() const { return items_; } std::vector>* 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> 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* converter); // Creates parent reference from parsed JSON. static std::unique_ptr 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* converter); // Creates about resource from parsed JSON. static std::unique_ptr 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* converter); // Creates about resource from parsed JSON. static std::unique_ptr 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* converter); // Creates a FileResourceCapabilities from parsed JSON. static std::unique_ptr 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* converter); // Creates file resource from parsed JSON. static std::unique_ptr 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& parents() const { return parents_; } // Returns the list of links to open the resource with a web app. const std::vector& 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* mutable_parents() { return &parents_; } std::vector* 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; 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 parents_; std::vector 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* 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 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>& items() const { return items_; } std::vector>* 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> 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* converter); // Creates change resource from parsed JSON. static std::unique_ptr 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 file) { file_ = std::move(file); } void set_team_drive(std::unique_ptr 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; 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 file_; base::Time modification_date_; std::string team_drive_id_; std::unique_ptr 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* 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 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>& items() const { return items_; } std::vector>* 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> 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* converter); // Creates StartPageToken from parsed JSON static std::unique_ptr 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_