CVB++ 15.0
detail_network.hpp
1#pragma once
2
3#include "../../global.hpp"
4#include "../../string.hpp"
5#include "../ui.hpp"
6
7#pragma warning(push)
8#pragma warning(disable : 4800)
9#pragma warning(disable : 4251)
10#pragma warning(disable : 4244)
11#include <QHostAddress>
12#include <QRegularExpression>
13#pragma warning(pop)
14
15namespace Cvb
16{
17
18 CVB_BEGIN_INLINE_NS
19
20 namespace UI
21 {
22 namespace Private
23 {
24
25 class IpAddress final
26 {
27
28 public:
29 explicit IpAddress(int64_t addr) noexcept
30 {
31 address_ = QHostAddress((quint32)addr);
32 }
33
34 explicit IpAddress(const String &addr) noexcept
35 {
36 address_ = QHostAddress(UI::CvbToQt(addr));
37 }
38
39 explicit IpAddress(const QString &addr) noexcept
40 {
41 address_ = QHostAddress(addr);
42 }
43
44 bool operator==(const IpAddress &addr) const noexcept
45 {
46 return (address_ == addr.address_);
47 }
48
49 bool operator!=(const IpAddress &addr) const noexcept
50 {
51 return !(*this == addr);
52 }
53
54 String ToString()
55 {
56 return UI::QtToCvb(address_.toString());
57 }
58
59 QString ToQString()
60 {
61 return address_.toString();
62 }
63
64 int64_t ToInt64()
65 {
66 return static_cast<int64_t>(address_.toIPv4Address());
67 }
68
69 bool IsValid()
70 {
71 return !(ToInt64() == 0);
72 }
73
74 private:
75 QHostAddress address_;
76 };
77
78 class MacAddress final
79 {
80
81 public:
82 enum MacDelimiter
83 {
84 Minus,
85 Colon
86 };
87
88 explicit MacAddress(int64_t addr) noexcept
89 {
90 Convert(addr);
91 Check();
92 }
93
94 explicit MacAddress(const String &addr) noexcept
95 : address_(UI::CvbToQt(addr))
96 {
97
98 Check();
99 }
100
101 explicit MacAddress(const QString &addr) noexcept
102 : address_(addr)
103 {
104 Check();
105 }
106
107 bool operator==(const MacAddress &addr) const noexcept
108 {
109 return (address_ == addr.address_);
110 }
111
112 bool operator!=(const MacAddress &addr) const noexcept
113 {
114 return !(*this == addr);
115 }
116
117 String ToString()
118 {
119 return UI::QtToCvb(address_);
120 }
121
122 QString ToQString()
123 {
124 return address_;
125 }
126
127 int64_t ToInt64()
128 {
129 if (address_.isEmpty())
130 return 0;
131
132 return Int64();
133 }
134
135 bool IsValid()
136 {
137 return !(ToInt64() == 0);
138 }
139
140 void SetDelimiter(const MacDelimiter delimiter)
141 {
142 separator_ = delimiter;
143 }
144
145 MacDelimiter Delimiter()
146 {
147 return separator_;
148 }
149
150 private:
151 void Check()
152 {
153 QRegularExpression rx(macRegExp);
154 auto match = rx.match(address_);
155 if (!match.hasMatch())
156 address_ = defaultAddress_;
157
158 ChangeSeparator();
159 }
160
161 void ChangeSeparator()
162 {
163 if (address_.count(Separator()) == 5)
164 return;
165 else
166 {
167 switch (separator_)
168 {
169 case Colon:
170 address_.replace('-', ':');
171 break;
172 case Minus:
173 default:
174 address_.replace(':', '-');
175 break;
176 }
177 }
178 }
179
180 void Convert(int64_t value)
181 {
182 auto tmp = QString("%1").arg(value, 8, 16, QLatin1Char('0'));
183 auto pos = tmp.size() - 2;
184 auto count = 0;
185 while (pos > 0)
186 {
187 tmp.insert(pos, Separator());
188 pos -= 2;
189 ++count;
190 }
191 while (count < 5)
192 {
193 tmp.insert(0, Separator()).insert(0, "00");
194 ++count;
195 }
196 address_ = tmp;
197 }
198
199 int64_t Int64()
200 {
201 auto tmp = address_;
202 tmp.remove(':').remove('-');
203 bool valid = false;
204 return static_cast<int64_t>(tmp.toLongLong(&valid, 16));
205 }
206
207 QChar Separator()
208 {
209 if (separator_ == Colon)
210 return ':';
211 return '-';
212 }
213
214 QString address_;
215 const QString defaultAddress_ = "00-00-00-00-00-00";
216 MacDelimiter separator_ = Minus;
217 const QString macRegExp = "([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})";
218 };
219
220 } /* namespace Private */
221 } /* namespace UI */
222
223 CVB_END_INLINE_NS
224
225} /* namespace Cvb */
T count(T... args)
Namespace for user interface components.
Definition decl_image_scene.hpp:39
Cvb::String QtToCvb(const QString text) noexcept
Convenience converter for strings.
Definition ui.hpp:242
QString CvbToQt(const Cvb::String &text) noexcept
Convenience converter for strings.
Definition ui.hpp:257
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49