15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class StructType>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JSONValueConverter;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class NestedType>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedMessageConverter;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_apis {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// About resource represents the account information about the current user.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/about
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AboutResource {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AboutResource();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AboutResource();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<AboutResource>* converter);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates about resource from parsed JSON.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<AboutResource> CreateFrom(const base::Value& value);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the largest change ID number.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_change_id() const { return largest_change_id_; }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns total number of quota bytes.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_total() const { return quota_bytes_total_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of quota bytes used.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_used() const { return quota_bytes_used_; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns root folder ID.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& root_folder_id() const { return root_folder_id_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_largest_change_id(int64 largest_change_id) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    largest_change_id_ = largest_change_id;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_quota_bytes_total(int64 quota_bytes_total) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quota_bytes_total_ = quota_bytes_total;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_quota_bytes_used(int64 quota_bytes_used) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quota_bytes_used_ = quota_bytes_used;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_root_folder_id(const std::string& root_folder_id) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_folder_id_ = root_folder_id;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DriveAPIParserTest;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, AboutResourceParser);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_change_id_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_total_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_used_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string root_folder_id_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This class is copyable on purpose.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DriveAppIcon represents an icon for Drive Application.
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DriveAppIcon {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum IconCategory {
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    UNKNOWN,          // Uninitialized state.
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DOCUMENT,         // Icon for a file associated with the app.
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    APPLICATION,      // Icon for the application.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SHARED_DOCUMENT,  // Icon for a shared file associated with the app.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DriveAppIcon();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DriveAppIcon();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<DriveAppIcon>* converter);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates drive app icon instance from parsed JSON.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<DriveAppIcon> CreateFrom(const base::Value& value);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Category of the icon.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconCategory category() const { return category_; }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size in pixels of one side of the icon (icons are always square).
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int icon_side_length() const { return icon_side_length_; }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns URL for this icon.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& icon_url() const { return icon_url_; }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_category(IconCategory category) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    category_ = category;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_icon_side_length(int icon_side_length) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_side_length_ = icon_side_length;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_icon_url(const GURL& icon_url) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_url_ = icon_url;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the icon category from the given string. Returns false and does
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not change |result| when |scheme| has an unrecognizable value.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetIconCategory(const base::StringPiece& category,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              IconCategory* result);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::internal::RepeatedMessageConverter<DriveAppIcon>;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AppResource;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconCategory category_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int icon_side_length_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL icon_url_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DriveAppIcon);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppResource represents a Drive Application.
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppResource {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AppResource();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppResource();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<AppResource>* converter);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates app resource from parsed JSON.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<AppResource> CreateFrom(const base::Value& value);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns application ID, which is 12-digit decimals (e.g. "123456780123").
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& application_id() const { return application_id_; }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns application name.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& name() const { return name_; }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the name of the type of object this application creates.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used for displaying in "Create" menu item for this app.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If empty, application name is used instead.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& object_type() const { return object_type_; }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the product ID.
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& product_id() const { return product_id_; }
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether this application supports creating new objects.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool supports_create() const { return supports_create_; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns whether this application is removable by apps.delete API.
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_removable() const { return removable_; }
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the create URL, i.e., the URL for opening a new file by the app.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL& create_url() const { return create_url_; }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of primary mime types supported by this WebApp. Primary status should
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trigger this WebApp becoming the default handler of file instances that
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have these mime types.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& primary_mimetypes() const {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return primary_mimetypes_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of secondary mime types supported by this WebApp. Secondary status
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should make this WebApp show up in "Open with..." pop-up menu of the
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default action menu for file with matching mime types.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& secondary_mimetypes() const {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return secondary_mimetypes_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of primary file extensions supported by this WebApp. Primary status
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should trigger this WebApp becoming the default handler of file instances
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that match these extensions.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& primary_file_extensions() const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return primary_file_extensions_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of secondary file extensions supported by this WebApp. Secondary
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status should make this WebApp show up in "Open with..." pop-up menu of the
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default action menu for file with matching extensions.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& secondary_file_extensions() const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return secondary_file_extensions_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns Icons for this application.  An application can have multiple
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icons for different purpose (application, document, shared document)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in several sizes.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<DriveAppIcon>& icons() const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return icons_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_application_id(const std::string& application_id) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    application_id_ = application_id;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_name(const std::string& name) { name_ = name; }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_object_type(const std::string& object_type) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    object_type_ = object_type;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_product_id(const std::string& id) { product_id_ = id; }
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_supports_create(bool supports_create) {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    supports_create_ = supports_create;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_removable(bool removable) { removable_ = removable; }
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_primary_mimetypes(
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ScopedVector<std::string> primary_mimetypes) {
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    primary_mimetypes_ = primary_mimetypes.Pass();
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_secondary_mimetypes(
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ScopedVector<std::string> secondary_mimetypes) {
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    secondary_mimetypes_ = secondary_mimetypes.Pass();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_primary_file_extensions(
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ScopedVector<std::string> primary_file_extensions) {
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    primary_file_extensions_ = primary_file_extensions.Pass();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_secondary_file_extensions(
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ScopedVector<std::string> secondary_file_extensions) {
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    secondary_file_extensions_ = secondary_file_extensions.Pass();
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void set_icons(ScopedVector<DriveAppIcon> icons) {
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    icons_ = icons.Pass();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_create_url(const GURL& url) {
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    create_url_ = url;
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::internal::RepeatedMessageConverter<AppResource>;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AppList;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string application_id_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string object_type_;
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string product_id_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool supports_create_;
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool removable_;
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL create_url_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> primary_mimetypes_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> secondary_mimetypes_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> primary_file_extensions_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> secondary_file_extensions_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<DriveAppIcon> icons_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppResource);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppList represents a list of Drive Applications.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps/list
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppList {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppList();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AppList();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<AppList>* converter);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates app list from parsed JSON.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<AppList> CreateFrom(const base::Value& value);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ETag for this resource.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& etag() const { return etag_; }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a vector of applications.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<AppResource>& items() const { return items_; }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_etag(const std::string& etag) {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    etag_ = etag;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void set_items(ScopedVector<AppResource> items) {
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    items_ = items.Pass();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DriveAPIParserTest;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, AppListParser);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string etag_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<AppResource> items_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppList);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ParentReference represents a directory.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/parents
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ParentReference {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParentReference();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ParentReference();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<ParentReference>* converter);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates parent reference from parsed JSON.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<ParentReference> CreateFrom(const base::Value& value);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the file id of the reference.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& file_id() const { return file_id_; }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the URL for the parent in Drive.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& parent_link() const { return parent_link_; }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_id(const std::string& file_id) { file_id_ = file_id; }
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_parent_link(const GURL& parent_link) {
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_link_ = parent_link;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_id_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL parent_link_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileLabels represents labels for file or folder.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/files
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileLabels {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileLabels();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FileLabels();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<FileLabels>* converter);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates about resource from parsed JSON.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<FileLabels> CreateFrom(const base::Value& value);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this file has been trashed.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_trashed() const { return trashed_; }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_trashed(bool trashed) { trashed_ = trashed; }
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FileResource;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trashed_;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// ImageMediaMetadata represents image metadata for a file.
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://developers.google.com/drive/v2/reference/files
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ImageMediaMetadata {
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ImageMediaMetadata();
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~ImageMediaMetadata();
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // class.
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static void RegisterJSONConverter(
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::JSONValueConverter<ImageMediaMetadata>* converter);
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Creates about resource from parsed JSON.
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static scoped_ptr<ImageMediaMetadata> CreateFrom(const base::Value& value);
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Width of the image in pixels.
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int width() const { return width_; }
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Height of the image in pixels.
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int height() const { return height_; }
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Rotation of the image in clockwise degrees.
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int rotation() const { return rotation_; }
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void set_width(int width) { width_ = width; }
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void set_height(int height) { height_ = height; }
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void set_rotation(int rotation) { rotation_ = rotation; }
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  friend class FileResource;
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Parses and initializes data members from content of |value|.
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Return false if parsing fails.
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool Parse(const base::Value& value);
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int width_;
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int height_;
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int rotation_;
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileResource represents a file or folder metadata in Drive.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/files
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileResource {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Link to open a file resource on a web app with |app_id|.
428a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  struct OpenWithLink {
429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    std::string app_id;
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GURL open_url;
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileResource();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FileResource();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<FileResource>* converter);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates file resource from parsed JSON.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<FileResource> CreateFrom(const base::Value& value);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this is a directory.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: "folder" is used elsewhere in this file to match Drive API reference,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but outside this file we use "directory" to match HTML5 filesystem API.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsDirectory() const;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns true if this is a hosted document.
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // A hosted document is a document in one of Google Docs formats (Documents,
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Spreadsheets, Slides, ...) whose content is not exposed via the API. It is
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // available only as |alternate_link()| to the document hosted on the server.
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool IsHostedDocument() const;
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns file ID.  This is unique in all files in Google Drive.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& file_id() const { return file_id_; }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns ETag for this file.
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& etag() const { return etag_; }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the title of this file.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& title() const { return title_; }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns MIME type of this file.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& mime_type() const { return mime_type_; }
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns labels for this file.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileLabels& labels() const { return labels_; }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Returns image media metadata for this file.
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const ImageMediaMetadata& image_media_metadata() const {
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return image_media_metadata_;
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns created time of this file.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time& created_date() const { return created_date_; }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns modified time of this file.
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Time& modified_date() const { return modified_date_; }
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns last access time by the user.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time& last_viewed_by_me_date() const {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_viewed_by_me_date_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns time when the file was shared with the user.
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::Time& shared_with_me_date() const {
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return shared_with_me_date_;
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the 'shared' attribute of the file.
492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool shared() const { return shared_; }
493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns MD5 checksum of this file.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& md5_checksum() const { return md5_checksum_; }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the size of this file in bytes.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size() const { return file_size_; }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the link to open the file in Google editor or viewer.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // E.g. Google Document, Google Spreadsheet.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& alternate_link() const { return alternate_link_; }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns parent references (directories) of this file.
505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const std::vector<ParentReference>& parents() const { return parents_; }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Returns the list of links to open the resource with a web app.
508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::vector<OpenWithLink>& open_with_links() const {
509a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return open_with_links_;
510a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_id(const std::string& file_id) {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_id_ = file_id;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_etag(const std::string& etag) {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    etag_ = etag;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_title(const std::string& title) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    title_ = title;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_mime_type(const std::string& mime_type) {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mime_type_ = mime_type;
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FileLabels* mutable_labels() {
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return &labels_;
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ImageMediaMetadata* mutable_image_media_metadata() {
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return &image_media_metadata_;
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_created_date(const base::Time& created_date) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    created_date_ = created_date;
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_modified_date(const base::Time& modified_date) {
5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    modified_date_ = modified_date;
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_viewed_by_me_date_ = last_viewed_by_me_date;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void set_shared_with_me_date(const base::Time& shared_with_me_date) {
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    shared_with_me_date_ = shared_with_me_date;
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void set_shared(bool shared) {
543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    shared_ = shared;
544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_md5_checksum(const std::string& md5_checksum) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    md5_checksum_ = md5_checksum;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_size(int64 file_size) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_size_ = file_size;
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_alternate_link(const GURL& alternate_link) {
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    alternate_link_ = alternate_link;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<ParentReference>* mutable_parents() { return &parents_; }
555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<OpenWithLink>* mutable_open_with_links() {
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return &open_with_links_;
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::internal::RepeatedMessageConverter<FileResource>;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ChangeResource;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FileList;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_id_;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string etag_;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title_;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type_;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileLabels labels_;
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ImageMediaMetadata image_media_metadata_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time created_date_;
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time modified_date_;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_viewed_by_me_date_;
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time shared_with_me_date_;
578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool shared_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string md5_checksum_;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size_;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL alternate_link_;
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<ParentReference> parents_;
583a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  std::vector<OpenWithLink> open_with_links_;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileList represents a collection of files and folders.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/files/list
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileList {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileList();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FileList();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<FileList>* converter);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if the |value| has kind field for FileList.
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool HasFileListKind(const base::Value& value);
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates file list from parsed JSON.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<FileList> CreateFrom(const base::Value& value);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a link to the next page of files.  The URL includes the next page
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // token.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& next_link() const { return next_link_; }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a set of files in this list.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<FileResource>& items() const { return items_; }
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedVector<FileResource>* mutable_items() { return &items_; }
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_next_link(const GURL& next_link) {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_link_ = next_link;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DriveAPIParserTest;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, FileListParser);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL next_link_;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<FileResource> items_;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FileList);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChangeResource represents a change in a file.
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/changes
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChangeResource {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChangeResource();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ChangeResource();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<ChangeResource>* converter);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates change resource from parsed JSON.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<ChangeResource> CreateFrom(const base::Value& value);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns change ID for this change.  This is a monotonically increasing
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 change_id() const { return change_id_; }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string file ID for corresponding file of the change.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& file_id() const { return file_id_; }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this file is deleted in the change.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_deleted() const { return deleted_; }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns FileResource of the file which the change refers to.
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const FileResource* file() const { return file_.get(); }
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FileResource* mutable_file() { return file_.get(); }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns the time of this modification.
660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::Time& modification_date() const { return modification_date_; }
661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_change_id(int64 change_id) {
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    change_id_ = change_id;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_id(const std::string& file_id) {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_id_ = file_id;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_deleted(bool deleted) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    deleted_ = deleted;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void set_file(scoped_ptr<FileResource> file) {
6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    file_ = file.Pass();
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_modification_date(const base::Time& modification_date) {
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    modification_date_ = modification_date;
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::internal::RepeatedMessageConverter<ChangeResource>;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ChangeList;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 change_id_;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_id_;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deleted_;
6897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<FileResource> file_;
690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Time modification_date_;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChangeResource);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChangeList represents a set of changes in the drive.
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/changes/list
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChangeList {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChangeList();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ChangeList();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in this
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class.
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<ChangeList>* converter);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if the |value| has kind field for ChangeList.
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool HasChangeListKind(const base::Value& value);
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates change list from parsed JSON.
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_ptr<ChangeList> CreateFrom(const base::Value& value);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a link to the next page of files.  The URL includes the next page
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // token.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& next_link() const { return next_link_; }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the largest change ID number.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_change_id() const { return largest_change_id_; }
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a set of changes in this list.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<ChangeResource>& items() const { return items_; }
722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedVector<ChangeResource>* mutable_items() { return &items_; }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_next_link(const GURL& next_link) {
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_link_ = next_link;
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_largest_change_id(int64 largest_change_id) {
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    largest_change_id_ = largest_change_id;
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class DriveAPIParserTest;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DriveAPIParserTest, ChangeListParser);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL next_link_;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_change_id_;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<ChangeResource> items_;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChangeList);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google_apis
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // GOOGLE_APIS_DRIVE_DRIVE_API_PARSER_H_
749