| Index: chrome/browser/chromeos/gdata/drive_api_parser.cc
|
| diff --git a/chrome/browser/chromeos/gdata/drive_api_parser.cc b/chrome/browser/chromeos/gdata/drive_api_parser.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9d62e7f647acdce79819a1d37f9a15545282186d
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/gdata/drive_api_parser.cc
|
| @@ -0,0 +1,282 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/gdata/drive_api_parser.h"
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/file_path.h"
|
| +#include "base/json/json_value_converter.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/string_number_conversions.h"
|
| +#include "base/string_piece.h"
|
| +#include "base/string_util.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/chromeos/gdata/gdata_util.h"
|
| +
|
| +using base::Value;
|
| +using base::DictionaryValue;
|
| +using base::ListValue;
|
| +
|
| +namespace {
|
| +
|
| +// Converts |url_string| to |result|. Always returns true to be used
|
| +// for JSONValueConverter::RegisterCustomField method.
|
| +// TODO(mukai): make it return false in case of invalid |url_string|.
|
| +bool GetGURLFromString(const base::StringPiece& url_string, GURL* result) {
|
| + *result = GURL(url_string.as_string());
|
| + return true;
|
| +}
|
| +
|
| +// Drive v2 API JSON names.
|
| +
|
| +// Common
|
| +const char kKind[] = "kind";
|
| +
|
| +// About Resource:
|
| +const char kAboutKind[] = "drive#about";
|
| +const char kRootFolderId[] = "rootFolderId";
|
| +const char kQuotaBytesTotal[] = "quotaBytesTotal";
|
| +const char kQuotaBytesUsed[] = "quotaBytesUsed";
|
| +const char kLargestChangeId[] = "largestChangeId";
|
| +
|
| +// App Icon
|
| +const char kCategory[] = "category";
|
| +const char kSize[] = "size";
|
| +const char kIconUrl[] = "iconUrl";
|
| +
|
| +// Apps Resource:
|
| +const char kAppKind[] = "drive#app";
|
| +const char kId[] = "id";
|
| +const char kETag[] = "etag";
|
| +const char kName[] = "name";
|
| +const char kObjectType[] = "objectType";
|
| +const char kSupportsCreate[] = "supportsCreate";
|
| +const char kSupportsImport[] = "supportsImport";
|
| +const char kInstalled[] = "installed";
|
| +const char kAuthorized[] = "authorized";
|
| +const char kProductUrl[] = "productUrl";
|
| +const char kPrimaryMimeTypes[] = "primaryMimeTypes";
|
| +const char kSecondaryMimeTypes[] = "secondaryMimeTypes";
|
| +const char kPrimaryFileExtensions[] = "primaryFileExtensions";
|
| +const char kSecondaryFileExtensions[] = "secondaryFileExtensions";
|
| +const char kIcons[] = "icons";
|
| +
|
| +// Apps List:
|
| +const char kAppListKind[] = "drive#appList";
|
| +const char kItems[] = "items";
|
| +
|
| +struct AppIconCategoryMap {
|
| + gdata::DriveAppIcon::IconCategory category;
|
| + const char* category_name;
|
| +};
|
| +
|
| +const AppIconCategoryMap kAppIconCategoryMap[] = {
|
| + { gdata::DriveAppIcon::DOCUMENT, "document" },
|
| + { gdata::DriveAppIcon::APPLICATION, "application" },
|
| + { gdata::DriveAppIcon::SHARED_DOCUMENT, "documentShared" },
|
| +};
|
| +
|
| +bool CheckResourceKind(const base::Value& value,
|
| + const std::string& expected_kind) {
|
| + const base::DictionaryValue* as_dict = NULL;
|
| + std::string kind;
|
| + return value.GetAsDictionary(&as_dict) &&
|
| + as_dict->HasKey(kKind) &&
|
| + as_dict->GetString(kKind, &kind) &&
|
| + kind == expected_kind;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// TODO(kochi): Rename to namespace drive. http://crbug.com/136371
|
| +namespace gdata {
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// AboutResource implementation
|
| +
|
| +AboutResource::AboutResource()
|
| + : quota_bytes_total_(0),
|
| + quota_bytes_used_(0),
|
| + largest_change_id_(0) {}
|
| +
|
| +AboutResource::~AboutResource() {}
|
| +
|
| +// static
|
| +scoped_ptr<AboutResource> AboutResource::CreateFrom(const base::Value& value) {
|
| + scoped_ptr<AboutResource> resource(new AboutResource());
|
| + if (!CheckResourceKind(value, kAboutKind) || !resource->Parse(value)) {
|
| + LOG(ERROR) << "Unable to create: Invalid About resource JSON!";
|
| + return scoped_ptr<AboutResource>(NULL);
|
| + }
|
| + return resource.Pass();
|
| +}
|
| +
|
| +// static
|
| +void AboutResource::RegisterJSONConverter(
|
| + base::JSONValueConverter<AboutResource>* converter) {
|
| + converter->RegisterStringField(kRootFolderId,
|
| + &AboutResource::root_folder_id_);
|
| + converter->RegisterCustomField<int64>(kQuotaBytesTotal,
|
| + &AboutResource::quota_bytes_total_,
|
| + &base::StringToInt64);
|
| + converter->RegisterCustomField<int64>(kQuotaBytesUsed,
|
| + &AboutResource::quota_bytes_used_,
|
| + &base::StringToInt64);
|
| + converter->RegisterCustomField<int64>(kLargestChangeId,
|
| + &AboutResource::largest_change_id_,
|
| + &base::StringToInt64);
|
| +}
|
| +
|
| +bool AboutResource::Parse(const base::Value& value) {
|
| + base::JSONValueConverter<AboutResource> converter;
|
| + if (!converter.Convert(value, this)) {
|
| + LOG(ERROR) << "Unable to parse: Invalid About resource JSON!";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// DriveAppIcon implementation
|
| +
|
| +DriveAppIcon::DriveAppIcon() {
|
| +}
|
| +
|
| +DriveAppIcon::~DriveAppIcon() {
|
| +}
|
| +
|
| +// static
|
| +void DriveAppIcon::RegisterJSONConverter(
|
| + base::JSONValueConverter<DriveAppIcon>* converter) {
|
| + converter->RegisterCustomField<IconCategory>(
|
| + kCategory,
|
| + &DriveAppIcon::category_,
|
| + &DriveAppIcon::GetIconCategory);
|
| + converter->RegisterIntField(kSize, &DriveAppIcon::size_);
|
| + converter->RegisterCustomField<GURL>(kIconUrl,
|
| + &DriveAppIcon::icon_url_,
|
| + GetGURLFromString);
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<DriveAppIcon> DriveAppIcon::CreateFrom(const base::Value& value) {
|
| + scoped_ptr<DriveAppIcon> resource(new DriveAppIcon());
|
| + if (!resource->Parse(value)) {
|
| + LOG(ERROR) << "Unable to create: Invalid DriveAppIcon JSON!";
|
| + return scoped_ptr<DriveAppIcon>(NULL);
|
| + }
|
| + return resource.Pass();
|
| +}
|
| +
|
| +bool DriveAppIcon::Parse(const base::Value& value) {
|
| + base::JSONValueConverter<DriveAppIcon> converter;
|
| + if (!converter.Convert(value, this)) {
|
| + LOG(ERROR) << "Unable to parse: Invalid DriveAppIcon";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +// static
|
| +bool DriveAppIcon::GetIconCategory(const base::StringPiece& category,
|
| + DriveAppIcon::IconCategory* result) {
|
| + for (size_t i = 0; i < arraysize(kAppIconCategoryMap); i++) {
|
| + if (category == kAppIconCategoryMap[i].category_name) {
|
| + *result = kAppIconCategoryMap[i].category;
|
| + return true;
|
| + }
|
| + }
|
| + DVLOG(1) << "Unknown icon category " << category;
|
| + return false;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// AppResource implementation
|
| +
|
| +AppResource::AppResource() {
|
| +}
|
| +
|
| +AppResource::~AppResource() {
|
| +}
|
| +
|
| +// static
|
| +void AppResource::RegisterJSONConverter(
|
| + base::JSONValueConverter<AppResource>* converter) {
|
| + converter->RegisterStringField(kId, &AppResource::id_);
|
| + converter->RegisterStringField(kName, &AppResource::name_);
|
| + converter->RegisterStringField(kObjectType, &AppResource::object_type_);
|
| + converter->RegisterBoolField(kSupportsCreate, &AppResource::supports_create_);
|
| + converter->RegisterBoolField(kSupportsImport, &AppResource::supports_import_);
|
| + converter->RegisterBoolField(kInstalled, &AppResource::installed_);
|
| + converter->RegisterBoolField(kAuthorized, &AppResource::authorized_);
|
| + converter->RegisterCustomField<GURL>(kProductUrl,
|
| + &AppResource::product_url_,
|
| + GetGURLFromString);
|
| + converter->RegisterRepeatedString(kPrimaryMimeTypes,
|
| + &AppResource::primary_mimetypes_);
|
| + converter->RegisterRepeatedString(kSecondaryMimeTypes,
|
| + &AppResource::secondary_mimetypes_);
|
| + converter->RegisterRepeatedString(kPrimaryFileExtensions,
|
| + &AppResource::primary_file_extensions_);
|
| + converter->RegisterRepeatedString(kSecondaryFileExtensions,
|
| + &AppResource::secondary_file_extensions_);
|
| + converter->RegisterRepeatedMessage(kIcons, &AppResource::icons_);
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<AppResource> AppResource::CreateFrom(const base::Value& value) {
|
| + scoped_ptr<AppResource> resource(new AppResource());
|
| + if (!CheckResourceKind(value, kAppKind) || !resource->Parse(value)) {
|
| + LOG(ERROR) << "Unable to create: Invalid AppResource JSON!";
|
| + return scoped_ptr<AppResource>(NULL);
|
| + }
|
| + return resource.Pass();
|
| +}
|
| +
|
| +bool AppResource::Parse(const base::Value& value) {
|
| + base::JSONValueConverter<AppResource> converter;
|
| + if (!converter.Convert(value, this)) {
|
| + LOG(ERROR) << "Unable to parse: Invalid AppResource";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// AppList implementation
|
| +
|
| +AppList::AppList() {}
|
| +
|
| +AppList::~AppList() {}
|
| +
|
| +// static
|
| +void AppList::RegisterJSONConverter(
|
| + base::JSONValueConverter<AppList>* converter) {
|
| + converter->RegisterStringField(kETag, &AppList::etag_);
|
| + converter->RegisterRepeatedMessage<AppResource>(kItems,
|
| + &AppList::items_);
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<AppList> AppList::CreateFrom(const base::Value& value) {
|
| + scoped_ptr<AppList> resource(new AppList());
|
| + if (!CheckResourceKind(value, kAppListKind) || !resource->Parse(value)) {
|
| + LOG(ERROR) << "Unable to create: Invalid AppList JSON!";
|
| + return scoped_ptr<AppList>(NULL);
|
| + }
|
| + return resource.Pass();
|
| +}
|
| +
|
| +bool AppList::Parse(const base::Value& value) {
|
| + base::JSONValueConverter<AppList> converter;
|
| + if (!converter.Convert(value, this)) {
|
| + LOG(ERROR) << "Unable to parse: Invalid AppList";
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace gdata
|
|
|