#include "google_apis/drive/drive_api_parser.h"
-#include <algorithm>
-
#include "base/basictypes.h"
-#include "base/files/file_path.h"
#include "base/json/json_value_converter.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "google_apis/drive/time_util.h"
-using base::Value;
-using base::DictionaryValue;
-using base::ListValue;
-
namespace google_apis {
namespace {
+const int64 kUnsetFileSize = -1;
+
bool CreateFileResourceFromValue(const base::Value* value,
scoped_ptr<FileResource>* file) {
*file = FileResource::CreateFrom(*value);
return true;
}
+// Converts |value| to |result|.
+bool GetParentsFromValue(const base::Value* value,
+ std::vector<ParentReference>* result) {
+ DCHECK(value);
+ DCHECK(result);
+
+ const base::ListValue* list_value = NULL;
+ if (!value->GetAsList(&list_value))
+ return false;
+
+ base::JSONValueConverter<ParentReference> converter;
+ result->resize(list_value->GetSize());
+ for (size_t i = 0; i < list_value->GetSize(); ++i) {
+ const base::Value* parent_value = NULL;
+ if (!list_value->Get(i, &parent_value) ||
+ !converter.Convert(*parent_value, &(*result)[i]))
+ return false;
+ }
+
+ return true;
+}
+
// Converts |value| to |result|. The key of |value| is app_id, and its value
// is URL to open the resource on the web app.
bool GetOpenWithLinksFromDictionaryValue(
return false;
result->reserve(dictionary_value->size());
- for (DictionaryValue::Iterator iter(*dictionary_value);
+ for (base::DictionaryValue::Iterator iter(*dictionary_value);
!iter.IsAtEnd(); iter.Advance()) {
std::string string_value;
if (!iter.value().GetAsString(&string_value))
const char kKind[] = "kind";
const char kId[] = "id";
const char kETag[] = "etag";
-const char kSelfLink[] = "selfLink";
const char kItems[] = "items";
const char kLargestChangeId[] = "largestChangeId";
const char kObjectType[] = "objectType";
const char kProductId[] = "productId";
const char kSupportsCreate[] = "supportsCreate";
-const char kSupportsImport[] = "supportsImport";
-const char kInstalled[] = "installed";
-const char kAuthorized[] = "authorized";
const char kRemovable[] = "removable";
const char kPrimaryMimeTypes[] = "primaryMimeTypes";
const char kSecondaryMimeTypes[] = "secondaryMimeTypes";
// https://developers.google.com/drive/v2/reference/parents
const char kParentReferenceKind[] = "drive#parentReference";
const char kParentLink[] = "parentLink";
-const char kIsRoot[] = "isRoot";
// File Resource
// https://developers.google.com/drive/v2/reference/files
const char kTitle[] = "title";
const char kMimeType[] = "mimeType";
const char kCreatedDate[] = "createdDate";
+const char kModificationDate[] = "modificationDate";
const char kModifiedDate[] = "modifiedDate";
-const char kModifiedByMeDate[] = "modifiedByMeDate";
const char kLastViewedByMeDate[] = "lastViewedByMeDate";
const char kSharedWithMeDate[] = "sharedWithMeDate";
-const char kDownloadUrl[] = "downloadUrl";
-const char kFileExtension[] = "fileExtension";
const char kMd5Checksum[] = "md5Checksum";
const char kFileSize[] = "fileSize";
const char kAlternateLink[] = "alternateLink";
-const char kEmbedLink[] = "embedLink";
const char kParents[] = "parents";
-const char kThumbnailLink[] = "thumbnailLink";
-const char kWebContentLink[] = "webContentLink";
const char kOpenWithLinks[] = "openWithLinks";
const char kLabels[] = "labels";
const char kImageMediaMetadata[] = "imageMediaMetadata";
const char kShared[] = "shared";
// These 5 flags are defined under |labels|.
-const char kLabelStarred[] = "starred";
-const char kLabelHidden[] = "hidden";
const char kLabelTrashed[] = "trashed";
-const char kLabelRestricted[] = "restricted";
-const char kLabelViewed[] = "viewed";
// These 3 flags are defined under |imageMediaMetadata|.
const char kImageMediaMetadataWidth[] = "width";
const char kImageMediaMetadataHeight[] = "height";
// Files List
// https://developers.google.com/drive/v2/reference/files/list
const char kFileListKind[] = "drive#fileList";
-const char kNextPageToken[] = "nextPageToken";
const char kNextLink[] = "nextLink";
// Change Resource
AppResource::AppResource()
: supports_create_(false),
- supports_import_(false),
- installed_(false),
- authorized_(false),
removable_(false) {
}
converter->RegisterStringField(kObjectType, &AppResource::object_type_);
converter->RegisterStringField(kProductId, &AppResource::product_id_);
converter->RegisterBoolField(kSupportsCreate, &AppResource::supports_create_);
- converter->RegisterBoolField(kSupportsImport, &AppResource::supports_import_);
- converter->RegisterBoolField(kInstalled, &AppResource::installed_);
- converter->RegisterBoolField(kAuthorized, &AppResource::authorized_);
converter->RegisterBoolField(kRemovable, &AppResource::removable_);
converter->RegisterRepeatedString(kPrimaryMimeTypes,
&AppResource::primary_mimetypes_);
////////////////////////////////////////////////////////////////////////////////
// ParentReference implementation
-ParentReference::ParentReference() : is_root_(false) {}
+ParentReference::ParentReference() {}
ParentReference::~ParentReference() {}
converter->RegisterCustomField<GURL>(kParentLink,
&ParentReference::parent_link_,
GetGURLFromString);
- converter->RegisterBoolField(kIsRoot, &ParentReference::is_root_);
}
// static
////////////////////////////////////////////////////////////////////////////////
// FileResource implementation
-FileResource::FileResource() : shared_(false), file_size_(0) {}
+FileResource::FileResource() : shared_(false), file_size_(kUnsetFileSize) {}
FileResource::~FileResource() {}
base::JSONValueConverter<FileResource>* converter) {
converter->RegisterStringField(kId, &FileResource::file_id_);
converter->RegisterStringField(kETag, &FileResource::etag_);
- converter->RegisterCustomField<GURL>(kSelfLink,
- &FileResource::self_link_,
- GetGURLFromString);
converter->RegisterStringField(kTitle, &FileResource::title_);
converter->RegisterStringField(kMimeType, &FileResource::mime_type_);
converter->RegisterNestedField(kLabels, &FileResource::labels_);
&FileResource::modified_date_,
&util::GetTimeFromString);
converter->RegisterCustomField<base::Time>(
- kModifiedByMeDate,
- &FileResource::modified_by_me_date_,
- &util::GetTimeFromString);
- converter->RegisterCustomField<base::Time>(
kLastViewedByMeDate,
&FileResource::last_viewed_by_me_date_,
&util::GetTimeFromString);
&FileResource::shared_with_me_date_,
&util::GetTimeFromString);
converter->RegisterBoolField(kShared, &FileResource::shared_);
- converter->RegisterCustomField<GURL>(kDownloadUrl,
- &FileResource::download_url_,
- GetGURLFromString);
- converter->RegisterStringField(kFileExtension,
- &FileResource::file_extension_);
converter->RegisterStringField(kMd5Checksum, &FileResource::md5_checksum_);
converter->RegisterCustomField<int64>(kFileSize,
&FileResource::file_size_,
converter->RegisterCustomField<GURL>(kAlternateLink,
&FileResource::alternate_link_,
GetGURLFromString);
- converter->RegisterCustomField<GURL>(kEmbedLink,
- &FileResource::embed_link_,
- GetGURLFromString);
- converter->RegisterRepeatedMessage<ParentReference>(kParents,
- &FileResource::parents_);
- converter->RegisterCustomField<GURL>(kThumbnailLink,
- &FileResource::thumbnail_link_,
- GetGURLFromString);
- converter->RegisterCustomField<GURL>(kWebContentLink,
- &FileResource::web_content_link_,
- GetGURLFromString);
+ converter->RegisterCustomValueField<std::vector<ParentReference> >(
+ kParents,
+ &FileResource::parents_,
+ GetParentsFromValue);
converter->RegisterCustomValueField<std::vector<OpenWithLink> >(
kOpenWithLinks,
&FileResource::open_with_links_,
return mime_type_ == kDriveFolderMimeType;
}
+bool FileResource::IsHostedDocument() const {
+ // Hosted documents don't have fileSize field set:
+ // https://developers.google.com/drive/v2/reference/files
+ return !IsDirectory() && file_size_ == kUnsetFileSize;
+}
+
bool FileResource::Parse(const base::Value& value) {
base::JSONValueConverter<FileResource> converter;
if (!converter.Convert(value, this)) {
// static
void FileList::RegisterJSONConverter(
base::JSONValueConverter<FileList>* converter) {
- converter->RegisterStringField(kETag, &FileList::etag_);
- converter->RegisterStringField(kNextPageToken, &FileList::next_page_token_);
converter->RegisterCustomField<GURL>(kNextLink,
&FileList::next_link_,
GetGURLFromString);
converter->RegisterBoolField(kDeleted, &ChangeResource::deleted_);
converter->RegisterCustomValueField(kFile, &ChangeResource::file_,
&CreateFileResourceFromValue);
+ converter->RegisterCustomField<base::Time>(
+ kModificationDate, &ChangeResource::modification_date_,
+ &util::GetTimeFromString);
}
// static
// static
void ChangeList::RegisterJSONConverter(
base::JSONValueConverter<ChangeList>* converter) {
- converter->RegisterStringField(kETag, &ChangeList::etag_);
- converter->RegisterStringField(kNextPageToken, &ChangeList::next_page_token_);
converter->RegisterCustomField<GURL>(kNextLink,
&ChangeList::next_link_,
GetGURLFromString);
////////////////////////////////////////////////////////////////////////////////
// FileLabels implementation
-FileLabels::FileLabels()
- : starred_(false),
- hidden_(false),
- trashed_(false),
- restricted_(false),
- viewed_(false) {}
+FileLabels::FileLabels() : trashed_(false) {}
FileLabels::~FileLabels() {}
// static
void FileLabels::RegisterJSONConverter(
base::JSONValueConverter<FileLabels>* converter) {
- converter->RegisterBoolField(kLabelStarred, &FileLabels::starred_);
- converter->RegisterBoolField(kLabelHidden, &FileLabels::hidden_);
converter->RegisterBoolField(kLabelTrashed, &FileLabels::trashed_);
- converter->RegisterBoolField(kLabelRestricted, &FileLabels::restricted_);
- converter->RegisterBoolField(kLabelViewed, &FileLabels::viewed_);
}
// static
}
bool ImageMediaMetadata::Parse(const base::Value& value) {
- return true;
base::JSONValueConverter<ImageMediaMetadata> converter;
if (!converter.Convert(value, this)) {
LOG(ERROR) << "Unable to parse: Invalid ImageMediaMetadata.";