// Copyright (c) 2026 Juhapekka Piiroinen // All Rights Reserved. // AmoosedWeb project: https://amoosed.com #pragma once #include "AmoosedWeb/Reader.hpp" #include #include namespace amoosed { // Stages a verified resource next to a caller-selected absolute target. // Parent directories must already exist and be trusted. Traversal and // symlinked ancestors are rejected; directory descriptors anchor operations. // An existing destination is never replaced. Methods are not concurrent. class PosixFileOutput final : public OutputHost { public: enum class Failure { None, InvalidPath, AlreadyExists, Io }; explicit PosixFileOutput(std::string_view absolute_utf8_path, std::string& error); ~PosixFileOutput() override; PosixFileOutput(const PosixFileOutput&) = delete; PosixFileOutput& operator=(const PosixFileOutput&) = delete; bool ready() const noexcept { return ready_; } Failure failure() const noexcept { return failure_; } bool write(const std::uint8_t* bytes, std::size_t length) override; bool commit() override; void abort() override; private: std::string target_, temporary_; int parent_ = -1, file_ = -1; bool ready_ = false, committed_ = false; Failure failure_ = Failure::None; }; }