4#include <winpr/crypto.h>
7#include <freerdp/settings.h>
8#include <freerdp/codecs.h>
10#include "settings_property_lists.h"
11#include "../settings.h"
13static BOOL log_result(BOOL value,
const char* fkt)
15 (void)fprintf(stderr,
"TestSettings [%s] returned %s\n", fkt, value ?
"TRUE" :
"FALSE");
19static BOOL log_result_case(BOOL value,
const char* fkt,
size_t testcase)
21 (void)fprintf(stderr,
"TestSettings [%s] testcase %" PRIuz
" returned %s\n", fkt, testcase,
22 value ?
"TRUE" :
"FALSE");
35 if (got->argc != expect->argc)
38 for (
int x = 0; x < expect->argc; x++)
40 if (strcmp(got->argv[x], expect->argv[x]) != 0)
43 return log_result(rc, __func__);
46static BOOL test_dyn_channels(
void)
52 const char* argv1[] = {
"foobar" };
55 const char* argv2[] = {
"gaga",
"abba",
"foo" };
68 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
71 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
76 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
77 test = freerdp_dynamic_channel_collection_add(settings, args1);
89 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
90 test = freerdp_dynamic_channel_collection_add(settings, args2);
103 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
104 if (!compare(got, cmp1))
106 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
107 if (!compare(got, cmp2))
109 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
118 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
119 if (compare(got, cmp1))
121 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
122 if (!compare(got, cmp2))
124 test = freerdp_dynamic_channel_collection_del(settings,
"gaga");
130 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
131 if (compare(got, cmp1))
133 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
134 if (compare(got, cmp2))
141 freerdp_addin_argv_free(args1);
142 freerdp_addin_argv_free(args2);
143 return log_result(rc, __func__);
146static BOOL test_static_channels(
void)
152 const char* argv1[] = {
"foobar" };
155 const char* argv2[] = {
"gaga",
"abba",
"foo" };
168 test = freerdp_static_channel_collection_del(settings,
"foobar");
171 got = freerdp_static_channel_collection_find(settings,
"foobar");
176 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
177 test = freerdp_static_channel_collection_add(settings, args1);
189 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
190 test = freerdp_static_channel_collection_add(settings, args2);
203 got = freerdp_static_channel_collection_find(settings,
"foobar");
204 if (!compare(got, cmp1))
206 got = freerdp_static_channel_collection_find(settings,
"gaga");
207 if (!compare(got, cmp2))
209 test = freerdp_static_channel_collection_del(settings,
"foobar");
218 got = freerdp_static_channel_collection_find(settings,
"foobar");
219 if (compare(got, cmp1))
221 got = freerdp_static_channel_collection_find(settings,
"gaga");
222 if (!compare(got, cmp2))
224 test = freerdp_static_channel_collection_del(settings,
"gaga");
230 got = freerdp_static_channel_collection_find(settings,
"foobar");
231 if (compare(got, cmp1))
233 got = freerdp_static_channel_collection_find(settings,
"gaga");
234 if (compare(got, cmp2))
241 freerdp_addin_argv_free(args1);
242 freerdp_addin_argv_free(args2);
243 return log_result(rc, __func__);
246static BOOL test_copy(
void)
249 wLog* log = WLog_Get(__func__);
254 if (!settings || !copy || !modified)
269 return log_result(rc, __func__);
272static BOOL test_helpers(
void)
284 if (flags != FREERDP_CODEC_ALL)
290 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_NSCODEC))
296 if (flags != (FREERDP_CODEC_ALL & ~(FREERDP_CODEC_NSCODEC | FREERDP_CODEC_REMOTEFX)))
302 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_REMOTEFX))
308 return log_result(rc, __func__);
311static BOOL format_uint(
char* buffer,
size_t size, UINT64 value, UINT16 intType, UINT64 max)
313 const UINT64 lvalue = value > max ? max : value;
314 intType = intType % 3;
318 (void)_snprintf(buffer, size,
"%" PRIu64, lvalue);
321 (void)_snprintf(buffer, size,
"0x%" PRIx64, lvalue);
324 if (max < UINT64_MAX)
325 (void)_snprintf(buffer, size,
"%" PRIu64, max + 1);
327 (
void)_snprintf(buffer, size,
"too large a number");
330 (void)_snprintf(buffer, size,
"not a number value");
335static BOOL print_negative(
char* buffer,
size_t size, INT64 value, INT64 min)
340 (void)_snprintf(buffer, size,
"%" PRId16, (INT16)value);
343 (void)_snprintf(buffer, size,
"%" PRId32, (INT32)value);
346 (void)_snprintf(buffer, size,
"%" PRId64, value);
349 (void)_snprintf(buffer, size,
"too small a number");
354static BOOL print_xpositive(
char* buffer,
size_t size, INT64 value, INT64 max)
358 (void)_snprintf(buffer, size,
"%" PRId64, value);
365 (void)_snprintf(buffer, size,
"%" PRIx16, (INT16)value);
368 (void)_snprintf(buffer, size,
"%" PRIx32, (INT32)value);
371 (void)_snprintf(buffer, size,
"%" PRIx64, value);
374 (void)_snprintf(buffer, size,
"too small a number");
379static BOOL format_int(
char* buffer,
size_t size, INT64 value, UINT16 intType, INT64 max, INT64 min)
381 const INT64 lvalue = (value > max) ? max : ((value < min) ? min : value);
382 intType = intType % 4;
387 (void)_snprintf(buffer, size,
"%" PRId64, lvalue);
390 print_xpositive(buffer, size, lvalue, max);
394 (void)_snprintf(buffer, size,
"%" PRId64, max + 1);
396 (
void)_snprintf(buffer, size,
"too large a number");
400 print_negative(buffer, size, min - 1, INT64_MIN);
402 (
void)_snprintf(buffer, size,
"too small a number");
405 (void)_snprintf(buffer, size,
"not a number value");
410static BOOL format_bool(
char* buffer,
size_t size, UINT16 intType)
412 intType = intType % 10;
416 (void)_snprintf(buffer, size,
"FALSE");
419 (void)_snprintf(buffer, size,
"FaLsE");
422 (void)_snprintf(buffer, size,
"False");
425 (void)_snprintf(buffer, size,
"false");
428 (void)_snprintf(buffer, size,
"falseentry");
431 (void)_snprintf(buffer, size,
"TRUE");
434 (void)_snprintf(buffer, size,
"TrUe");
437 (void)_snprintf(buffer, size,
"True");
440 (void)_snprintf(buffer, size,
"true");
443 (void)_snprintf(buffer, size,
"someentry");
446 (void)_snprintf(buffer, size,
"ok");
451static BOOL check_key_helpers(
size_t key,
const char* stype)
453 int test_rounds = 100;
455 rdpSettings* settings = NULL;
459 const size_t clear_keys[] = { FreeRDP_RdpServerCertificate,
460 FreeRDP_RdpServerRsaKey,
461 FreeRDP_RedirectionPassword,
462 FreeRDP_RedirectionTsvUrl,
463 FreeRDP_LoadBalanceInfo,
464 FreeRDP_ServerRandom,
465 FreeRDP_ClientRandom,
466 FreeRDP_ServerCertificate,
467 FreeRDP_TargetNetAddresses,
468 FreeRDP_ReceivedCapabilities,
469 FreeRDP_ServerLicenseProductIssuers,
470 FreeRDP_TargetNetPorts,
472 FreeRDP_ChannelDefArray,
473 FreeRDP_MonitorDefArray,
474 FreeRDP_ClientAutoReconnectCookie,
475 FreeRDP_ServerAutoReconnectCookie,
476 FreeRDP_ClientTimeZone,
477 FreeRDP_BitmapCacheV2CellInfo,
480 FreeRDP_StaticChannelArray,
481 FreeRDP_DynamicChannelArray,
482 FreeRDP_ReceivedCapabilities,
483 FreeRDP_OrderSupport,
484 FreeRDP_MonitorIds };
488 printf(
"[%s] missing name for key %" PRIuz
"\n", stype, key);
494 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
497 if ((
size_t)tkey != key)
499 printf(
"[%s] mismatch reverse name for key %s [%" PRIuz
"]: %" PRIdz
"\n", stype, name, key,
506 printf(
"[%s] missing reverse type for key %s [%" PRIuz
"]\n", stype, name, key);
512 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
518 printf(
"[%s] mismatch reverse type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
519 stype, name, key, rc, type);
526 printf(
"[%s] freerdp_settings_new failed\n", stype);
529 for (
size_t x = 0; x < ARRAYSIZE(clear_keys); x++)
531 const size_t id = clear_keys[x];
535 printf(
"[%s] freerdp_settings_set_pointer_len(%s, NULL, 0) failed\n", stype, foo);
541 UINT16 intEntryType = 0;
544 char value[8192] = { 0 };
556 winpr_RAND(&intEntryType,
sizeof(intEntryType));
557 winpr_RAND(&val.u64,
sizeof(val.u64));
561 case FreeRDP_ReceivedCapabilitiesSize:
562 case FreeRDP_TargetNetAddressCount:
571 case RDP_SETTINGS_TYPE_BOOL:
572 expect = format_bool(value,
sizeof(value), intEntryType);
574 case RDP_SETTINGS_TYPE_UINT16:
575 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT16_MAX);
577 case RDP_SETTINGS_TYPE_INT16:
579 format_int(value,
sizeof(value), val.i64, intEntryType, INT16_MAX, INT16_MIN);
581 case RDP_SETTINGS_TYPE_UINT32:
582 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT32_MAX);
584 case RDP_SETTINGS_TYPE_INT32:
586 format_int(value,
sizeof(value), val.i64, intEntryType, INT32_MAX, INT32_MIN);
588 case RDP_SETTINGS_TYPE_UINT64:
589 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT64_MAX);
591 case RDP_SETTINGS_TYPE_INT64:
593 format_int(value,
sizeof(value), val.i64, intEntryType, INT64_MAX, INT64_MIN);
595 case RDP_SETTINGS_TYPE_STRING:
597 (void)_snprintf(value,
sizeof(value),
"somerandomstring");
599 case RDP_SETTINGS_TYPE_POINTER:
604 printf(
"[%s] invalid type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
605 stype, name, key, rc, type);
609 have = freerdp_settings_set_value_for_name(settings, name, value);
612 printf(
"[%s] %s=%s have [%s] != expect[%s]\n", stype, name, value,
613 have ?
"TRUE" :
"FALSE", expect ?
"TRUE" :
"FALSE");
617 }
while (test_rounds-- > 0);
622 return log_result(res, __func__);
625static BOOL check_args(
const RDPDR_DEVICE* what,
size_t count,
const char* args[])
631 if (strcmp(what->Name, args[0]) != 0)
637 case RDPDR_DTYP_PRINT:
644 return strcmp(a->DriverName, args[1]) == 0;
647 case RDPDR_DTYP_SERIAL:
655 if (strcmp(a->Path, args[1]) != 0)
663 if (strcmp(a->Driver, args[2]) != 0)
671 if (strcmp(a->Permissive, args[3]) != 0)
677 case RDPDR_DTYP_PARALLEL:
684 return strcmp(a->Path, args[1]) == 0;
687 case RDPDR_DTYP_SMARTCARD:
690 case RDPDR_DTYP_FILESYSTEM:
697 if (strcmp(a->Path, args[1]) != 0)
702 return a->automount == (args[2] == NULL) ? TRUE : FALSE;
705 return !a->automount;
713static int check_device_type_arg(UINT32 Type,
size_t count,
const char* args[])
716 RDPDR_DEVICE* device = freerdp_device_new(Type, count, args);
727 if (!check_args(device, count, args))
731 if (!freerdp_device_equal(clone, device))
736 freerdp_device_free(device);
737 freerdp_device_free(clone);
738 return log_result(rc, __func__);
741static BOOL check_device_type(
void)
750 const char* args[] = {
"somename",
"anothername",
"3rdname",
"4thname" };
751 const struct test_entry tests[] = {
752 { 1, RDPDR_DTYP_SERIAL, 0, NULL },
753 { 1, RDPDR_DTYP_SERIAL, 0, args },
754 { 1, RDPDR_DTYP_SERIAL, 1, args },
755 { 1, RDPDR_DTYP_SERIAL, 2, args },
756 { 1, RDPDR_DTYP_SERIAL, 3, args },
757 { 1, RDPDR_DTYP_SERIAL, 4, args },
758 { 1, RDPDR_DTYP_PARALLEL, 0, NULL },
759 { 1, RDPDR_DTYP_PARALLEL, 0, args },
760 { 1, RDPDR_DTYP_PARALLEL, 1, args },
761 { 1, RDPDR_DTYP_PARALLEL, 2, args },
762 { 1, RDPDR_DTYP_PARALLEL, 3, args },
763 { 1, RDPDR_DTYP_PARALLEL, 4, args },
764 { 1, RDPDR_DTYP_PRINT, 0, NULL },
765 { 1, RDPDR_DTYP_PRINT, 0, args },
766 { 1, RDPDR_DTYP_PRINT, 1, args },
767 { 1, RDPDR_DTYP_PRINT, 2, args },
768 { 1, RDPDR_DTYP_PRINT, 3, args },
769 { 1, RDPDR_DTYP_PRINT, 4, args },
770 { 1, RDPDR_DTYP_FILESYSTEM, 0, NULL },
771 { 1, RDPDR_DTYP_FILESYSTEM, 0, args },
772 { 1, RDPDR_DTYP_FILESYSTEM, 1, args },
773 { 1, RDPDR_DTYP_FILESYSTEM, 2, args },
774 { 1, RDPDR_DTYP_FILESYSTEM, 3, args },
775 { 1, RDPDR_DTYP_FILESYSTEM, 4, args },
776 { 1, RDPDR_DTYP_SMARTCARD, 0, NULL },
777 { 1, RDPDR_DTYP_SMARTCARD, 0, args },
778 { 1, RDPDR_DTYP_SMARTCARD, 1, args },
779 { 1, RDPDR_DTYP_SMARTCARD, 2, args },
780 { 1, RDPDR_DTYP_SMARTCARD, 3, args },
781 { 1, RDPDR_DTYP_SMARTCARD, 4, args },
782 { -3, 0x123, 0, NULL },
783 { -3, 0x123, 0, args },
784 { -3, 0x123, 1, args },
785 { -3, 0x123, 2, args },
786 { -3, 0x123, 3, args },
787 { -3, 0x123, 4, args },
790 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
792 const struct test_entry* cur = &tests[x];
793 int got = check_device_type_arg(cur->type, cur->count, cur->args);
794 if (got != cur->expect)
797 return log_result(rc, __func__);
800static BOOL check_offsets(rdpSettings* settings,
size_t id,
size_t min,
size_t max, BOOL checkPtr)
804 WINPR_ASSERT(settings);
809 for (
size_t x = min; x < max; x++)
811 const void* ptr = freerdp_settings_get_pointer_array(settings,
id, x);
812 if (!ptr && checkPtr)
815 return log_result(rc, __func__);
818static BOOL test_write_offsets(rdpSettings* settings,
size_t id,
size_t elementSize,
size_t min,
821 WINPR_ASSERT(settings);
823 for (
size_t x = min; x < max; x++)
825 const void* ptr = NULL;
826 char buffer[8192] = { 0 };
828 winpr_RAND(buffer,
sizeof(buffer));
829 if (!freerdp_settings_set_pointer_array(settings,
id, x, buffer))
831 ptr = freerdp_settings_get_pointer_array(settings,
id, x);
834 if (memcmp(ptr, buffer, elementSize) != 0)
840static BOOL test_pointer_array(
void)
842 struct pointer_test_case
851 const struct pointer_test_case tests[] = {
852 { FALSE, FALSE, FreeRDP_DeviceArray, FreeRDP_DeviceArraySize, 32,
sizeof(
RDPDR_DEVICE*) },
853 { FALSE, FALSE, FreeRDP_StaticChannelArray, FreeRDP_StaticChannelArraySize, 32,
855 { FALSE, FALSE, FreeRDP_DynamicChannelArray, FreeRDP_DynamicChannelArraySize, 33,
857 { TRUE, TRUE, FreeRDP_BitmapCacheV2CellInfo, FreeRDP_BitmapCacheV2NumCells, 5,
859 { FALSE, FALSE, FreeRDP_OrderSupport, -1, 32,
sizeof(BYTE) },
860 { FALSE, FALSE, FreeRDP_ReceivedCapabilities, -1, 32,
sizeof(BYTE) },
863 { TRUE, TRUE, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, 33,
sizeof(UINT32) },
864 { TRUE, TRUE, FreeRDP_ChannelDefArray, FreeRDP_ChannelDefArraySize, 42,
866 { TRUE, TRUE, FreeRDP_MonitorDefArray, FreeRDP_MonitorDefArraySize, 33,
869 { FALSE, FALSE, FreeRDP_RdpServerCertificate, -1, 1,
sizeof(rdpCertificate*) },
871 { TRUE, TRUE, FreeRDP_RedirectionPassword, FreeRDP_RedirectionPasswordLength, 42,
873 { TRUE, TRUE, FreeRDP_RedirectionTsvUrl, FreeRDP_RedirectionTsvUrlLength, 42,
875 { TRUE, TRUE, FreeRDP_LoadBalanceInfo, FreeRDP_LoadBalanceInfoLength, 42,
sizeof(char) },
876 { TRUE, TRUE, FreeRDP_ServerRandom, FreeRDP_ServerRandomLength, 42,
sizeof(char) },
877 { TRUE, TRUE, FreeRDP_ClientRandom, FreeRDP_ClientRandomLength, 42,
sizeof(char) },
878 { TRUE, TRUE, FreeRDP_ServerCertificate, FreeRDP_ServerCertificateLength, 42,
888 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
890 const struct pointer_test_case* cur = &tests[x];
893 if (cur->sizeId >= 0)
899 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
901 if (check_offsets(settings, cur->id, cur->size, cur->size + 5, TRUE))
905 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
907 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
912 if (cur->sizeId >= 0)
918 if (check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
922 if (test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
927 if (cur->sizeId >= 0)
933 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
935 if (check_offsets(settings, cur->id, cur->size + 1, cur->size + 5, TRUE))
939 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
941 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
950 return log_result(rc, __func__);
953struct validity_test_case
960static BOOL prepare_monitor_array(rdpSettings* settings,
const struct validity_test_case* testcase)
962 WINPR_ASSERT(settings);
963 WINPR_ASSERT(testcase);
969static BOOL check_primary_offset(
const rdpSettings* settings,
const rdpMonitor* monitors,
973 for (
size_t x = 0; x < count; x++)
981 for (
size_t x = 0; x < count; x++)
984 if ((cur->x == 0) && (cur->y == 0))
989 for (
size_t x = 0; x < count; x++)
992 freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x);
999 if (!sprimary || !cprimary)
1002 const INT32 xoff = cprimary->x;
1003 const INT32 yoff = cprimary->y;
1013static BOOL test_validity_check(
void)
1027 .attributes = { .physicalWidth = 100,
1028 .physicalHeight = 100,
1029 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1030 .desktopScaleFactor = 100,
1031 .deviceScaleFactor = 100 } }
1033 const rdpMonitor single_monitor_invalid_1[] = {
1040 .attributes = { .physicalWidth = 100,
1041 .physicalHeight = 100,
1042 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1043 .desktopScaleFactor = 100,
1044 .deviceScaleFactor = 100 } }
1046 const rdpMonitor single_monitor_invalid_2[] = {
1053 .attributes = { .physicalWidth = 100,
1054 .physicalHeight = 100,
1055 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1056 .desktopScaleFactor = 100,
1057 .deviceScaleFactor = 100 } }
1059 const rdpMonitor single_monitor_invalid_3[] = {
1066 .attributes = { .physicalWidth = 100,
1067 .physicalHeight = 100,
1068 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1069 .desktopScaleFactor = 100,
1070 .deviceScaleFactor = 100 } }
1072 const rdpMonitor single_monitor_invalid_4[] = {
1079 .attributes = { .physicalWidth = 100,
1080 .physicalHeight = 100,
1081 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1082 .desktopScaleFactor = 100,
1083 .deviceScaleFactor = 100 } }
1090 .is_primary = FALSE,
1092 .attributes = { .physicalWidth = 100,
1093 .physicalHeight = 100,
1094 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1095 .desktopScaleFactor = 100,
1096 .deviceScaleFactor = 100 } },
1101 .is_primary = FALSE,
1103 .attributes = { .physicalWidth = 100,
1104 .physicalHeight = 100,
1105 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1106 .desktopScaleFactor = 100,
1107 .deviceScaleFactor = 100 } },
1112 .is_primary = FALSE,
1114 .attributes = { .physicalWidth = 100,
1115 .physicalHeight = 100,
1116 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1117 .desktopScaleFactor = 100,
1118 .deviceScaleFactor = 100 } },
1123 .is_primary = FALSE,
1125 .attributes = { .physicalWidth = 100,
1126 .physicalHeight = 100,
1127 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1128 .desktopScaleFactor = 100,
1129 .deviceScaleFactor = 100 } },
1136 .attributes = { .physicalWidth = 100,
1137 .physicalHeight = 100,
1138 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1139 .desktopScaleFactor = 100,
1140 .deviceScaleFactor = 100 } },
1145 .is_primary = FALSE,
1147 .attributes = { .physicalWidth = 100,
1148 .physicalHeight = 100,
1149 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1150 .desktopScaleFactor = 100,
1151 .deviceScaleFactor = 100 } },
1156 .is_primary = FALSE,
1158 .attributes = { .physicalWidth = 100,
1159 .physicalHeight = 100,
1160 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1161 .desktopScaleFactor = 100,
1162 .deviceScaleFactor = 100 } },
1167 .is_primary = FALSE,
1169 .attributes = { .physicalWidth = 100,
1170 .physicalHeight = 100,
1171 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1172 .desktopScaleFactor = 100,
1173 .deviceScaleFactor = 100 } },
1178 .is_primary = FALSE,
1180 .attributes = { .physicalWidth = 100,
1181 .physicalHeight = 100,
1182 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1183 .desktopScaleFactor = 100,
1184 .deviceScaleFactor = 100 } },
1189 .is_primary = FALSE,
1191 .attributes = { .physicalWidth = 100,
1192 .physicalHeight = 100,
1193 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1194 .desktopScaleFactor = 100,
1195 .deviceScaleFactor = 100 } },
1200 .is_primary = FALSE,
1202 .attributes = { .physicalWidth = 100,
1203 .physicalHeight = 100,
1204 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1205 .desktopScaleFactor = 100,
1206 .deviceScaleFactor = 100 } },
1211 .is_primary = FALSE,
1213 .attributes = { .physicalWidth = 100,
1214 .physicalHeight = 100,
1215 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1216 .desktopScaleFactor = 100,
1217 .deviceScaleFactor = 100 } },
1219 const rdpMonitor multi_monitor_invalid_1[] = {
1224 .is_primary = FALSE,
1226 .attributes = { .physicalWidth = 100,
1227 .physicalHeight = 100,
1228 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1229 .desktopScaleFactor = 100,
1230 .deviceScaleFactor = 100 } },
1235 .is_primary = FALSE,
1237 .attributes = { .physicalWidth = 100,
1238 .physicalHeight = 100,
1239 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1240 .desktopScaleFactor = 100,
1241 .deviceScaleFactor = 100 } }
1243 const rdpMonitor multi_monitor_invalid_2[] = {
1248 .is_primary = FALSE,
1250 .attributes = { .physicalWidth = 100,
1251 .physicalHeight = 100,
1252 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1253 .desktopScaleFactor = 100,
1254 .deviceScaleFactor = 100 } },
1261 .attributes = { .physicalWidth = 100,
1262 .physicalHeight = 100,
1263 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1264 .desktopScaleFactor = 100,
1265 .deviceScaleFactor = 100 } }
1267 const rdpMonitor multi_monitor_invalid_3[] = {
1272 .is_primary = FALSE,
1274 .attributes = { .physicalWidth = 100,
1275 .physicalHeight = 100,
1276 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1277 .desktopScaleFactor = 100,
1278 .deviceScaleFactor = 100 } },
1285 .attributes = { .physicalWidth = 100,
1286 .physicalHeight = 100,
1287 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1288 .desktopScaleFactor = 100,
1289 .deviceScaleFactor = 100 } }
1291 const rdpMonitor multi_monitor_invalid_4[] = {
1296 .is_primary = FALSE,
1298 .attributes = { .physicalWidth = 100,
1299 .physicalHeight = 100,
1300 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1301 .desktopScaleFactor = 100,
1302 .deviceScaleFactor = 100 } },
1309 .attributes = { .physicalWidth = 100,
1310 .physicalHeight = 100,
1311 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1312 .desktopScaleFactor = 100,
1313 .deviceScaleFactor = 100 } }
1323 .attributes = { .physicalWidth = 100,
1324 .physicalHeight = 100,
1325 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1326 .desktopScaleFactor = 100,
1327 .deviceScaleFactor = 100 } },
1332 .is_primary = FALSE,
1334 .attributes = { .physicalWidth = 100,
1335 .physicalHeight = 100,
1336 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1337 .desktopScaleFactor = 100,
1338 .deviceScaleFactor = 100 } },
1343 .is_primary = FALSE,
1345 .attributes = { .physicalWidth = 100,
1346 .physicalHeight = 100,
1347 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1348 .desktopScaleFactor = 100,
1349 .deviceScaleFactor = 100 } }
1359 .attributes = { .physicalWidth = 100,
1360 .physicalHeight = 100,
1361 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1362 .desktopScaleFactor = 100,
1363 .deviceScaleFactor = 100 } },
1368 .is_primary = FALSE,
1370 .attributes = { .physicalWidth = 100,
1371 .physicalHeight = 100,
1372 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1373 .desktopScaleFactor = 100,
1374 .deviceScaleFactor = 100 } },
1379 .is_primary = FALSE,
1381 .attributes = { .physicalWidth = 100,
1382 .physicalHeight = 100,
1383 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1384 .desktopScaleFactor = 100,
1385 .deviceScaleFactor = 100 } }
1388 const struct validity_test_case tests[] = {
1389 { TRUE, ARRAYSIZE(single_monitor_valid), single_monitor_valid },
1390 { FALSE, ARRAYSIZE(single_monitor_invalid_1), single_monitor_invalid_1 },
1391 { FALSE, ARRAYSIZE(single_monitor_invalid_2), single_monitor_invalid_2 },
1392 { FALSE, ARRAYSIZE(single_monitor_invalid_3), single_monitor_invalid_3 },
1393 { FALSE, ARRAYSIZE(single_monitor_invalid_4), single_monitor_invalid_4 },
1394 { TRUE, ARRAYSIZE(multi_monitor_valid), multi_monitor_valid },
1395 { TRUE, ARRAYSIZE(multi_monitor_invalid_1), multi_monitor_invalid_1 },
1396 { FALSE, ARRAYSIZE(multi_monitor_invalid_2), multi_monitor_invalid_2 },
1397 { FALSE, ARRAYSIZE(multi_monitor_invalid_3), multi_monitor_invalid_3 },
1398 { FALSE, ARRAYSIZE(multi_monitor_invalid_4), multi_monitor_invalid_4 },
1399 { TRUE, ARRAYSIZE(multi_monitor_valid_2), multi_monitor_valid_2 },
1400 { TRUE, ARRAYSIZE(multi_monitor_valid_3), multi_monitor_valid_3 }
1404 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
1406 const struct validity_test_case* cur = &tests[x];
1408 if (!prepare_monitor_array(settings, cur))
1409 rc = log_result_case(FALSE, __func__, x);
1412#if defined(BUILD_TESTING_INTERNAL)
1413 const BOOL res = freerdp_settings_check_client_after_preconnect(settings);
1415 const BOOL res = cur->expected;
1418 if ((res != cur->expected) ||
1419 !check_primary_offset(settings, cur->monitors, cur->count))
1421 rc = log_result_case(FALSE, __func__, x);
1428 return log_result(rc, __func__);
1431static BOOL test_string_null(rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
1437 return (chk == NULL);
1440static BOOL test_string_check(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1441 const char*
string,
size_t len)
1447 const size_t clen = strnlen(chk, len + 1);
1454 if (strncmp(
string, chk, clen) != 0)
1460static BOOL test_string_check_reset(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1461 const char*
string,
size_t len)
1463 return test_string_check(settings,
id,
string, len) && test_string_null(settings,
id);
1466static BOOL test_string_set_readback(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1467 const char*
string,
size_t len)
1469 WINPR_ASSERT(len > 3);
1474 const size_t slen = strnlen(
string, len);
1478 if (!test_string_check_reset(settings,
id,
string, slen - 1))
1486 if (!wstr || (wlen != slen))
1489 if (!test_string_check_reset(settings,
id,
string, slen))
1495 if (!test_string_check(settings,
id,
string, slen - 1))
1501 if (!test_string_check(settings,
id,
string, slen))
1510static BOOL test_string_len(rdpSettings* settings)
1514 const char user[] =
"abcdefg";
1515 if (!test_string_set_readback(settings, FreeRDP_Username, user,
sizeof(user)))
1518 const char pwd[] =
"xyz";
1519 if (!test_string_set_readback(settings, FreeRDP_Password, pwd,
sizeof(pwd)))
1522 const char domain[] =
"foobar";
1523 if (!test_string_set_readback(settings, FreeRDP_Domain, domain,
sizeof(domain)))
1531static BOOL test_serialize_with(rdpSettings* src,
const char* name)
1535 rdpSettings* dst = NULL;
1541 if (!str || (slen == 0))
1554 printf(
"Test %s: %s\n", name, rc ?
"success" :
"failure");
1558static BOOL test_serialize_strings(DWORD flags,
const char* str)
1564 for (SSIZE_T x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
1569 FreeRDP_Settings_Keys_Pointer ptr;
1576 case RDP_SETTINGS_TYPE_STRING:
1588 char buffer[128] = { 0 };
1589 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32
" {%s}", __func__, flags, str);
1590 return test_serialize_with(src, buffer);
1593static BOOL add_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1595 ADDIN_ARGV* val = freerdp_addin_argv_new(argc, argv);
1598 if (!freerdp_static_channel_collection_add(src, val))
1600 if (!freerdp_static_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1602 if (!freerdp_dynamic_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1608static BOOL add_dev_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1610 FreeRDP_Settings_Keys_Pointer key = FreeRDP_DeviceArray;
1615 const uint32_t types[] = { RDPDR_DTYP_SERIAL, RDPDR_DTYP_PARALLEL, RDPDR_DTYP_PRINT,
1616 RDPDR_DTYP_FILESYSTEM, RDPDR_DTYP_SMARTCARD };
1618 for (
size_t x = 0; x < count; x++)
1620 const uint32_t type = types[x % ARRAYSIZE(types)];
1621 RDPDR_DEVICE* arg = freerdp_device_new(type, argc, argv);
1624 const BOOL rc = freerdp_settings_set_pointer_array(src, key, x, arg);
1625 freerdp_device_free(arg);
1632static BOOL fill_random(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key,
size_t elem,
1640 winpr_RAND(data, len * elem);
1644static BOOL fill_random_timezone(rdpSettings* src)
1646 FreeRDP_Settings_Keys_Pointer key = FreeRDP_ClientTimeZone;
1653 (void)ConvertUtf8ToWChar(
"testXXXXDaylight", data->DaylightName, ARRAYSIZE(data->DaylightName));
1654 (void)ConvertUtf8ToWChar(
"testXXXX", data->StandardName, ARRAYSIZE(data->StandardName));
1659static BOOL set_private_key(rdpSettings* src)
1664 rdpPrivateKey* key =
1665 freerdp_settings_get_pointer_array_writable(src, FreeRDP_RdpServerRsaKey, 0);
1669 return freerdp_key_generate(key,
"RSA", 1, 4096);
1672static BOOL set_cert(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key)
1674 const char pem[] =
"-----BEGIN CERTIFICATE-----\n"
1675 "MIICvTCCAaWgAwIBAgIEZrM9yjANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlt\n"
1676 "b3RvcmhlYWQwHhcNMjUwNDE1MTExMjE5WhcNMjYwNDE1MTExMjE5WjAUMRIwEAYD\n"
1677 "VQQDDAltb3RvcmhlYWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw\n"
1678 "g0tADY3kh5Hi6YsTsQbuaPs50zlTpIv+rCCK3BNIblsIh4cSO1YGdWfB0gP9bUD1\n"
1679 "L7mPWRnIiAvwrRA/Mgyo+UgiYj/aE3xxN3adB9/QsUzNrI07o6L8MupV4237txMj\n"
1680 "uxVmarB4c7E4wFgSxwbMQPhQtoNNew3bY+EeqhQBMFfYy4z+rg60xl0QHGcMePY/\n"
1681 "xz0WMHrIz6FhZfBIr+BGViRtjIchbjcU0HfTSujX+MT0D5MBISe8aiFvrewFItfT\n"
1682 "vglriDLeNMiB9U/aRLV8OtW+heGNhi5qSC9JXEW70OFeGAoqtwyRHLnSh38Fo2xv\n"
1683 "fEc90zjkCan8usEDKuzBAgMBAAGjFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0G\n"
1684 "CSqGSIb3DQEBCwUAA4IBAQBY1wkJ6XWduNmTi+UNdcZ5e9GWV/3+SYLtFALwKVrU\n"
1685 "KQQbsYnGLfyUKXFc7e9JoZ+UCTJgY3EyL+6p79io+cFeTtpp1RVKljibbeRAP01W\n"
1686 "WbcxcHZFKgBlH1KNSeO7iOAPet3aCaVDKl1XSU7fhxtsfBBI9YTtaMZM5e9WhuHK\n"
1687 "lL11Un6ePThX+4NG1yYp0X+emqUHd/qaq8IShnU6ajvzoloWGf4vLlDSsuFHJJsK\n"
1688 "LnshNFOFGAjp1Se4DjhtUSr6Xofdse+kx9cSQazCZ5vFJNeHkxr0B7ojQ4bN37Tg\n"
1689 "2uyfSclCCLnmjcoRMlIGUiL2bevCPDRNRWiblDgx3tGG\n"
1690 "-----END CERTIFICATE-----\n";
1692 rdpCertificate* cert = freerdp_certificate_new_from_pem(pem);
1698static BOOL set_string_array(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, uint32_t max)
1701 winpr_RAND(&count,
sizeof(count));
1702 count = count % max;
1707 for (uint32_t x = 0; x < count; x++)
1709 char buffer[32] = { 0 };
1710 (void)_snprintf(buffer,
sizeof(buffer),
"foobar-0x%08" PRIu32, x);
1711 if (!freerdp_settings_set_pointer_array(src, key, x, buffer))
1717static BOOL test_serialize_pointer(DWORD flags)
1723 const char* argv1[] = {
"foobar",
"lala",
"haha" };
1724 const char* argv2[] = {
"lala",
"haha" };
1725 const char* argv3[] = {
"haha" };
1726 if (!add_argv(src, ARRAYSIZE(argv1), argv1))
1728 if (!add_argv(src, ARRAYSIZE(argv2), argv2))
1730 if (!add_argv(src, ARRAYSIZE(argv3), argv3))
1732 if (!add_dev_argv(src, ARRAYSIZE(argv3), argv3))
1737 FreeRDP_Settings_Keys_Pointer key;
1742 const struct key_len_pair keys[] = {
1743 { FreeRDP_ServerRandom, 1, 123 },
1744 { FreeRDP_RedirectionPassword, 1, 13 },
1745 { FreeRDP_ClientRandom, 1, 23 },
1746 { FreeRDP_RedirectionGuid, 1, 22 },
1747 { FreeRDP_LoadBalanceInfo, 1, 21 },
1748 { FreeRDP_ServerCertificate, 1, 512 },
1749 { FreeRDP_RedirectionTsvUrl, 1, 33 },
1753 { FreeRDP_OrderSupport, 1, 32 },
1756 { FreeRDP_Password51, 1, 54 },
1757 { FreeRDP_MonitorIds, 1, 111 },
1758 { FreeRDP_MonitorDefArray, 1, 7 },
1759 { FreeRDP_ChannelDefArray, 1, 31 },
1760 { FreeRDP_ReceivedCapabilities,
sizeof(uint8_t), 33 },
1761 { FreeRDP_ReceivedCapabilityData,
sizeof(uint8_t*), 33 },
1762 { FreeRDP_ReceivedCapabilityDataSizes,
sizeof(UINT32), 33 }
1765 for (
size_t x = 0; x < ARRAYSIZE(keys); x++)
1767 const struct key_len_pair* cur = &keys[x];
1768 if (!fill_random(src, cur->key, cur->elem, cur->len))
1772 if (!fill_random_timezone(src))
1776 winpr_RAND((
void*)&ptr,
sizeof(
void*));
1780 if (!set_private_key(src))
1782 if (!set_cert(src, FreeRDP_RedirectionTargetCertificate))
1784 if (!set_cert(src, FreeRDP_RdpServerCertificate))
1787 if (!set_string_array(src, FreeRDP_ServerLicenseProductIssuers, 43))
1790 char addresses[12][43] = { 0 };
1791 char* strptr[12] = { 0 };
1793 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1795 (void)_snprintf(addresses[x], 43,
"foobar-0x%08" PRIx32, x);
1796 strptr[x] = addresses[x];
1799 if (!freerdp_target_net_addresses_copy(src, strptr, ARRAYSIZE(addresses)))
1802 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1805 winpr_RAND(&port,
sizeof(port));
1806 if (!freerdp_settings_set_pointer_array(src, FreeRDP_TargetNetPorts, x, &port))
1817 winpr_RAND(caps, count);
1819 for (uint32_t x = 0; x < count; x++)
1821 uint8_t* buffer = calloc(64,
sizeof(uint8_t));
1824 winpr_RAND(buffer,
sizeof(buffer));
1825 uint32_t blen = (buffer[0] % 52) + 13;
1827 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityData, x, buffer))
1829 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityDataSizes, x, &blen))
1833 char buffer[128] = { 0 };
1834 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32, __func__, flags);
1835 return test_serialize_with(src, buffer);
1837 printf(
"Test %s: (pre)failure\n", __func__);
1842static BOOL test_serialize(
void)
1850 char buffer[32] = { 0 };
1851 (void)_snprintf(buffer,
sizeof(buffer),
"default (flags 0x%08" PRIx32
")", flags);
1854 if (!test_serialize_strings(flags,
"foobar"))
1856 if (!test_serialize_strings(flags,
""))
1858 if (!test_serialize_strings(flags, NULL))
1860 if (!test_serialize_pointer(flags))
1867int TestSettings(
int argc,
char* argv[])
1870 rdpSettings* settings = NULL;
1871 rdpSettings* cloned = NULL;
1872 rdpSettings* cloned2 = NULL;
1876 if (!test_serialize())
1878 if (!test_dyn_channels())
1880 if (!test_static_channels())
1884 if (!test_helpers())
1886 if (!check_device_type())
1888 if (!test_pointer_array())
1890 if (!test_validity_check())
1897 printf(
"Couldn't create settings\n");
1901 if (!test_string_len(settings))
1909#if defined(have_bool_list_indices)
1911 for (
size_t x = 0; x < ARRAYSIZE(bool_list_indices); x++)
1913 const size_t key = bool_list_indices[x];
1920 printf(
"mismatch for key %s: %u -> copy %u\n", name, val, cval);
1925 if (!check_key_helpers(key,
"bool"))
1930#if defined(have_int16_list_indices)
1932 for (
size_t x = 0; x < ARRAYSIZE(int16_list_indices); x++)
1934 const size_t key = int16_list_indices[x];
1940 printf(
"mismatch for key %s: %" PRId16
" -> copy %" PRId16
"\n", name, val, cval);
1945 if (!check_key_helpers(key,
"int16"))
1950#if defined(have_uint16_list_indices)
1952 for (
size_t x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
1954 const size_t key = uint16_list_indices[x];
1961 printf(
"mismatch for key %s: %" PRIu16
" -> copy %" PRIu16
"\n", name, val, cval);
1966 if (!check_key_helpers(key,
"uint16"))
1971#if defined(have_uint32_list_indices)
1973 for (
size_t x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
1975 const size_t key = uint32_list_indices[x];
1982 printf(
"mismatch for key %s: %" PRIu32
" -> copy %" PRIu32
"\n", name, val, cval);
1987 if (!check_key_helpers(key,
"uint32"))
1992#if defined(have_int32_list_indices)
1994 for (
size_t x = 0; x < ARRAYSIZE(int32_list_indices); x++)
1996 const size_t key = int32_list_indices[x];
2003 printf(
"mismatch for key %s: %" PRId32
" -> copy %" PRId32
"\n", name, val, cval);
2008 if (!check_key_helpers(key,
"int32"))
2013#if defined(have_uint64_list_indices)
2015 for (
size_t x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
2017 const size_t key = uint64_list_indices[x];
2024 printf(
"mismatch for key %s: %" PRIu64
" -> copy %" PRIu64
"\n", name, val, cval);
2029 if (!check_key_helpers(key,
"uint64"))
2034#if defined(have_int64_list_indices)
2036 for (
size_t x = 0; x < ARRAYSIZE(int64_list_indices); x++)
2038 const size_t key = int64_list_indices[x];
2044 printf(
"mismatch for key %s: %" PRId64
" -> copy %" PRId64
"\n", name, val, cval);
2049 if (!check_key_helpers(key,
"int64"))
2054#if defined(have_string_list_indices)
2056 for (
size_t x = 0; x < ARRAYSIZE(string_list_indices); x++)
2058 const size_t key = string_list_indices[x];
2059 const char val[] =
"test-string";
2060 const char* res = NULL;
2065 if ((oval != cval) && (strcmp(oval, cval) != 0))
2067 printf(
"mismatch for key %s: %s -> copy %s\n", name, oval, cval);
2075 if (strncmp(val, res,
sizeof(val)) != 0)
2080#if defined(have_pointer_list_indices)
2082 for (
size_t x = 0; x < ARRAYSIZE(pointer_list_indices); x++)
2084 const size_t key = pointer_list_indices[x];
WINPR_API int WINPR_JSON_version(char *buffer, size_t len)
Get the library version string.
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
FREERDP_API INT64 freerdp_settings_get_int64(const rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id)
Returns a INT64 settings value.
FREERDP_API rdpSettings * freerdp_settings_clone(const rdpSettings *settings)
Creates a deep copy of settings.
FREERDP_API BOOL freerdp_settings_print_diff(wLog *log, DWORD level, const rdpSettings *src, const rdpSettings *other)
Dumps the difference between two settings structs to a WLog.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_name(const char *value)
Get a key type for the name string of that key.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16N(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param, size_t length)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.
FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id)
Returns a UINT64 settings value.
FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char *value)
Get a key index for the name string of that key.
FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data, size_t len)
Set a pointer to value data.
FREERDP_API char * freerdp_settings_serialize(const rdpSettings *settings, BOOL pretty, size_t *plength)
A function that converts a rdpSettings struct to a JSON serialized string.
FREERDP_API BOOL freerdp_settings_set_int32(rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id, INT32 param)
Sets a INT32 settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
#define FREERDP_SETTINGS_SERVER_MODE
FREERDP_API BOOL freerdp_settings_set_monitor_def_array_sorted(rdpSettings *settings, const rdpMonitor *monitors, size_t count)
Sort monitor array according to:
FREERDP_API UINT16 freerdp_settings_get_uint16(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id)
Returns a UINT16 settings value.
FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.
FREERDP_API BOOL freerdp_settings_copy(rdpSettings *dst, const rdpSettings *src)
Deep copies settings from src to dst.
FREERDP_API WCHAR * freerdp_settings_get_string_as_utf16(const rdpSettings *settings, FreeRDP_Settings_Keys_String id, size_t *pCharLen)
Return an allocated UTF16 string.
FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id, UINT64 param)
Sets a UINT64 settings value.
FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id, INT16 param)
Sets a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id, INT64 param)
Sets a INT64 settings value.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data)
Set a pointer to value data.
FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id)
Returns a INT32 settings value.
FREERDP_API const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
FREERDP_API UINT32 freerdp_settings_get_codecs_flags(const rdpSettings *settings)
helper function to get a mask of supported codec flags.
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param, size_t len)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.
FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 param)
Sets a UINT16 settings value.
FREERDP_API INT16 freerdp_settings_get_int16(const rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id)
Returns a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL param)
Sets a BOOL settings value.
FREERDP_API rdpSettings * freerdp_settings_deserialize(const char *json, size_t length)
A function that converts a JSON string to a rdpSettings struct.