HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
socket_event_win32_impl.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
8
9#include "socket_event_intf.hpp"
10#include "../utility/utility.hpp"
11#include "../macros.hpp"
12
13hi_export_module(hikogui.dipatch.socket_event : impl);
14
15namespace hi::inline v1 {
16
17[[nodiscard]] constexpr socket_event socket_event_from_win32(long rhs) noexcept
18{
19 auto r = socket_event::none;
20
21 r |= (rhs & FD_READ) ? socket_event::read : socket_event::none;
22 r |= (rhs & FD_WRITE) ? socket_event::write : socket_event::none;
23 r |= (rhs & FD_CLOSE) ? socket_event::close : socket_event::none;
24 r |= (rhs & FD_CONNECT) ? socket_event::connect : socket_event::none;
25 r |= (rhs & FD_ACCEPT) ? socket_event::accept : socket_event::none;
26 r |= (rhs & FD_OOB) ? socket_event::out_of_band : socket_event::none;
27 r |= (rhs & FD_QOS) ? socket_event::qos : socket_event::none;
28 r |= (rhs & FD_GROUP_QOS) ? socket_event::group_qos : socket_event::none;
29 r |= (rhs & FD_ADDRESS_LIST_CHANGE) ? socket_event::address_list_change : socket_event::none;
30 r |= (rhs & FD_ROUTING_INTERFACE_CHANGE) ? socket_event::routing_interface_changed : socket_event::none;
31
32 return r;
33}
34
35[[nodiscard]] constexpr socket_error socket_error_from_win32(int rhs) noexcept
36{
37 switch (rhs) {
38 case 0: return socket_error::success;
39 case WSAEAFNOSUPPORT: return socket_error::af_not_supported;
40 case WSAECONNREFUSED: return socket_error::connection_refused;
41 case WSAENETUNREACH: return socket_error::network_unreachable;
42 case WSAENOBUFS: return socket_error::no_buffers;
43 case WSAETIMEDOUT: return socket_error::timeout;
44 case WSAENETDOWN: return socket_error::network_down;
45 case WSAECONNRESET: return socket_error::connection_reset;
46 case WSAECONNABORTED: return socket_error::connection_aborted;
47 default: hi_no_default();
48 }
49}
50
51[[nodiscard]] constexpr socket_events socket_events_from_win32(WSANETWORKEVENTS const& rhs) noexcept
52{
53 auto r = socket_events{};
54 r.events = socket_event_from_win32(rhs.lNetworkEvents);
55 r.errors[bit(socket_event::read)] = socket_error_from_win32(rhs.iErrorCode[FD_READ_BIT]);
56 r.errors[bit(socket_event::write)] = socket_error_from_win32(rhs.iErrorCode[FD_WRITE_BIT]);
57 r.errors[bit(socket_event::close)] = socket_error_from_win32(rhs.iErrorCode[FD_CLOSE_BIT]);
58 r.errors[bit(socket_event::connect)] = socket_error_from_win32(rhs.iErrorCode[FD_CONNECT_BIT]);
59 r.errors[bit(socket_event::accept)] = socket_error_from_win32(rhs.iErrorCode[FD_ACCEPT_BIT]);
60 r.errors[bit(socket_event::out_of_band)] = socket_error_from_win32(rhs.iErrorCode[FD_OOB_BIT]);
61 r.errors[bit(socket_event::qos)] = socket_error_from_win32(rhs.iErrorCode[FD_QOS_BIT]);
62 r.errors[bit(socket_event::group_qos)] = socket_error_from_win32(rhs.iErrorCode[FD_GROUP_QOS_BIT]);
63 r.errors[bit(socket_event::address_list_change)] = socket_error_from_win32(rhs.iErrorCode[FD_ADDRESS_LIST_CHANGE_BIT]);
64 r.errors[bit(socket_event::routing_interface_changed)] =
65 socket_error_from_win32(rhs.iErrorCode[FD_ROUTING_INTERFACE_CHANGE_BIT]);
66
67 return r;
68}
69
70} // namespace hi::inline v1
Rules for working with win32 headers.
DOXYGEN BUG.
Definition algorithm.hpp:16
constexpr size_t bit(socket_event const &rhs) noexcept
Get the bit index of the single bit of the socket_event mask.
Definition socket_event_intf.hpp:54
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377