| Index: chrome/browser/chromeos/gdata/gdata_parser.h
|
| diff --git a/chrome/browser/chromeos/gdata/gdata_parser.h b/chrome/browser/chromeos/gdata/gdata_parser.h
|
| index 06cf3eda9e5ac36118cb62a95465f3bb245863e9..190069b68e3e91f3ae13a51c7c176d221b7ed8bf 100644
|
| --- a/chrome/browser/chromeos/gdata/gdata_parser.h
|
| +++ b/chrome/browser/chromeos/gdata/gdata_parser.h
|
| @@ -11,6 +11,7 @@
|
|
|
| #include "base/compiler_specific.h"
|
| #include "base/memory/scoped_vector.h"
|
| +#include "base/string_piece.h"
|
| #include "base/time.h"
|
| #include "googleurl/src/gurl.h"
|
|
|
| @@ -18,6 +19,12 @@ class Profile;
|
| namespace base {
|
| class Value;
|
| class DictionaryValue;
|
| +template <class StructType>
|
| +class JSONValueConverter;
|
| +namespace internal {
|
| +template <class NestedType>
|
| +class RepeatedMessageConverter;
|
| +}
|
| }
|
|
|
| // Defines data elements of Google Documents API as described in
|
| @@ -47,8 +54,9 @@ class Link {
|
| };
|
| Link();
|
|
|
| - // Reads link fields from corresponding fields from |dictionary|.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(base::JSONValueConverter<Link>* converter);
|
|
|
| // Type of the link.
|
| LinkType type() const { return type_; }
|
| @@ -63,8 +71,10 @@ class Link {
|
| const std::string& mime_type() const { return mime_type_; }
|
|
|
| private:
|
| - // Converts value of link.rel into LinkType.
|
| - static LinkType GetLinkType(const std::string& rel);
|
| + // Converts value of link.rel into LinkType. Outputs to |result| and
|
| + // returns true when |rel| has a valid value. Otherwise does nothing
|
| + // and returns false.
|
| + static bool GetLinkType(const base::StringPiece& rel, LinkType* result);
|
|
|
| LinkType type_;
|
| GURL href_;
|
| @@ -75,6 +85,8 @@ class Link {
|
| static const char kRelField[];
|
| static const char kTitleField[];
|
| static const char kTypeField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Link);
|
| };
|
|
|
| // Feed links define links (URLs) to special list of entries (i.e. list of
|
| @@ -88,8 +100,10 @@ class FeedLink {
|
| };
|
| FeedLink();
|
|
|
| - // Reads link details from corresponding fields from |dictionary|.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<FeedLink>* converter);
|
|
|
| // URL of the feed.
|
| FeedLinkType type() const { return type_; }
|
| @@ -99,21 +113,29 @@ class FeedLink {
|
|
|
| private:
|
| // Converts value of gd$feedLink.rel into FeedLinkType enum.
|
| - static FeedLinkType GetFeedLinkType(const std::string& rel);
|
| + // Outputs to |result| and returns true when |rel| has a valid
|
| + // value. Otherwise does nothing and returns false.
|
| + static bool GetFeedLinkType(
|
| + const base::StringPiece& rel, FeedLinkType* result);
|
|
|
| FeedLinkType type_;
|
| GURL href_;
|
|
|
| static const char kHrefField[];
|
| static const char kRelField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(FeedLink);
|
| };
|
|
|
| +// Author represents an author of an entity.
|
| class Author {
|
| public:
|
| Author();
|
|
|
| - // Reads author details from corresponding fields from |dictionary|.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<Author>* converter);
|
|
|
| // Getters.
|
| const string16& name() const { return name_; }
|
| @@ -124,6 +146,8 @@ class Author {
|
| std::string email_;
|
| static const char kNameField[];
|
| static const char kEmailField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Author);
|
| };
|
|
|
| // Entry category.
|
| @@ -137,8 +161,10 @@ class Category {
|
| };
|
| Category();
|
|
|
| - // Reads category details from corresponding fields from |dictionary|.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<Category>* converter);
|
|
|
| // Category label.
|
| const string16& label() const { return label_; }
|
| @@ -152,15 +178,42 @@ class Category {
|
| private:
|
| // Converts catory scheme into CategoryType enum. For example,
|
| // http://schemas.google.com/g/2005#kind => Category::KIND
|
| - CategoryType GetCategoryTypeFromScheme(const std::string& scheme);
|
| + // Returns false and does not change |result| when |scheme| has an
|
| + // unrecognizable value.
|
| + static bool GetCategoryTypeFromScheme(
|
| + const base::StringPiece& scheme, CategoryType* result);
|
|
|
| string16 label_;
|
| CategoryType type_;
|
| std::string term_;
|
| -
|
| static const char kLabelField[];
|
| static const char kSchemeField[];
|
| static const char kTermField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Category);
|
| +};
|
| +
|
| +// Content details of a document: mime-type, url, and so on.
|
| +class Content {
|
| + public:
|
| + Content();
|
| +
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<Content>* converter);
|
| +
|
| + const GURL& url() const { return url_; }
|
| + const std::string& mime_type() const { return mime_type_; }
|
| +
|
| + private:
|
| + GURL url_;
|
| + std::string mime_type_;
|
| +
|
| + static const char kSrcField[];
|
| + static const char kTypeField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Content);
|
| };
|
|
|
| // Base class for feed entries.
|
| @@ -190,27 +243,15 @@ class GDataEntry {
|
|
|
| // Returns true when time string (in format yyyy-mm-ddThh:mm:ss.dddZ), is
|
| // successfully parsed and output as |time|.
|
| - static bool GetTimeFromString(const std::string& raw_value, base::Time* time);
|
| -
|
| - protected:
|
| - // Handler method, invoked when a new category is added to the entry.
|
| - virtual void OnAddCategory(Category* category) {}
|
| -
|
| - // Parses links from |dictionary|.
|
| - bool ParseLinks(const base::DictionaryValue* dictionary);
|
| -
|
| - // Parses categories from |dictionary|.
|
| - bool ParseCategories(const base::DictionaryValue* dictionary);
|
| + static bool GetTimeFromString(
|
| + const base::StringPiece& raw_value, base::Time* time);
|
|
|
| - // Parses authors from |dictionary|.
|
| - bool ParseAuthors(const base::DictionaryValue* dictionary);
|
| -
|
| - // Returns true when time string (in format yyyy-mm-ddThh:mm:ss.dddZ), is
|
| - // successfully parsed and output as |time|.
|
| - static bool ParseDateTime(const base::DictionaryValue* dict,
|
| - const std::string& field,
|
| - base::Time* time);
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<GDataEntry>* converter);
|
|
|
| + protected:
|
| std::string etag_;
|
| ScopedVector<Author> authors_;
|
| ScopedVector<Link> links_;
|
| @@ -221,6 +262,10 @@ class GDataEntry {
|
| static const char kAuthorField[];
|
| static const char kLinkField[];
|
| static const char kCategoryField[];
|
| + static const char kUpdatedField[];
|
| + static const char kETagField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GDataEntry);
|
| };
|
|
|
| // Document feed entry.
|
| @@ -237,9 +282,18 @@ class DocumentEntry : public GDataEntry {
|
| PDF,
|
| };
|
| virtual ~DocumentEntry();
|
| - // Creates document entry from parsed JSON Value.
|
| +
|
| + // Creates document entry from parsed JSON Value. You should call
|
| + // this instead of instantiating JSONValueConverter by yourself
|
| + // because this method does some post-process for some fields. See
|
| + // FillRemainingFields comment and implementation for the details.
|
| static DocumentEntry* CreateFrom(base::Value* value);
|
|
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<DocumentEntry>* converter);
|
| +
|
| // Document entry resource id.
|
| const std::string& resource_id() const { return resource_id_; }
|
|
|
| @@ -259,10 +313,10 @@ class DocumentEntry : public GDataEntry {
|
| const std::vector<string16>& labels() const { return labels_; }
|
|
|
| // Document entry content URL.
|
| - const GURL& content_url() const { return content_url_; }
|
| + const GURL& content_url() const { return content_.url(); }
|
|
|
| // Document entry MIME type.
|
| - const std::string& content_mime_type() const { return content_mime_type_; }
|
| + const std::string& content_mime_type() const { return content_.mime_type(); }
|
|
|
| // List of document feed links.
|
| const ScopedVector<FeedLink>& feed_links() const { return feed_links_; }
|
| @@ -280,23 +334,14 @@ class DocumentEntry : public GDataEntry {
|
| int64 file_size() const { return file_size_; }
|
|
|
| private:
|
| - DocumentEntry();
|
| -
|
| - // Parses and initializes data members from content of |dictionary|. Returns
|
| - // false if parsing fails.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| -
|
| - // Parses properties for file entry from |dictionary|.
|
| - bool ParseFileProperties(const base::DictionaryValue* dictionary);
|
| + friend class base::internal::RepeatedMessageConverter<DocumentEntry>;
|
| + friend class DocumentFeed;
|
|
|
| - // Parses content properties from |dictionary|.
|
| - bool ParseContent(const base::DictionaryValue* dictionary);
|
| + DocumentEntry();
|
|
|
| - // Parses feed links from |dictionary|.
|
| - bool ParseFeedLinks(const base::DictionaryValue* dictionary);
|
| + // Fills the remaining fields where JSONValueConverter cannot catch.
|
| + void FillRemainingFields();
|
|
|
| - // GDataEntry overrides.
|
| - virtual void OnAddCategory(Category* category) OVERRIDE;
|
| // Converts categories.term into EntryKind enum.
|
| static EntryKind GetEntryKindFromTerm(const std::string& term);
|
|
|
| @@ -306,8 +351,7 @@ class DocumentEntry : public GDataEntry {
|
| string16 title_;
|
| base::Time published_time_;
|
| std::vector<string16> labels_;
|
| - GURL content_url_;
|
| - std::string content_mime_type_;
|
| + Content content_;
|
| ScopedVector<FeedLink> feed_links_;
|
| // Optional fields for files only.
|
| string16 filename_;
|
| @@ -317,18 +361,16 @@ class DocumentEntry : public GDataEntry {
|
|
|
| static const char kFeedLinkField[];
|
| static const char kContentField[];
|
| - static const char kSrcField[];
|
| - static const char kTypeField[];
|
| static const char kFileNameField[];
|
| static const char kMD5Field[];
|
| static const char kSizeField[];
|
| static const char kSuggestedFileNameField[];
|
| - static const char kETagField[];
|
| static const char kResourceIdField[];
|
| static const char kIDField[];
|
| static const char kTitleField[];
|
| - static const char kUpdatedField[];
|
| static const char kPublishedField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DocumentEntry);
|
| };
|
|
|
| // Document feed represents a list of entries. The feed is paginated and
|
| @@ -338,9 +380,18 @@ class DocumentFeed : public GDataEntry {
|
| public:
|
| virtual ~DocumentFeed();
|
|
|
| - // Creates feed from parsed JSON Value.
|
| + // Creates feed from parsed JSON Value. You should call this
|
| + // instead of instantiating JSONValueConverter by yourself because
|
| + // this method does some post-process for some fields. See
|
| + // FillRemainingFields comment and implementation in DocumentEntry
|
| + // class for the details.
|
| static DocumentFeed* CreateFrom(base::Value* value);
|
|
|
| + // Registers the mapping between JSON field names and the members in
|
| + // this class.
|
| + static void RegisterJSONConverter(
|
| + base::JSONValueConverter<DocumentFeed>* converter);
|
| +
|
| // Returns true and passes|url| of the next feed if the current entry list
|
| // does not completed this feed.
|
| bool GetNextFeedURL(GURL* url);
|
| @@ -359,21 +410,22 @@ class DocumentFeed : public GDataEntry {
|
|
|
| private:
|
| DocumentFeed();
|
| - // Parses and initializes data members from content of |dictionary|. Returns
|
| - // false if parsing fails.
|
| - bool Parse(const base::DictionaryValue* dictionary);
|
| +
|
| + // Parses and initializes data members from content of |value|.
|
| + // Return false if parsing fails.
|
| + bool Parse(base::Value* value);
|
|
|
| ScopedVector<DocumentEntry> entries_;
|
| int start_index_;
|
| int items_per_page_;
|
| std::string title_;
|
|
|
| - static const char kETagField[];
|
| static const char kStartIndexField[];
|
| static const char kItemsPerPageField[];
|
| - static const char kUpdatedField[];
|
| static const char kTitleField[];
|
| static const char kEntryField[];
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DocumentFeed);
|
| };
|
|
|
| } // namespace gdata
|
|
|