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