FreeRDP
Loading...
Searching...
No Matches
sdl_connection_dialog_wrapper.cpp
1
21#include <sstream>
22
23#include "sdl_connection_dialog_wrapper.hpp"
24#include "sdl_connection_dialog.hpp"
25#include "../sdl_utils.hpp"
26
28
29SdlConnectionDialogWrapper::~SdlConnectionDialogWrapper() = default;
30
31void SdlConnectionDialogWrapper::create(rdpContext* context)
32{
33 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
34}
35
36void SdlConnectionDialogWrapper::destroy()
37{
38 _connection_dialog.reset();
39}
40
41bool SdlConnectionDialogWrapper::isRunning() const
42{
43 std::unique_lock lock(_mux);
44 if (!_connection_dialog)
45 return false;
46 return _connection_dialog->running();
47}
48
49bool SdlConnectionDialogWrapper::isVisible() const
50{
51 std::unique_lock lock(_mux);
52 if (!_connection_dialog)
53 return false;
54 return _connection_dialog->visible();
55}
56
57bool SdlConnectionDialogWrapper::handleEvent(const SDL_Event& event)
58{
59 std::unique_lock lock(_mux);
60 if (!_connection_dialog)
61 return false;
62 return _connection_dialog->handle(event);
63}
64
65WINPR_ATTR_FORMAT_ARG(1, 0)
66static std::string format(WINPR_FORMAT_ARG const char* fmt, va_list ap)
67{
68 va_list ap1;
69 va_copy(ap1, ap);
70 const int size = vsnprintf(nullptr, 0, fmt, ap1);
71 va_end(ap1);
72
73 if (size < 0)
74 return "";
75
76 std::string msg;
77 msg.resize(static_cast<size_t>(size) + 1);
78
79 va_list ap2;
80 va_copy(ap2, ap);
81 (void)vsnprintf(msg.data(), msg.size(), fmt, ap2);
82 va_end(ap2);
83 return msg;
84}
85
86void SdlConnectionDialogWrapper::setTitle(const char* fmt, ...)
87{
88 va_list ap;
89 va_start(ap, fmt);
90 setTitle(format(fmt, ap));
91 va_end(ap);
92}
93
94void SdlConnectionDialogWrapper::setTitle(const std::string& title)
95{
96 push({ title });
97}
98
99void SdlConnectionDialogWrapper::showInfo(const char* fmt, ...)
100{
101 va_list ap;
102 va_start(ap, fmt);
103 showInfo(format(fmt, ap));
104 va_end(ap);
105}
106
107void SdlConnectionDialogWrapper::showInfo(const std::string& info)
108{
109 show(MSG_INFO, info);
110}
111
112void SdlConnectionDialogWrapper::showWarn(const char* fmt, ...)
113{
114 va_list ap;
115 va_start(ap, fmt);
116 showWarn(format(fmt, ap));
117 va_end(ap);
118}
119
120void SdlConnectionDialogWrapper::showWarn(const std::string& info)
121{
122 show(MSG_WARN, info);
123}
124
125void SdlConnectionDialogWrapper::showError(const char* fmt, ...)
126{
127 va_list ap;
128 va_start(ap, fmt);
129 showError(format(fmt, ap));
130 va_end(ap);
131}
132
133void SdlConnectionDialogWrapper::showError(const std::string& error)
134{
135 show(MSG_ERROR, error);
136}
137
138void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
139 const std::string& msg)
140{
141 push({ type, msg, true });
142}
143
144void SdlConnectionDialogWrapper::show(bool visible)
145{
146 push({ visible });
147}
148
149void SdlConnectionDialogWrapper::handleShow()
150{
151 std::unique_lock lock(_mux);
152 while (!_queue.empty())
153 {
154 auto arg = _queue.front();
155 _queue.pop();
156
157 if (!_connection_dialog)
158 continue;
159
160 if (arg.hasTitle())
161 {
162 _connection_dialog->setTitle(arg.title().c_str());
163 }
164
165 if (arg.hasType() && arg.hasMessage())
166 {
167 switch (arg.type())
168 {
169 case SdlConnectionDialogWrapper::MSG_INFO:
170 _connection_dialog->showInfo(arg.message().c_str());
171 break;
172 case SdlConnectionDialogWrapper::MSG_WARN:
173 _connection_dialog->showWarn(arg.message().c_str());
174 break;
175 case SdlConnectionDialogWrapper::MSG_ERROR:
176 _connection_dialog->showError(arg.message().c_str());
177 break;
178 default:
179 break;
180 }
181 }
182
183 if (arg.hasVisibility())
184 {
185 if (arg.visible())
186 _connection_dialog->show();
187 else
188 _connection_dialog->hide();
189 }
190 }
191}
192
193void SdlConnectionDialogWrapper::push(EventArg&& arg)
194{
195 {
196 std::unique_lock lock(_mux);
197 _queue.push(std::move(arg));
198 }
199
200 auto rc = SDL_RunOnMainThread(
201 [](void* user)
202 {
203 auto dlg = static_cast<SdlConnectionDialogWrapper*>(user);
204 dlg->handleShow();
205 },
206 this, false);
207 if (!rc)
208 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "[%s] SDL_RunOnMainThread failed with %s",
209 __func__, SDL_GetError());
210}
211
212SdlConnectionDialogWrapper::EventArg::EventArg(bool visible) : _visible(visible), _mask(8)
213{
214}
215
216SdlConnectionDialogWrapper::EventArg::EventArg(const std::string& title) : _title(title), _mask(1)
217{
218}
219
220SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type, const std::string& msg, bool visible)
221 : _message(msg), _type(type), _visible(visible), _mask(14)
222{
223}
224
225bool SdlConnectionDialogWrapper::EventArg::hasTitle() const
226{
227 return _mask & 0x01;
228}
229
230const std::string& SdlConnectionDialogWrapper::EventArg::title() const
231{
232 return _title;
233}
234
235bool SdlConnectionDialogWrapper::EventArg::hasMessage() const
236{
237 return _mask & 0x02;
238}
239
240const std::string& SdlConnectionDialogWrapper::EventArg::message() const
241{
242 return _message;
243}
244
245bool SdlConnectionDialogWrapper::EventArg::hasType() const
246{
247 return _mask & 0x04;
248}
249
250SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type() const
251{
252 return _type;
253}
254
255bool SdlConnectionDialogWrapper::EventArg::hasVisibility() const
256{
257 return _mask & 0x08;
258}
259
260bool SdlConnectionDialogWrapper::EventArg::visible() const
261{
262 return _visible;
263}
264
265std::string SdlConnectionDialogWrapper::EventArg::str() const
266{
267 std::stringstream ss;
268 ss << "{ title:" << _title << ", message:" << _message << ", type:" << _type
269 << ", visible:" << _visible << ", mask:" << _mask << "}";
270 return ss.str();
271}