refactored windows based ip_notifier in a separated class

This commit is contained in:
Alden Torres 2017-04-12 10:25:02 -04:00 committed by Arvid Norberg
parent 266beaaab2
commit 591d9716c3
1 changed files with 51 additions and 4 deletions

View File

@ -311,13 +311,60 @@ private:
#endif // TORRENT_USE_SC_NETWORK_REACHABILITY
#elif defined TORRENT_WINDOWS
// TODO: ip_change_notifier_win
#else
// TODO: ip_change_notifier_default
struct ip_change_notifier_impl final : ip_change_notifier
{
explicit ip_change_notifier_impl(io_service& ios)
: m_hnd(ios, WSACreateEvent())
{
if (!m_hnd.is_open()) aux::throw_ex<system_error>(WSAGetLastError(), system_category());
m_ovl.hEvent = m_hnd.native_handle();
}
// noncopyable
ip_change_notifier_impl(ip_change_notifier_impl const&) = delete;
ip_change_notifier_impl& operator=(ip_change_notifier_impl const&) = delete;
~ip_change_notifier_impl() override
{
cancel();
// the reason to call close() here is because the
// object_handle destructor doesn't close the handle
m_hnd.close();
}
void async_wait(std::function<void(error_code const&)> cb) override
{
HANDLE hnd;
DWORD err = NotifyAddrChange(&hnd, &m_ovl);
if (err == ERROR_IO_PENDING)
{
m_hnd.async_wait([cb](error_code const& ec)
{
// call CancelIPChangeNotify here?
cb(ec);
});
}
else
{
m_hnd.get_io_service().post([cb, err]()
{ cb(error_code(err, system_category())); });
}
}
void cancel() override
{
CancelIPChangeNotify(&m_ovl);
m_hnd.cancel();
}
private:
OVERLAPPED m_ovl = {};
boost::asio::windows::object_handle m_hnd;
};
#endif
// TODO: to remove when separated per platform
#if defined TORRENT_BUILD_SIMULATOR || defined TORRENT_WINDOWS
#if defined TORRENT_BUILD_SIMULATOR
struct ip_change_notifier_impl final : ip_change_notifier
{
explicit ip_change_notifier_impl(io_service& ios);