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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_GOOGLE_APIS_GDATA_WAPI_PARSER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_GOOGLE_APIS_GDATA_WAPI_PARSER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google_apis/drive_entry_kinds.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Value;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class StructType>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JSONValueConverter;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class NestedType>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedMessageConverter;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines data elements of Google Documents API as described in
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/apis/documents/.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_apis {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kochi): These forward declarations will be unnecessary once
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/142293 is resolved.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChangeList;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChangeResource;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileList;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileResource;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines link (URL) of an entity (document, file, feed...). Each entity could
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have more than one link representing it.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Link {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum LinkType {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_UNKNOWN,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_SELF,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_NEXT,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_PARENT,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_ALTERNATE,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_EDIT,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_EDIT_MEDIA,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_ALT_EDIT_MEDIA,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_ALT_POST,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_FEED,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_POST,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_BATCH,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_RESUMABLE_EDIT_MEDIA,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_RESUMABLE_CREATE_MEDIA,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_TABLES_FEED,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_WORKSHEET_FEED,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_THUMBNAIL,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_EMBED,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_PRODUCT,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_ICON,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_OPEN_WITH,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LINK_SHARE,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Link();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Link();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(base::JSONValueConverter<Link>* converter);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Type of the link.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LinkType type() const { return type_; }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL of the link.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& href() const { return href_; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Title of the link.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& title() const { return title_; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For OPEN_WITH links, this contains the application ID. For all other link
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // types, it is the empty string.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& app_id() const { return app_id_; }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Link MIME type.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& mime_type() const { return mime_type_; }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_type(LinkType type) { type_ = type; }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_href(const GURL& href) { href_ = href; }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_title(const std::string& title) { title_ = title; }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_app_id(const std::string& app_id) { app_id_ = app_id; }
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceEntry;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts value of link.rel into LinkType. Outputs to |type| and returns
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true when |rel| has a valid value. Otherwise does nothing and returns
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // false.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetLinkType(const base::StringPiece& rel, LinkType* type);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts value of link.rel to application ID, if there is one embedded in
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the link.rel field. Outputs to |app_id| and returns true when |rel| has a
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // valid value. Otherwise does nothing and returns false.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetAppID(const base::StringPiece& rel, std::string* app_id);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LinkType type_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL href_;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string title_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Link);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Feed links define links (URLs) to special list of entries (i.e. list of
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// previous document revisions).
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceLink {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum ResourceLinkType {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FEED_LINK_UNKNOWN,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FEED_LINK_ACL,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FEED_LINK_REVISIONS,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceLink();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::JSONValueConverter<ResourceLink>* converter);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MIME type of the feed.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceLinkType type() const { return type_; }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL of the feed.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& href() const { return href_; }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_type(ResourceLinkType type) { type_ = type; }
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_href(const GURL& href) { href_ = href; }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceEntry;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Converts value of gd$feedLink.rel into ResourceLinkType enum.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Outputs to |result| and returns true when |rel| has a valid
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value.  Otherwise does nothing and returns false.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetFeedLinkType(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::StringPiece& rel, ResourceLinkType* result);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceLinkType type_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL href_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceLink);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author represents an author of an entity.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Author {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Author();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<Author>* converter);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getters.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& name() const { return name_; }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& email() const { return email_; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_name(const std::string& name) { name_ = name; }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_email(const std::string& email) { email_ = email; }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceEntry;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string email_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Author);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Entry category.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Category {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum CategoryType {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CATEGORY_UNKNOWN,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CATEGORY_ITEM,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CATEGORY_KIND,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CATEGORY_LABEL,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Category();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<Category>* converter);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Category label.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& label() const { return label_; }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Category type.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CategoryType type() const { return type_; }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Category term.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& term() const { return term_; }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_label(const std::string& label) { label_ = label; }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_type(CategoryType type) { type_ = type; }
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_term(const std::string& term) { term_ = term; }
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceEntry;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts category scheme into CategoryType enum. For example,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://schemas.google.com/g/2005#kind => Category::CATEGORY_KIND
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false and does not change |result| when |scheme| has an
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unrecognizable value.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetCategoryTypeFromScheme(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::StringPiece& scheme, CategoryType* result);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string label_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CategoryType type_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string term_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Category);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Content details of a resource: mime-type, url, and so on.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Content {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Content();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<Content>* converter);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The URL to download the file content.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that the url can expire, so we'll fetch the latest resource
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry before starting a download to get the download URL.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& url() const { return url_; }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& mime_type() const { return mime_type_; }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_url(const GURL& url) { url_ = url; }
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; }
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceEntry;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This stores a representation of an application icon as registered with the
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed applications section of the account metadata feed. There can be
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple icons registered for each application, differing in size, category
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and MIME type.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppIcon {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum IconCategory {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ICON_UNKNOWN,          // Uninitialized state
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ICON_DOCUMENT,         // Document icon for various MIME types
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ICON_APPLICATION,      // Application icon for various MIME types
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ICON_SHARED_DOCUMENT,  // Icon for documents that are shared from other
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           // users.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppIcon();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AppIcon();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<AppIcon>* converter);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Category of the icon.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconCategory category() const { return category_; }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size in pixels of one side of the icon (icons are always square).
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int icon_side_length() const { return icon_side_length_; }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a list of links available for this AppIcon.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<Link>& links() const { return links_; }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the icon URL from the internal list of links.  Returns the first
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icon URL found in the list.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetIconURL() const;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_category(IconCategory category) { category_ = category; }
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_icon_side_length(int icon_side_length) {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_side_length_ = icon_side_length;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_links(ScopedVector<Link>* links) { links_.swap(*links); }
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the icon category from the given string. Returns false and does
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not change |result| when |scheme| has an unrecognizable value.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetIconCategory(const base::StringPiece& category,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              IconCategory* result);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconCategory category_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int icon_side_length_;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<Link> links_;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppIcon);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Base class for feed entries. This class defines fields commonly used by
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// various feeds.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CommonMetadata {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommonMetadata();
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CommonMetadata();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a link of a given |type| for this entry. If not found, it returns
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Link* GetLinkByType(Link::LinkType type) const;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Entry update time.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time updated_time() const { return updated_time_; }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Entry ETag.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& etag() const { return etag_; }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of entry authors.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<Author>& authors() const { return authors_; }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of entry links.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<Link>& links() const { return links_; }
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<Link>* mutable_links() { return &links_; }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of entry categories.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<Category>& categories() const { return categories_; }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_etag(const std::string& etag) { etag_ = etag; }
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_authors(ScopedVector<Author>* authors) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    authors_.swap(*authors);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_links(ScopedVector<Link>* links) {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    links_.swap(*links);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_categories(ScopedVector<Category>* categories) {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    categories_.swap(*categories);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_updated_time(const base::Time& updated_time) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    updated_time_ = updated_time;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template<typename CommonMetadataDescendant>
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::JSONValueConverter<CommonMetadataDescendant>* converter);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string etag_;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<Author> authors_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<Link> links_;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<Category> categories_;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time updated_time_;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CommonMetadata);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class represents a resource entry. A resource is a generic term which
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// refers to a file and a directory.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceEntry : public CommonMetadata {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceEntry();
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ResourceEntry();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts "entry" dictionary from the JSON value, and parse the contents,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // using CreateFrom(). Returns NULL on failure. The input JSON data, coming
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the gdata server, looks like:
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "encoding": "UTF-8",
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "entry": { ... },   // This function will extract this and parse.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "version": "1.0"
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The caller should delete the returned object.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceEntry> ExtractAndParse(const base::Value& value);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates resource entry from parsed JSON Value.  You should call
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this instead of instantiating JSONValueConverter by yourself
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because this method does some post-process for some fields.  See
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FillRemainingFields comment and implementation for the details.
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceEntry> CreateFrom(const base::Value& value);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates resource entry from FileResource.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(kochi): This should go away soon. http://crbug.com/142293
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceEntry> CreateFromFileResource(
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FileResource& file);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates resource entry from ChangeResource.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Todo(Kochi): This should go away soon. http://crbug.com/142293
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceEntry> CreateFromChangeResource(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ChangeResource& change);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns name of entry node.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetEntryNodeName();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::JSONValueConverter<ResourceEntry>* converter);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets true to |result| if the field exists.
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Always returns true even when the field does not exist.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HasFieldPresent(const base::Value* value, bool* result);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parses |value| as int64 and sets it to |result|. If the field does not
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exist, sets 0 to |result| as default value.
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if |value| is NULL or it is parsed as int64 successfully.
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ParseChangestamp(const base::Value* value, int64* result);
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The resource ID is used to identify a resource, which looks like:
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // file:d41d8cd98f00b204e9800998ecf8
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& resource_id() const { return resource_id_; }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is a URL looks like:
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // https://docs.google.com/feeds/id/file%3Ad41d8cd98f00b204e9800998ecf8.
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The URL is currently not used.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& id() const { return id_; }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DriveEntryKind kind() const { return kind_; }
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& title() const { return title_; }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time published_time() const { return published_time_; }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_viewed_time() const { return last_viewed_time_; }
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<std::string>& labels() const { return labels_; }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The URL to download a file content.
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Search for 'download_url' in gdata_wapi_requests.h for details.
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL& download_url() const { return content_.url(); }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& content_mime_type() const { return content_.mime_type(); }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The resource links contain extra links for revisions and access control,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // etc.  Note that links() contain more basic links like edit URL,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // alternative URL, etc.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ScopedVector<ResourceLink>& resource_links() const {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return resource_links_;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // File name (exists only for kinds FILE and PDF).
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& filename() const { return filename_; }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Suggested file name (exists only for kinds FILE and PDF).
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& suggested_filename() const { return suggested_filename_; }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // File content MD5 (exists only for kinds FILE and PDF).
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& file_md5() const { return file_md5_; }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // File size (exists only for kinds FILE and PDF).
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size() const { return file_size_; }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the file or directory is deleted (applicable to change list only).
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deleted() const { return deleted_ || removed_; }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changestamp (exists only for change query results).
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If not exists, defaults to 0.
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 changestamp() const { return changestamp_; }
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Text version of resource entry kind. Returns an empty string for
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unknown entry kind.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetEntryKindText() const;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns preferred file extension for hosted documents. If entry is not
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a hosted document, this call returns an empty string.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetHostedDocumentExtension() const;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry is remotely hosted.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_hosted_document() const {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ClassifyEntryKind(kind_) & KIND_OF_HOSTED_DOCUMENT) > 0;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry hosted by Google Documents.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_google_document() const {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ClassifyEntryKind(kind_) & KIND_OF_GOOGLE_DOCUMENT) > 0;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry is hosted by an external application.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_external_document() const {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ClassifyEntryKind(kind_) & KIND_OF_EXTERNAL_DOCUMENT) > 0;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry is a folder (collection).
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_folder() const {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ClassifyEntryKind(kind_) & KIND_OF_FOLDER) > 0;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry is regular file.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_file() const {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ClassifyEntryKind(kind_) & KIND_OF_FILE) > 0;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if resource entry can't be mapped to the file system.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_special() const {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !is_file() && !is_folder() && !is_hosted_document();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following constructs are exposed for unit tests.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Classes of EntryKind. Used for ClassifyEntryKind().
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum EntryKindClass {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_NONE = 0,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_HOSTED_DOCUMENT = 1,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_GOOGLE_DOCUMENT = 1 << 1,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_EXTERNAL_DOCUMENT = 1 << 2,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_FOLDER = 1 << 3,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KIND_OF_FILE = 1 << 4,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Classifies the EntryKind. The returned value is a bitmask of
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EntryKindClass. For example, DOCUMENT is classified as
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // KIND_OF_HOSTED_DOCUMENT and KIND_OF_GOOGLE_DOCUMENT, hence the returned
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value is KIND_OF_HOSTED_DOCUMENT | KIND_OF_GOOGLE_DOCUMENT.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int ClassifyEntryKind(DriveEntryKind kind);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Classifies the EntryKind by the file extension of specific path. The
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // returned value is a bitmask of EntryKindClass. See also ClassifyEntryKind.
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static int ClassifyEntryKindByFileExtension(const base::FilePath& file);
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_resource_id(const std::string& resource_id) {
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_id_ = resource_id;
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_id(const std::string& id) { id_ = id; }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_kind(DriveEntryKind kind) { kind_ = kind; }
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_title(const std::string& title) { title_ = title; }
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_published_time(const base::Time& published_time) {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    published_time_ = published_time;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_last_viewed_time(const base::Time& last_viewed_time) {
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_viewed_time_ = last_viewed_time;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_labels(const std::vector<std::string>& labels) {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    labels_ = labels;
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_content(const Content& content) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_ = content;
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_resource_links(ScopedVector<ResourceLink>* resource_links) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_links_.swap(*resource_links);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_filename(const std::string& filename) { filename_ = filename; }
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_suggested_filename(const std::string& suggested_filename) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    suggested_filename_ = suggested_filename;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_md5(const std::string& file_md5) { file_md5_ = file_md5; }
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_file_size(int64 file_size) { file_size_ = file_size; }
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_deleted(bool deleted) { deleted_ = deleted; }
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_removed(bool removed) { removed_ = removed; }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_changestamp(int64 changestamp) { changestamp_ = changestamp; }
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::internal::RepeatedMessageConverter<ResourceEntry>;
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceList;
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class ResumeUploadRequest;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills the remaining fields where JSONValueConverter cannot catch.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillRemainingFields();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts categories.term into DriveEntryKind enum.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static DriveEntryKind GetEntryKindFromTerm(const std::string& term);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |kind| into its text identifier equivalent.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* GetEntryKindDescription(DriveEntryKind kind);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string resource_id_;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id_;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DriveEntryKind kind_;
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string title_;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time published_time_;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last viewed value may be unreliable. See: crbug.com/152628.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_viewed_time_;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> labels_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Content content_;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<ResourceLink> resource_links_;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Optional fields for files only.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string filename_;
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string suggested_filename_;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_md5_;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size_;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deleted_;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool removed_;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 changestamp_;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class represents a list of resource entries with some extra metadata
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// such as the root upload URL. The feed is paginated and the rest of the
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// feed can be fetched by retrieving the remaining parts of the feed from
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLs provided by GetNextFeedURL() method.
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceList : public CommonMetadata {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceList();
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ResourceList();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts "feed" dictionary from the JSON value, and parse the contents,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // using CreateFrom(). Returns NULL on failure. The input JSON data, coming
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the gdata server, looks like:
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "encoding": "UTF-8",
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "feed": { ... },   // This function will extract this and parse.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "version": "1.0"
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // }
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceList> ExtractAndParse(const base::Value& value);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates feed from parsed JSON Value.  You should call this
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of instantiating JSONValueConverter by yourself because
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method does some post-process for some fields.  See
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FillRemainingFields comment and implementation in ResourceEntry
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class for the details.
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceList> CreateFrom(const base::Value& value);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Variant of CreateFrom() above, creates feed from parsed ChangeList.
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(hidehiko): This should go away soon. http://crbug.com/142293
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ResourceList> CreateFromChangeList(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ChangeList& changelist);
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Variant of CreateFrom() above, creates feed from parsed FileList.
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(hidehiko): This should go away soon. http://crbug.com/142293
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<ResourceList> CreateFromFileList(
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const FileList& file_list);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::JSONValueConverter<ResourceList>* converter);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true and passes|url| of the next feed if the current entry list
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not completed this feed.
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetNextFeedURL(GURL* url) const;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // List of resource entries.
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ScopedVector<ResourceEntry>& entries() const { return entries_; }
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<ResourceEntry>* mutable_entries() { return &entries_; }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Releases entries_ into |entries|. This is a transfer of ownership, so the
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // caller is responsible for deleting the elements of |entries|.
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReleaseEntries(std::vector<ResourceEntry*>* entries);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start index of the resource entry list.
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int start_index() const { return start_index_; }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Number of items per feed of the resource entry list.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int items_per_page() const { return items_per_page_; }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The largest changestamp. Next time the resource list should be fetched
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from this changestamp.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_changestamp() const { return largest_changestamp_; }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Resource entry list title.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& title() { return title_; }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_entries(ScopedVector<ResourceEntry>* entries) {
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entries_.swap(*entries);
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_start_index(int start_index) {
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_index_ = start_index;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_items_per_page(int items_per_page) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items_per_page_ = items_per_page;
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_title(const std::string& title) {
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    title_ = title;
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_largest_changestamp(int64 largest_changestamp) {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    largest_changestamp_ = largest_changestamp;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<ResourceEntry> entries_;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int start_index_;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int items_per_page_;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title_;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_changestamp_;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceList);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Metadata representing installed Google Drive application.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstalledApp {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<std::pair<int, GURL> > IconList;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstalledApp();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InstalledApp();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebApp name.
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& app_name() const { return app_name_; }
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drive app id
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& app_id() const { return app_id_; }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Object (file) type name that is generated by this WebApp.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& object_type() const { return object_type_; }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if WebApp supports creation of new file instances.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool supports_create() const { return supports_create_; }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of primary mime types supported by this WebApp. Primary status should
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trigger this WebApp becoming the default handler of file instances that
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have these mime types.
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& primary_mimetypes() const {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return primary_mimetypes_;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of secondary mime types supported by this WebApp. Secondary status
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should make this WebApp show up in "Open with..." pop-up menu of the
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default action menu for file with matching mime types.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& secondary_mimetypes() const {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return secondary_mimetypes_;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of primary file extensions supported by this WebApp. Primary status
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should trigger this WebApp becoming the default handler of file instances
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that match these extensions.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& primary_extensions() const {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return primary_extensions_;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of secondary file extensions supported by this WebApp. Secondary
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status should make this WebApp show up in "Open with..." pop-up menu of the
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default action menu for file with matching extensions.
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<std::string>& secondary_extensions() const {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return secondary_extensions_;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of entry links.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<Link>& links() const { return links_; }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a list of icons associated with this installed application.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<AppIcon>& app_icons() const {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return app_icons_;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convenience function for getting the icon URLs for a particular |category|
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of icon. Icons are returned in a sorted list, from smallest to largest.
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IconList GetIconsForCategory(AppIcon::IconCategory category) const;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves product URL from the link collection.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetProductUrl() const;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONValueConverter<InstalledApp>* converter);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_app_id(const std::string& app_id) { app_id_ = app_id; }
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_app_name(const std::string& app_name) { app_name_ = app_name; }
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_object_type(const std::string& object_type) {
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    object_type_ = object_type;
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_supports_create(bool supports_create) {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    supports_create_ = supports_create;
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_primary_mimetypes(
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedVector<std::string>* primary_mimetypes) {
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    primary_mimetypes_.swap(*primary_mimetypes);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_secondary_mimetypes(
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedVector<std::string>* secondary_mimetypes) {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    secondary_mimetypes_.swap(*secondary_mimetypes);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_primary_extensions(
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedVector<std::string>* primary_extensions) {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    primary_extensions_.swap(*primary_extensions);
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_secondary_extensions(
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedVector<std::string>* secondary_extensions) {
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    secondary_extensions_.swap(*secondary_extensions);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_links(ScopedVector<Link>* links) {
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    links_.swap(*links);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_app_icons(ScopedVector<AppIcon>* app_icons) {
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    app_icons_.swap(*app_icons);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts "$t" value from the dictionary |value| and returns it in |result|.
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the string value can't be found, it returns false.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetValueString(const base::Value* value,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             std::string* result);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id_;
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string app_name_;
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string object_type_;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool supports_create_;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> primary_mimetypes_;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> secondary_mimetypes_;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> primary_extensions_;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<std::string> secondary_extensions_;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<Link> links_;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<AppIcon> app_icons_;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Account metadata feed represents the metadata object attached to the user's
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account.
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AccountMetadata {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AccountMetadata();
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AccountMetadata();
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates feed from parsed JSON Value.  You should call this
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of instantiating JSONValueConverter by yourself because
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this method does some post-process for some fields.  See
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FillRemainingFields comment and implementation in ResourceEntry
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class for the details.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<AccountMetadata> CreateFrom(const base::Value& value);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_total() const {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_bytes_total_;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_used() const {
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return quota_bytes_used_;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_changestamp() const {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return largest_changestamp_;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ScopedVector<InstalledApp>& installed_apps() const {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return installed_apps_;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_quota_bytes_total(int64 quota_bytes_total) {
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quota_bytes_total_ = quota_bytes_total;
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_quota_bytes_used(int64 quota_bytes_used) {
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quota_bytes_used_ = quota_bytes_used;
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_largest_changestamp(int64 largest_changestamp) {
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    largest_changestamp_ = largest_changestamp;
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_installed_apps(ScopedVector<InstalledApp>* installed_apps) {
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    installed_apps_.swap(*installed_apps);
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers the mapping between JSON field names and the members in
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class.
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterJSONConverter(
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::JSONValueConverter<AccountMetadata>* converter);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses and initializes data members from content of |value|.
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if parsing fails.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Parse(const base::Value& value);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_total_;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 quota_bytes_used_;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 largest_changestamp_;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<InstalledApp> installed_apps_;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccountMetadata);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google_apis
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_GOOGLE_APIS_GDATA_WAPI_PARSER_H_
870