15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_value_converter.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/time_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Value; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::DictionaryValue; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::ListValue; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_apis { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Term values for kSchemeKind category: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTermPrefix[] = "http://schemas.google.com/docs/2007#"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Node names. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEntryNode[] = "entry"; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Field names. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAuthorField[] = "author"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCategoryField[] = "category"; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kChangestampField[] = "docs$changestamp.value"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kContentField[] = "content"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDeletedField[] = "gd$deleted"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kETagField[] = "gd$etag"; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEmailField[] = "email.$t"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEntryField[] = "entry"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFeedField[] = "feed"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFeedLinkField[] = "gd$feedLink"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileNameField[] = "docs$filename.$t"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHrefField[] = "href"; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIDField[] = "id.$t"; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppField[] = "docs$installedApp"; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppNameField[] = "docs$installedAppName"; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppIdField[] = "docs$installedAppId"; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppIconField[] = "docs$installedAppIcon"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppIconCategoryField[] = "docs$installedAppIconCategory"; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppIconSizeField[] = "docs$installedAppIconSize"; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppObjectTypeField[] = "docs$installedAppObjectType"; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppPrimaryFileExtensionField[] = 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "docs$installedAppPrimaryFileExtension"; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppPrimaryMimeTypeField[] = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "docs$installedAppPrimaryMimeType"; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppSecondaryFileExtensionField[] = 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "docs$installedAppSecondaryFileExtension"; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppSecondaryMimeTypeField[] = 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "docs$installedAppSecondaryMimeType"; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalledAppSupportsCreateField[] = 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "docs$installedAppSupportsCreate"; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kItemsPerPageField[] = "openSearch$itemsPerPage.$t"; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelField[] = "label"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLargestChangestampField[] = "docs$largestChangestamp.value"; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLastViewedField[] = "gd$lastViewed.$t"; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLinkField[] = "link"; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMD5Field[] = "docs$md5Checksum.$t"; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNameField[] = "name.$t"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPublishedField[] = "published.$t"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kQuotaBytesTotalField[] = "gd$quotaBytesTotal.$t"; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kQuotaBytesUsedField[] = "gd$quotaBytesUsed.$t"; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRelField[] = "rel"; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRemovedField[] = "docs$removed"; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kResourceIdField[] = "gd$resourceId.$t"; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSchemeField[] = "scheme"; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSizeField[] = "docs$size.$t"; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSrcField[] = "src"; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStartIndexField[] = "openSearch$startIndex.$t"; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSuggestedFileNameField[] = "docs$suggestedFilename.$t"; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTField[] = "$t"; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTermField[] = "term"; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTitleField[] = "title"; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTitleTField[] = "title.$t"; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTypeField[] = "type"; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kUpdatedField[] = "updated.$t"; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Link Prefixes 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOpenWithPrefix[] = "http://schemas.google.com/docs/2007#open-with-"; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kOpenWithPrefixSize = arraysize(kOpenWithPrefix) - 1; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct EntryKindMap { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DriveEntryKind kind; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* entry; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* extension; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const EntryKindMap kEntryKindMap[] = { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_UNKNOWN, "unknown", NULL}, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_ITEM, "item", NULL}, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_DOCUMENT, "document", ".gdoc"}, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_SPREADSHEET, "spreadsheet", ".gsheet"}, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_PRESENTATION, "presentation", ".gslides" }, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_DRAWING, "drawing", ".gdraw"}, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_TABLE, "table", ".gtable"}, 1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { ENTRY_KIND_FORM, "form", ".gform"}, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_EXTERNAL_APP, "externalapp", ".glink"}, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_SITE, "site", NULL}, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_FOLDER, "folder", NULL}, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_FILE, "file", NULL}, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ENTRY_KIND_PDF, "pdf", NULL}, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(kEntryKindMap) == ENTRY_KIND_MAX_VALUE, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryKindMap_and_DriveEntryKind_are_not_in_sync); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LinkTypeMap { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Link::LinkType type; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* rel; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const LinkTypeMap kLinkTypeMap[] = { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_SELF, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "self" }, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_NEXT, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "next" }, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_PARENT, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#parent" }, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_ALTERNATE, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "alternate"}, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_EDIT, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "edit" }, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_EDIT_MEDIA, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "edit-media" }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_ALT_EDIT_MEDIA, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#alt-edit-media" }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_ALT_POST, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#alt-post" }, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_FEED, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/g/2005#feed"}, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_POST, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/g/2005#post"}, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_BATCH, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/g/2005#batch"}, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_THUMBNAIL, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007/thumbnail"}, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_RESUMABLE_EDIT_MEDIA, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/g/2005#resumable-edit-media"}, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_RESUMABLE_CREATE_MEDIA, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/g/2005#resumable-create-media"}, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_TABLES_FEED, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/spreadsheets/2006#tablesfeed"}, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_WORKSHEET_FEED, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/spreadsheets/2006#worksheetsfeed"}, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_EMBED, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#embed"}, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_PRODUCT, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#product"}, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_ICON, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#icon"}, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Link::LINK_SHARE, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007#share"}, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ResourceLinkTypeMap { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceLink::ResourceLinkType type; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* rel; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ResourceLinkTypeMap kFeedLinkTypeMap[] = { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { ResourceLink::FEED_LINK_ACL, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/acl/2007#accessControlList" }, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { ResourceLink::FEED_LINK_REVISIONS, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://schemas.google.com/docs/2007/revisions" }, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CategoryTypeMap { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Category::CategoryType type; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* scheme; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CategoryTypeMap kCategoryTypeMap[] = { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Category::CATEGORY_KIND, "http://schemas.google.com/g/2005#kind" }, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { Category::CATEGORY_LABEL, "http://schemas.google.com/g/2005/labels" }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AppIconCategoryMap { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppIcon::IconCategory category; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* category_name; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AppIconCategoryMap kAppIconCategoryMap[] = { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { AppIcon::ICON_DOCUMENT, "document" }, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { AppIcon::ICON_APPLICATION, "application" }, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { AppIcon::ICON_SHARED_DOCUMENT, "documentShared" }, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts |url_string| to |result|. Always returns true to be used 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for JSONValueConverter::RegisterCustomField method. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mukai): make it return false in case of invalid |url_string|. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetGURLFromString(const base::StringPiece& url_string, GURL* result) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = GURL(url_string.as_string()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts boolean string values like "true" into bool. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetBoolFromString(const base::StringPiece& value, bool* result) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = (value == "true"); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SortBySize(const InstalledApp::IconList::value_type& a, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InstalledApp::IconList::value_type& b) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.first < b.first; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author implementation 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Author::Author() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Author::RegisterJSONConverter( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONValueConverter<Author>* converter) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kNameField, &Author::name_); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kEmailField, &Author::email_); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Link implementation 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Link::Link() : type_(Link::LINK_UNKNOWN) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Link::~Link() { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Link::GetAppID(const base::StringPiece& rel, std::string* app_id) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(app_id); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fast return path if the link clearly isn't an OPEN_WITH link. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rel.size() < kOpenWithPrefixSize) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_id->clear(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kOpenWithPrefixStr(kOpenWithPrefix); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (StartsWithASCII(rel.as_string(), kOpenWithPrefixStr, false)) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *app_id = rel.as_string().substr(kOpenWithPrefixStr.size()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_id->clear(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Link::GetLinkType(const base::StringPiece& rel, Link::LinkType* type) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kLinkTypeMap); i++) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rel == kLinkTypeMap[i].rel) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = kLinkTypeMap[i].type; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OPEN_WITH links have extra information at the end of the rel that is unique 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for each one, so we can't just check the usual map. This check is slightly 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redundant to provide a quick skip if it's obviously not an OPEN_WITH url. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rel.size() >= kOpenWithPrefixSize && 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartsWithASCII(rel.as_string(), kOpenWithPrefix, false)) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = LINK_OPEN_WITH; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let unknown link types through, just report it; if the link type is needed 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the future, add it into LinkType and kLinkTypeMap. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Ignoring unknown link type for rel " << rel; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = LINK_UNKNOWN; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::RegisterJSONConverter(base::JSONValueConverter<Link>* converter) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<Link::LinkType>(kRelField, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Link::type_, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Link::GetLinkType); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to register kRelField twice because we extract two different pieces 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of data from the same rel field. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<std::string>(kRelField, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Link::app_id_, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Link::GetAppID); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField(kHrefField, &Link::href_, &GetGURLFromString); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kTitleField, &Link::title_); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kTypeField, &Link::mime_type_); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ResourceLink implementation 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceLink::ResourceLink() : type_(ResourceLink::FEED_LINK_UNKNOWN) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static. 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceLink::GetFeedLinkType( 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::StringPiece& rel, ResourceLink::ResourceLinkType* result) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kFeedLinkTypeMap); i++) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rel == kFeedLinkTypeMap[i].rel) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = kFeedLinkTypeMap[i].type; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Unknown feed link type for rel " << rel; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceLink::RegisterJSONConverter( 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<ResourceLink>* converter) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterCustomField<ResourceLink::ResourceLinkType>( 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kRelField, &ResourceLink::type_, &ResourceLink::GetFeedLinkType); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField( 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kHrefField, &ResourceLink::href_, &GetGURLFromString); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Category implementation 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Category::Category() : type_(CATEGORY_UNKNOWN) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts category.scheme into CategoryType enum. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Category::GetCategoryTypeFromScheme( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& scheme, Category::CategoryType* result) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kCategoryTypeMap); i++) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (scheme == kCategoryTypeMap[i].scheme) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = kCategoryTypeMap[i].type; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Unknown feed link type for scheme " << scheme; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Category::RegisterJSONConverter( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONValueConverter<Category>* converter) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kLabelField, &Category::label_); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<Category::CategoryType>( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSchemeField, &Category::type_, &Category::GetCategoryTypeFromScheme); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kTermField, &Category::term_); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const Link* CommonMetadata::GetLinkByType(Link::LinkType type) const { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < links_.size(); ++i) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (links_[i]->type() == type) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return links_[i]; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Content implementation 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Content::Content() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Content::RegisterJSONConverter( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONValueConverter<Content>* converter) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField(kSrcField, &Content::url_, &GetGURLFromString); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kTypeField, &Content::mime_type_); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppIcon implementation 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppIcon::AppIcon() : category_(AppIcon::ICON_UNKNOWN), icon_side_length_(0) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppIcon::~AppIcon() { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppIcon::RegisterJSONConverter( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONValueConverter<AppIcon>* converter) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<AppIcon::IconCategory>( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInstalledAppIconCategoryField, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AppIcon::category_, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AppIcon::GetIconCategory); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int>(kInstalledAppIconSizeField, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &AppIcon::icon_side_length_, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedMessage(kLinkField, &AppIcon::links_); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL AppIcon::GetIconURL() const { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < links_.size(); ++i) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (links_[i]->type() == Link::LINK_ICON) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return links_[i]->href(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppIcon::GetIconCategory(const base::StringPiece& category, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppIcon::IconCategory* result) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kAppIconCategoryMap); i++) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (category == kAppIconCategoryMap[i].category_name) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = kAppIconCategoryMap[i].category; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Unknown icon category " << category; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CommonMetadata implementation 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommonMetadata::CommonMetadata() { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommonMetadata::~CommonMetadata() { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename CommonMetadataDescendant> 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CommonMetadata::RegisterJSONConverter( 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<CommonMetadataDescendant>* converter) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kETagField, &CommonMetadata::etag_); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->template RegisterRepeatedMessage<Author>( 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kAuthorField, &CommonMetadata::authors_); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->template RegisterRepeatedMessage<Link>( 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kLinkField, &CommonMetadata::links_); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->template RegisterRepeatedMessage<Category>( 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kCategoryField, &CommonMetadata::categories_); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->template RegisterCustomField<base::Time>( 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kUpdatedField, &CommonMetadata::updated_time_, &util::GetTimeFromString); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ResourceEntry implementation 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceEntry::ResourceEntry() 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : kind_(ENTRY_KIND_UNKNOWN), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_size_(0), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deleted_(false), 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) removed_(false), 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) changestamp_(0), 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_width_(-1), 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_height_(-1), 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_rotation_(-1) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceEntry::~ResourceEntry() { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceEntry::HasFieldPresent(const base::Value* value, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* result) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = (value != NULL); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceEntry::ParseChangestamp(const base::Value* value, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64* result) { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value) { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *result = 0; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string string_value; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetAsString(&string_value) && 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt64(string_value, result)) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceEntry::RegisterJSONConverter( 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<ResourceEntry>* converter) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inherit the parent registrations. 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommonMetadata::RegisterJSONConverter(converter); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField( 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kResourceIdField, &ResourceEntry::resource_id_); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kIDField, &ResourceEntry::id_); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kTitleTField, &ResourceEntry::title_); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<base::Time>( 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPublishedField, &ResourceEntry::published_time_, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &util::GetTimeFromString); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<base::Time>( 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kLastViewedField, &ResourceEntry::last_viewed_time_, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &util::GetTimeFromString); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedMessage( 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kFeedLinkField, &ResourceEntry::resource_links_); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterNestedField(kContentField, &ResourceEntry::content_); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // File properties. If the resource type is not a normal file, then 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that's no problem because those feed must not have these fields 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // themselves, which does not report errors. 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kFileNameField, &ResourceEntry::filename_); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kMD5Field, &ResourceEntry::file_md5_); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int64>( 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSizeField, &ResourceEntry::file_size_, &base::StringToInt64); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField( 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSuggestedFileNameField, &ResourceEntry::suggested_filename_); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deleted are treated as 'trashed' items on web client side. Removed files 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are gone for good. We treat both cases as 'deleted' for this client. 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomValueField<bool>( 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kDeletedField, &ResourceEntry::deleted_, &ResourceEntry::HasFieldPresent); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomValueField<bool>( 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kRemovedField, &ResourceEntry::removed_, &ResourceEntry::HasFieldPresent); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterCustomValueField<int64>( 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kChangestampField, &ResourceEntry::changestamp_, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &ResourceEntry::ParseChangestamp); 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ImageMediaMetadata fields are not supported by WAPI. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ResourceEntry::GetHostedDocumentExtension() const { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kEntryKindMap); i++) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kEntryKindMap[i].kind == kind_) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kEntryKindMap[i].extension) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(kEntryKindMap[i].extension); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int ResourceEntry::ClassifyEntryKindByFileExtension( 54090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::FilePath& file_path) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string file_extension = WideToUTF8(file_path.Extension()); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string file_extension = file_path.Extension(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kEntryKindMap); ++i) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* document_extension = kEntryKindMap[i].extension; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (document_extension && file_extension == document_extension) 54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return ClassifyEntryKind(kEntryKindMap[i].kind); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return 0; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DriveEntryKind ResourceEntry::GetEntryKindFromTerm( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& term) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!StartsWithASCII(term, kTermPrefix, false)) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Unexpected term prefix term " << term; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ENTRY_KIND_UNKNOWN; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type = term.substr(strlen(kTermPrefix)); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kEntryKindMap); i++) { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == kEntryKindMap[i].entry) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kEntryKindMap[i].kind; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Unknown entry type for term " << term << ", type " << type; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ENTRY_KIND_UNKNOWN; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ResourceEntry::ClassifyEntryKind(DriveEntryKind kind) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int classes = 0; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All DriveEntryKind members are listed here, so the compiler catches if a 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // newly added member is missing here. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (kind) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_UNKNOWN: 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special entries. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_ITEM: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_SITE: 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosted Google document. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_DOCUMENT: 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_SPREADSHEET: 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_PRESENTATION: 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_DRAWING: 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_TABLE: 5908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) case ENTRY_KIND_FORM: 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classes = KIND_OF_GOOGLE_DOCUMENT | KIND_OF_HOSTED_DOCUMENT; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hosted external application document. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_EXTERNAL_APP: 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classes = KIND_OF_EXTERNAL_DOCUMENT | KIND_OF_HOSTED_DOCUMENT; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Folders, collections. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_FOLDER: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classes = KIND_OF_FOLDER; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Regular files. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_FILE: 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_PDF: 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classes = KIND_OF_FILE; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ENTRY_KIND_MAX_VALUE: 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return classes; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceEntry::FillRemainingFields() { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set |kind_| and |labels_| based on the |categories_| in the class. 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JSONValueConverter does not have the ability to catch an element in a list 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // based on a predicate. Thus we need to iterate over |categories_| and 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // find the elements to set these fields as a post-process. 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < categories_.size(); ++i) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Category* category = categories_[i]; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (category->type() == Category::CATEGORY_KIND) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kind_ = GetEntryKindFromTerm(category->term()); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (category->type() == Category::CATEGORY_LABEL) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels_.push_back(category->label()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ResourceEntry> ResourceEntry::ExtractAndParse( 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* as_dict = NULL; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* entry_dict = NULL; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.GetAsDictionary(&as_dict) && 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) as_dict->GetDictionary(kEntryField, &entry_dict)) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ResourceEntry::CreateFrom(*entry_dict); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<ResourceEntry>(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ResourceEntry> ResourceEntry::CreateFrom(const base::Value& value) { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<ResourceEntry> converter; 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceEntry> entry(new ResourceEntry()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!converter.Convert(value, entry.get())) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Invalid resource entry!"; 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<ResourceEntry>(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->FillRemainingFields(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return entry.Pass(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ResourceEntry::GetEntryNodeName() { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kEntryNode; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ResourceList implementation 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceList::ResourceList() 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : start_index_(0), 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items_per_page_(0), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) largest_changestamp_(0) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceList::~ResourceList() { 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceList::RegisterJSONConverter( 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<ResourceList>* converter) { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inheritance 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommonMetadata::RegisterJSONConverter(converter); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(zelidrag): Once we figure out where these will be used, we should 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // check for valid start_index_ and items_per_page_ values. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int>( 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kStartIndexField, &ResourceList::start_index_, &base::StringToInt); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int>( 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kItemsPerPageField, &ResourceList::items_per_page_, &base::StringToInt); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterStringField(kTitleTField, &ResourceList::title_); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) converter->RegisterRepeatedMessage(kEntryField, &ResourceList::entries_); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int64>( 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kLargestChangestampField, &ResourceList::largest_changestamp_, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &base::StringToInt64); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceList::Parse(const base::Value& value) { 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<ResourceList> converter; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!converter.Convert(value, this)) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Invalid resource list!"; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<ResourceEntry>::iterator iter = entries_.begin(); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (iter != entries_.end()) { 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceEntry* entry = (*iter); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->FillRemainingFields(); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ResourceList> ResourceList::ExtractAndParse( 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* as_dict = NULL; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* feed_dict = NULL; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.GetAsDictionary(&as_dict) && 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) as_dict->GetDictionary(kFeedField, &feed_dict)) { 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ResourceList::CreateFrom(*feed_dict); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return scoped_ptr<ResourceList>(); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<ResourceList> ResourceList::CreateFrom(const base::Value& value) { 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ResourceList> feed(new ResourceList()); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!feed->Parse(value)) { 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Invalid resource list!"; 7247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return scoped_ptr<ResourceList>(); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return feed.Pass(); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceList::GetNextFeedURL(GURL* url) const { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(url); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < links_.size(); ++i) { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (links_[i]->type() == Link::LINK_NEXT) { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *url = links_[i]->href(); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceList::ReleaseEntries(std::vector<ResourceEntry*>* entries) { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries_.release(entries); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InstalledApp implementation 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstalledApp::InstalledApp() : supports_create_(false) { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstalledApp::~InstalledApp() { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstalledApp::IconList InstalledApp::GetIconsForCategory( 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppIcon::IconCategory category) const { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconList result; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<AppIcon>::const_iterator icon_iter = app_icons_.begin(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_iter != app_icons_.end(); ++icon_iter) { 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*icon_iter)->category() != category) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url = (*icon_iter)->GetIconURL(); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon_url.is_empty()) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.push_back(std::make_pair((*icon_iter)->icon_side_length(), 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_url)); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return a sorted list, smallest to largest. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(result.begin(), result.end(), SortBySize); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL InstalledApp::GetProductUrl() const { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ScopedVector<Link>::const_iterator it = links_.begin(); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != links_.end(); ++it) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Link* link = *it; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (link->type() == Link::LINK_PRODUCT) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return link->href(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InstalledApp::GetValueString(const base::Value* value, 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* result) { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* dict = NULL; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value->GetAsDictionary(&dict)) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict->GetString(kTField, result)) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InstalledApp::RegisterJSONConverter( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONValueConverter<InstalledApp>* converter) { 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedMessage(kInstalledAppIconField, 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::app_icons_); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kInstalledAppIdField, 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::app_id_); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kInstalledAppNameField, 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::app_name_); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterStringField(kInstalledAppObjectTypeField, 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::object_type_); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<bool>(kInstalledAppSupportsCreateField, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::supports_create_, 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetBoolFromString); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedCustomValue(kInstalledAppPrimaryMimeTypeField, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::primary_mimetypes_, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetValueString); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedCustomValue(kInstalledAppSecondaryMimeTypeField, 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::secondary_mimetypes_, 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetValueString); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedCustomValue(kInstalledAppPrimaryFileExtensionField, 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::primary_extensions_, 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetValueString); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedCustomValue( 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInstalledAppSecondaryFileExtensionField, 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &InstalledApp::secondary_extensions_, 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetValueString); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedMessage(kLinkField, &InstalledApp::links_); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AccountMetadata implementation 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccountMetadata::AccountMetadata() 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : quota_bytes_total_(0), 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quota_bytes_used_(0), 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) largest_changestamp_(0) { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AccountMetadata::~AccountMetadata() { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccountMetadata::RegisterJSONConverter( 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<AccountMetadata>* converter) { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int64>( 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kQuotaBytesTotalField, 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &AccountMetadata::quota_bytes_total_, 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &base::StringToInt64); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int64>( 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kQuotaBytesUsedField, 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &AccountMetadata::quota_bytes_used_, 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &base::StringToInt64); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterCustomField<int64>( 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLargestChangestampField, 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &AccountMetadata::largest_changestamp_, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &base::StringToInt64); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) converter->RegisterRepeatedMessage(kInstalledAppField, 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &AccountMetadata::installed_apps_); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<AccountMetadata> AccountMetadata::CreateFrom( 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<AccountMetadata> metadata(new AccountMetadata()); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* dictionary = NULL; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* entry = NULL; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.GetAsDictionary(&dictionary) || 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !dictionary->Get(kEntryField, &entry) || 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !metadata->Parse(*entry)) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unable to create: Invalid account metadata feed!"; 8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return scoped_ptr<AccountMetadata>(); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata.Pass(); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AccountMetadata::Parse(const base::Value& value) { 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::JSONValueConverter<AccountMetadata> converter; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!converter.Convert(value, this)) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unable to parse: Invalid account metadata feed!"; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google_apis 884