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... ");
73 LOG(
"Waiting for \"joedb\"... ");
88 throw Exception(
"Did not receive \"joedb\" from server");
91 const int64_t server_version =
buffer.
read<int64_t>();
93 if (server_version == 0)
94 throw Exception(
"Client version rejected by server");
96 LOG(
"server_version = " << server_version <<
". ");
99 throw Exception(
"Unsupported server version");
107 else if (mode ==
'W')
110 throw Exception(
"Unexpected server mode");
116 "; mode = " << mode <<
120 if (keep_alive_interval.count() > 0)
122 keep_alive_thread_must_stop =
false;
123 keep_alive_thread = std::thread([
this](){keep_alive();});
136 LOG(
"downloading, size = " << size);
138 std::optional<Progress_Bar> progress_bar;
139 if (size > buffer.ssize && log)
140 progress_bar.emplace(size, *log);
142 for (int64_t read = 0; read < size;)
144 const int64_t remaining = size - read;
145 const size_t read_size = size_t
147 std::min(int64_t(buffer.size), remaining)
149 const size_t n = lock.read_some(buffer.data, read_size);
150 writer.write(buffer.data, n);
153 progress_bar->print(read);
163 keep_alive_interval(std::chrono::seconds{240}),
167 pullonly_server(false)
173 void Server_Client::disconnect()
178 keep_alive_thread_must_stop =
true;
181 condition.notify_one();
182 if (keep_alive_thread.joinable())
183 keep_alive_thread.join();
190 try { disconnect(); }
catch (...) {}
char data[size+extra_size]
int64_t server_checkpoint
void download(Async_Writer &writer, Channel_Lock &lock, int64_t size) const
Thread_Safe_Channel channel
Server_Client(Channel &channel)
constexpr int protocol_version