23#include <freerdp/freerdp.h>
24#include <freerdp/settings.h>
25#include <freerdp/log.h>
27#include "../sdl_utils.hpp"
28#include "sdl_connection_dialog.hpp"
29#include "sdl_connection_dialog_wrapper.hpp"
35SdlConnectionDialogWrapper::~SdlConnectionDialogWrapper() =
default;
37void SdlConnectionDialogWrapper::create(rdpContext* context)
41 _connection_dialog.reset();
43 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
46void SdlConnectionDialogWrapper::destroy()
48 _connection_dialog.reset();
51bool SdlConnectionDialogWrapper::isRunning()
const
53 std::unique_lock lock(_mux);
59 if (!_connection_dialog)
61 return _connection_dialog->running();
64bool SdlConnectionDialogWrapper::isVisible()
const
66 std::unique_lock lock(_mux);
67 if (!_connection_dialog)
69 return _connection_dialog->visible();
72bool SdlConnectionDialogWrapper::handleEvent(
const SDL_Event& event)
74 std::unique_lock lock(_mux);
75 if (!_connection_dialog)
77 return _connection_dialog->handle(event);
80WINPR_ATTR_FORMAT_ARG(1, 0)
81static std::
string format(WINPR_FORMAT_ARG const
char* fmt, va_list ap)
85 const int size = vsnprintf(
nullptr, 0, fmt, ap1);
92 msg.resize(
static_cast<size_t>(size) + 1);
96 std::ignore = vsnprintf(msg.data(), msg.size(), fmt, ap2);
101void SdlConnectionDialogWrapper::setTitle(
const char* fmt, ...)
105 setTitle(format(fmt, ap));
109void SdlConnectionDialogWrapper::setTitle(
const std::string& title)
111 push(EventArg{ title });
114void SdlConnectionDialogWrapper::showInfo(
const char* fmt, ...)
118 showInfo(format(fmt, ap));
122void SdlConnectionDialogWrapper::showInfo(
const std::string& info)
124 show(MSG_INFO, info);
127void SdlConnectionDialogWrapper::showWarn(
const char* fmt, ...)
131 showWarn(format(fmt, ap));
135void SdlConnectionDialogWrapper::showWarn(
const std::string& info)
137 show(MSG_WARN, info);
140void SdlConnectionDialogWrapper::showError(
const char* fmt, ...)
144 showError(format(fmt, ap));
148void SdlConnectionDialogWrapper::showError(
const std::string& error)
150 show(MSG_ERROR, error);
153void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
154 const std::string& msg)
156 push({ type, msg,
true });
159void SdlConnectionDialogWrapper::show(
bool visible)
161 push(EventArg{ visible });
164void SdlConnectionDialogWrapper::handleShow()
166 std::unique_lock lock(_mux);
167 while (!_queue.empty())
169 auto arg = _queue.front();
172 if (arg.hasTitle() && _connection_dialog)
174 std::ignore = _connection_dialog->setTitle(arg.title().c_str());
177 if (arg.hasType() && arg.hasMessage())
181 case SdlConnectionDialogWrapper::MSG_INFO:
182 if (_connection_dialog)
183 std::ignore = _connection_dialog->showInfo(arg.message().c_str());
185 WLog_Print(_log, WLOG_INFO,
"%s", arg.message().c_str());
187 case SdlConnectionDialogWrapper::MSG_WARN:
188 if (_connection_dialog)
189 std::ignore = _connection_dialog->showWarn(arg.message().c_str());
191 WLog_Print(_log, WLOG_WARN,
"%s", arg.message().c_str());
193 case SdlConnectionDialogWrapper::MSG_ERROR:
194 if (_connection_dialog)
195 std::ignore = _connection_dialog->showError(arg.message().c_str());
197 WLog_Print(_log, WLOG_ERROR,
"%s", arg.message().c_str());
204 if (arg.hasVisibility() && _connection_dialog)
207 std::ignore = _connection_dialog->show();
209 std::ignore = _connection_dialog->hide();
214void SdlConnectionDialogWrapper::push(EventArg&& arg)
217 std::unique_lock lock(_mux);
218 _queue.push(std::move(arg));
221 auto rc = SDL_RunOnMainThread(
229 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] SDL_RunOnMainThread failed with %s",
230 __func__, SDL_GetError());
233SdlConnectionDialogWrapper::EventArg::EventArg(
bool visible) : _visible(visible), _mask(8)
237SdlConnectionDialogWrapper::EventArg::EventArg(
const std::string& title) : _title(title), _mask(1)
241SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type,
const std::string& msg,
bool visible)
242 : _message(msg), _type(type), _visible(visible), _mask(14)
246bool SdlConnectionDialogWrapper::EventArg::hasTitle()
const
251const std::string& SdlConnectionDialogWrapper::EventArg::title()
const
256bool SdlConnectionDialogWrapper::EventArg::hasMessage()
const
261const std::string& SdlConnectionDialogWrapper::EventArg::message()
const
266bool SdlConnectionDialogWrapper::EventArg::hasType()
const
271SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type()
const
276bool SdlConnectionDialogWrapper::EventArg::hasVisibility()
const
281bool SdlConnectionDialogWrapper::EventArg::visible()
const
286std::string SdlConnectionDialogWrapper::EventArg::str()
const
288 std::stringstream ss;
289 ss <<
"{ title:" << _title <<
", message:" << _message <<
", type:" << _type
290 <<
", visible:" << _visible <<
", mask:" << _mask <<
"}";
SdlConnectionDialogWrapper(wLog *log)
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.