#pragma once #include #include #include struct TransferState { std::atomic done{false}; std::atomic cancelled{false}; std::atomic connection_failed{false}; std::atomic bytes_done{0}; std::atomic bytes_total{0}; std::string status; std::string fail_reason; mutable std::mutex status_mutex; void reset() { done = false; cancelled = false; connection_failed = false; bytes_done = 0; bytes_total = 0; fail_reason.clear(); std::lock_guard lock(status_mutex); status.clear(); } double progress() const { uint64_t t = bytes_total.load(); return t ? (double)bytes_done.load() / (double)t * 100.0 : 0.0; } std::string getStatus() const { std::lock_guard lock(status_mutex); return status; } void setStatus(const std::string& s) { std::lock_guard lock(status_mutex); status = s; } };