FreeRDP
Loading...
Searching...
No Matches
TestClientCmdLine.c
1#include <freerdp/config.h>
2
3#include <freerdp/client.h>
4#include <freerdp/client/cmdline.h>
5#include <freerdp/settings.h>
6#include <winpr/cmdline.h>
7#include <winpr/spec.h>
8#include <winpr/strlst.h>
9#include <winpr/collections.h>
10
11typedef BOOL (*validate_settings_pr)(rdpSettings* settings);
12typedef void (*setup_settings_pr)(rdpSettings* settings);
13
14#define printref() printf("%s:%d: in function %-40s:", __FILE__, __LINE__, __func__)
15
16#define TEST_ERROR(format, ...) \
17 do \
18 { \
19 (void)fprintf(stderr, format, ##__VA_ARGS__); \
20 printref(); \
21 (void)printf(format, ##__VA_ARGS__); \
22 (void)fflush(stdout); \
23 } while (0)
24
25#define TEST_FAILURE(format, ...) \
26 do \
27 { \
28 printref(); \
29 (void)printf(" FAILURE "); \
30 (void)printf(format, ##__VA_ARGS__); \
31 (void)fflush(stdout); \
32 } while (0)
33
34static void print_test_title(int argc, char** argv)
35{
36 printf("Running test:");
37
38 for (int i = 0; i < argc; i++)
39 {
40 printf(" %s", argv[i]);
41 }
42
43 printf("\n");
44}
45
46static inline BOOL testcase(const char* name, char** argv, size_t argc, int expected_return,
47 validate_settings_pr validate_settings,
48 setup_settings_pr setup_settings)
49{
50 int status = 0;
51 BOOL valid_settings = TRUE;
52 rdpSettings* settings = freerdp_settings_new(0);
53
54 WINPR_ASSERT(argc <= INT_MAX);
55
56 print_test_title((int)argc, argv);
57
58 if (!settings)
59 {
60 TEST_ERROR("Test %s could not allocate settings!\n", name);
61 return FALSE;
62 }
63
64 if (setup_settings)
65 setup_settings(settings);
66
67 status = freerdp_client_settings_parse_command_line(settings, (int)argc, argv, FALSE);
68
69 if (validate_settings)
70 {
71 valid_settings = validate_settings(settings);
72 }
73
74 freerdp_settings_free(settings);
75
76 if (status == expected_return)
77 {
78 if (!valid_settings)
79 {
80 return FALSE;
81 }
82 }
83 else
84 {
85 TEST_FAILURE("Expected status %d, got status %d\n", expected_return, status);
86 return FALSE;
87 }
88
89 return TRUE;
90}
91
92#if defined(_WIN32)
93#define DRIVE_REDIRECT_PATH "c:\\Windows"
94#else
95#define DRIVE_REDIRECT_PATH "/tmp"
96#endif
97
98static BOOL check_settings_gateway_response_timeout(rdpSettings* settings, UINT32 expected)
99{
100 const UINT32 val = freerdp_settings_get_uint32(settings, FreeRDP_GatewayResponseTimeout);
101
102 if (val != expected)
103 {
104 TEST_FAILURE("Expected GatewayResponseTimeout = %" PRIu32 ", but got %" PRIu32 "!\n",
105 expected, val);
106 return FALSE;
107 }
108
109 return TRUE;
110}
111
112static BOOL check_settings_gateway_response_timeout_default(rdpSettings* settings)
113{
114 return check_settings_gateway_response_timeout(settings, 15000);
115}
116
117static BOOL check_settings_gateway_response_timeout_custom(rdpSettings* settings)
118{
119 return check_settings_gateway_response_timeout(settings, 120000);
120}
121
122static const char test_aad_user_agent[] = "TestAgent/1.0 (KHTML, like Gecko)";
123
124static BOOL check_settings_aad_user_agent(rdpSettings* settings)
125{
126 const char* ua = freerdp_settings_get_string(settings, FreeRDP_AadAuthUserAgent);
127 if (!ua || (strcmp(ua, test_aad_user_agent) != 0))
128 {
129 TEST_FAILURE("Expected AadAuthUserAgent = \"%s\", but got %s!\n", test_aad_user_agent,
130 ua ? ua : "(null)");
131 return FALSE;
132 }
133 return TRUE;
134}
135
136static BOOL check_settings_smartcard_no_redirection(rdpSettings* settings)
137{
138 BOOL result = TRUE;
139
140 if (freerdp_settings_get_bool(settings, FreeRDP_RedirectSmartCards))
141 {
142 TEST_FAILURE("Expected RedirectSmartCards = FALSE, but RedirectSmartCards = TRUE!\n");
143 result = FALSE;
144 }
145
146 if (freerdp_device_collection_find_type(settings, RDPDR_DTYP_SMARTCARD))
147 {
148 TEST_FAILURE("Expected no SMARTCARD device, but found at least one!\n");
149 result = FALSE;
150 }
151
152 return result;
153}
154
155#ifndef TEST_SOURCE_DIR
156#error "TEST_SOURCE_DIR must be defined to the test source directory"
157#endif
158#define DISABLED_DISPLAY_OPTIONS_RDP TEST_SOURCE_DIR "/rdp-cmdline/disabled-display-options.rdp"
159
160static BOOL check_settings_multimon_disabled(rdpSettings* settings)
161{
162 BOOL result = TRUE;
163
164 if (freerdp_settings_get_bool(settings, FreeRDP_UseMultimon))
165 {
166 TEST_FAILURE("Expected UseMultimon = FALSE, but UseMultimon = TRUE!\n");
167 result = FALSE;
168 }
169
170 if (freerdp_settings_get_bool(settings, FreeRDP_ForceMultimon))
171 {
172 TEST_FAILURE("Expected ForceMultimon = FALSE, but ForceMultimon = TRUE!\n");
173 result = FALSE;
174 }
175
176 if (!freerdp_settings_get_bool(settings, FreeRDP_SmartSizing))
177 {
178 TEST_FAILURE("Expected SmartSizing = TRUE, but SmartSizing = FALSE!\n");
179 result = FALSE;
180 }
181
182 return result;
183}
184
185static BOOL check_settings_smart_sizing_disabled(rdpSettings* settings)
186{
187 BOOL result = TRUE;
188
189 if (freerdp_settings_get_bool(settings, FreeRDP_SmartSizing))
190 {
191 TEST_FAILURE("Expected SmartSizing = FALSE, but SmartSizing = TRUE!\n");
192 result = FALSE;
193 }
194
195 if (!freerdp_settings_get_bool(settings, FreeRDP_DynamicResolutionUpdate))
196 {
197 TEST_FAILURE(
198 "Expected DynamicResolutionUpdate = TRUE, but DynamicResolutionUpdate = FALSE!\n");
199 result = FALSE;
200 }
201
202 if (!freerdp_settings_get_bool(settings, FreeRDP_UseMultimon))
203 {
204 TEST_FAILURE("Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
205 result = FALSE;
206 }
207
208 return result;
209}
210
211static BOOL check_settings_multimon_enabled(rdpSettings* settings)
212{
213 BOOL result = TRUE;
214
215 if (!freerdp_settings_get_bool(settings, FreeRDP_UseMultimon))
216 {
217 TEST_FAILURE("Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
218 result = FALSE;
219 }
220
221 return result;
222}
223
224static void setup_settings_multimon_force(rdpSettings* settings)
225{
226 (void)freerdp_settings_set_bool(settings, FreeRDP_ForceMultimon, TRUE);
227}
228
229static BOOL check_settings_multimon_force(rdpSettings* settings)
230{
231 BOOL result = TRUE;
232
233 if (!freerdp_settings_get_bool(settings, FreeRDP_UseMultimon))
234 {
235 TEST_FAILURE("Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
236 result = FALSE;
237 }
238
239 if (!freerdp_settings_get_bool(settings, FreeRDP_ForceMultimon))
240 {
241 TEST_FAILURE("Expected ForceMultimon = TRUE, but ForceMultimon = FALSE!\n");
242 result = FALSE;
243 }
244
245 return result;
246}
247
248static BOOL check_settings_smart_sizing_size(rdpSettings* settings)
249{
250 BOOL result = TRUE;
251
252 if (!freerdp_settings_get_bool(settings, FreeRDP_SmartSizing))
253 {
254 TEST_FAILURE("Expected SmartSizing = TRUE, but SmartSizing = FALSE!\n");
255 result = FALSE;
256 }
257
258 if (freerdp_settings_get_uint32(settings, FreeRDP_SmartSizingWidth) != 1024)
259 {
260 TEST_FAILURE("Expected SmartSizingWidth = 1024, but SmartSizingWidth = %u!\n",
261 (unsigned)freerdp_settings_get_uint32(settings, FreeRDP_SmartSizingWidth));
262 result = FALSE;
263 }
264
265 if (freerdp_settings_get_uint32(settings, FreeRDP_SmartSizingHeight) != 768)
266 {
267 TEST_FAILURE("Expected SmartSizingHeight = 768, but SmartSizingHeight = %u!\n",
268 (unsigned)freerdp_settings_get_uint32(settings, FreeRDP_SmartSizingHeight));
269 result = FALSE;
270 }
271
272 return result;
273}
274
275#if defined(WITH_GFX_AV1)
276static BOOL check_settings_gfx_av1(rdpSettings* settings)
277{
278 BOOL result = TRUE;
279
280 if (!freerdp_settings_get_bool(settings, FreeRDP_GfxCodecAV1))
281 {
282 TEST_FAILURE("Expected GfxCodecAV1 = TRUE, but GfxCodecAV1 = FALSE!\n");
283 result = FALSE;
284 }
285
286 return result;
287}
288#endif
289
290static BOOL check_settings_gfx_without_h264(rdpSettings* settings)
291{
292 BOOL result = TRUE;
293
294 if (freerdp_settings_get_uint32(settings, FreeRDP_ConnectionType) != CONNECTION_TYPE_AUTODETECT)
295 {
296 TEST_FAILURE("Expected ConnectionType = AUTODETECT, but ConnectionType = %u!\n",
297 (unsigned)freerdp_settings_get_uint32(settings, FreeRDP_ConnectionType));
298 result = FALSE;
299 }
300
301 if (freerdp_settings_get_bool(settings, FreeRDP_GfxH264) ||
302 freerdp_settings_get_bool(settings, FreeRDP_GfxAVC444) ||
303 freerdp_settings_get_bool(settings, FreeRDP_GfxAVC444v2))
304 {
305 TEST_FAILURE(
306 "Expected the H.264 codecs off as /gfx asked, but /network:auto turned them on!\n");
307 result = FALSE;
308 }
309
310 if (!freerdp_settings_get_bool(settings, FreeRDP_GfxProgressive))
311 {
312 TEST_FAILURE("Expected GfxProgressive = TRUE, but GfxProgressive = FALSE!\n");
313 result = FALSE;
314 }
315
316 return result;
317}
318
319static BOOL check_settings_network_auto_h264(rdpSettings* settings)
320{
321 BOOL result = TRUE;
322
323 if (!freerdp_settings_get_bool(settings, FreeRDP_GfxH264) ||
324 !freerdp_settings_get_bool(settings, FreeRDP_GfxAVC444))
325 {
326 TEST_FAILURE("Expected /network:auto alone to turn the H.264 codecs on!\n");
327 result = FALSE;
328 }
329
330 return result;
331}
332
333static BOOL check_settings_modem_with_fonts(rdpSettings* settings)
334{
335 BOOL result = TRUE;
336
337 if (freerdp_settings_get_uint32(settings, FreeRDP_ConnectionType) != CONNECTION_TYPE_MODEM)
338 {
339 TEST_FAILURE("Expected ConnectionType = MODEM, but ConnectionType = %u!\n",
340 (unsigned)freerdp_settings_get_uint32(settings, FreeRDP_ConnectionType));
341 result = FALSE;
342 }
343
344 if (!freerdp_settings_get_bool(settings, FreeRDP_AllowFontSmoothing))
345 {
346 TEST_FAILURE("Expected AllowFontSmoothing = TRUE as +fonts asked, but /network:modem "
347 "turned it off!\n");
348 result = FALSE;
349 }
350
351 if (!freerdp_settings_get_bool(settings, FreeRDP_DisableWallpaper))
352 {
353 TEST_FAILURE("Expected DisableWallpaper = TRUE, the default of /network:modem!\n");
354 result = FALSE;
355 }
356
357 return result;
358}
359
360typedef struct
361{
362 int expected_status;
363 validate_settings_pr validate_settings;
364 const char* command_line[128];
365 struct
366 {
367 int index;
368 const char* expected_value;
369 } modified_arguments[8];
370 setup_settings_pr setup_settings;
371} test;
372
373// NOLINTBEGIN(bugprone-suspicious-missing-comma)
374static const test tests[] = {
375 { COMMAND_LINE_STATUS_PRINT_HELP,
376 check_settings_smartcard_no_redirection,
377 { "testfreerdp", "--help", nullptr },
378 { WINPR_C_ARRAY_INIT } },
379 { COMMAND_LINE_STATUS_PRINT_HELP,
380 check_settings_smartcard_no_redirection,
381 { "testfreerdp", "/help", nullptr },
382 { WINPR_C_ARRAY_INIT } },
383 { COMMAND_LINE_STATUS_PRINT_HELP,
384 check_settings_smartcard_no_redirection,
385 { "testfreerdp", "-help", nullptr },
386 { WINPR_C_ARRAY_INIT } },
387 { COMMAND_LINE_STATUS_PRINT_VERSION,
388 check_settings_smartcard_no_redirection,
389 { "testfreerdp", "--version", nullptr },
390 { WINPR_C_ARRAY_INIT } },
391 { COMMAND_LINE_STATUS_PRINT_VERSION,
392 check_settings_smartcard_no_redirection,
393 { "testfreerdp", "/version", nullptr },
394 { WINPR_C_ARRAY_INIT } },
395 { COMMAND_LINE_STATUS_PRINT_VERSION,
396 check_settings_smartcard_no_redirection,
397 { "testfreerdp", "-version", nullptr },
398 { WINPR_C_ARRAY_INIT } },
399 { 0,
400 check_settings_smartcard_no_redirection,
401 { "testfreerdp", "-v", "test.freerdp.com", nullptr },
402 { WINPR_C_ARRAY_INIT } },
403 { 0,
404 check_settings_smartcard_no_redirection,
405 { "testfreerdp", "--v", "test.freerdp.com", nullptr },
406 { WINPR_C_ARRAY_INIT } },
407 { 0,
408 check_settings_smartcard_no_redirection,
409 { "testfreerdp", "/v:test.freerdp.com", nullptr },
410 { WINPR_C_ARRAY_INIT } },
411 { 0,
412 check_settings_smartcard_no_redirection,
413 { "testfreerdp", "/sound", "/drive:media," DRIVE_REDIRECT_PATH, "/v:test.freerdp.com",
414 nullptr },
415 { WINPR_C_ARRAY_INIT } },
416 { 0,
417 check_settings_smartcard_no_redirection,
418 { "testfreerdp", "-u", "test", "-p", "test", "-v", "test.freerdp.com", nullptr },
419 { { 4, "****" }, WINPR_C_ARRAY_INIT } },
420 { 0,
421 check_settings_smartcard_no_redirection,
422 { "testfreerdp", "/u:test", "/p:test", "/v:test.freerdp.com", nullptr },
423 { { 2, "/p:****" }, WINPR_C_ARRAY_INIT } },
424 { COMMAND_LINE_ERROR_NO_KEYWORD,
425 check_settings_smartcard_no_redirection,
426 { "testfreerdp", "-invalid", nullptr },
427 { WINPR_C_ARRAY_INIT } },
428 { COMMAND_LINE_ERROR_NO_KEYWORD,
429 check_settings_smartcard_no_redirection,
430 { "testfreerdp", "--invalid", nullptr },
431 { WINPR_C_ARRAY_INIT } },
432#if defined(WITH_FREERDP_DEPRECATED_CMDLINE)
433 { COMMAND_LINE_STATUS_PRINT,
434 check_settings_smartcard_no_redirection,
435 { "testfreerdp", "/kbd-list", 0 },
436 { WINPR_C_ARRAY_INIT } },
437 { COMMAND_LINE_STATUS_PRINT,
438 check_settings_smartcard_no_redirection,
439 { "testfreerdp", "/monitor-list", 0 },
440 { WINPR_C_ARRAY_INIT } },
441#endif
442 { COMMAND_LINE_STATUS_PRINT,
443 check_settings_smartcard_no_redirection,
444 { "testfreerdp", "/list:kbd", nullptr },
445 { WINPR_C_ARRAY_INIT } },
446 { COMMAND_LINE_STATUS_PRINT,
447 check_settings_smartcard_no_redirection,
448 { "testfreerdp", "/list:monitor", nullptr },
449 { WINPR_C_ARRAY_INIT } },
450 { 0,
451 check_settings_smartcard_no_redirection,
452 { "testfreerdp", "/sound", "/drive:media:" DRIVE_REDIRECT_PATH, "/v:test.freerdp.com",
453 nullptr },
454 { WINPR_C_ARRAY_INIT } },
455 { 0,
456 check_settings_smartcard_no_redirection,
457 { "testfreerdp", "/sound", "/drive:media,/foo/bar/blabla", "/v:test.freerdp.com", nullptr },
458 { WINPR_C_ARRAY_INIT } },
459 { 0,
460 check_settings_gateway_response_timeout_default,
461 { "testfreerdp", "/gateway:type:arm,g:gw.contoso.com", "/v:test.freerdp.com", nullptr },
462 { WINPR_C_ARRAY_INIT } },
463 { 0,
464 check_settings_gateway_response_timeout_custom,
465 { "testfreerdp", "/gateway:type:arm,g:gw.contoso.com,timeout:120000", "/v:test.freerdp.com",
466 nullptr },
467 { WINPR_C_ARRAY_INIT } },
468 { 0,
469 check_settings_gateway_response_timeout_custom,
470 { "testfreerdp", "/gateway:type:http,g:gw.contoso.com,timeout:120000", "/v:test.freerdp.com",
471 nullptr },
472 { WINPR_C_ARRAY_INIT } },
473 { COMMAND_LINE_ERROR,
474 check_settings_gateway_response_timeout_default,
475 { "testfreerdp", "/gateway:type:arm,g:gw.contoso.com,timeout:0", "/v:test.freerdp.com",
476 nullptr },
477 { WINPR_C_ARRAY_INIT } },
478 { COMMAND_LINE_ERROR,
479 check_settings_gateway_response_timeout_default,
480 { "testfreerdp", "/gateway:type:arm,g:gw.contoso.com,timeout:abc", "/v:test.freerdp.com",
481 nullptr },
482 { WINPR_C_ARRAY_INIT } },
483 { 0,
484 check_settings_aad_user_agent,
485 { "testfreerdp", "/azure:tenantid:common,\"user-agent:TestAgent/1.0 (KHTML, like Gecko)\"",
486 "/v:test.freerdp.com", nullptr },
487 { WINPR_C_ARRAY_INIT } },
488 { 0,
489 check_settings_multimon_disabled,
490 { "testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP, "/multimon:off", nullptr },
491 { WINPR_C_ARRAY_INIT },
492 setup_settings_multimon_force },
493 { 0,
494 check_settings_multimon_disabled,
495 { "testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP, "-multimon", nullptr },
496 { WINPR_C_ARRAY_INIT },
497 setup_settings_multimon_force },
498 { 0,
499 check_settings_smart_sizing_disabled,
500 { "testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP, "-smart-sizing", nullptr },
501 { WINPR_C_ARRAY_INIT } },
502 { 0,
503 check_settings_smart_sizing_disabled,
504 { "testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP, "/smart-sizing:off", nullptr },
505 { WINPR_C_ARRAY_INIT } },
506 { 0,
507 check_settings_multimon_force,
508 { "testfreerdp", "--multimon", "force", nullptr },
509 { WINPR_C_ARRAY_INIT } },
510 { 0,
511 check_settings_smart_sizing_size,
512 { "testfreerdp", "--smart-sizing", "1024x768", nullptr },
513 { WINPR_C_ARRAY_INIT } },
514 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
515 check_settings_smartcard_no_redirection,
516 { "testfreerdp", "/multimon:garbage", nullptr },
517 { WINPR_C_ARRAY_INIT } },
518 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
519 check_settings_smartcard_no_redirection,
520 { "testfreerdp", "/smart-sizing:garbage", nullptr },
521 { WINPR_C_ARRAY_INIT } },
522 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
523 check_settings_smartcard_no_redirection,
524 { "testfreerdp", "/multimon:", nullptr },
525 { WINPR_C_ARRAY_INIT } },
526 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
527 check_settings_smartcard_no_redirection,
528 { "testfreerdp", "/smart-sizing:", nullptr },
529 { WINPR_C_ARRAY_INIT } },
530 { 0,
531 check_settings_multimon_enabled,
532 { "testfreerdp", "+multimon", nullptr },
533 { WINPR_C_ARRAY_INIT } },
534#if defined(WITH_GFX_H264)
535 { 0,
536 check_settings_gfx_without_h264,
537 { "testfreerdp", "/gfx:progressive,AVC420:off,AVC444:off", "/network:auto",
538 "/v:test.freerdp.com", nullptr },
539 { WINPR_C_ARRAY_INIT } },
540 { 0,
541 check_settings_gfx_without_h264,
542 { "testfreerdp", "/network:auto", "/gfx:progressive,AVC420:off,AVC444:off",
543 "/v:test.freerdp.com", nullptr },
544 { WINPR_C_ARRAY_INIT } },
545 { 0,
546 check_settings_network_auto_h264,
547 { "testfreerdp", "/network:auto", "/v:test.freerdp.com", nullptr },
548 { WINPR_C_ARRAY_INIT } },
549#endif
550#if defined(WITH_GFX_AV1)
551 { 0,
552 check_settings_gfx_av1,
553 { "testfreerdp", "/gfx:AV1", "/v:test.freerdp.com", nullptr },
554 { WINPR_C_ARRAY_INIT } },
555 { 0,
556 check_settings_gfx_av1,
557 { "testfreerdp", "/gfx:AV1:on", "/v:test.freerdp.com", nullptr },
558 { WINPR_C_ARRAY_INIT } },
559#endif
560 { 0,
561 check_settings_modem_with_fonts,
562 { "testfreerdp", "+fonts", "/network:modem", "/v:test.freerdp.com", nullptr },
563 { WINPR_C_ARRAY_INIT } },
564};
565// NOLINTEND(bugprone-suspicious-missing-comma)
566
567static void check_modified_arguments(const test* test, char** command_line, int* rc)
568{
569 const char* expected_argument = nullptr;
570
571 for (int k = 0; (expected_argument = test->modified_arguments[k].expected_value); k++)
572 {
573 int index = test->modified_arguments[k].index;
574 char* actual_argument = command_line[index];
575
576 if (0 != strcmp(actual_argument, expected_argument))
577 {
578 printref();
579 printf("Failure: overridden argument %d is %s but it should be %s\n", index,
580 actual_argument, expected_argument);
581 (void)fflush(stdout);
582 *rc = -1;
583 }
584 }
585}
586
587int TestClientCmdLine(int argc, char* argv[])
588{
589 int rc = 0;
590
591 WINPR_UNUSED(argc);
592 WINPR_UNUSED(argv);
593 for (size_t i = 0; i < ARRAYSIZE(tests); i++)
594 {
595 const test* current = &tests[i];
596 int failure = 0;
597 char** command_line = string_list_copy(current->command_line);
598
599 const int len = string_list_length((const char* const*)command_line);
600 if (!testcase(__func__, command_line, WINPR_ASSERTING_INT_CAST(size_t, len),
601 current->expected_status, current->validate_settings,
602 current->setup_settings))
603 {
604 TEST_FAILURE("parsing arguments.\n");
605 failure = 1;
606 }
607
608 check_modified_arguments(current, command_line, &failure);
609
610 if (failure)
611 {
612 string_list_print(stdout, (const char* const*)command_line);
613 rc = -1;
614 }
615
616 string_list_free(command_line);
617 }
618
619 return rc;
620}
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
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 BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.