// 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 signalled?
  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)?
};
