// Copyright 2015 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.

// TODO(vtl): notes to self:
//  - file offsets, file positions, and file sizes are int64 (though positions
//    and sizes must always be non-negative)
//  - buffer size parameters (for read/write) are uint32

[DartPackage="mojo_services"]
module mojo.files;

import "files/interfaces/types.mojom";

// TODO(vtl): Write comments.
interface File {
  // Flushes/closes this file; no operations may be performed on this file after
  // this. Note that any error code is strictly informational -- the close may
  // not be retried.
  Close() => (Error err);

  // Reads (at most) |num_bytes_to_read| from the location specified by
  // |offset|/|whence|. On success, |bytes_read| is set to the data read.
  // TODO(vtl): Define/clarify behavior when less than |num_bytes_to_read| bytes
  // are read.
  // TODO(vtl): Clarify when (for what values of |offset|/|whence|) this
  // modifies the file position. Or maybe there should be a flag?
  Read(uint32 num_bytes_to_read, int64 offset, Whence whence)
      => (Error error, array<uint8>? bytes_read);

  // Writes |bytes_to_write| to the location specified by |offset|/|whence|.
  // TODO(vtl): Clarify behavior when |num_bytes_written| is less than the size
  // of |bytes_to_write|.
  Write(array<uint8> bytes_to_write, int64 offset, Whence whence)
      => (Error error, uint32 num_bytes_written);

  // TODO(vtl): We definitely want 64 bits for |num_bytes_to_read|; but do we
  // want it to be signed (this is consistent with |size| values, but
  // inconsistent with 32-bit |num_bytes_to_read| values)? Do we want to have
  // separate "read to end" versus "tail" (i.e., keep on reading as more data is
  // appended) modes, and how would those be signaled?
  ReadToStream(handle<data_pipe_producer> source,
               int64 offset,
               Whence whence,
               int64 num_bytes_to_read) => (Error error);
  WriteFromStream(handle<data_pipe_consumer> sink, int64 offset, Whence whence)
      => (Error error);

  // Gets the current file position. On success, |position| is the current
  // offset (in bytes) from the beginning of the file).
  Tell() => (Error error, int64 position);

  // Sets the current file position to that specified by |offset|/|whence|. On
  // success, |position| is the offset (in bytes) from the beginning of the
  // file.
  Seek(int64 offset, Whence whence) => (Error error, int64 position);

  // Gets information about this file. On success, |file_information| is
  // non-null and will contain this information.
  Stat() => (Error error, FileInformation? file_information);

  // Truncates this file to the size specified by |size| (in bytes).
  Truncate(int64 size) => (Error error);

  // Updates this file's atime and/or mtime to the time specified by |atime| (or
  // |mtime|, respectively), which may also indicate "now". If |atime| or
  // |mtime| is null, then the corresponding time is not modified.
  Touch(TimespecOrNow? atime, TimespecOrNow? mtime) => (Error error);

  // Creates a new |File| instance, which shares the same "file description".
  // I.e., the access mode, etc. (as specified to |Directory::OpenFile()| by the
  // |open_flags| argument) as well as file position.
  Dup(File& file) => (Error error);

  // TODO(vtl): What are the rules for reopening (w.r.t. changing mode/flags).
  // E.g., obviously can go from "read-write" to "read", but reverse? (probably
  // not), can remove "append"? (probably not?). Do we allow "truncate"?
  Reopen(File& file, uint32 open_flags) => (Error error);

  // TODO(vtl): probably should have access flags (but also exec?); how do these
  // relate to access mode?
  AsBuffer() => (Error error, handle<shared_buffer>? buffer);

  // Special-file-specific control function, for device "files". |in| and |out|
  // are dependent on |request|. See ioctl.mojom for the master list of request
  // values.
  Ioctl(uint32 request, array<uint32>? in_values)
      => (Error error, array<uint32>? out_values);

  // TODO(vtl): Add a "watch"?
  // TODO(vtl): Add something analogous to fsync(2)?
};
