// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by the GPL v2 license that can
// be found in the LICENSE file.
//
// Simple wrapper for synchronous file operations
// TODO(wad) clean up the API then propose moving it to a standalone location.
#ifndef VERITY_SIMPLE_FILE_FILE_H__
#define VERITY_SIMPLE_FILE_FILE_H__ 1

#include <fcntl.h>
#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include "verity/logging.h"
#include "verity/simple_file/env.h"

namespace simple_file {

// File wraps normal file interactions to allow for easy mocking. In addition,
// the underlying OS calls can also be mocked using the Env class above.
// This class may not be used by multiple threads at once.
class File {
 public:
  File() : default_env_(new Env), env_(NULL), fd_(-1), offset_(0) { }
  virtual ~File() { if (fd_ >= 0) { env()->Close(fd_); } delete default_env_; }
  virtual const Env *env() const;

  // Specify the file and the open(2) flags for using it
  virtual bool Initialize(const char *path, int flags, const Env *env);
  // Read |bytes| into |buf|. |buf| may be altered even on failure.
  virtual bool Read(int bytes, uint8_t *buf);
  virtual bool ReadAt(int bytes, uint8_t *buf, off_t at);
  // Write |bytes| from |buf|
  virtual bool Write(int bytes, const uint8_t *buf);
  // WriteAt |bytes| from |buf|
  virtual bool WriteAt(int bytes, const uint8_t *buf, off_t at);

  // Size returns the total File size.
  virtual int64_t Size() const;
  virtual bool Seek(off_t location, bool absolute);
  virtual off_t Whence() const;
  // Reset returns the object to state immediately after construction.
  virtual void Reset();

 private:
  Env *default_env_;
  const Env *env_;
  int fd_;
  off_t offset_;
};

}  // namespace simple_file
#endif  // VERITY_SIMPLE_FILE_H__
