// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include #include #include "ImagePuller.h" #include "../common/Logger.h" #include "../common/ThreadSafeFIFO.h" class TCPImagePuller : public ImagePuller { int fd = -1; std::mutex fd_mutex; std::string addr; std::string host; uint16_t port = 0; std::optional receive_buffer_size; std::atomic disconnect{false}; ThreadSafeFIFO cbor_fifo{200}; ThreadSafeFIFO repub_fifo{200}; std::unique_ptr repub_socket; std::thread receiver_thread; std::thread cbor_thread; std::thread repub_thread; Logger logger{"TCPImagePuller"}; static constexpr uint32_t default_repub_watermark = 220; static constexpr auto RepubTimeout = std::chrono::milliseconds(100); bool ReadExact(void *buf, size_t size); bool SendAll(const void *buf, size_t len); bool EnsureConnected(); void CloseSocket(); void ReceiverThread(); void CBORThread(); void RepubThread(); public: explicit TCPImagePuller(const std::string &tcp_addr, std::optional rcv_buffer_size = {}, const std::string &repub_address = "", const std::optional &repub_watermark = {}); ~TCPImagePuller() override; bool SupportsAck() const override { return true; } bool SendAck(const PullerAckMessage &ack) override; void Disconnect() override; };