// 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}; std::thread receiver_thread; std::thread cbor_thread; Logger logger{"TCPImagePuller"}; bool ReadExact(void *buf, size_t size); bool SendAll(const void *buf, size_t len); bool EnsureConnected(); void CloseSocket(); void ReceiverThread(); void CBORThread(); public: explicit TCPImagePuller(const std::string &tcp_addr, std::optional rcv_buffer_size = {}); ~TCPImagePuller() override; bool SupportsAck() const override { return true; } bool SendAck(const PullerAckMessage &ack) override; void Disconnect() override; };