Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/chromeos/gdata/drive_api_parser.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/basictypes.h" | |
| 10 #include "base/file_path.h" | |
| 11 #include "base/json/json_value_converter.h" | |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 #include "base/string_number_conversions.h" | |
| 14 #include "base/string_piece.h" | |
| 15 #include "base/string_util.h" | |
| 16 #include "base/values.h" | |
| 17 #include "chrome/browser/chromeos/gdata/gdata_util.h" | |
| 18 | |
| 19 using base::Value; | |
| 20 using base::DictionaryValue; | |
| 21 using base::ListValue; | |
| 22 | |
| 23 namespace { | |
| 24 | |
| 25 // Converts |url_string| to |result|. Always returns true to be used | |
| 26 // for JSONValueConverter::RegisterCustomField method. | |
| 27 // TODO(mukai): make it return false in case of invalid |url_string|. | |
| 28 bool GetGURLFromString(const base::StringPiece& url_string, GURL* result) { | |
| 29 *result = GURL(url_string.as_string()); | |
| 30 return true; | |
| 31 } | |
| 32 | |
| 33 // Drive v2 API JSON names. | |
| 34 | |
| 35 // Common | |
| 36 const char kKind[] = "kind"; | |
| 37 | |
| 38 // About Resource: | |
| 39 const char kAboutKind[] = "drive#about"; | |
| 40 const char kRootFolderId[] = "rootFolderId"; | |
| 41 const char kQuotaBytesTotal[] = "quotaBytesTotal"; | |
| 42 const char kQuotaBytesUsed[] = "quotaBytesUsed"; | |
| 43 const char kLargestChangeId[] = "largestChangeId"; | |
| 44 | |
| 45 // App Icon: | |
| 46 const char kCategory[] = "category"; | |
| 47 const char kSize[] = "size"; | |
| 48 const char kIconUrl[] = "iconUrl"; | |
| 49 | |
| 50 // Apps Resource: | |
| 51 const char kAppKind[] = "drive#app"; | |
| 52 const char kId[] = "id"; | |
| 53 const char kETag[] = "etag"; | |
| 54 const char kName[] = "name"; | |
| 55 const char kObjectType[] = "objectType"; | |
| 56 const char kSupportsCreate[] = "supportsCreate"; | |
| 57 const char kSupportsImport[] = "supportsImport"; | |
| 58 const char kInstalled[] = "installed"; | |
| 59 const char kAuthorized[] = "authorized"; | |
| 60 const char kProductUrl[] = "productUrl"; | |
| 61 const char kPrimaryMimeTypes[] = "primaryMimeTypes"; | |
| 62 const char kSecondaryMimeTypes[] = "secondaryMimeTypes"; | |
| 63 const char kPrimaryFileExtensions[] = "primaryFileExtensions"; | |
| 64 const char kSecondaryFileExtensions[] = "secondaryFileExtensions"; | |
| 65 const char kIcons[] = "icons"; | |
| 66 | |
| 67 // Apps List: | |
| 68 const char kAppListKind[] = "drive#appList"; | |
| 69 const char kItems[] = "items"; | |
| 70 | |
| 71 | |
| 72 // Maps category name to enum IconCategory. | |
| 73 struct AppIconCategoryMap { | |
| 74 gdata::DriveAppIcon::IconCategory category; | |
| 75 const char* category_name; | |
| 76 }; | |
| 77 | |
| 78 const AppIconCategoryMap kAppIconCategoryMap[] = { | |
| 79 { gdata::DriveAppIcon::DOCUMENT, "document" }, | |
| 80 { gdata::DriveAppIcon::APPLICATION, "application" }, | |
| 81 { gdata::DriveAppIcon::SHARED_DOCUMENT, "documentShared" }, | |
| 82 }; | |
| 83 | |
| 84 // Checks if the JSON is expected kind. In Drive API, JSON data structure has | |
| 85 // |kind| property which denotes the type of the structure (e.g. "drive#file"). | |
| 86 bool CheckResourceKind(const base::Value& value, | |
|
satorux1
2012/07/25 19:39:57
maybe HasResourceKind() is a bit better?
kochi
2012/07/26 02:16:10
As it checks against expected value, renamed to Is
| |
| 87 const std::string& expected_kind) { | |
| 88 const base::DictionaryValue* as_dict = NULL; | |
| 89 std::string kind; | |
| 90 return value.GetAsDictionary(&as_dict) && | |
| 91 as_dict->HasKey(kKind) && | |
| 92 as_dict->GetString(kKind, &kind) && | |
| 93 kind == expected_kind; | |
| 94 } | |
| 95 | |
| 96 } // namespace | |
| 97 | |
| 98 // TODO(kochi): Rename to namespace drive. http://crbug.com/136371 | |
| 99 namespace gdata { | |
| 100 | |
| 101 //////////////////////////////////////////////////////////////////////////////// | |
| 102 // AboutResource implementation | |
| 103 | |
| 104 AboutResource::AboutResource() | |
| 105 : quota_bytes_total_(0), | |
| 106 quota_bytes_used_(0), | |
| 107 largest_change_id_(0) {} | |
| 108 | |
| 109 AboutResource::~AboutResource() {} | |
| 110 | |
| 111 // static | |
| 112 scoped_ptr<AboutResource> AboutResource::CreateFrom(const base::Value& value) { | |
| 113 scoped_ptr<AboutResource> resource(new AboutResource()); | |
| 114 if (!CheckResourceKind(value, kAboutKind) || !resource->Parse(value)) { | |
| 115 LOG(ERROR) << "Unable to create: Invalid About resource JSON!"; | |
| 116 return scoped_ptr<AboutResource>(NULL); | |
| 117 } | |
| 118 return resource.Pass(); | |
| 119 } | |
| 120 | |
| 121 // static | |
| 122 void AboutResource::RegisterJSONConverter( | |
| 123 base::JSONValueConverter<AboutResource>* converter) { | |
| 124 converter->RegisterStringField(kRootFolderId, | |
| 125 &AboutResource::root_folder_id_); | |
| 126 converter->RegisterCustomField<int64>(kQuotaBytesTotal, | |
| 127 &AboutResource::quota_bytes_total_, | |
| 128 &base::StringToInt64); | |
| 129 converter->RegisterCustomField<int64>(kQuotaBytesUsed, | |
| 130 &AboutResource::quota_bytes_used_, | |
| 131 &base::StringToInt64); | |
| 132 converter->RegisterCustomField<int64>(kLargestChangeId, | |
| 133 &AboutResource::largest_change_id_, | |
| 134 &base::StringToInt64); | |
| 135 } | |
| 136 | |
| 137 bool AboutResource::Parse(const base::Value& value) { | |
| 138 base::JSONValueConverter<AboutResource> converter; | |
| 139 if (!converter.Convert(value, this)) { | |
| 140 LOG(ERROR) << "Unable to parse: Invalid About resource JSON!"; | |
| 141 return false; | |
| 142 } | |
| 143 return true; | |
| 144 } | |
| 145 | |
| 146 //////////////////////////////////////////////////////////////////////////////// | |
| 147 // DriveAppIcon implementation | |
| 148 | |
| 149 DriveAppIcon::DriveAppIcon() {} | |
| 150 | |
| 151 DriveAppIcon::~DriveAppIcon() {} | |
| 152 | |
| 153 // static | |
| 154 void DriveAppIcon::RegisterJSONConverter( | |
| 155 base::JSONValueConverter<DriveAppIcon>* converter) { | |
| 156 converter->RegisterCustomField<IconCategory>( | |
| 157 kCategory, | |
| 158 &DriveAppIcon::category_, | |
| 159 &DriveAppIcon::GetIconCategory); | |
| 160 converter->RegisterIntField(kSize, &DriveAppIcon::icon_side_length_); | |
| 161 converter->RegisterCustomField<GURL>(kIconUrl, | |
| 162 &DriveAppIcon::icon_url_, | |
| 163 GetGURLFromString); | |
| 164 } | |
| 165 | |
| 166 // static | |
| 167 scoped_ptr<DriveAppIcon> DriveAppIcon::CreateFrom(const base::Value& value) { | |
| 168 scoped_ptr<DriveAppIcon> resource(new DriveAppIcon()); | |
| 169 if (!resource->Parse(value)) { | |
| 170 LOG(ERROR) << "Unable to create: Invalid DriveAppIcon JSON!"; | |
| 171 return scoped_ptr<DriveAppIcon>(NULL); | |
| 172 } | |
| 173 return resource.Pass(); | |
| 174 } | |
| 175 | |
| 176 bool DriveAppIcon::Parse(const base::Value& value) { | |
| 177 base::JSONValueConverter<DriveAppIcon> converter; | |
| 178 if (!converter.Convert(value, this)) { | |
| 179 LOG(ERROR) << "Unable to parse: Invalid DriveAppIcon"; | |
| 180 return false; | |
| 181 } | |
| 182 return true; | |
| 183 } | |
| 184 | |
| 185 // static | |
| 186 bool DriveAppIcon::GetIconCategory(const base::StringPiece& category, | |
| 187 DriveAppIcon::IconCategory* result) { | |
| 188 for (size_t i = 0; i < arraysize(kAppIconCategoryMap); i++) { | |
| 189 if (category == kAppIconCategoryMap[i].category_name) { | |
| 190 *result = kAppIconCategoryMap[i].category; | |
| 191 return true; | |
| 192 } | |
| 193 } | |
| 194 DVLOG(1) << "Unknown icon category " << category; | |
| 195 return false; | |
| 196 } | |
| 197 | |
| 198 //////////////////////////////////////////////////////////////////////////////// | |
| 199 // AppResource implementation | |
| 200 | |
| 201 AppResource::AppResource() {} | |
| 202 | |
| 203 AppResource::~AppResource() {} | |
| 204 | |
| 205 // static | |
| 206 void AppResource::RegisterJSONConverter( | |
| 207 base::JSONValueConverter<AppResource>* converter) { | |
| 208 converter->RegisterStringField(kId, &AppResource::id_); | |
| 209 converter->RegisterStringField(kName, &AppResource::name_); | |
| 210 converter->RegisterStringField(kObjectType, &AppResource::object_type_); | |
| 211 converter->RegisterBoolField(kSupportsCreate, &AppResource::supports_create_); | |
| 212 converter->RegisterBoolField(kSupportsImport, &AppResource::supports_import_); | |
| 213 converter->RegisterBoolField(kInstalled, &AppResource::installed_); | |
| 214 converter->RegisterBoolField(kAuthorized, &AppResource::authorized_); | |
| 215 converter->RegisterCustomField<GURL>(kProductUrl, | |
| 216 &AppResource::product_url_, | |
| 217 GetGURLFromString); | |
| 218 converter->RegisterRepeatedString(kPrimaryMimeTypes, | |
| 219 &AppResource::primary_mimetypes_); | |
| 220 converter->RegisterRepeatedString(kSecondaryMimeTypes, | |
| 221 &AppResource::secondary_mimetypes_); | |
| 222 converter->RegisterRepeatedString(kPrimaryFileExtensions, | |
| 223 &AppResource::primary_file_extensions_); | |
| 224 converter->RegisterRepeatedString(kSecondaryFileExtensions, | |
| 225 &AppResource::secondary_file_extensions_); | |
| 226 converter->RegisterRepeatedMessage(kIcons, &AppResource::icons_); | |
| 227 } | |
| 228 | |
| 229 // static | |
| 230 scoped_ptr<AppResource> AppResource::CreateFrom(const base::Value& value) { | |
| 231 scoped_ptr<AppResource> resource(new AppResource()); | |
| 232 if (!CheckResourceKind(value, kAppKind) || !resource->Parse(value)) { | |
| 233 LOG(ERROR) << "Unable to create: Invalid AppResource JSON!"; | |
| 234 return scoped_ptr<AppResource>(NULL); | |
| 235 } | |
| 236 return resource.Pass(); | |
| 237 } | |
| 238 | |
| 239 bool AppResource::Parse(const base::Value& value) { | |
| 240 base::JSONValueConverter<AppResource> converter; | |
| 241 if (!converter.Convert(value, this)) { | |
| 242 LOG(ERROR) << "Unable to parse: Invalid AppResource"; | |
| 243 return false; | |
| 244 } | |
| 245 return true; | |
| 246 } | |
| 247 | |
| 248 //////////////////////////////////////////////////////////////////////////////// | |
| 249 // AppList implementation | |
| 250 | |
| 251 AppList::AppList() {} | |
| 252 | |
| 253 AppList::~AppList() {} | |
| 254 | |
| 255 // static | |
| 256 void AppList::RegisterJSONConverter( | |
| 257 base::JSONValueConverter<AppList>* converter) { | |
| 258 converter->RegisterStringField(kETag, &AppList::etag_); | |
| 259 converter->RegisterRepeatedMessage<AppResource>(kItems, | |
| 260 &AppList::items_); | |
| 261 } | |
| 262 | |
| 263 // static | |
| 264 scoped_ptr<AppList> AppList::CreateFrom(const base::Value& value) { | |
| 265 scoped_ptr<AppList> resource(new AppList()); | |
| 266 if (!CheckResourceKind(value, kAppListKind) || !resource->Parse(value)) { | |
| 267 LOG(ERROR) << "Unable to create: Invalid AppList JSON!"; | |
| 268 return scoped_ptr<AppList>(NULL); | |
| 269 } | |
| 270 return resource.Pass(); | |
| 271 } | |
| 272 | |
| 273 bool AppList::Parse(const base::Value& value) { | |
| 274 base::JSONValueConverter<AppList> converter; | |
| 275 if (!converter.Convert(value, this)) { | |
| 276 LOG(ERROR) << "Unable to parse: Invalid AppList"; | |
| 277 return false; | |
| 278 } | |
| 279 return true; | |
| 280 } | |
| 281 | |
| 282 } // namespace gdata | |
| OLD | NEW |