// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include "HDF5DataFile.h" #include "../common/JFJochMessages.h" #include "../common/ZMQWrappers.h" #include "HDF5NXmx.h" #include "CBFWriter.h" #include class FileWriter { FileWriterFormat format = FileWriterFormat::NXmxLegacy; StartMessage start_message; std::unique_ptr master_file; std::vector > files; std::vector stats; std::unique_ptr finalized_file_socket; std::unique_ptr cbf_writer; std::unordered_set closed_files; constexpr static uint64_t close_file_lag_images = 1000; constexpr static uint64_t default_images_per_file = 1000; void CreateHDF5MasterFile(const StartMessage& msg); void CheckOutputFilesAvailable() const; void AddStats(const std::optional& s); void CloseFile(uint64_t file_number); void CloseOldFiles(uint64_t current_image_number); public: // check_overwrite_at_start: fail the constructor if an output file already // exists and overwrite is off. Only safe for transports with a back-channel // (direct HDF5 pusher, TCP) that can report the failure to the broker before // acquisition arms. The ZeroMQ pusher is fire-and-forget with no back-channel, // so it must pass false: the writer then falls back to writing .tmp files and // failing at the final rename (see docs/JFJOCH_WRITER.md). // trusted_path: the caller supplied the output prefix itself (offline rugnux / the viewer's // processing), so the multi-user CheckPath guard - which forbids absolute paths and '..' traversal // for remotely-supplied prefixes - is skipped, allowing an absolute output path. The broker/writer // never set it, so their behaviour is unchanged. explicit FileWriter(const StartMessage &request, bool check_overwrite_at_start = true, bool trusted_path = false); void Write(const DataMessage& msg); void WriteTIFF(const DataMessage& msg); void WriteHDF5(const DataMessage& msg); void WriteHDF5(const CompressedImage& msg); void WriteHDF5(const EndMessage& msg); std::vector Finalize(); void SetupFinalizedFileSocket(const std::string &addr); std::optional GetZMQAddr(); };