15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/google_apis/drive_api_parser.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_value_converter.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/gdata_wapi_parser.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/time_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Value;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::DictionaryValue;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::ListValue;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google_apis {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool CreateFileResourceFromValue(const base::Value* value,
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 scoped_ptr<FileResource>* file) {
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  *file = FileResource::CreateFrom(*value);
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return !!*file;
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts |url_string| to |result|.  Always returns true to be used
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for JSONValueConverter::RegisterCustomField method.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mukai): make it return false in case of invalid |url_string|.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetGURLFromString(const base::StringPiece& url_string, GURL* result) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = GURL(url_string.as_string());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Converts |value| to |result|. The key of |value| is app_id, and its value
43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// is URL to open the resource on the web app.
44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool GetOpenWithLinksFromDictionaryValue(
45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const base::Value* value,
46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    std::vector<FileResource::OpenWithLink>* result) {
47a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK(value);
48a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK(result);
49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
50a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const base::DictionaryValue* dictionary_value;
51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!value->GetAsDictionary(&dictionary_value))
52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return false;
53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  result->reserve(dictionary_value->size());
55a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  for (DictionaryValue::Iterator iter(*dictionary_value);
56a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       !iter.IsAtEnd(); iter.Advance()) {
57a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    std::string string_value;
58a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!iter.value().GetAsString(&string_value))
59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return false;
60a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
61a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    FileResource::OpenWithLink open_with_link;
62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    open_with_link.app_id = iter.key();
63a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    open_with_link.open_url = GURL(string_value);
64a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    result->push_back(open_with_link);
65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return true;
68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drive v2 API JSON names.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Definition order follows the order of documentation in
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKind[] = "kind";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kId[] = "id";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kETag[] = "etag";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSelfLink[] = "selfLink";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kItems[] = "items";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLargestChangeId[] = "largestChangeId";
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// About Resource
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/about
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAboutKind[] = "drive#about";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kQuotaBytesTotal[] = "quotaBytesTotal";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kQuotaBytesUsed[] = "quotaBytesUsed";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRootFolderId[] = "rootFolderId";
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// App Icon
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCategory[] = "category";
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSize[] = "size";
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIconUrl[] = "iconUrl";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Apps Resource
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppKind[] = "drive#app";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kName[] = "name";
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kObjectType[] = "objectType";
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSupportsCreate[] = "supportsCreate";
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSupportsImport[] = "supportsImport";
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInstalled[] = "installed";
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAuthorized[] = "authorized";
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductUrl[] = "productUrl";
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrimaryMimeTypes[] = "primaryMimeTypes";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSecondaryMimeTypes[] = "secondaryMimeTypes";
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrimaryFileExtensions[] = "primaryFileExtensions";
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSecondaryFileExtensions[] = "secondaryFileExtensions";
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIcons[] = "icons";
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Apps List
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/apps/list
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppListKind[] = "drive#appList";
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parent Resource
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/parents
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kParentReferenceKind[] = "drive#parentReference";
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kParentLink[] = "parentLink";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kIsRoot[] = "isRoot";
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File Resource
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/files
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileKind[] = "drive#file";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTitle[] = "title";
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMimeType[] = "mimeType";
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kCreatedDate[] = "createdDate";
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kModifiedDate[] = "modifiedDate";
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kModifiedByMeDate[] = "modifiedByMeDate";
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLastViewedByMeDate[] = "lastViewedByMeDate";
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSharedWithMeDate[] = "sharedWithMeDate";
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDownloadUrl[] = "downloadUrl";
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileExtension[] = "fileExtension";
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMd5Checksum[] = "md5Checksum";
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileSize[] = "fileSize";
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAlternateLink[] = "alternateLink";
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEmbedLink[] = "embedLink";
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kParents[] = "parents";
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kThumbnailLink[] = "thumbnailLink";
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWebContentLink[] = "webContentLink";
141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kOpenWithLinks[] = "openWithLinks";
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabels[] = "labels";
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These 5 flags are defined under |labels|.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelStarred[] = "starred";
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelHidden[] = "hidden";
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelTrashed[] = "trashed";
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelRestricted[] = "restricted";
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLabelViewed[] = "viewed";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDriveFolderMimeType[] = "application/vnd.google-apps.folder";
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Files List
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/files/list
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileListKind[] = "drive#fileList";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNextPageToken[] = "nextPageToken";
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNextLink[] = "nextLink";
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change Resource
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/changes
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChangeKind[] = "drive#change";
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFileId[] = "fileId";
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDeleted[] = "deleted";
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFile[] = "file";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Changes List
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://developers.google.com/drive/v2/reference/changes/list
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChangeListKind[] = "drive#changeList";
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google Apps MIME types:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleDocumentMimeType[] = "application/vnd.google-apps.document";
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleDrawingMimeType[] = "application/vnd.google-apps.drawing";
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleFormMimeType[] = "application/vnd.google-apps.form";
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGooglePresentationMimeType[] =
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "application/vnd.google-apps.presentation";
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleScriptMimeType[] = "application/vnd.google-apps.script";
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleSiteMimeType[] = "application/vnd.google-apps.site";
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleSpreadsheetMimeType[] =
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "application/vnd.google-apps.spreadsheet";
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kGoogleTableMimeType[] = "application/vnd.google-apps.table";
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps category name to enum IconCategory.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AppIconCategoryMap {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DriveAppIcon::IconCategory category;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* category_name;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AppIconCategoryMap kAppIconCategoryMap[] = {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { DriveAppIcon::DOCUMENT, "document" },
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { DriveAppIcon::APPLICATION, "application" },
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { DriveAppIcon::SHARED_DOCUMENT, "documentShared" },
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if the JSON is expected kind.  In Drive API, JSON data structure has
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |kind| property which denotes the type of the structure (e.g. "drive#file").
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsResourceKindExpected(const base::Value& value,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& expected_kind) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* as_dict = NULL;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string kind;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value.GetAsDictionary(&as_dict) &&
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      as_dict->HasKey(kKind) &&
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      as_dict->GetString(kKind, &kind) &&
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kind == expected_kind;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedVector<std::string> CopyScopedVectorString(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ScopedVector<std::string>& source) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<std::string> result;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.reserve(source.size());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < source.size(); ++i) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(new std::string(*source[i]));
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result.Pass();
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AboutResource implementation
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AboutResource::AboutResource()
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : largest_change_id_(0),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_bytes_total_(0),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      quota_bytes_used_(0) {}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AboutResource::~AboutResource() {}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<AboutResource> AboutResource::CreateFrom(const base::Value& value) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AboutResource> resource(new AboutResource());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kAboutKind) || !resource->Parse(value)) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid About resource JSON!";
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<AboutResource>();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<AboutResource> AboutResource::CreateFromAccountMetadata(
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AccountMetadata& account_metadata,
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& root_resource_id) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AboutResource> resource(new AboutResource);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_largest_change_id(account_metadata.largest_changestamp());
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_quota_bytes_total(account_metadata.quota_bytes_total());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_quota_bytes_used(account_metadata.quota_bytes_used());
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_root_folder_id(root_resource_id);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return resource.Pass();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AboutResource::RegisterJSONConverter(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<AboutResource>* converter) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kLargestChangeId,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &AboutResource::largest_change_id_,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kQuotaBytesTotal,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &AboutResource::quota_bytes_total_,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kQuotaBytesUsed,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &AboutResource::quota_bytes_used_,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kRootFolderId,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &AboutResource::root_folder_id_);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AboutResource::Parse(const base::Value& value) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<AboutResource> converter;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid About resource JSON!";
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DriveAppIcon implementation
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DriveAppIcon::DriveAppIcon() : category_(UNKNOWN), icon_side_length_(0) {}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DriveAppIcon::~DriveAppIcon() {}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveAppIcon::RegisterJSONConverter(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<DriveAppIcon>* converter) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<IconCategory>(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kCategory,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &DriveAppIcon::category_,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &DriveAppIcon::GetIconCategory);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterIntField(kSize, &DriveAppIcon::icon_side_length_);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kIconUrl,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &DriveAppIcon::icon_url_,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<DriveAppIcon> DriveAppIcon::CreateFrom(const base::Value& value) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DriveAppIcon> resource(new DriveAppIcon());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!resource->Parse(value)) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid DriveAppIcon JSON!";
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<DriveAppIcon>();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DriveAppIcon> DriveAppIcon::CreateFromAppIcon(
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AppIcon& app_icon) {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DriveAppIcon> resource(new DriveAppIcon);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (app_icon.category()) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case AppIcon::ICON_UNKNOWN:
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->set_category(DriveAppIcon::UNKNOWN);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case AppIcon::ICON_DOCUMENT:
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->set_category(DriveAppIcon::DOCUMENT);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case AppIcon::ICON_APPLICATION:
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->set_category(DriveAppIcon::APPLICATION);
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case AppIcon::ICON_SHARED_DOCUMENT:
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource->set_category(DriveAppIcon::SHARED_DOCUMENT);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_icon_side_length(app_icon.icon_side_length());
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_icon_url(app_icon.GetIconURL());
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return resource.Pass();
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DriveAppIcon::Parse(const base::Value& value) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<DriveAppIcon> converter;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid DriveAppIcon";
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DriveAppIcon::GetIconCategory(const base::StringPiece& category,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   DriveAppIcon::IconCategory* result) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kAppIconCategoryMap); i++) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (category == kAppIconCategoryMap[i].category_name) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *result = kAppIconCategoryMap[i].category;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Unknown icon category " << category;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppResource implementation
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppResource::AppResource()
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : supports_create_(false),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      supports_import_(false),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      installed_(false),
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      authorized_(false) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppResource::~AppResource() {}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppResource::RegisterJSONConverter(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<AppResource>* converter) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kId, &AppResource::application_id_);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kName, &AppResource::name_);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kObjectType, &AppResource::object_type_);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kSupportsCreate, &AppResource::supports_create_);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kSupportsImport, &AppResource::supports_import_);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kInstalled, &AppResource::installed_);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kAuthorized, &AppResource::authorized_);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kProductUrl,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &AppResource::product_url_,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedString(kPrimaryMimeTypes,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &AppResource::primary_mimetypes_);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedString(kSecondaryMimeTypes,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &AppResource::secondary_mimetypes_);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedString(kPrimaryFileExtensions,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &AppResource::primary_file_extensions_);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedString(kSecondaryFileExtensions,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &AppResource::secondary_file_extensions_);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedMessage(kIcons, &AppResource::icons_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<AppResource> AppResource::CreateFrom(const base::Value& value) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AppResource> resource(new AppResource());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kAppKind) || !resource->Parse(value)) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid AppResource JSON!";
3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<AppResource>();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<AppResource> AppResource::CreateFromInstalledApp(
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const InstalledApp& installed_app) {
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AppResource> resource(new AppResource);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_application_id(installed_app.app_id());
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_name(installed_app.app_name());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_object_type(installed_app.object_type());
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_supports_create(installed_app.supports_create());
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_product_url(installed_app.GetProductUrl());
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<std::string> primary_mimetypes(
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CopyScopedVectorString(installed_app.primary_mimetypes()));
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource->set_primary_mimetypes(&primary_mimetypes);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<std::string> secondary_mimetypes(
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CopyScopedVectorString(installed_app.secondary_mimetypes()));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource->set_secondary_mimetypes(&secondary_mimetypes);
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<std::string> primary_file_extensions(
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CopyScopedVectorString(installed_app.primary_extensions()));
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource->set_primary_file_extensions(&primary_file_extensions);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<std::string> secondary_file_extensions(
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CopyScopedVectorString(installed_app.secondary_extensions()));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource->set_secondary_file_extensions(&secondary_file_extensions);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ScopedVector<AppIcon>& app_icons = installed_app.app_icons();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<DriveAppIcon> icons;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icons.reserve(app_icons.size());
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < app_icons.size(); ++i) {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      icons.push_back(DriveAppIcon::CreateFromAppIcon(*app_icons[i]).release());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource->set_icons(&icons);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // supports_import, installed and authorized are not supported in
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // InstalledApp.
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return resource.Pass();
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppResource::Parse(const base::Value& value) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<AppResource> converter;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid AppResource";
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AppList implementation
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppList::AppList() {}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppList::~AppList() {}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppList::RegisterJSONConverter(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<AppList>* converter) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kETag, &AppList::etag_);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedMessage<AppResource>(kItems,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &AppList::items_);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<AppList> AppList::CreateFrom(const base::Value& value) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AppList> resource(new AppList());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kAppListKind) || !resource->Parse(value)) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid AppList JSON!";
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<AppList>();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<AppList> AppList::CreateFromAccountMetadata(
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AccountMetadata& account_metadata) {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AppList> resource(new AppList);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ScopedVector<InstalledApp>& installed_apps =
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      account_metadata.installed_apps();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedVector<AppResource> app_resources;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_resources.reserve(installed_apps.size());
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < installed_apps.size(); ++i) {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    app_resources.push_back(
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AppResource::CreateFromInstalledApp(*installed_apps[i]).release());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource->set_items(&app_resources);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // etag is not supported in AccountMetadata.
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return resource.Pass();
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppList::Parse(const base::Value& value) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<AppList> converter;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid AppList";
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ParentReference implementation
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ParentReference::ParentReference() : is_root_(false) {}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ParentReference::~ParentReference() {}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParentReference::RegisterJSONConverter(
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<ParentReference>* converter) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kId, &ParentReference::file_id_);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kParentLink,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &ParentReference::parent_link_,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kIsRoot, &ParentReference::is_root_);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ParentReference>
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ParentReference::CreateFrom(const base::Value& value) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ParentReference> reference(new ParentReference());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kParentReferenceKind) ||
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !reference->Parse(value)) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid ParentRefernce JSON!";
5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<ParentReference>();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reference.Pass();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParentReference::Parse(const base::Value& value) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<ParentReference> converter;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid ParentReference";
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileResource implementation
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileResource::FileResource() : file_size_(0) {}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileResource::~FileResource() {}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileResource::RegisterJSONConverter(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<FileResource>* converter) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kId, &FileResource::file_id_);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kETag, &FileResource::etag_);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kSelfLink,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::self_link_,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kTitle, &FileResource::title_);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kMimeType, &FileResource::mime_type_);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterNestedField(kLabels, &FileResource::labels_);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<base::Time>(
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kCreatedDate,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &FileResource::created_date_,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &util::GetTimeFromString);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<base::Time>(
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kModifiedDate,
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &FileResource::modified_date_,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &util::GetTimeFromString);
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  converter->RegisterCustomField<base::Time>(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kModifiedByMeDate,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &FileResource::modified_by_me_date_,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &util::GetTimeFromString);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<base::Time>(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kLastViewedByMeDate,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &FileResource::last_viewed_by_me_date_,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &util::GetTimeFromString);
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  converter->RegisterCustomField<base::Time>(
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kSharedWithMeDate,
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &FileResource::shared_with_me_date_,
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &util::GetTimeFromString);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kDownloadUrl,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::download_url_,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kFileExtension,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 &FileResource::file_extension_);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kMd5Checksum, &FileResource::md5_checksum_);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kFileSize,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &FileResource::file_size_,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kAlternateLink,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::alternate_link_,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kEmbedLink,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::embed_link_,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedMessage<ParentReference>(kParents,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &FileResource::parents_);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kThumbnailLink,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::thumbnail_link_,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kWebContentLink,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileResource::web_content_link_,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
608a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  converter->RegisterCustomValueField<std::vector<OpenWithLink> >(
609a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      kOpenWithLinks,
610a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      &FileResource::open_with_links_,
611a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetOpenWithLinksFromDictionaryValue);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<FileResource> FileResource::CreateFrom(const base::Value& value) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileResource> resource(new FileResource());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kFileKind) || !resource->Parse(value)) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid FileResource JSON!";
6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<FileResource>();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileResource::IsDirectory() const {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return mime_type_ == kDriveFolderMimeType;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DriveEntryKind FileResource::GetKind() const {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kGoogleDocumentMimeType)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_DOCUMENT;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kGoogleSpreadsheetMimeType)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_SPREADSHEET;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kGooglePresentationMimeType)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_PRESENTATION;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kGoogleDrawingMimeType)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_DRAWING;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kGoogleTableMimeType)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_TABLE;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == kDriveFolderMimeType)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_FOLDER;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mime_type() == "application/pdf")
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ENTRY_KIND_PDF;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ENTRY_KIND_FILE;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileResource::Parse(const base::Value& value) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<FileResource> converter;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid FileResource";
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileList implementation
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileList::FileList() {}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileList::~FileList() {}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileList::RegisterJSONConverter(
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<FileList>* converter) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kETag, &FileList::etag_);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kNextPageToken, &FileList::next_page_token_);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kNextLink,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &FileList::next_link_,
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedMessage<FileResource>(kItems,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &FileList::items_);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FileList::HasFileListKind(const base::Value& value) {
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return IsResourceKindExpected(value, kFileListKind);
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<FileList> FileList::CreateFrom(const base::Value& value) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileList> resource(new FileList());
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!HasFileListKind(value) || !resource->Parse(value)) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid FileList JSON!";
6847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<FileList>();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileList::Parse(const base::Value& value) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<FileList> converter;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid FileList";
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChangeResource implementation
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChangeResource::ChangeResource() : change_id_(0), deleted_(false) {}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChangeResource::~ChangeResource() {}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeResource::RegisterJSONConverter(
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<ChangeResource>* converter) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kId,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &ChangeResource::change_id_,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kFileId, &ChangeResource::file_id_);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kDeleted, &ChangeResource::deleted_);
7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  converter->RegisterCustomValueField(kFile, &ChangeResource::file_,
7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      &CreateFileResourceFromValue);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ChangeResource>
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChangeResource::CreateFrom(const base::Value& value) {
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ChangeResource> resource(new ChangeResource());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsResourceKindExpected(value, kChangeKind) || !resource->Parse(value)) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid ChangeResource JSON!";
7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<ChangeResource>();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChangeResource::Parse(const base::Value& value) {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<ChangeResource> converter;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid ChangeResource";
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChangeList implementation
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChangeList::ChangeList() : largest_change_id_(0) {}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChangeList::~ChangeList() {}
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChangeList::RegisterJSONConverter(
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<ChangeList>* converter) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kETag, &ChangeList::etag_);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterStringField(kNextPageToken, &ChangeList::next_page_token_);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<GURL>(kNextLink,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       &ChangeList::next_link_,
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetGURLFromString);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterCustomField<int64>(kLargestChangeId,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &ChangeList::largest_change_id_,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        &base::StringToInt64);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterRepeatedMessage<ChangeResource>(kItems,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     &ChangeList::items_);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ChangeList::HasChangeListKind(const base::Value& value) {
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return IsResourceKindExpected(value, kChangeListKind);
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ChangeList> ChangeList::CreateFrom(const base::Value& value) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ChangeList> resource(new ChangeList());
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!HasChangeListKind(value) || !resource->Parse(value)) {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid ChangeList JSON!";
7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<ChangeList>();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChangeList::Parse(const base::Value& value) {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<ChangeList> converter;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid ChangeList";
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FileLabels implementation
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileLabels::FileLabels()
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : starred_(false),
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hidden_(false),
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trashed_(false),
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restricted_(false),
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      viewed_(false) {}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileLabels::~FileLabels() {}
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FileLabels::RegisterJSONConverter(
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::JSONValueConverter<FileLabels>* converter) {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kLabelStarred, &FileLabels::starred_);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kLabelHidden, &FileLabels::hidden_);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kLabelTrashed, &FileLabels::trashed_);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kLabelRestricted, &FileLabels::restricted_);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  converter->RegisterBoolField(kLabelViewed, &FileLabels::viewed_);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<FileLabels> FileLabels::CreateFrom(const base::Value& value) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileLabels> resource(new FileLabels());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!resource->Parse(value)) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to create: Invalid FileLabels JSON!";
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scoped_ptr<FileLabels>();
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return resource.Pass();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileLabels::Parse(const base::Value& value) {
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONValueConverter<FileLabels> converter;
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!converter.Convert(value, this)) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unable to parse: Invalid FileLabels";
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google_apis
826