// 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.
//
// Protocol buffer definitions for representing Drive files and directories,
// and serializing them for the resource metadata database.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package drive;

// Represents base::PlatformFileInfo.
message PlatformFileInfoProto {
  optional int64 size = 1;
  optional bool is_directory = 2;
  optional bool is_symbolic_link = 3;
  optional int64 last_modified = 4;
  optional int64 last_accessed = 5;
  optional int64 creation_time = 6;
}

// File specific info, which is a part of ResourceEntry.
message FileSpecificInfo {
  // This URL points to a thumbnail image. The thumbnail URL is not permanent
  // as it's not protected by authentication. See crbug.com/127697 for how
  // stale thumbnail URLs are handled.
  optional string thumbnail_url = 1;

  // This URL is used for opening hosted documents with Google Drive's web
  // interface.
  optional string alternate_url = 2;

  // Content mime type like "text/plain".
  optional string content_mime_type = 3;

  // The MD5 of contents of a regular file. Hosted files don't have MD5.
  optional string md5 = 4;

  // File extension, including the dot, used for hosted documents
  // (ex. ".gsheet" for hosted spreadsheets).
  optional string document_extension = 5;

  // True if the file is a hosted document (i.e. document hosted on
  // drive.google.com such as documents, spreadsheets, and presentations).
  optional bool is_hosted_document = 6;

  // The argument with ID 7 had been used, but got deleted. Next ID to use: 8.
}

// Directory specific info, which is a part of ResourceEntry.
message DirectorySpecificInfo {
  // The changestamp of this directory. This value can be larger than the
  // changestamp of ResourceMetadata, if this directory was
  // "fast-fetched". See crbug.com/178348 for details about the "fast-fetch"
  // feature.
  optional int64 changestamp = 1;
}

// Represents metadata of a resource (file or directory) on Drive.
message ResourceEntry {
  optional PlatformFileInfoProto file_info = 1;
  // Base name of the entry. The base name is used for file paths. Usually
  // identical to |title|, but some extra number is inserted if multiple
  // entries with the same title exist in the same directory, to ensure that
  // file paths are unique. For instance, if two files titled "foo.jpg" exist
  // in the same directory, which is allowed on drive.google.com, one of them
  // will have a base name of "foo (2).jpg".
  optional string base_name = 2;

  // Title of the entry. See the comment at |base_name|.
  optional string title = 3;

  // Resource ID of the entry. Guaranteed to be unique.
  optional string resource_id = 4;

  // Local ID of the parent entry.
  optional string parent_local_id = 7;

  // This field is used for processing the change list from the
  // server. Deleted entries won't be stored in ResourceMetadata.
  optional bool deleted = 11;

  // True if the entry is labeled with "shared-with-me".
  optional bool shared_with_me = 14;

  // File specific information, such as MD5.
  optional FileSpecificInfo file_specific_info = 9;

  // Directory specific information, such as changestamp.
  optional DirectorySpecificInfo directory_specific_info = 13;
}

// Container for the header part of ResourceMetadata.
message ResourceMetadataHeader {
  // Monotonically increasing version number, which is changed when
  // incompatible change is made to the DB format. kDBVersion in
  // drive_resource_metadata_storage.h defines the current version.
  optional int32 version = 1;
  optional int64 largest_changestamp = 2;
}

// Message to store information of an existing cache file.
message FileCacheEntry {
  // MD5 of the cache file.
  optional string md5 = 1;

  // True if the file is present locally.
  optional bool is_present = 2;

  // True if the file is pinned (i.e. available offline).
  optional bool is_pinned = 3;

  // True if the file is dirty (i.e. modified locally).
  optional bool is_dirty = 4;

  // When adding a new state, be sure to update TestFileCacheState and test
  // functions defined in test_util.cc.
}
