// 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 FLUTTER_SHELL_PLATFORM_FUCHSIA_FILE_IN_NAMESPACE_BUFFER_H_
#define FLUTTER_SHELL_PLATFORM_FUCHSIA_FILE_IN_NAMESPACE_BUFFER_H_

#include "flutter/fml/mapping.h"

namespace flutter_runner {

/// A mapping to a buffer for a file that has been loaded into a namespace.
class FileInNamespaceBuffer final : public fml::Mapping {
 public:
  /// Loads the file at |path| into the namespace |namespace_fd|, creating
  /// a mapping to the loaded buffer.
  ///
  /// The file will be loaded with the readable permission. If |executable| is
  /// true, the file will also be loaded with the executable permission.
  FileInNamespaceBuffer(int namespace_fd, const char* path, bool executable);
  ~FileInNamespaceBuffer();

  // |fml::Mapping|
  const uint8_t* GetMapping() const override;

  // |fml::Mapping|
  size_t GetSize() const override;

  // |fml::Mapping|
  bool IsDontNeedSafe() const override;

 private:
  /// The address that was mapped to the buffer.
  void* address_;

  /// The size of the buffer.
  size_t size_;

  FML_DISALLOW_COPY_AND_ASSIGN(FileInNamespaceBuffer);
};

/// Loads a file from |file_path| into the namespace |namespace_fd|, returning
/// the mapping for that file.
///
/// The file will be loaded with the readable permission. If |executable| is
/// true, the file will be also be loaded with the executable permission.
std::unique_ptr<fml::Mapping> LoadFile(int namespace_fd,
                                       const char* path,
                                       bool executable);

/// Opens the file at |path| and creates a file mapping for the file.
///
/// The file will be opened with the readable permission. If |executable| is
/// true, the file will also be opened with the executable permission.
std::unique_ptr<fml::FileMapping> MakeFileMapping(const char* path,
                                                  bool executable);

}  // namespace flutter_runner

#endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_FILE_IN_NAMESPACE_BUFFER_H_
