-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathserver_manager.cpp
50 lines (39 loc) · 1.75 KB
/
server_manager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Copyright (c) 2022, Eugene Gershnik
// SPDX-License-Identifier: BSD-3-Clause
#include "server_manager.h"
#include "exc_handling.h"
auto ServerManager::createServer(const NetworkInterface & interface, const ip::address & addr) -> refcnt_ptr<WsdServer> {
refcnt_ptr<WsdServer> server;
try {
server = createWsdServer(m_ctxt, m_config, m_httpServerFactory, m_udpServerFactory, interface, addr);
} catch(std::system_error & ex) {
WSDLOG_ERROR("Unable to start WSD server on interface {}, addr {}: error: {}", interface, addr.to_string(), ex.what());
WSDLOG_DEBUG("{}", formatCaughtExceptionBacktrace());
return nullptr;
}
server->start();
return server;
}
void ServerManager::onFatalInterfaceMonitorError(asio::error_code ec) {
//nothing left to do if the monitor died
throw std::system_error(ec, "fatal interface monitor error");
}
void ServerManager::addAddress(const NetworkInterface & interface, const ip::address & addr) {
auto & server = m_serversByAddress[addr];
if (server && server->interface() == interface && server->state() == WsdServer::Running)
return;
WSDLOG_INFO("Adding interface {}, addr {}", interface, addr.to_string());
server = createServer(interface, addr);
}
void ServerManager::removeAddress(const NetworkInterface & interface, const ip::address & addr) {
auto itServer = m_serversByAddress.find(addr);
if (itServer == m_serversByAddress.end())
return;
auto & server = itServer->second;
if (server && server->interface() != interface)
return;
WSDLOG_INFO("Removing interface {}, addr {}", interface, addr.to_string());
if (server)
server->stop(false);
m_serversByAddress.erase(itServer);
}