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(buffer.ssize, remaining));
129 const size_t n = lock.read_some(buffer.data, read_size);
130 writer.write(buffer.data, n);
132 progress_bar.
print(read);
139 keep_alive_interval(std::chrono::seconds{240}),
143 pullonly_server(false)
149 void Server_Client::disconnect()
154 keep_alive_thread_must_stop =
true;
157 condition.notify_one();
158 if (keep_alive_thread.joinable())
159 keep_alive_thread.join();
166 try { disconnect(); }
catch (...) {}
char data[size+extra_size]
void print(int64_t current)
int64_t server_checkpoint
void download(Async_Writer &writer, Channel_Lock &lock, int64_t size) const
Server_Client(Channel &channel, std::ostream *log=nullptr)
Thread_Safe_Channel channel
constexpr int protocol_version