9#define LOG(x) do {if (log) *log << x;} while (false)
34 void Server_Client::keep_alive()
41 while (!keep_alive_thread_must_stop)
43 condition.wait_for(lock, keep_alive_interval);
45 if (keep_alive_thread_must_stop)
57 void Server_Client::connect()
60 LOG(
"Connecting... ");
75 throw Exception(
"Did not receive \"joedb\" from server");
77 const int64_t server_version =
buffer.
read<int64_t>();
79 if (server_version == 0)
80 throw Exception(
"Client version rejected by server");
82 LOG(
"server_version = " << server_version <<
". ");
85 throw Exception(
"Unsupported server version");
96 throw Exception(
"Unexpected server mode");
102 "; mode = " << mode <<
106 if (keep_alive_interval.count() > 0)
108 keep_alive_thread_must_stop =
false;
109 keep_alive_thread = std::thread([
this](){keep_alive();});
125 for (int64_t read = 0; read < size;)
127 const int64_t remaining = size - read;
128 const size_t read_size = size_t(std::min(int64_t(buffer.size), remaining));
129 const size_t n = lock->read_some(buffer.data, read_size);
130 writer.write(buffer.data, n);
132 progress_bar.
print(read);
142 std::chrono::milliseconds keep_alive_interval
144 keep_alive_interval(keep_alive_interval),
148 pullonly_server(false)
154 void Server_Client::disconnect() noexcept
160 keep_alive_thread_must_stop =
true;
170 condition.notify_one();
171 if (keep_alive_thread.joinable())
172 keep_alive_thread.join();
char data[size+extra_size]
void print(int64_t current)
int64_t server_checkpoint
Thread_Safe< Channel & > channel
Server_Client(Channel &channel, std::ostream *log=nullptr, std::chrono::milliseconds keep_alive_interval=std::chrono::seconds(0))
void download(Async_Writer &writer, Lock< Channel & > &lock, int64_t size) const
constexpr int protocol_version