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);
 
   54  if (!_connection_dialog)
 
   56  return _connection_dialog->running();
 
   59bool SdlConnectionDialogWrapper::isVisible()
 const 
   61  std::unique_lock lock(_mux);
 
   62  if (!_connection_dialog)
 
   64  return _connection_dialog->visible();
 
   67bool SdlConnectionDialogWrapper::handleEvent(
const SDL_Event& event)
 
   69  std::unique_lock lock(_mux);
 
   70  if (!_connection_dialog)
 
   72  return _connection_dialog->handle(event);
 
   75WINPR_ATTR_FORMAT_ARG(1, 0)
 
   76static std::
string format(WINPR_FORMAT_ARG const 
char* fmt, va_list ap)
 
   80  const int size = vsnprintf(
nullptr, 0, fmt, ap1);
 
   87  msg.resize(
static_cast<size_t>(size) + 1);
 
   91  (void)vsnprintf(msg.data(), msg.size(), fmt, ap2);
 
   96void SdlConnectionDialogWrapper::setTitle(
const char* fmt, ...)
 
  100  setTitle(format(fmt, ap));
 
  104void SdlConnectionDialogWrapper::setTitle(
const std::string& title)
 
  106  push(EventArg{ title });
 
  109void SdlConnectionDialogWrapper::showInfo(
const char* fmt, ...)
 
  113  showInfo(format(fmt, ap));
 
  117void SdlConnectionDialogWrapper::showInfo(
const std::string& info)
 
  119  show(MSG_INFO, info);
 
  122void SdlConnectionDialogWrapper::showWarn(
const char* fmt, ...)
 
  126  showWarn(format(fmt, ap));
 
  130void SdlConnectionDialogWrapper::showWarn(
const std::string& info)
 
  132  show(MSG_WARN, info);
 
  135void SdlConnectionDialogWrapper::showError(
const char* fmt, ...)
 
  139  showError(format(fmt, ap));
 
  143void SdlConnectionDialogWrapper::showError(
const std::string& error)
 
  145  show(MSG_ERROR, error);
 
  148void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
 
  149                                      const std::string& msg)
 
  151  push({ type, msg, 
true });
 
  154void SdlConnectionDialogWrapper::show(
bool visible)
 
  156  push(EventArg{ visible });
 
  159void SdlConnectionDialogWrapper::handleShow()
 
  161  std::unique_lock lock(_mux);
 
  162  while (!_queue.empty())
 
  164    auto arg = _queue.front();
 
  167    if (arg.hasTitle() && _connection_dialog)
 
  169      _connection_dialog->setTitle(arg.title().c_str());
 
  172    if (arg.hasType() && arg.hasMessage())
 
  176        case SdlConnectionDialogWrapper::MSG_INFO:
 
  177          if (_connection_dialog)
 
  178            _connection_dialog->showInfo(arg.message().c_str());
 
  180            WLog_Print(_log, WLOG_INFO, 
"%s", arg.message().c_str());
 
  182        case SdlConnectionDialogWrapper::MSG_WARN:
 
  183          if (_connection_dialog)
 
  184            _connection_dialog->showWarn(arg.message().c_str());
 
  186            WLog_Print(_log, WLOG_WARN, 
"%s", arg.message().c_str());
 
  188        case SdlConnectionDialogWrapper::MSG_ERROR:
 
  189          if (_connection_dialog)
 
  190            _connection_dialog->showError(arg.message().c_str());
 
  192            WLog_Print(_log, WLOG_ERROR, 
"%s", arg.message().c_str());
 
  199    if (arg.hasVisibility() && _connection_dialog)
 
  202        _connection_dialog->show();
 
  204        _connection_dialog->hide();
 
  209void SdlConnectionDialogWrapper::push(EventArg&& arg)
 
  212    std::unique_lock lock(_mux);
 
  213    _queue.push(std::move(arg));
 
  216  auto rc = SDL_RunOnMainThread(
 
  224    SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, 
"[%s] SDL_RunOnMainThread failed with %s",
 
  225                __func__, SDL_GetError());
 
  228SdlConnectionDialogWrapper::EventArg::EventArg(
bool visible) : _visible(visible), _mask(8)
 
  232SdlConnectionDialogWrapper::EventArg::EventArg(
const std::string& title) : _title(title), _mask(1)
 
  236SdlConnectionDialogWrapper::EventArg::EventArg(MsgType type, 
const std::string& msg, 
bool visible)
 
  237    : _message(msg), _type(type), _visible(visible), _mask(14)
 
  241bool SdlConnectionDialogWrapper::EventArg::hasTitle()
 const 
  246const std::string& SdlConnectionDialogWrapper::EventArg::title()
 const 
  251bool SdlConnectionDialogWrapper::EventArg::hasMessage()
 const 
  256const std::string& SdlConnectionDialogWrapper::EventArg::message()
 const 
  261bool SdlConnectionDialogWrapper::EventArg::hasType()
 const 
  266SdlConnectionDialogWrapper::MsgType SdlConnectionDialogWrapper::EventArg::type()
 const 
  271bool SdlConnectionDialogWrapper::EventArg::hasVisibility()
 const 
  276bool SdlConnectionDialogWrapper::EventArg::visible()
 const 
  281std::string SdlConnectionDialogWrapper::EventArg::str()
 const 
  283  std::stringstream ss;
 
  284  ss << 
"{ title:" << _title << 
", message:" << _message << 
", type:" << _type
 
  285     << 
", visible:" << _visible << 
", mask:" << _mask << 
"}";
 
SdlConnectionDialogWrapper(wLog *log)
 
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.