25#include "sdl_utils.hpp"
27#include "sdl_freerdp.hpp"
31#include <freerdp/version.h>
32#include <freerdp/utils/string.h>
35#define EV_CASE_STR(x) \
39const char* sdl_error_string(Sint32 res)
44 return SDL_GetError();
47BOOL sdl_log_error_ex(Sint32 res, wLog* log,
const char* what,
const char* file,
size_t line,
50 const char* msg = sdl_error_string(res);
57 WLog_Print(log, WLOG_ERROR,
"[%s:%" PRIuz
"][%s]: %s", fkt, line, what, msg);
61bool sdl_push_user_event(Uint32 type, ...)
64 SDL_UserEvent*
event = &ev.user;
71 case SDL_EVENT_USER_AUTH_RESULT:
74 arg->user = va_arg(ap,
char*);
75 arg->domain = va_arg(ap,
char*);
76 arg->password = va_arg(ap,
char*);
77 arg->result = va_arg(ap, Sint32);
80 case SDL_EVENT_USER_AUTH_DIALOG:
84 arg->title = va_arg(ap,
char*);
85 arg->user = va_arg(ap,
char*);
86 arg->domain = va_arg(ap,
char*);
87 arg->password = va_arg(ap,
char*);
88 arg->result = va_arg(ap, Sint32);
91 case SDL_EVENT_USER_SCARD_DIALOG:
93 event->data1 = va_arg(ap,
char*);
94 event->data2 = va_arg(ap,
char**);
95 event->code = va_arg(ap, Sint32);
98 case SDL_EVENT_USER_RETRY_DIALOG:
99 event->code = va_arg(ap, Sint32);
101 case SDL_EVENT_USER_SCARD_RESULT:
102 case SDL_EVENT_USER_SHOW_RESULT:
103 case SDL_EVENT_USER_CERT_RESULT:
104 event->code = va_arg(ap, Sint32);
107 case SDL_EVENT_USER_SHOW_DIALOG:
108 event->data1 = va_arg(ap,
char*);
109 event->data2 = va_arg(ap,
char*);
110 event->code = va_arg(ap, Sint32);
112 case SDL_EVENT_USER_CERT_DIALOG:
113 event->data1 = va_arg(ap,
char*);
114 event->data2 = va_arg(ap,
char*);
116 case SDL_EVENT_USER_UPDATE:
117 event->data1 = va_arg(ap,
void*);
119 case SDL_EVENT_USER_POINTER_POSITION:
120 event->data1 =
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
121 event->data2 =
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap, UINT32)));
123 case SDL_EVENT_USER_POINTER_SET:
124 event->data1 = va_arg(ap,
void*);
125 event->data2 = va_arg(ap,
void*);
127 case SDL_EVENT_USER_CREATE_WINDOWS:
128 event->data1 = va_arg(ap,
void*);
130 case SDL_EVENT_USER_WINDOW_FULLSCREEN:
131 event->data1 = va_arg(ap,
void*);
132 event->code = va_arg(ap,
int);
133 event->data2 =
reinterpret_cast<void*
>(
static_cast<uintptr_t
>(va_arg(ap,
int)));
135 case SDL_EVENT_USER_WINDOW_RESIZEABLE:
136 event->data1 = va_arg(ap,
void*);
137 event->code = va_arg(ap,
int);
139 case SDL_EVENT_USER_WINDOW_MINIMIZE:
140 case SDL_EVENT_USER_QUIT:
141 case SDL_EVENT_USER_POINTER_NULL:
142 case SDL_EVENT_USER_POINTER_DEFAULT:
143 case SDL_EVENT_CLIPBOARD_UPDATE:
147 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] unsupported type %u", __func__, type);
151 const auto rc = SDL_PushEvent(&ev);
153 SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"[%s] SDL_PushEvent returned %d", __func__, rc);
160 ev.type = SDL_EVENT_QUIT;
167 UINT32 orientaion_to_rdp(SDL_DisplayOrientation orientation)
171 case SDL_ORIENTATION_LANDSCAPE:
172 return ORIENTATION_LANDSCAPE;
173 case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
174 return ORIENTATION_LANDSCAPE_FLIPPED;
175 case SDL_ORIENTATION_PORTRAIT_FLIPPED:
176 return ORIENTATION_PORTRAIT_FLIPPED;
177 case SDL_ORIENTATION_PORTRAIT:
179 return ORIENTATION_PORTRAIT;
183 std::string touchFlagsToString(Uint32 flags)
185 std::stringstream ss;
188 for (
size_t x = 0; x < 32; x++)
190 const Uint32 mask = 1u << x;
196 ss << freerdp_input_touch_state_string(mask);
203 std::string toString(SDL_DisplayOrientation orientation)
207 case SDL_ORIENTATION_LANDSCAPE:
208 return "SDL_ORIENTATION_LANDSCAPE";
209 case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
210 return "SDL_ORIENTATION_LANDSCAPE_FLIPPED";
211 case SDL_ORIENTATION_PORTRAIT_FLIPPED:
212 return "SDL_ORIENTATION_PORTRAIT_FLIPPED";
213 case SDL_ORIENTATION_PORTRAIT:
214 return "SDL_ORIENTATION_PORTRAIT";
217 std::stringstream ss;
218 ss <<
"SDL_ORIENTATION_UNKNOWN[0x" << std::hex << std::setw(8) << std::setfill(
'0')
219 << orientation <<
"]";
225 std::string toString(FreeRDP_DesktopRotationFlags orientation)
227 return freerdp_desktop_rotation_flags_to_string(orientation);
230 std::string toString(
const SDL_DisplayMode* mode)
233 return "SDL_DisplayMode=null";
235 std::stringstream ss;
238 <<
"id=" << mode->displayID <<
","
239 <<
"fmt=" << mode->format <<
","
240 <<
"w=" << mode->w <<
","
241 <<
"h=" << mode->h <<
","
242 <<
"dpi=" << mode->pixel_density <<
","
243 <<
"refresh=" << mode->refresh_rate <<
","
244 <<
"num=" << mode->refresh_rate_numerator <<
","
245 <<
"denom=" << mode->refresh_rate_denominator <<
"]";
250 std::string toString(Uint32 type)
254 EV_CASE_STR(SDL_EVENT_FIRST);
255 EV_CASE_STR(SDL_EVENT_QUIT);
256 EV_CASE_STR(SDL_EVENT_TERMINATING);
257 EV_CASE_STR(SDL_EVENT_LOW_MEMORY);
258 EV_CASE_STR(SDL_EVENT_WILL_ENTER_BACKGROUND);
259 EV_CASE_STR(SDL_EVENT_DID_ENTER_BACKGROUND);
260 EV_CASE_STR(SDL_EVENT_WILL_ENTER_FOREGROUND);
261 EV_CASE_STR(SDL_EVENT_DID_ENTER_FOREGROUND);
262 EV_CASE_STR(SDL_EVENT_LOCALE_CHANGED);
263 EV_CASE_STR(SDL_EVENT_SYSTEM_THEME_CHANGED);
264 EV_CASE_STR(SDL_EVENT_DISPLAY_ORIENTATION);
265 EV_CASE_STR(SDL_EVENT_DISPLAY_ADDED);
266 EV_CASE_STR(SDL_EVENT_DISPLAY_REMOVED);
267 EV_CASE_STR(SDL_EVENT_DISPLAY_MOVED);
268 EV_CASE_STR(SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED);
269 EV_CASE_STR(SDL_EVENT_WINDOW_SHOWN);
270 EV_CASE_STR(SDL_EVENT_WINDOW_HIDDEN);
271 EV_CASE_STR(SDL_EVENT_WINDOW_EXPOSED);
272 EV_CASE_STR(SDL_EVENT_WINDOW_MOVED);
273 EV_CASE_STR(SDL_EVENT_WINDOW_RESIZED);
274 EV_CASE_STR(SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED);
275 EV_CASE_STR(SDL_EVENT_WINDOW_MINIMIZED);
276 EV_CASE_STR(SDL_EVENT_WINDOW_MAXIMIZED);
277 EV_CASE_STR(SDL_EVENT_WINDOW_RESTORED);
278 EV_CASE_STR(SDL_EVENT_WINDOW_MOUSE_ENTER);
279 EV_CASE_STR(SDL_EVENT_WINDOW_MOUSE_LEAVE);
280 EV_CASE_STR(SDL_EVENT_WINDOW_FOCUS_GAINED);
281 EV_CASE_STR(SDL_EVENT_WINDOW_FOCUS_LOST);
282 EV_CASE_STR(SDL_EVENT_WINDOW_CLOSE_REQUESTED);
283 EV_CASE_STR(SDL_EVENT_WINDOW_HIT_TEST);
284 EV_CASE_STR(SDL_EVENT_WINDOW_ICCPROF_CHANGED);
285 EV_CASE_STR(SDL_EVENT_WINDOW_DISPLAY_CHANGED);
286 EV_CASE_STR(SDL_EVENT_WINDOW_SAFE_AREA_CHANGED);
287 EV_CASE_STR(SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED);
288 EV_CASE_STR(SDL_EVENT_WINDOW_OCCLUDED);
289 EV_CASE_STR(SDL_EVENT_WINDOW_ENTER_FULLSCREEN);
290 EV_CASE_STR(SDL_EVENT_WINDOW_LEAVE_FULLSCREEN);
291 EV_CASE_STR(SDL_EVENT_WINDOW_DESTROYED);
293 EV_CASE_STR(SDL_EVENT_KEY_DOWN);
294 EV_CASE_STR(SDL_EVENT_KEY_UP);
295 EV_CASE_STR(SDL_EVENT_TEXT_EDITING);
296 EV_CASE_STR(SDL_EVENT_TEXT_INPUT);
297 EV_CASE_STR(SDL_EVENT_KEYMAP_CHANGED);
298 EV_CASE_STR(SDL_EVENT_KEYBOARD_ADDED);
299 EV_CASE_STR(SDL_EVENT_KEYBOARD_REMOVED);
301 EV_CASE_STR(SDL_EVENT_MOUSE_MOTION);
302 EV_CASE_STR(SDL_EVENT_MOUSE_BUTTON_DOWN);
303 EV_CASE_STR(SDL_EVENT_MOUSE_BUTTON_UP);
304 EV_CASE_STR(SDL_EVENT_MOUSE_WHEEL);
305 EV_CASE_STR(SDL_EVENT_MOUSE_ADDED);
306 EV_CASE_STR(SDL_EVENT_MOUSE_REMOVED);
308 EV_CASE_STR(SDL_EVENT_JOYSTICK_AXIS_MOTION);
309 EV_CASE_STR(SDL_EVENT_JOYSTICK_BALL_MOTION);
310 EV_CASE_STR(SDL_EVENT_JOYSTICK_HAT_MOTION);
311 EV_CASE_STR(SDL_EVENT_JOYSTICK_BUTTON_DOWN);
312 EV_CASE_STR(SDL_EVENT_JOYSTICK_BUTTON_UP);
313 EV_CASE_STR(SDL_EVENT_JOYSTICK_ADDED);
314 EV_CASE_STR(SDL_EVENT_JOYSTICK_REMOVED);
315 EV_CASE_STR(SDL_EVENT_JOYSTICK_BATTERY_UPDATED);
316 EV_CASE_STR(SDL_EVENT_JOYSTICK_UPDATE_COMPLETE);
318 EV_CASE_STR(SDL_EVENT_GAMEPAD_AXIS_MOTION);
319 EV_CASE_STR(SDL_EVENT_GAMEPAD_BUTTON_DOWN);
320 EV_CASE_STR(SDL_EVENT_GAMEPAD_BUTTON_UP);
321 EV_CASE_STR(SDL_EVENT_GAMEPAD_ADDED);
322 EV_CASE_STR(SDL_EVENT_GAMEPAD_REMOVED);
323 EV_CASE_STR(SDL_EVENT_GAMEPAD_REMAPPED);
324 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN);
325 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION);
326 EV_CASE_STR(SDL_EVENT_GAMEPAD_TOUCHPAD_UP);
327 EV_CASE_STR(SDL_EVENT_GAMEPAD_SENSOR_UPDATE);
328 EV_CASE_STR(SDL_EVENT_GAMEPAD_UPDATE_COMPLETE);
329 EV_CASE_STR(SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED);
331 EV_CASE_STR(SDL_EVENT_FINGER_DOWN);
332 EV_CASE_STR(SDL_EVENT_FINGER_UP);
333 EV_CASE_STR(SDL_EVENT_FINGER_MOTION);
335 EV_CASE_STR(SDL_EVENT_CLIPBOARD_UPDATE);
337 EV_CASE_STR(SDL_EVENT_DROP_FILE);
338 EV_CASE_STR(SDL_EVENT_DROP_TEXT);
339 EV_CASE_STR(SDL_EVENT_DROP_BEGIN);
340 EV_CASE_STR(SDL_EVENT_DROP_COMPLETE);
341 EV_CASE_STR(SDL_EVENT_DROP_POSITION);
343 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_ADDED);
344 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_REMOVED);
345 EV_CASE_STR(SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED);
347 EV_CASE_STR(SDL_EVENT_SENSOR_UPDATE);
349 EV_CASE_STR(SDL_EVENT_PEN_DOWN);
350 EV_CASE_STR(SDL_EVENT_PEN_UP);
351 EV_CASE_STR(SDL_EVENT_PEN_MOTION);
352 EV_CASE_STR(SDL_EVENT_PEN_BUTTON_DOWN);
353 EV_CASE_STR(SDL_EVENT_PEN_BUTTON_UP);
354 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_ADDED);
355 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_REMOVED);
356 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_APPROVED);
357 EV_CASE_STR(SDL_EVENT_CAMERA_DEVICE_DENIED);
359 EV_CASE_STR(SDL_EVENT_RENDER_TARGETS_RESET);
360 EV_CASE_STR(SDL_EVENT_RENDER_DEVICE_RESET);
361 EV_CASE_STR(SDL_EVENT_POLL_SENTINEL);
363 EV_CASE_STR(SDL_EVENT_USER);
365 EV_CASE_STR(SDL_EVENT_USER_CERT_DIALOG);
366 EV_CASE_STR(SDL_EVENT_USER_CERT_RESULT);
367 EV_CASE_STR(SDL_EVENT_USER_SHOW_DIALOG);
368 EV_CASE_STR(SDL_EVENT_USER_SHOW_RESULT);
369 EV_CASE_STR(SDL_EVENT_USER_AUTH_DIALOG);
370 EV_CASE_STR(SDL_EVENT_USER_AUTH_RESULT);
371 EV_CASE_STR(SDL_EVENT_USER_SCARD_DIALOG);
372 EV_CASE_STR(SDL_EVENT_USER_RETRY_DIALOG);
373 EV_CASE_STR(SDL_EVENT_USER_SCARD_RESULT);
374 EV_CASE_STR(SDL_EVENT_USER_UPDATE);
375 EV_CASE_STR(SDL_EVENT_USER_CREATE_WINDOWS);
376 EV_CASE_STR(SDL_EVENT_USER_WINDOW_RESIZEABLE);
377 EV_CASE_STR(SDL_EVENT_USER_WINDOW_FULLSCREEN);
378 EV_CASE_STR(SDL_EVENT_USER_WINDOW_MINIMIZE);
379 EV_CASE_STR(SDL_EVENT_USER_POINTER_NULL);
380 EV_CASE_STR(SDL_EVENT_USER_POINTER_DEFAULT);
381 EV_CASE_STR(SDL_EVENT_USER_POINTER_POSITION);
382 EV_CASE_STR(SDL_EVENT_USER_POINTER_SET);
383 EV_CASE_STR(SDL_EVENT_USER_QUIT);
385 EV_CASE_STR(SDL_EVENT_LAST);
388 std::stringstream ss;
389 ss <<
"SDL_UNKNOWNEVENT[0x" << std::hex << std::setw(8) << std::setfill(
'0') << type
396 std::string generate_uuid_v4()
398 static std::random_device rd;
399 static std::mt19937 gen(rd());
400 static std::uniform_int_distribution<> dis(0, 255);
401 std::stringstream ss;
402 ss << std::hex << std::setfill(
'0') << std::setw(2);
403 for (
int i = 0; i < 4; i++)
408 for (
int i = 0; i < 2; i++)
413 for (
int i = 0; i < 2; i++)
418 for (
int i = 0; i < 2; i++)
423 for (
int i = 0; i < 6; i++)
430 HighDpiScaleMode platformScaleMode()
432 const auto platform = SDL_GetPlatform();
434 return SCALE_MODE_INVALID;
435 if (strcmp(
"Windows", platform) == 0)
436 return SCALE_MODE_X11;
437 if (strcmp(
"macOS", platform) == 0)
438 return SCALE_MODE_WAYLAND;
439 if (strcmp(
"Linux", platform) == 0)
441 const auto driver = SDL_GetCurrentVideoDriver();
443 return SCALE_MODE_WAYLAND;
444 if (strcmp(
"x11", driver) == 0)
445 return SCALE_MODE_X11;
446 if (strcmp(
"wayland", driver) == 0)
447 return SCALE_MODE_WAYLAND;
449 return SCALE_MODE_INVALID;
452 std::string windowTitle(
const rdpSettings* settings)
454 const char* prefix =
"FreeRDP:";
466 const auto addPort = (port != 3389);
468 std::stringstream ss;
473 ss << name <<
":" << port;
481 struct sdl_exitCode_map_t
485 const char* code_tag;
488#define ENTRY(x, y) { x, y, #y }
489 static const struct sdl_exitCode_map_t sdl_exitCode_map[] = {
490 ENTRY(FREERDP_ERROR_SUCCESS, SUCCESS), ENTRY(FREERDP_ERROR_NONE, DISCONNECT),
491 ENTRY(FREERDP_ERROR_NONE, LOGOFF), ENTRY(FREERDP_ERROR_NONE, IDLE_TIMEOUT),
492 ENTRY(FREERDP_ERROR_NONE, LOGON_TIMEOUT), ENTRY(FREERDP_ERROR_NONE, CONN_REPLACED),
493 ENTRY(FREERDP_ERROR_NONE, OUT_OF_MEMORY), ENTRY(FREERDP_ERROR_NONE, CONN_DENIED),
494 ENTRY(FREERDP_ERROR_NONE, CONN_DENIED_FIPS), ENTRY(FREERDP_ERROR_NONE, USER_PRIVILEGES),
495 ENTRY(FREERDP_ERROR_NONE, FRESH_CREDENTIALS_REQUIRED),
496 ENTRY(ERRINFO_LOGOFF_BY_USER, DISCONNECT_BY_USER), ENTRY(FREERDP_ERROR_NONE, UNKNOWN),
499 ENTRY(FREERDP_ERROR_NONE, LICENSE_INTERNAL),
500 ENTRY(FREERDP_ERROR_NONE, LICENSE_NO_LICENSE_SERVER),
501 ENTRY(FREERDP_ERROR_NONE, LICENSE_NO_LICENSE),
502 ENTRY(FREERDP_ERROR_NONE, LICENSE_BAD_CLIENT_MSG),
503 ENTRY(FREERDP_ERROR_NONE, LICENSE_HWID_DOESNT_MATCH),
504 ENTRY(FREERDP_ERROR_NONE, LICENSE_BAD_CLIENT),
505 ENTRY(FREERDP_ERROR_NONE, LICENSE_CANT_FINISH_PROTOCOL),
506 ENTRY(FREERDP_ERROR_NONE, LICENSE_CLIENT_ENDED_PROTOCOL),
507 ENTRY(FREERDP_ERROR_NONE, LICENSE_BAD_CLIENT_ENCRYPTION),
508 ENTRY(FREERDP_ERROR_NONE, LICENSE_CANT_UPGRADE),
509 ENTRY(FREERDP_ERROR_NONE, LICENSE_NO_REMOTE_CONNECTIONS),
510 ENTRY(FREERDP_ERROR_NONE, LICENSE_CANT_UPGRADE),
513 ENTRY(FREERDP_ERROR_NONE, RDP),
516 ENTRY(FREERDP_ERROR_NONE, PARSE_ARGUMENTS), ENTRY(FREERDP_ERROR_NONE, MEMORY),
517 ENTRY(FREERDP_ERROR_NONE, PROTOCOL), ENTRY(FREERDP_ERROR_NONE, CONN_FAILED),
519 ENTRY(FREERDP_ERROR_AUTHENTICATION_FAILED, AUTH_FAILURE),
520 ENTRY(FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED, NEGO_FAILURE),
521 ENTRY(FREERDP_ERROR_CONNECT_LOGON_FAILURE, LOGON_FAILURE),
522 ENTRY(FREERDP_ERROR_CONNECT_TARGET_BOOTING, CONNECT_TARGET_BOOTING),
523 ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT, ACCOUNT_LOCKED_OUT),
524 ENTRY(FREERDP_ERROR_PRE_CONNECT_FAILED, PRE_CONNECT_FAILED),
525 ENTRY(FREERDP_ERROR_CONNECT_UNDEFINED, CONNECT_UNDEFINED),
526 ENTRY(FREERDP_ERROR_POST_CONNECT_FAILED, POST_CONNECT_FAILED),
527 ENTRY(FREERDP_ERROR_DNS_ERROR, DNS_ERROR),
528 ENTRY(FREERDP_ERROR_DNS_NAME_NOT_FOUND, DNS_NAME_NOT_FOUND),
529 ENTRY(FREERDP_ERROR_CONNECT_FAILED, CONNECT_FAILED),
530 ENTRY(FREERDP_ERROR_MCS_CONNECT_INITIAL_ERROR, MCS_CONNECT_INITIAL_ERROR),
531 ENTRY(FREERDP_ERROR_TLS_CONNECT_FAILED, TLS_CONNECT_FAILED),
532 ENTRY(FREERDP_ERROR_INSUFFICIENT_PRIVILEGES, INSUFFICIENT_PRIVILEGES),
533 ENTRY(FREERDP_ERROR_CONNECT_CANCELLED, CONNECT_CANCELLED),
534 ENTRY(FREERDP_ERROR_CONNECT_TRANSPORT_FAILED, CONNECT_TRANSPORT_FAILED),
535 ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED, CONNECT_PASSWORD_EXPIRED),
536 ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE, CONNECT_PASSWORD_MUST_CHANGE),
537 ENTRY(FREERDP_ERROR_CONNECT_KDC_UNREACHABLE, CONNECT_KDC_UNREACHABLE),
538 ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED, CONNECT_ACCOUNT_DISABLED),
539 ENTRY(FREERDP_ERROR_CONNECT_PASSWORD_CERTAINLY_EXPIRED, CONNECT_PASSWORD_CERTAINLY_EXPIRED),
540 ENTRY(FREERDP_ERROR_CONNECT_CLIENT_REVOKED, CONNECT_CLIENT_REVOKED),
541 ENTRY(FREERDP_ERROR_CONNECT_WRONG_PASSWORD, CONNECT_WRONG_PASSWORD),
542 ENTRY(FREERDP_ERROR_CONNECT_ACCESS_DENIED, CONNECT_ACCESS_DENIED),
543 ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION, CONNECT_ACCOUNT_RESTRICTION),
544 ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED, CONNECT_ACCOUNT_EXPIRED),
545 ENTRY(FREERDP_ERROR_CONNECT_LOGON_TYPE_NOT_GRANTED, CONNECT_LOGON_TYPE_NOT_GRANTED),
546 ENTRY(FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS, CONNECT_NO_OR_MISSING_CREDENTIALS)
549 static const sdl_exitCode_map_t* mapEntryByCode(
int exit_code)
551 for (
const auto& x : sdl_exitCode_map)
554 if (cur->code == exit_code)
560 static const sdl_exitCode_map_t* mapEntryByError(UINT32 error)
562 for (
const auto& x : sdl_exitCode_map)
565 if (cur->error == error)
571 int errorToExitCode(DWORD error)
573 auto entry = mapEntryByError(error);
580 const char* errorToExitCodeTag(UINT32 error)
582 auto entry = mapEntryByError(error);
584 return entry->code_tag;
588 const char* exitCodeToTag(
int code)
590 auto entry = mapEntryByCode(code);
592 return entry->code_tag;
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_server_name(const rdpSettings *settings)
A helper function to return the correct server name.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.