// Copyright 2013 The Flutter 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 FILESYSTEM_FILE_H_
#define FILESYSTEM_FILE_H_

#include <string>
#include <vector>

#include "filesystem/eintr_wrapper.h"
#include "filesystem/portable_unistd.h"

namespace filesystem {

class Descriptor {
 public:
  using Handle = int;

  Descriptor(Handle handle) : handle_(handle) {}

  ~Descriptor() {
    if (is_valid()) {
      IGNORE_EINTR(::close(handle_));
    }
  }

  bool is_valid() { return handle_ >= 0; }

  Handle get() { return handle_; }

 private:
  Handle handle_ = -1;

  Descriptor(Descriptor&) = delete;

  void operator=(const Descriptor&) = delete;
};

// Reads the contents of the file at the given path or file descriptor and
// stores the data in result. Returns true if the file was read successfully,
// otherwise returns false. If this function returns false, |result| will be
// the empty string.
bool ReadFileToString(const std::string& path, std::string* result);
bool ReadFileDescriptorToString(int fd, std::string* result);

// Reads the contents of the file at the given path and if successful, returns
// pair of read allocated bytes with data and size of the data if succesful.
// pair of <nullptr, -1> if read failed.
std::pair<uint8_t*, intptr_t> ReadFileToBytes(const std::string& path);
std::pair<uint8_t*, intptr_t> ReadFileDescriptorToBytes(int fd);

}  // namespace filesystem

#endif  // FILESYSTEM_FILE_H_
