drive_backend_util.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
16e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org// Copyright 2013 The Chromium Authors. All rights reserved.
26e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org// Use of this source code is governed by a BSD-style license that can be
36e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org// found in the LICENSE file.
46e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
56e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
66e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
76e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include <string>
86e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
96e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "base/logging.h"
106e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "base/memory/scoped_vector.h"
116e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "base/strings/string_number_conversions.h"
126e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/drive/drive_api_util.h"
136e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/google_apis/drive_api_parser.h"
146e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/google_apis/gdata_wapi_parser.h"
156e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
166e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
176e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
186e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
196e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgnamespace sync_file_system {
206e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgnamespace drive_backend {
216e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
226e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgvoid PutServiceMetadataToBatch(const ServiceMetadata& service_metadata,
236e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org                               leveldb::WriteBatch* batch) {
246e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  std::string value;
256e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  bool success = service_metadata.SerializeToString(&value);
266e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  DCHECK(success);
276e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  batch->Put(kServiceMetadataKey, value);
286e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org}
296e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
306e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgvoid PutFileToBatch(const FileMetadata& file, leveldb::WriteBatch* batch) {
316e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  std::string value;
326e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  bool success = file.SerializeToString(&value);
336e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  DCHECK(success);
346e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  batch->Put(kFileMetadataKeyPrefix + file.file_id(), value);
356e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org}
366e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
376e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgvoid PutTrackerToBatch(const FileTracker& tracker, leveldb::WriteBatch* batch) {
386e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  std::string value;
396e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  bool success = tracker.SerializeToString(&value);
406e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  DCHECK(success);
416e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org  batch->Put(kFileTrackerKeyPrefix + base::Int64ToString(tracker.tracker_id()),
426e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org             value);
436e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org}
446e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org
456e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.orgvoid PopulateFileDetailsByFileResource(
466e34ceb97c11f4d390742a8364e77a65b8a01200henrike@webrtc.org    const google_apis::FileResource& file_resource,
47    FileDetails* details) {
48  details->clear_parent_folder_ids();
49  for (ScopedVector<google_apis::ParentReference>::const_iterator itr =
50           file_resource.parents().begin();
51       itr != file_resource.parents().end();
52       ++itr) {
53    details->add_parent_folder_ids((*itr)->file_id());
54  }
55  details->set_title(file_resource.title());
56
57  google_apis::DriveEntryKind kind = drive::util::GetKind(file_resource);
58  if (kind == google_apis::ENTRY_KIND_FILE)
59    details->set_file_kind(FILE_KIND_FILE);
60  else if (kind == google_apis::ENTRY_KIND_FOLDER)
61    details->set_file_kind(FILE_KIND_FOLDER);
62  else
63    details->set_file_kind(FILE_KIND_UNSUPPORTED);
64
65  details->set_md5(file_resource.md5_checksum());
66  details->set_etag(file_resource.etag());
67  details->set_creation_time(file_resource.created_date().ToInternalValue());
68  details->set_modification_time(
69      file_resource.modified_date().ToInternalValue());
70  details->set_deleted(false);
71}
72
73scoped_ptr<FileMetadata> CreateFileMetadataFromFileResource(
74    int64 change_id,
75    const google_apis::FileResource& resource) {
76  scoped_ptr<FileMetadata> file(new FileMetadata);
77  file->set_file_id(resource.file_id());
78
79  FileDetails* details = file->mutable_details();
80  details->set_change_id(change_id);
81
82  if (resource.labels().is_trashed()) {
83    details->set_deleted(true);
84    return file.Pass();
85  }
86
87  PopulateFileDetailsByFileResource(resource, details);
88  return file.Pass();
89}
90
91scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource(
92    const google_apis::ChangeResource& change) {
93  scoped_ptr<FileMetadata> file(new FileMetadata);
94  file->set_file_id(change.file_id());
95
96  FileDetails* details = file->mutable_details();
97  details->set_change_id(change.change_id());
98
99  if (change.is_deleted()) {
100    details->set_deleted(true);
101    return file.Pass();
102  }
103
104  PopulateFileDetailsByFileResource(*change.file(), details);
105  return file.Pass();
106}
107
108}  // namespace drive_backend
109}  // namespace sync_file_system
110