// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIB_VFS_CPP_INTERNAL_FILE_H_
#define LIB_VFS_CPP_INTERNAL_FILE_H_

#include <fuchsia/io/cpp/fidl.h>
#include <lib/vfs/cpp/internal/node.h>
#include <stdint.h>

#include <vector>

namespace vfs {
namespace internal {

// A file object in a file system.
//
// Implements the |fuchsia.io.File| interface. Incoming connections are
// owned by this object and will be destroyed when this object is destroyed.
//
// Subclass to implement specific file semantics.
//
// See also:
//
//  * Directory, which represents directory objects.
class File : public Node {
 public:
  File();
  ~File() override;

  // Create |count| bytes of data from the file at the given |offset|.
  //
  // The data read should be copied to |out_data|, which should be empty when
  // passed as an argument. When |ReadAt| returns, |out_data| should contain no
  // more than |count| bytes.
  virtual zx_status_t ReadAt(uint64_t count, uint64_t offset,
                             std::vector<uint8_t>* out_data);

  // Write the given |data| to the file at the given |offset|.
  //
  // Data should be copied into the file starting at the beginning of |data|.
  // If |WriteAt| returns |ZX_OK|, |out_actual| should contain the number of
  // bytes actually written to the file.
  virtual zx_status_t WriteAt(std::vector<uint8_t> data, uint64_t offset,
                              uint64_t* out_actual);

  // Resize the file to the given |length|.
  virtual zx_status_t Truncate(uint64_t length);

  // Override that describes this object as a file.
  void Describe(fuchsia::io::NodeInfo* out_info) override;

  // Returns current file length.
  //
  // All implementations should implement this.
  virtual uint64_t GetLength() = 0;

  // Returns file capacity.
  //
  // Seek() uses this to return ZX_ERR_OUT_OF_RANGE if new seek is more than
  // this value.
  virtual size_t GetCapacity();

 protected:
  NodeKind::Type GetKind() const override;

  zx_status_t CreateConnection(
      uint32_t flags, std::unique_ptr<Connection>* connection) override;
};

}  // namespace internal
}  // namespace vfs

#endif  // LIB_VFS_CPP_INTERNAL_FILE_H_
