HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
network_event_win32.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "network_event.hpp"
8#include "../assert.hpp"
9
10namespace hi::inline v1 {
11
12[[nodiscard]] constexpr network_event network_event_from_win32(long rhs) noexcept
13{
14 auto r = network_event::none;
15
16 r |= (rhs & FD_READ) ? network_event::read : network_event::none;
17 r |= (rhs & FD_WRITE) ? network_event::write : network_event::none;
18 r |= (rhs & FD_CLOSE) ? network_event::close : network_event::none;
19 r |= (rhs & FD_CONNECT) ? network_event::connect : network_event::none;
20 r |= (rhs & FD_ACCEPT) ? network_event::accept : network_event::none;
21 r |= (rhs & FD_OOB) ? network_event::out_of_band : network_event::none;
22 r |= (rhs & FD_QOS) ? network_event::qos : network_event::none;
23 r |= (rhs & FD_GROUP_QOS) ? network_event::group_qos : network_event::none;
24 r |= (rhs & FD_ADDRESS_LIST_CHANGE) ? network_event::address_list_change : network_event::none;
25 r |= (rhs & FD_ROUTING_INTERFACE_CHANGE) ? network_event::routing_interface_changed : network_event::none;
26
27 return r;
28}
29
30[[nodiscard]] constexpr network_error network_error_from_win32(int rhs) noexcept
31{
32 switch (rhs) {
33 case 0: return network_error::success;
34 case WSAEAFNOSUPPORT: return network_error::af_not_supported;
35 case WSAECONNREFUSED: return network_error::connection_refused;
36 case WSAENETUNREACH: return network_error::network_unreachable;
37 case WSAENOBUFS: return network_error::no_buffers;
38 case WSAETIMEDOUT: return network_error::timeout;
39 case WSAENETDOWN: return network_error::network_down;
40 case WSAECONNRESET: return network_error::connection_reset;
41 case WSAECONNABORTED: return network_error::connection_aborted;
42 default: hi_no_default();
43 }
44}
45
46[[nodiscard]] constexpr network_events network_events_from_win32(WSANETWORKEVENTS const& rhs) noexcept
47{
48 auto r = network_events{};
49 r.events = network_event_from_win32(rhs.lNetworkEvents);
50 r.errors[bit(network_event::read)] = network_error_from_win32(rhs.iErrorCode[FD_READ_BIT]);
51 r.errors[bit(network_event::write)] = network_error_from_win32(rhs.iErrorCode[FD_WRITE_BIT]);
52 r.errors[bit(network_event::close)] = network_error_from_win32(rhs.iErrorCode[FD_CLOSE_BIT]);
53 r.errors[bit(network_event::connect)] = network_error_from_win32(rhs.iErrorCode[FD_CONNECT_BIT]);
54 r.errors[bit(network_event::accept)] = network_error_from_win32(rhs.iErrorCode[FD_ACCEPT_BIT]);
55 r.errors[bit(network_event::out_of_band)] = network_error_from_win32(rhs.iErrorCode[FD_OOB_BIT]);
56 r.errors[bit(network_event::qos)] = network_error_from_win32(rhs.iErrorCode[FD_QOS_BIT]);
57 r.errors[bit(network_event::group_qos)] = network_error_from_win32(rhs.iErrorCode[FD_GROUP_QOS_BIT]);
58 r.errors[bit(network_event::address_list_change)] = network_error_from_win32(rhs.iErrorCode[FD_ADDRESS_LIST_CHANGE_BIT]);
59 r.errors[bit(network_event::routing_interface_changed)] =
60 network_error_from_win32(rhs.iErrorCode[FD_ROUTING_INTERFACE_CHANGE_BIT]);
61
62 return r;
63}
64
65} // namespace hi::inline v1
DOXYGEN BUG.
Definition algorithm.hpp:15
constexpr size_t bit(network_event const &rhs) noexcept
Get the bit index of the single bit of the network_event mask.
Definition network_event.hpp:52