FreeRDP
Loading...
Searching...
No Matches
sdl_connection_dialog_wrapper.cpp
1
21#include "sdl_connection_dialog_wrapper.hpp"
22#include "sdl_connection_dialog.hpp"
23#include "../sdl_utils.hpp"
24
26
27SdlConnectionDialogWrapper::~SdlConnectionDialogWrapper() = default;
28
29void SdlConnectionDialogWrapper::create(rdpContext* context)
30{
31 std::unique_lock lock(_mux);
32 _connection_dialog = std::make_unique<SDLConnectionDialog>(context);
33 sdl_push_user_event(SDL_EVENT_USER_UPDATE_CONNECT_DIALOG);
34}
35
36void SdlConnectionDialogWrapper::destroy()
37{
38 std::unique_lock lock(_mux);
39 _connection_dialog.reset();
40 sdl_push_user_event(SDL_EVENT_USER_UPDATE_CONNECT_DIALOG);
41}
42
43bool SdlConnectionDialogWrapper::isRunning() const
44{
45 std::unique_lock lock(_mux);
46 if (!_connection_dialog)
47 return false;
48 return _connection_dialog->running();
49}
50
51bool SdlConnectionDialogWrapper::isVisible() const
52{
53 std::unique_lock lock(_mux);
54 if (!_connection_dialog)
55 return false;
56 return _connection_dialog->visible();
57}
58
59bool SdlConnectionDialogWrapper::handleEvent(const SDL_Event& event)
60{
61 std::unique_lock lock(_mux);
62 if (!_connection_dialog)
63 return false;
64 return _connection_dialog->handle(event);
65}
66
67WINPR_ATTR_FORMAT_ARG(1, 0)
68static std::string format(WINPR_FORMAT_ARG const char* fmt, va_list ap)
69{
70 va_list ap1;
71 va_copy(ap1, ap);
72 const int size = vsnprintf(nullptr, 0, fmt, ap1);
73 va_end(ap1);
74
75 if (size < 0)
76 return "";
77
78 std::string msg;
79 msg.resize(static_cast<size_t>(size) + 1);
80
81 va_list ap2;
82 va_copy(ap2, ap);
83 (void)vsnprintf(msg.data(), msg.size(), fmt, ap2);
84 va_end(ap2);
85 return msg;
86}
87
88void SdlConnectionDialogWrapper::setTitle(const char* fmt, ...)
89{
90 va_list ap;
91 va_start(ap, fmt);
92 setTitle(format(fmt, ap));
93 va_end(ap);
94}
95
96void SdlConnectionDialogWrapper::setTitle(const std::string& title)
97{
98 std::unique_lock lock(_mux);
99 _title = title;
100 sdl_push_user_event(SDL_EVENT_USER_UPDATE_CONNECT_DIALOG);
101}
102
103void SdlConnectionDialogWrapper::showInfo(const char* fmt, ...)
104{
105 va_list ap;
106 va_start(ap, fmt);
107 showInfo(format(fmt, ap));
108 va_end(ap);
109}
110
111void SdlConnectionDialogWrapper::showInfo(const std::string& info)
112{
113 show(MSG_INFO, info);
114}
115
116void SdlConnectionDialogWrapper::showWarn(const char* fmt, ...)
117{
118 va_list ap;
119 va_start(ap, fmt);
120 showWarn(format(fmt, ap));
121 va_end(ap);
122}
123
124void SdlConnectionDialogWrapper::showWarn(const std::string& info)
125{
126 show(MSG_WARN, info);
127}
128
129void SdlConnectionDialogWrapper::showError(const char* fmt, ...)
130{
131 va_list ap;
132 va_start(ap, fmt);
133 showError(format(fmt, ap));
134 va_end(ap);
135}
136
137void SdlConnectionDialogWrapper::showError(const std::string& error)
138{
139 show(MSG_ERROR, error);
140}
141
142void SdlConnectionDialogWrapper::show(SdlConnectionDialogWrapper::MsgType type,
143 const std::string& msg)
144{
145 std::unique_lock lock(_mux);
146 _message = msg;
147 _type = type;
148 _visible = true;
149 sdl_push_user_event(SDL_EVENT_USER_UPDATE_CONNECT_DIALOG);
150}
151
152void SdlConnectionDialogWrapper::show(bool visible)
153{
154 std::unique_lock lock(_mux);
155 _visible = visible;
156 sdl_push_user_event(SDL_EVENT_USER_UPDATE_CONNECT_DIALOG);
157}
158
159void SdlConnectionDialogWrapper::handleShow()
160{
161 std::unique_lock lock(_mux);
162 if (!_connection_dialog)
163 return;
164
165 _connection_dialog->setTitle(_title.c_str());
166 if (!_visible)
167 {
168 _connection_dialog->hide();
169 return;
170 }
171
172 switch (_type)
173 {
174 case SdlConnectionDialogWrapper::MSG_INFO:
175 _connection_dialog->showInfo(_message.c_str());
176 break;
177 case SdlConnectionDialogWrapper::MSG_WARN:
178 _connection_dialog->showWarn(_message.c_str());
179 break;
180 case SdlConnectionDialogWrapper::MSG_ERROR:
181 _connection_dialog->showError(_message.c_str());
182 break;
183 default:
184 break;
185 }
186
187 _connection_dialog->show();
188}