23#include <freerdp/config.h>
32#include <winpr/assert.h>
33#include <winpr/cast.h>
35#include "../core/settings.h"
36#include "../core/capabilities.h"
38#include <freerdp/crypto/certificate.h>
39#include <freerdp/settings.h>
40#include <freerdp/freerdp.h>
41#include <freerdp/log.h>
43#define TAG FREERDP_TAG("common")
45BOOL freerdp_addin_argv_add_argument_ex(
ADDIN_ARGV* args,
const char* argument,
size_t len)
47 if (!args || !argument)
51 len = strlen(argument);
53 char** new_argv = (
char**)realloc(
54 (
void*)args->argv,
sizeof(
char*) * (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc) + 1));
59 args->argv = new_argv;
61 char* str = calloc(len + 1,
sizeof(
char));
64 memcpy(str, argument, len);
65 args->argv[args->argc++] = str;
69BOOL freerdp_addin_argv_add_argument(
ADDIN_ARGV* args,
const char* argument)
71 return freerdp_addin_argv_add_argument_ex(args, argument, 0);
74BOOL freerdp_addin_argv_del_argument(
ADDIN_ARGV* args,
const char* argument)
76 if (!args || !argument)
78 for (
int x = 0; x < args->argc; x++)
80 char* arg = args->argv[x];
81 if (strcmp(argument, arg) == 0)
84 memmove_s((
void*)&args->argv[x],
85 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) *
sizeof(
char*),
86 (
void*)&args->argv[x + 1],
87 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) *
sizeof(
char*));
88 args->argv[args->argc - 1] = NULL;
96int freerdp_addin_set_argument(
ADDIN_ARGV* args,
const char* argument)
98 if (!args || !argument)
101 for (
int i = 0; i < args->argc; i++)
103 if (strcmp(args->argv[i], argument) == 0)
109 if (!freerdp_addin_argv_add_argument(args, argument))
114int freerdp_addin_replace_argument(
ADDIN_ARGV* args,
const char* previous,
const char* argument)
116 if (!args || !previous || !argument)
119 for (
int i = 0; i < args->argc; i++)
121 if (strcmp(args->argv[i], previous) == 0)
125 if (!(args->argv[i] = _strdup(argument)))
132 if (!freerdp_addin_argv_add_argument(args, argument))
137int freerdp_addin_set_argument_value(
ADDIN_ARGV* args,
const char* option,
const char* value)
143 if (!args || !option || !value)
145 length = strlen(option) + strlen(value) + 1;
146 str = (
char*)calloc(length + 1,
sizeof(
char));
151 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
153 for (
int i = 0; i < args->argc; i++)
155 p = strchr(args->argv[i],
':');
159 if (strncmp(args->argv[i], option,
160 WINPR_ASSERTING_INT_CAST(
size_t, p - args->argv[i])) == 0)
169 rc = freerdp_addin_argv_add_argument(args, str);
176int freerdp_addin_replace_argument_value(
ADDIN_ARGV* args,
const char* previous,
const char* option,
182 if (!args || !previous || !option || !value)
184 length = strlen(option) + strlen(value) + 1;
185 str = (
char*)calloc(length + 1,
sizeof(
char));
190 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
192 for (
int i = 0; i < args->argc; i++)
194 if (strcmp(args->argv[i], previous) == 0)
202 rc = freerdp_addin_argv_add_argument(args, str);
209BOOL freerdp_device_collection_add(rdpSettings* settings,
RDPDR_DEVICE* device)
213 WINPR_ASSERT(settings);
214 WINPR_ASSERT(device);
220 const size_t new_size = (old + 32);
227 settings->DeviceArray = new_array;
228 for (
size_t x = old; x < new_size; x++)
229 settings->DeviceArray[x] = NULL;
232 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
236 settings->DeviceArray[settings->DeviceCount++] = device;
242 WINPR_ASSERT(settings);
247 const UINT32 count = settings->DeviceCount;
248 for (
size_t x = 0; x < count; x++)
253 for (
size_t y = x + 1; y < count; y++)
256 settings->DeviceArray[y - 1] = next;
258 settings->DeviceArray[count - 1] = NULL;
259 settings->DeviceCount--;
267RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings,
const char* name)
271 WINPR_ASSERT(settings);
273 for (UINT32 index = 0; index < settings->DeviceCount; index++)
275 device = settings->DeviceArray[index];
280 if (strcmp(device->Name, name) == 0)
287RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
290 WINPR_ASSERT(settings);
292 for (UINT32 index = 0; index < settings->DeviceCount; index++)
294 device = settings->DeviceArray[index];
296 if (device->Type == type)
303RDPDR_DEVICE* freerdp_device_new(UINT32 Type,
size_t count,
const char*
const args[])
317 WINPR_ASSERT(args || (count == 0));
321 case RDPDR_DTYP_PRINT:
324 case RDPDR_DTYP_SERIAL:
327 case RDPDR_DTYP_PARALLEL:
330 case RDPDR_DTYP_SMARTCARD:
333 case RDPDR_DTYP_FILESYSTEM:
340 device.base = calloc(1, size);
344 device.base->Type = Type;
348 device.base->Name = _strdup(args[0]);
349 if (!device.base->Name)
354 case RDPDR_DTYP_PRINT:
357 device.printer->DriverName = _strdup(args[1]);
358 if (!device.printer->DriverName)
364 device.printer->IsDefault = _stricmp(args[2],
"default") == 0;
367 case RDPDR_DTYP_SERIAL:
370 device.serial->Path = _strdup(args[1]);
371 if (!device.serial->Path)
377 device.serial->Driver = _strdup(args[2]);
378 if (!device.serial->Driver)
384 device.serial->Permissive = _strdup(args[3]);
385 if (!device.serial->Permissive)
389 case RDPDR_DTYP_PARALLEL:
392 device.parallel->Path = _strdup(args[1]);
393 if (!device.serial->Path)
397 case RDPDR_DTYP_SMARTCARD:
399 case RDPDR_DTYP_FILESYSTEM:
402 device.drive->Path = _strdup(args[1]);
403 if (!device.drive->Path)
407 device.drive->automount = (args[2] == NULL) ? TRUE : FALSE;
416 freerdp_device_free(device.base);
437 switch (device->Type)
439 case RDPDR_DTYP_PRINT:
440 free(cnv.printer->DriverName);
442 case RDPDR_DTYP_SERIAL:
443 free(cnv.serial->Path);
444 free(cnv.serial->Driver);
445 free(cnv.serial->Permissive);
447 case RDPDR_DTYP_PARALLEL:
448 free(cnv.parallel->Path);
450 case RDPDR_DTYP_SMARTCARD:
452 case RDPDR_DTYP_FILESYSTEM:
453 free(cnv.drive->Path);
484 const char* args[4] = { 0 };
494 args[count++] = device->Name;
497 switch (device->Type)
499 case RDPDR_DTYP_FILESYSTEM:
502 args[count++] = src.drive->Path;
503 args[count++] = src.drive->automount ? NULL : src.drive->Path;
507 case RDPDR_DTYP_PRINT:
508 if (src.printer->DriverName)
509 args[count++] = src.printer->DriverName;
512 case RDPDR_DTYP_SMARTCARD:
515 case RDPDR_DTYP_SERIAL:
516 if (src.serial->Path)
517 args[count++] = src.serial->Path;
519 if (src.serial->Driver)
520 args[count++] = src.serial->Driver;
522 if (src.serial->Permissive)
523 args[count++] = src.serial->Permissive;
526 case RDPDR_DTYP_PARALLEL:
527 if (src.parallel->Path)
528 args[count++] = src.parallel->Path;
531 WLog_ERR(TAG,
"unknown device type %" PRIu32
"", device->Type);
535 copy.dev = freerdp_device_new(device->Type, count, args);
539 copy.dev->Id = device->Id;
544void freerdp_device_collection_free(rdpSettings* settings)
546 WINPR_ASSERT(settings);
548 if (settings->DeviceArray)
550 for (UINT32 index = 0; index < settings->DeviceArraySize; index++)
551 (
void)freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index, NULL);
554 free((
void*)settings->DeviceArray);
561BOOL freerdp_static_channel_collection_del(rdpSettings* settings,
const char* name)
564 if (!settings || !settings->StaticChannelArray)
567 for (UINT32 x = 0; x < count; x++)
569 ADDIN_ARGV* cur = settings->StaticChannelArray[x];
570 if (cur && (cur->argc > 0))
572 if (strcmp(name, cur->argv[0]) == 0)
574 memmove_s((
void*)&settings->StaticChannelArray[x],
576 (
void*)&settings->StaticChannelArray[x + 1],
578 for (
size_t y = count - 1; y < settings->StaticChannelArraySize; y++)
579 settings->StaticChannelArray[y] = NULL;
581 freerdp_addin_argv_free(cur);
587 for (
size_t x = count; x < settings->StaticChannelArraySize; x++)
588 settings->StaticChannelArray[x] = NULL;
593BOOL freerdp_static_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
597 WINPR_ASSERT(settings);
598 WINPR_ASSERT(channel);
603 const UINT32 oldSize =
605 const size_t new_size = oldSize + 32ul;
612 settings->StaticChannelArray = new_array;
614 for (
size_t x = oldSize; x < new_size; x++)
615 settings->StaticChannelArray[x] = NULL;
618 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
624 ADDIN_ARGV** cur = &settings->StaticChannelArray[count++];
625 freerdp_addin_argv_free(*cur);
630ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings,
const char* name)
634 WINPR_ASSERT(settings);
637 for (UINT32 index = 0;
640 channel = settings->StaticChannelArray[index];
642 if (strcmp(channel->argv[0], name) == 0)
649void freerdp_static_channel_collection_free(rdpSettings* settings)
654 if (settings->StaticChannelArray)
658 freerdp_addin_argv_free(settings->StaticChannelArray[i]);
661 free((
void*)settings->StaticChannelArray);
663 settings->StaticChannelArray = NULL;
667BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings,
const char* name)
670 if (!settings || !settings->DynamicChannelArray)
673 for (UINT32 x = 0; x < count; x++)
675 ADDIN_ARGV* cur = settings->DynamicChannelArray[x];
676 if (cur && (cur->argc > 0))
678 if (strcmp(name, cur->argv[0]) == 0)
680 memmove_s((
void*)&settings->DynamicChannelArray[x],
682 (
void*)&settings->DynamicChannelArray[x + 1],
684 for (
size_t y = count - 1; y < settings->DynamicChannelArraySize; y++)
685 settings->DynamicChannelArray[y] = NULL;
687 freerdp_addin_argv_free(cur);
697BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
702 WINPR_ASSERT(settings);
703 WINPR_ASSERT(channel);
710 const size_t size = oldSize + 32;
717 settings->DynamicChannelArray = new_array;
719 for (
size_t x = oldSize; x < size; x++)
720 settings->DynamicChannelArray[x] = NULL;
723 WINPR_ASSERTING_INT_CAST(uint32_t, size)))
728 settings->DynamicChannelArray[count++] = channel;
732ADDIN_ARGV* freerdp_dynamic_channel_collection_find(
const rdpSettings* settings,
const char* name)
734 WINPR_ASSERT(settings);
737 for (UINT32 index = 0;
740 ADDIN_ARGV* channel = settings->DynamicChannelArray[index];
742 if (strcmp(channel->argv[0], name) == 0)
756 for (
int index = 0; index < args->argc; index++)
757 free(args->argv[index]);
758 free((
void*)args->argv);
764ADDIN_ARGV* freerdp_addin_argv_new(
size_t argc,
const char*
const argv[])
766 if (argc > INT32_MAX)
775 args->argc = (int)argc;
776 args->argv = (
char**)calloc(argc,
sizeof(
char*));
782 for (
size_t x = 0; x < argc; x++)
784 args->argv[x] = _strdup(argv[x]);
792 WINPR_PRAGMA_DIAG_PUSH
793 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
794 freerdp_addin_argv_free(args);
795 WINPR_PRAGMA_DIAG_POP
809 return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
812void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
814 WINPR_ASSERT(settings);
816 if (settings->DynamicChannelArray)
820 freerdp_addin_argv_free(settings->DynamicChannelArray[i]);
823 free((
void*)settings->DynamicChannelArray);
825 settings->DynamicChannelArray = NULL;
829static void freerdp_capability_data_free(rdpSettings* settings,
size_t offset, BOOL full)
831 WINPR_ASSERT(settings);
833 if (settings->ReceivedCapabilityData)
835 for (
size_t x = offset; x < settings->ReceivedCapabilitiesSize; x++)
837 free(settings->ReceivedCapabilityData[x]);
838 settings->ReceivedCapabilityData[x] = NULL;
842 free((
void*)settings->ReceivedCapabilityData);
843 settings->ReceivedCapabilityData = NULL;
848void freerdp_capability_buffer_free(rdpSettings* settings)
850 WINPR_ASSERT(settings);
852 freerdp_capability_data_free(settings, 0, TRUE);
854 free(settings->ReceivedCapabilityDataSizes);
855 settings->ReceivedCapabilityDataSizes = NULL;
857 free(settings->ReceivedCapabilities);
858 settings->ReceivedCapabilities = NULL;
860 settings->ReceivedCapabilitiesSize = 0;
863static BOOL resize_setting(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
size_t oldsize,
864 size_t size,
size_t base)
867 uint8_t* ptr = realloc(old, size * base);
873 const size_t diff = size - oldsize;
874 memset(&ptr[oldsize * base], 0, diff * base);
881static BOOL resize_setting_ptr(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
882 size_t oldsize,
size_t size,
size_t base)
884 WINPR_ASSERT(base ==
sizeof(
void*));
889 uint8_t** optr = WINPR_REINTERPRET_CAST(old, uint8_t*, uint8_t**);
890 for (
size_t x = size; x < oldsize; x++)
892 uint8_t* ptr = optr[x];
896 uint8_t* ptr = realloc(old, size * base);
900 uint8_t** optr = WINPR_REINTERPRET_CAST(ptr, uint8_t*, uint8_t**);
901 for (
size_t x = oldsize; x < size; x++)
910BOOL freerdp_capability_buffer_resize(rdpSettings* settings,
size_t count, BOOL force)
912 WINPR_ASSERT(settings);
914 const uint32_t len = settings->ReceivedCapabilitiesSize;
921 freerdp_capability_data_free(settings, count, FALSE);
925 freerdp_capability_buffer_free(settings);
929 const size_t oldsize = settings->ReceivedCapabilitiesSize;
930 if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count,
933 if (!resize_setting_ptr(settings, FreeRDP_ReceivedCapabilityData, oldsize, count,
936 if (!resize_setting(settings, FreeRDP_ReceivedCapabilities, oldsize, count,
sizeof(uint32_t)))
939 settings->ReceivedCapabilitiesSize = WINPR_ASSERTING_INT_CAST(uint32_t, count);
943BOOL freerdp_capability_buffer_copy(rdpSettings* settings,
const rdpSettings* src)
945 WINPR_ASSERT(settings);
948 if (src->ReceivedCapabilitiesSize == 0)
951 if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize, TRUE))
954 for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++)
956 WINPR_ASSERT(settings->ReceivedCapabilities);
957 settings->ReceivedCapabilities[x] = src->ReceivedCapabilities[x];
959 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
960 settings->ReceivedCapabilityDataSizes[x] = src->ReceivedCapabilityDataSizes[x];
962 WINPR_ASSERT(settings->ReceivedCapabilityData);
963 if (src->ReceivedCapabilityDataSizes[x] > 0)
965 void* tmp = realloc(settings->ReceivedCapabilityData[x],
966 settings->ReceivedCapabilityDataSizes[x]);
969 memcpy(tmp, src->ReceivedCapabilityData[x], src->ReceivedCapabilityDataSizes[x]);
970 settings->ReceivedCapabilityData[x] = tmp;
974 free(settings->ReceivedCapabilityData[x]);
975 settings->ReceivedCapabilityData[x] = NULL;
981static void target_net_addresses_free(rdpSettings* settings,
size_t offset)
983 WINPR_ASSERT(settings);
985 if (settings->TargetNetAddresses)
987 for (
size_t index = offset; index < settings->TargetNetAddressCount; index++)
989 free(settings->TargetNetAddresses[index]);
990 settings->TargetNetAddresses[index] = NULL;
995void freerdp_target_net_addresses_free(rdpSettings* settings)
997 WINPR_ASSERT(settings);
999 target_net_addresses_free(settings, 0);
1001 free((
void*)settings->TargetNetAddresses);
1002 settings->TargetNetAddresses = NULL;
1004 free(settings->TargetNetPorts);
1005 settings->TargetNetPorts = NULL;
1007 settings->TargetNetAddressCount = 0;
1010BOOL freerdp_target_net_addresses_resize(rdpSettings* settings,
size_t count)
1012 WINPR_ASSERT(settings);
1016 freerdp_target_net_addresses_free(settings);
1020 const uint32_t len = settings->TargetNetAddressCount;
1021 if (!resize_setting_ptr(settings, FreeRDP_TargetNetAddresses, len, count,
sizeof(
char*)))
1023 if (!resize_setting(settings, FreeRDP_TargetNetPorts, len, count,
sizeof(uint32_t)))
1026 settings->TargetNetAddressCount = WINPR_ASSERTING_INT_CAST(uint32_t, count);
1030void freerdp_server_license_issuers_free(rdpSettings* settings)
1032 WINPR_ASSERT(settings);
1034 if (settings->ServerLicenseProductIssuers)
1036 for (UINT32 x = 0; x < settings->ServerLicenseProductIssuersCount; x++)
1037 free(settings->ServerLicenseProductIssuers[x]);
1039 free((
void*)settings->ServerLicenseProductIssuers);
1040 settings->ServerLicenseProductIssuers = NULL;
1041 settings->ServerLicenseProductIssuersCount = 0;
1044BOOL freerdp_server_license_issuers_copy(rdpSettings* settings,
char** issuers, UINT32 count)
1046 WINPR_ASSERT(settings);
1047 WINPR_ASSERT(issuers || (count == 0));
1053 for (UINT32 x = 0; x < count; x++)
1055 char* issuer = _strdup(issuers[x]);
1058 settings->ServerLicenseProductIssuers[x] = issuer;
1064void freerdp_performance_flags_make(rdpSettings* settings)
1066 UINT32 PerformanceFlags = PERF_FLAG_NONE;
1069 PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
1072 PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
1075 PerformanceFlags |= PERF_DISABLE_WALLPAPER;
1078 PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
1081 PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
1084 PerformanceFlags |= PERF_DISABLE_THEMING;
1088void freerdp_performance_flags_split(rdpSettings* settings)
1091 settings, FreeRDP_AllowFontSmoothing,
1093 PERF_ENABLE_FONT_SMOOTHING)
1097 settings, FreeRDP_AllowDesktopComposition,
1099 PERF_ENABLE_DESKTOP_COMPOSITION)
1103 settings, FreeRDP_DisableWallpaper,
1108 settings, FreeRDP_DisableFullWindowDrag,
1110 PERF_DISABLE_FULLWINDOWDRAG)
1114 settings, FreeRDP_DisableMenuAnims,
1116 PERF_DISABLE_MENUANIMATIONS)
1120 settings, FreeRDP_DisableThemes,
1131 if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
1137 else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
1143 else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
1149 else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
1160 else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
1170void freerdp_update_gateway_usage_method(rdpSettings* settings, UINT32 GatewayEnabled,
1171 UINT32 GatewayBypassLocal)
1173 UINT32 GatewayUsageMethod = 0;
1175 if (!GatewayEnabled && !GatewayBypassLocal)
1176 GatewayUsageMethod = TSC_PROXY_MODE_NONE_DIRECT;
1177 else if (GatewayEnabled && !GatewayBypassLocal)
1178 GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
1179 else if (GatewayEnabled && GatewayBypassLocal)
1180 GatewayUsageMethod = TSC_PROXY_MODE_DETECT;
1185#if defined(WITH_FREERDP_DEPRECATED)
1186BOOL freerdp_get_param_bool(
const rdpSettings* settings,
int id)
1191int freerdp_set_param_bool(rdpSettings* settings,
int id, BOOL param)
1196int freerdp_get_param_int(
const rdpSettings* settings,
int id)
1201int freerdp_set_param_int(rdpSettings* settings,
int id,
int param)
1206UINT32 freerdp_get_param_uint32(
const rdpSettings* settings,
int id)
1211int freerdp_set_param_uint32(rdpSettings* settings,
int id, UINT32 param)
1216UINT64 freerdp_get_param_uint64(
const rdpSettings* settings,
int id)
1221int freerdp_set_param_uint64(rdpSettings* settings,
int id, UINT64 param)
1226char* freerdp_get_param_string(
const rdpSettings* settings,
int id)
1229 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
1232int freerdp_set_param_string(rdpSettings* settings,
int id,
const char* param)
1238static BOOL value_to_uint(
const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max)
1240 char* endptr = NULL;
1241 unsigned long long rc = 0;
1243 if (!value || !result)
1247 rc = _strtoui64(value, &endptr, 0);
1252 if (endptr == value)
1255 if ((rc < min) || (rc > max))
1262static BOOL value_to_int(
const char* value, LONGLONG* result, LONGLONG min, LONGLONG max)
1264 char* endptr = NULL;
1267 if (!value || !result)
1271 rc = _strtoi64(value, &endptr, 0);
1276 if (endptr == value)
1279 if ((rc < min) || (rc > max))
1286static BOOL parsing_fail(
const char* key,
const char* type,
const char* value)
1288 WLog_ERR(TAG,
"Failed to parse key [%s] of type [%s]: value [%s]", key, type, value);
1292BOOL freerdp_settings_set_value_for_name(rdpSettings* settings,
const char* name,
const char* value)
1298 if (!settings || !name)
1304 WLog_ERR(TAG,
"Invalid settings key [%s]", name);
1308 const SSIZE_T index = i;
1314 case RDP_SETTINGS_TYPE_BOOL:
1316 const BOOL val = (_strnicmp(value,
"TRUE", 5) == 0) || (_strnicmp(value,
"ON", 5) == 0);
1318 (_strnicmp(value,
"FALSE", 6) == 0) || (_strnicmp(value,
"OFF", 6) == 0);
1320 return parsing_fail(name,
"BOOL", value);
1325 case RDP_SETTINGS_TYPE_UINT16:
1326 if (!value_to_uint(value, &uval, 0, UINT16_MAX))
1327 return parsing_fail(name,
"UINT16", value);
1332 return parsing_fail(name,
"UINT16", value);
1335 case RDP_SETTINGS_TYPE_INT16:
1336 if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX))
1337 return parsing_fail(name,
"INT16", value);
1342 return parsing_fail(name,
"INT16", value);
1344 case RDP_SETTINGS_TYPE_UINT32:
1345 if (!value_to_uint(value, &uval, 0, UINT32_MAX))
1346 return parsing_fail(name,
"UINT32", value);
1351 return parsing_fail(name,
"UINT32", value);
1353 case RDP_SETTINGS_TYPE_INT32:
1354 if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX))
1355 return parsing_fail(name,
"INT32", value);
1360 return parsing_fail(name,
"INT32", value);
1362 case RDP_SETTINGS_TYPE_UINT64:
1363 if (!value_to_uint(value, &uval, 0, UINT64_MAX))
1364 return parsing_fail(name,
"UINT64", value);
1368 return parsing_fail(name,
"UINT64", value);
1370 case RDP_SETTINGS_TYPE_INT64:
1371 if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX))
1372 return parsing_fail(name,
"INT64", value);
1376 return parsing_fail(name,
"INT64", value);
1379 case RDP_SETTINGS_TYPE_STRING:
1383 case RDP_SETTINGS_TYPE_POINTER:
1384 return parsing_fail(name,
"POINTER", value);
1391BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1392 FreeRDP_Settings_Keys_UInt32 lenId,
const void* data,
1393 size_t len,
size_t size)
1401 if (lenId != FreeRDP_UINT32_UNUSED)
1407 if (len > UINT32_MAX)
1411 copy = calloc(len, size);
1415 memcpy(copy, data, len * size);
1425 if (lenId == FreeRDP_UINT32_UNUSED)
1431 FreeRDP_Settings_Keys_Pointer
id)
1435 const rdpSettings* pc;
1443 const void* data,
size_t len)
1457 case FreeRDP_RdpServerCertificate:
1458 freerdp_certificate_free(settings->RdpServerCertificate);
1462 WLog_ERR(TAG,
"FreeRDP_RdpServerCertificate::len must be 0 or 1");
1465 settings->RdpServerCertificate = cnv.v;
1466 if (!settings->RdpServerCertificate && (len > 0))
1468 settings->RdpServerCertificate = freerdp_certificate_new();
1469 if (!settings->RdpServerCertificate)
1473 case FreeRDP_RdpServerRsaKey:
1474 freerdp_key_free(settings->RdpServerRsaKey);
1477 WLog_ERR(TAG,
"FreeRDP_RdpServerRsaKey::len must be 0 or 1");
1480 settings->RdpServerRsaKey = (rdpPrivateKey*)cnv.v;
1481 if (!settings->RdpServerRsaKey && (len > 0))
1483 settings->RdpServerRsaKey = freerdp_key_new();
1484 if (!settings->RdpServerRsaKey)
1488 case FreeRDP_RedirectionPassword:
1489 return freerdp_settings_set_pointer_len_(
1490 settings,
id, FreeRDP_RedirectionPasswordLength, data, len,
sizeof(
char));
1491 case FreeRDP_RedirectionTsvUrl:
1492 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionTsvUrlLength,
1493 data, len,
sizeof(
char));
1494 case FreeRDP_RedirectionTargetCertificate:
1495 freerdp_certificate_free(settings->RedirectionTargetCertificate);
1499 WLog_ERR(TAG,
"FreeRDP_RedirectionTargetCertificate::len must be 0 or 1");
1502 settings->RedirectionTargetCertificate = cnv.v;
1503 if (!settings->RedirectionTargetCertificate && (len > 0))
1505 settings->RedirectionTargetCertificate = freerdp_certificate_new();
1506 if (!settings->RedirectionTargetCertificate)
1510 case FreeRDP_RedirectionGuid:
1511 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionGuidLength,
1512 data, len,
sizeof(BYTE));
1513 case FreeRDP_LoadBalanceInfo:
1514 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_LoadBalanceInfoLength,
1515 data, len,
sizeof(
char));
1516 case FreeRDP_ServerRandom:
1517 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerRandomLength, data,
1519 case FreeRDP_ClientRandom:
1520 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ClientRandomLength, data,
1522 case FreeRDP_ServerCertificate:
1523 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerCertificateLength,
1524 data, len,
sizeof(
char));
1525 case FreeRDP_TargetNetAddresses:
1526 if (!freerdp_target_net_addresses_resize(settings, len))
1529 target_net_addresses_free(settings, 0);
1531 case FreeRDP_ServerLicenseProductIssuers:
1533 freerdp_server_license_issuers_free(settings);
1534 return freerdp_settings_set_pointer_len_(
1535 settings,
id, FreeRDP_ServerLicenseProductIssuersCount, data, len,
sizeof(
char*));
1536 case FreeRDP_TargetNetPorts:
1537 if (!freerdp_target_net_addresses_resize(settings, len))
1541 for (
size_t x = 0; x < len; x++)
1542 settings->TargetNetPorts[x] = 0;
1545 case FreeRDP_DeviceArray:
1547 freerdp_device_collection_free(settings);
1548 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DeviceArraySize, data,
1550 case FreeRDP_ChannelDefArray:
1551 if ((len > 0) && (len < CHANNEL_MAX_COUNT))
1553 "FreeRDP_ChannelDefArray::len expected to be >= %d, but have %" PRIuz,
1554 CHANNEL_MAX_COUNT, len);
1555 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ChannelDefArray,
1556 FreeRDP_ChannelDefArraySize, data, len,
1558 case FreeRDP_MonitorDefArray:
1559 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_MonitorDefArraySize,
1561 case FreeRDP_ClientAutoReconnectCookie:
1562 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1564 case FreeRDP_ServerAutoReconnectCookie:
1565 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1567 case FreeRDP_ClientTimeZone:
1570 WLog_ERR(TAG,
"FreeRDP_ClientTimeZone::len must be 0 or 1");
1573 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1575 case FreeRDP_BitmapCacheV2CellInfo:
1576 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_BitmapCacheV2NumCells,
1578 case FreeRDP_GlyphCache:
1579 if ((len != 0) && (len != 10))
1581 WLog_ERR(TAG,
"FreeRDP_GlyphCache::len must be 0 or 10");
1584 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1586 case FreeRDP_FragCache:
1589 WLog_ERR(TAG,
"FreeRDP_FragCache::len must be 0 or 1");
1592 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1594 case FreeRDP_StaticChannelArray:
1596 freerdp_static_channel_collection_free(settings);
1597 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_StaticChannelArraySize,
1599 case FreeRDP_DynamicChannelArray:
1601 freerdp_dynamic_channel_collection_free(settings);
1602 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DynamicChannelArraySize,
1604 case FreeRDP_ReceivedCapabilityData:
1605 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1609 freerdp_capability_data_free(settings, 0, FALSE);
1612 case FreeRDP_ReceivedCapabilities:
1613 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1617 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1619 settings->ReceivedCapabilities[x] = 0;
1623 case FreeRDP_OrderSupport:
1624 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1627 case FreeRDP_MonitorIds:
1628 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_NumMonitorIds, data, len,
1631 case FreeRDP_ReceivedCapabilityDataSizes:
1632 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1636 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1637 settings->ReceivedCapabilityDataSizes[x] = 0;
1641 case FreeRDP_Password51:
1642 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_Password51Length, data,
1645 if ((data == NULL) && (len == 0))
1650 WLog_WARN(TAG,
"Invalid id %d",
id);
1655void* freerdp_settings_get_pointer_array_writable(
const rdpSettings* settings,
1656 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1663 case FreeRDP_ClientAutoReconnectCookie:
1665 if ((offset >= max) || !settings->ClientAutoReconnectCookie)
1667 return &settings->ClientAutoReconnectCookie[offset];
1668 case FreeRDP_ServerAutoReconnectCookie:
1670 if ((offset >= max) || !settings->ServerAutoReconnectCookie)
1672 return &settings->ServerAutoReconnectCookie[offset];
1673 case FreeRDP_ServerCertificate:
1677 return &settings->ServerCertificate[offset];
1678 case FreeRDP_ServerRandom:
1682 return &settings->ServerRandom[offset];
1683 case FreeRDP_ClientRandom:
1687 return &settings->ClientRandom[offset];
1688 case FreeRDP_LoadBalanceInfo:
1692 return &settings->LoadBalanceInfo[offset];
1694 case FreeRDP_RedirectionTsvUrl:
1698 return &settings->RedirectionTsvUrl[offset];
1700 case FreeRDP_RedirectionPassword:
1704 return &settings->RedirectionPassword[offset];
1706 case FreeRDP_OrderSupport:
1710 return &settings->OrderSupport[offset];
1711 case FreeRDP_MonitorIds:
1715 return &settings->MonitorIds[offset];
1716 case FreeRDP_MonitorDefArray:
1720 return &settings->MonitorDefArray[offset];
1721 case FreeRDP_ChannelDefArray:
1725 return &settings->ChannelDefArray[offset];
1726 case FreeRDP_DeviceArray:
1730 return settings->DeviceArray[offset];
1731 case FreeRDP_StaticChannelArray:
1735 return settings->StaticChannelArray[offset];
1736 case FreeRDP_DynamicChannelArray:
1740 return settings->DynamicChannelArray[offset];
1741 case FreeRDP_FragCache:
1745 return &settings->FragCache[offset];
1746 case FreeRDP_GlyphCache:
1750 return &settings->GlyphCache[offset];
1751 case FreeRDP_BitmapCacheV2CellInfo:
1755 return &settings->BitmapCacheV2CellInfo[offset];
1756 case FreeRDP_ReceivedCapabilities:
1760 return &settings->ReceivedCapabilities[offset];
1761 case FreeRDP_TargetNetAddresses:
1765 WINPR_ASSERT(settings->TargetNetAddresses);
1766 return settings->TargetNetAddresses[offset];
1767 case FreeRDP_TargetNetPorts:
1771 WINPR_ASSERT(settings->TargetNetPorts);
1772 return &settings->TargetNetPorts[offset];
1773 case FreeRDP_ClientTimeZone:
1777 return settings->ClientTimeZone;
1778 case FreeRDP_RdpServerCertificate:
1782 return settings->RdpServerCertificate;
1783 case FreeRDP_RdpServerRsaKey:
1787 return settings->RdpServerRsaKey;
1788 case FreeRDP_ServerLicenseProductIssuers:
1792 return settings->ServerLicenseProductIssuers[offset];
1793 case FreeRDP_ReceivedCapabilityData:
1797 WINPR_ASSERT(settings->ReceivedCapabilityData);
1798 return settings->ReceivedCapabilityData[offset];
1800 case FreeRDP_ReceivedCapabilityDataSizes:
1804 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1805 return &settings->ReceivedCapabilityDataSizes[offset];
1812 WLog_WARN(TAG,
"Invalid offset for %s [%d]: size=%" PRIuz
", offset=%" PRIuz,
1817BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1818 size_t offset,
const void* data)
1820 size_t maxOffset = 0;
1825 case FreeRDP_ClientAutoReconnectCookie:
1827 if ((offset >= maxOffset) || !data || !settings->ClientAutoReconnectCookie)
1831 case FreeRDP_ServerAutoReconnectCookie:
1833 if ((offset >= maxOffset) || !data || !settings->ServerAutoReconnectCookie)
1837 case FreeRDP_ServerCertificate:
1839 if ((offset >= maxOffset) || !data)
1841 settings->ServerCertificate[offset] = *(
const BYTE*)data;
1843 case FreeRDP_DeviceArray:
1845 if (offset >= maxOffset)
1847 freerdp_device_free(settings->DeviceArray[offset]);
1848 settings->DeviceArray[offset] = freerdp_device_clone(data);
1850 case FreeRDP_TargetNetAddresses:
1852 if ((offset >= maxOffset) || !data)
1854 WINPR_ASSERT(settings->TargetNetAddresses);
1855 free(settings->TargetNetAddresses[offset]);
1856 settings->TargetNetAddresses[offset] = _strdup((
const char*)data);
1857 return settings->TargetNetAddresses[offset] != NULL;
1858 case FreeRDP_TargetNetPorts:
1860 if ((offset >= maxOffset) || !data)
1862 WINPR_ASSERT(settings->TargetNetPorts);
1863 settings->TargetNetPorts[offset] = *((
const UINT32*)data);
1865 case FreeRDP_StaticChannelArray:
1867 if ((offset >= maxOffset) || !data)
1869 freerdp_addin_argv_free(settings->StaticChannelArray[offset]);
1870 settings->StaticChannelArray[offset] = freerdp_addin_argv_clone(data);
1872 case FreeRDP_DynamicChannelArray:
1874 if ((offset >= maxOffset) || !data)
1876 freerdp_addin_argv_free(settings->DynamicChannelArray[offset]);
1877 settings->DynamicChannelArray[offset] = freerdp_addin_argv_clone(data);
1879 case FreeRDP_BitmapCacheV2CellInfo:
1881 if ((offset >= maxOffset) || !data)
1885 settings->BitmapCacheV2CellInfo[offset] = *cdata;
1888 case FreeRDP_ServerRandom:
1890 if ((offset >= maxOffset) || !data)
1892 settings->ServerRandom[offset] = *(
const BYTE*)data;
1894 case FreeRDP_ClientRandom:
1896 if ((offset >= maxOffset) || !data)
1898 settings->ClientRandom[offset] = *(
const BYTE*)data;
1900 case FreeRDP_LoadBalanceInfo:
1902 if ((offset >= maxOffset) || !data)
1904 settings->LoadBalanceInfo[offset] = *(
const BYTE*)data;
1906 case FreeRDP_RedirectionTsvUrl:
1908 if ((offset >= maxOffset) || !data)
1910 settings->RedirectionTsvUrl[offset] = *(
const BYTE*)data;
1912 case FreeRDP_RedirectionPassword:
1914 if ((offset >= maxOffset) || !data)
1916 settings->RedirectionPassword[offset] = *(
const BYTE*)data;
1918 case FreeRDP_OrderSupport:
1920 if (!settings->OrderSupport)
1922 if ((offset >= maxOffset) || !data)
1924 settings->OrderSupport[offset] = *(
const BOOL*)data ? 1 : 0;
1926 case FreeRDP_GlyphCache:
1928 if (!settings->GlyphCache)
1930 if ((offset >= maxOffset) || !data)
1934 case FreeRDP_FragCache:
1936 if (!settings->FragCache)
1938 if ((offset >= maxOffset) || !data)
1942 case FreeRDP_MonitorIds:
1944 if ((offset >= maxOffset) || !data)
1946 settings->MonitorIds[offset] = *(
const UINT32*)data;
1948 case FreeRDP_ChannelDefArray:
1950 if ((offset >= maxOffset) || !data)
1952 settings->ChannelDefArray[offset] = *(
const CHANNEL_DEF*)data;
1954 case FreeRDP_MonitorDefArray:
1956 if ((offset >= maxOffset) || !data)
1958 settings->MonitorDefArray[offset] = *(
const rdpMonitor*)data;
1961 case FreeRDP_ClientTimeZone:
1963 if ((offset >= maxOffset) || !data || !settings->ClientTimeZone)
1968 case FreeRDP_ServerLicenseProductIssuers:
1971 if ((offset >= maxOffset) || !settings->ServerLicenseProductIssuers)
1973 free(settings->ServerLicenseProductIssuers[offset]);
1974 settings->ServerLicenseProductIssuers[offset] = NULL;
1976 settings->ServerLicenseProductIssuers[offset] = _strdup((
const char*)data);
1979 case FreeRDP_ReceivedCapabilityData:
1981 if (offset >= maxOffset)
1983 WINPR_ASSERT(settings->ReceivedCapabilityData);
1984 settings->ReceivedCapabilityData[offset] = WINPR_CAST_CONST_PTR_AWAY(data, BYTE*);
1986 case FreeRDP_ReceivedCapabilityDataSizes:
1988 if (offset >= maxOffset)
1990 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1991 settings->ReceivedCapabilityDataSizes[offset] = *(
const uint32_t*)data;
1999 WLog_WARN(TAG,
"[%s] Invalid offset=%" PRIuz
" [%" PRIuz
"] or NULL data=%p",
2004const void* freerdp_settings_get_pointer_array(
const rdpSettings* settings,
2005 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
2007 return freerdp_settings_get_pointer_array_writable(settings,
id, offset);
2012 UINT32 flags = FREERDP_CODEC_ALL;
2013 if (settings->RemoteFxCodec == FALSE)
2015 flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
2017 if (settings->NSCodec == FALSE)
2019 flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
2027 WINPR_ASSERT(settings);
2028 const char* hostname = settings->ServerHostname;
2030 if (settings->UserSpecifiedServerName)
2031 hostname = settings->UserSpecifiedServerName;
2036#if defined(WITH_FREERDP_DEPRECATED)
2039 return freerdp_addin_argv_clone(channel);
2044 return freerdp_addin_argv_clone(channel);
2048BOOL freerdp_target_net_addresses_copy(rdpSettings* settings,
char** addresses, UINT32 count)
2050 WINPR_ASSERT(settings);
2051 WINPR_ASSERT(addresses);
2053 if (!freerdp_target_net_adresses_reset(settings, count))
2056 for (UINT32 i = 0; i < settings->TargetNetAddressCount; i++)
2058 const char* address = addresses[i];
2059 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_TargetNetAddresses, i, address))
2061 freerdp_target_net_addresses_free(settings);
2071 if (!what && !expect)
2073 if (!what || !expect)
2076 if (what->Id != expect->Id)
2078 if (what->Type != expect->Type)
2080 if (what->Name && expect->Name)
2082 if (strcmp(what->Name, expect->Name) != 0)
2087 if (what->Name != expect->Name)
2093 case RDPDR_DTYP_PRINT:
2097 if (a->DriverName && b->DriverName)
2098 return strcmp(a->DriverName, b->DriverName) == 0;
2099 return a->DriverName == b->DriverName;
2102 case RDPDR_DTYP_SERIAL:
2107 if (a->Path && b->Path)
2109 if (strcmp(a->Path, b->Path) != 0)
2112 else if (a->Path != b->Path)
2115 if (a->Driver && b->Driver)
2117 if (strcmp(a->Driver, b->Driver) != 0)
2120 else if (a->Driver != b->Driver)
2122 if (a->Permissive && b->Permissive)
2123 return strcmp(a->Permissive, b->Permissive) == 0;
2124 return a->Permissive == b->Permissive;
2127 case RDPDR_DTYP_PARALLEL:
2131 if (a->Path && b->Path)
2132 return strcmp(a->Path, b->Path) == 0;
2133 return a->Path == b->Path;
2136 case RDPDR_DTYP_SMARTCARD:
2138 case RDPDR_DTYP_FILESYSTEM:
2142 if (a->automount != b->automount)
2144 if (a->Path && b->Path)
2145 return strcmp(a->Path, b->Path) == 0;
2146 return a->Path == b->Path;
2159 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
2160 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
2161 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED |
2162 RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED;
2164 if (flags & RAIL_LEVEL_SUPPORTED)
2165 winpr_str_append(
"RAIL_LEVEL_SUPPORTED", buffer, length,
"|");
2166 if (flags & RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED)
2167 winpr_str_append(
"RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED", buffer, length,
"|");
2168 if (flags & RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED)
2169 winpr_str_append(
"RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED", buffer, length,
"|");
2170 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2171 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2172 if (flags & RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED)
2173 winpr_str_append(
"RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED", buffer, length,
"|");
2174 if (flags & RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED)
2175 winpr_str_append(
"RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED", buffer, length,
"|");
2176 if (flags & RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED)
2177 winpr_str_append(
"RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED", buffer, length,
"|");
2178 if (flags & RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED)
2179 winpr_str_append(
"RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED", buffer, length,
"|");
2180 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2181 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2182 if ((flags & ~mask) != 0)
2184 char tbuffer[64] = { 0 };
2185 (void)_snprintf(tbuffer,
sizeof(tbuffer),
"RAIL_FLAG_UNKNOWN 0x%08" PRIx32, flags & mask);
2186 winpr_str_append(tbuffer, buffer, length,
"|");
2192 const BYTE** capsData,
const UINT32* capsSizes,
2193 UINT32 capsCount, BOOL serverReceivedCaps)
2195 WINPR_ASSERT(settings);
2196 WINPR_ASSERT(capsFlags || (capsCount == 0));
2197 WINPR_ASSERT(capsData || (capsCount == 0));
2198 WINPR_ASSERT(capsSizes || (capsCount == 0));
2199 WINPR_ASSERT(capsCount <= UINT16_MAX);
2201 wLog* log = WLog_Get(TAG);
2203 for (UINT32 x = 0; x < capsCount; x++)
2208 wStream* sub = Stream_StaticConstInit(&buffer, capsData[x], capsSizes[x]);
2210 if (!rdp_read_capability_set(log, sub, (UINT16)x, settings, serverReceivedCaps))
2223 return "RDP_VERSION_4";
2224 case RDP_VERSION_5_PLUS:
2225 return "RDP_VERSION_5_PLUS";
2226 case RDP_VERSION_10_0:
2227 return "RDP_VERSION_10_0";
2228 case RDP_VERSION_10_1:
2229 return "RDP_VERSION_10_1";
2230 case RDP_VERSION_10_2:
2231 return "RDP_VERSION_10_2";
2232 case RDP_VERSION_10_3:
2233 return "RDP_VERSION_10_3";
2234 case RDP_VERSION_10_4:
2235 return "RDP_VERSION_10_4";
2236 case RDP_VERSION_10_5:
2237 return "RDP_VERSION_10_5";
2238 case RDP_VERSION_10_6:
2239 return "RDP_VERSION_10_6";
2240 case RDP_VERSION_10_7:
2241 return "RDP_VERSION_10_7";
2242 case RDP_VERSION_10_8:
2243 return "RDP_VERSION_10_8";
2244 case RDP_VERSION_10_9:
2245 return "RDP_VERSION_10_9";
2246 case RDP_VERSION_10_10:
2247 return "RDP_VERSION_10_10";
2248 case RDP_VERSION_10_11:
2249 return "RDP_VERSION_10_11";
2250 case RDP_VERSION_10_12:
2251 return "RDP_VERSION_10_12";
2253 return "RDP_VERSION_UNKNOWN";
2260 WINPR_ASSERT(settings);
2263 return freerdp_settings_set_string_copy_(settings,
id, NULL, 0, TRUE);
2267 char* str = ConvertWCharToUtf8Alloc(param, &len);
2268 if (!str && (len != 0))
2271 return freerdp_settings_set_string_(settings,
id, str, len);
2275 const WCHAR* param,
size_t length)
2279 WINPR_ASSERT(settings);
2282 return freerdp_settings_set_string_copy_(settings,
id, NULL, length, TRUE);
2284 char* str = ConvertWCharNToUtf8Alloc(param, length, &len);
2285 if (!str && (length != 0))
2289 const size_t wlen = _wcsnlen(param, length);
2294 return freerdp_settings_set_string_(settings,
id, str, len);
2298 FreeRDP_Settings_Keys_String
id,
size_t* pCharLen)
2305 return ConvertUtf8ToWCharAlloc(str, pCharLen);
2312 case RDPDR_DTYP_FILESYSTEM:
2313 return "RDPDR_DTYP_FILESYSTEM";
2314 case RDPDR_DTYP_PARALLEL:
2315 return "RDPDR_DTYP_PARALLEL";
2316 case RDPDR_DTYP_PRINT:
2317 return "RDPDR_DTYP_PRINT";
2318 case RDPDR_DTYP_SERIAL:
2319 return "RDPDR_DTYP_SERIAL";
2320 case RDPDR_DTYP_SMARTCARD:
2321 return "RDPDR_DTYP_SMARTCARD";
2323 return "RDPDR_DTYP_UNKNOWN";
2327const char* freerdp_encryption_level_string(UINT32 EncryptionLevel)
2329 switch (EncryptionLevel)
2331 case ENCRYPTION_LEVEL_NONE:
2332 return "ENCRYPTION_LEVEL_NONE";
2333 case ENCRYPTION_LEVEL_LOW:
2334 return "ENCRYPTION_LEVEL_LOW";
2335 case ENCRYPTION_LEVEL_CLIENT_COMPATIBLE:
2336 return "ENCRYPTION_LEVEL_CLIENT_COMPATIBLE";
2337 case ENCRYPTION_LEVEL_HIGH:
2338 return "ENCRYPTION_LEVEL_HIGH";
2339 case ENCRYPTION_LEVEL_FIPS:
2340 return "ENCRYPTION_LEVEL_FIPS";
2342 return "ENCRYPTION_LEVEL_UNKNOWN";
2346const char* freerdp_encryption_methods_string(UINT32 EncryptionMethods,
char* buffer,
size_t size)
2348 if (EncryptionMethods == ENCRYPTION_METHOD_NONE)
2350 winpr_str_append(
"ENCRYPTION_METHOD_NONE", buffer, size,
"|");
2354 if (EncryptionMethods & ENCRYPTION_METHOD_40BIT)
2356 winpr_str_append(
"ENCRYPTION_METHOD_40BIT", buffer, size,
"|");
2358 if (EncryptionMethods & ENCRYPTION_METHOD_128BIT)
2360 winpr_str_append(
"ENCRYPTION_METHOD_128BIT", buffer, size,
"|");
2362 if (EncryptionMethods & ENCRYPTION_METHOD_56BIT)
2364 winpr_str_append(
"ENCRYPTION_METHOD_56BIT", buffer, size,
"|");
2366 if (EncryptionMethods & ENCRYPTION_METHOD_FIPS)
2368 winpr_str_append(
"ENCRYPTION_METHOD_FIPS", buffer, size,
"|");
2376 const UINT32 invalid = mask & ~(RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
2377 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT);
2379 if (mask & RNS_UD_32BPP_SUPPORT)
2380 winpr_str_append(
"RNS_UD_32BPP_SUPPORT", buffer, size,
"|");
2381 if (mask & RNS_UD_24BPP_SUPPORT)
2382 winpr_str_append(
"RNS_UD_24BPP_SUPPORT", buffer, size,
"|");
2383 if (mask & RNS_UD_16BPP_SUPPORT)
2384 winpr_str_append(
"RNS_UD_16BPP_SUPPORT", buffer, size,
"|");
2385 if (mask & RNS_UD_15BPP_SUPPORT)
2386 winpr_str_append(
"RNS_UD_15BPP_SUPPORT", buffer, size,
"|");
2390 char str[32] = { 0 };
2391 (void)_snprintf(str,
sizeof(str),
"RNS_UD_INVALID[0x%04" PRIx32
"]", invalid);
2392 winpr_str_append(str, buffer, size,
"|");
2394 char hex[32] = { 0 };
2395 (void)_snprintf(hex,
sizeof(hex),
"[0x%04" PRIx16
"]", mask);
2400 const char* separator,
const char* param)
2408 winpr_asprintf(&str, &len,
"%s", param);
2409 else if (!separator)
2410 winpr_asprintf(&str, &len,
"%s%s", old, param);
2412 winpr_asprintf(&str, &len,
"%s%s%s", old, separator, param);
2421 return settings != NULL;
2428static int sort_monitor_fn(
const void* pva,
const void* pvb)
2434 if (a->is_primary && b->is_primary)
2451 WINPR_ASSERT(monitors || (count == 0));
2465 for (
size_t x = 0; x < count; x++)
2468 if (cur->is_primary)
2476 for (
size_t x = 0; x < count; x++)
2479 if ((cur->x == 0) && (cur->y == 0))
2489 WLog_ERR(TAG,
"Could not find primary monitor, aborting");
2496 WINPR_ASSERT(sorted);
2501 sorted[sortpos] = *primary;
2502 sorted[sortpos].x = 0;
2503 sorted[sortpos].y = 0;
2504 sorted[sortpos].is_primary = TRUE;
2508 const INT32 offsetX = primary->x;
2509 const INT32 offsetY = primary->y;
2515 for (
size_t x = 0; x < count; x++)
2524 sorted[sortpos++] = m;
2528 qsort(sorted, count,
sizeof(
rdpMonitor), sort_monitor_fn);
2531 WINPR_ASSERTING_INT_CAST(uint32_t, count));
2534static BOOL fill_array(WINPR_JSON* array,
const void* data,
size_t length)
2536 const BYTE* pdata = data;
2537 for (
size_t x = 0; x < length; x++)
2539 BYTE val = pdata[x];
2546static BOOL fill_uint32_array(WINPR_JSON* array,
const uint32_t* data,
size_t length)
2548 for (
size_t x = 0; x < length; x++)
2550 uint32_t val = data[x];
2557static WINPR_JSON* json_from_addin_item(
const ADDIN_ARGV* val)
2571 for (
int x = 0; x < val->argc; x++)
2573 const char* str = val->argv[x];
2575 WINPR_JSON* item = NULL;
2596static BOOL json_from_addin_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2597 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2602 for (uint32_t x = 0; x < count; x++)
2604 const ADDIN_ARGV* cval = freerdp_settings_get_pointer_array(settings, key, x);
2611static BOOL add_string_or_null(WINPR_JSON* json,
const char* key,
const char* value)
2620static WINPR_JSON* json_from_device_item(
const RDPDR_DEVICE* val)
2645 if (!add_string_or_null(obj,
"Name", val->Name))
2649 case RDPDR_DTYP_SERIAL:
2650 if (!add_string_or_null(obj,
"Path", device.serial->Path))
2652 if (!add_string_or_null(obj,
"Driver", device.serial->Driver))
2654 if (!add_string_or_null(obj,
"Permissive", device.serial->Permissive))
2657 case RDPDR_DTYP_PARALLEL:
2658 if (!add_string_or_null(obj,
"Path", device.parallel->Path))
2661 case RDPDR_DTYP_PRINT:
2662 if (!add_string_or_null(obj,
"DriverName", device.printer->DriverName))
2667 case RDPDR_DTYP_FILESYSTEM:
2668 if (!add_string_or_null(obj,
"Path", device.drive->Path))
2673 case RDPDR_DTYP_SMARTCARD:
2685static BOOL json_from_device_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2686 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2691 for (uint32_t x = 0; x < count; x++)
2693 const RDPDR_DEVICE* cval = freerdp_settings_get_pointer_array(settings, key, x);
2700static BOOL string_array_to_json(WINPR_JSON* json,
const rdpSettings* settings, uint32_t argc,
2701 FreeRDP_Settings_Keys_Pointer key)
2703 for (uint32_t x = 0; x < argc; x++)
2705 const char* cval = freerdp_settings_get_pointer_array(settings, key, x);
2707 WINPR_JSON* item = NULL;
2718static BOOL wchar_to_json(WINPR_JSON* obj,
const char* key,
const WCHAR* wstr,
size_t len)
2723 const size_t slen = len * 6;
2724 char* str = calloc(1, slen);
2728 WINPR_JSON* jstr = NULL;
2729 SSIZE_T rc = ConvertWCharNToUtf8(wstr, len, str, slen);
2733 return jstr != NULL;
2736static BOOL wchar_from_json(WCHAR* wstr,
size_t len,
const WINPR_JSON* obj,
const char* key)
2747 memset(wstr, 0,
sizeof(WCHAR) * len);
2751 SSIZE_T rc = ConvertUtf8ToWChar(str, wstr, len);
2755static int64_t int_from_json_item(
const WINPR_JSON* item, int64_t min, int64_t max)
2764 if (isinf(val) || isnan(val))
2770 const int64_t ival = (int64_t)val;
2771 if ((ival < min) || (ival > max))
2780static int64_t int_from_json(
const WINPR_JSON* obj,
const char* key, int64_t min, int64_t max)
2788 return int_from_json_item(item, min, max);
2791static uint64_t uint_from_json_item(
const WINPR_JSON* item, uint64_t max)
2800 if (isinf(val) || isnan(val) || (val < 0.0))
2806 const uint64_t uval = (uint64_t)val;
2815static uint64_t uint_from_json(
const WINPR_JSON* obj,
const char* key, uint64_t max)
2824 return uint_from_json_item(item, max);
2827static WINPR_JSON* systemtime_to_json(WINPR_JSON* parent,
const char* key,
const SYSTEMTIME* st)
2858static BOOL systemtime_from_json(
const WINPR_JSON* pobj,
const char* key,
SYSTEMTIME* st)
2870 st->wYear = (uint16_t)uint_from_json(obj,
"wYear", UINT16_MAX);
2871 st->wMonth = (uint16_t)uint_from_json(obj,
"wMonth", UINT16_MAX);
2872 st->wDayOfWeek = (uint16_t)uint_from_json(obj,
"wDayOfWeek", UINT16_MAX);
2873 st->wDay = (uint16_t)uint_from_json(obj,
"wDay", UINT16_MAX);
2874 st->wHour = (uint16_t)uint_from_json(obj,
"wHour", UINT16_MAX);
2875 st->wMinute = (uint16_t)uint_from_json(obj,
"wMinute", UINT16_MAX);
2876 st->wSecond = (uint16_t)uint_from_json(obj,
"wSecond", UINT16_MAX);
2877 st->wMilliseconds = (uint16_t)uint_from_json(obj,
"wMilliseconds", UINT16_MAX);
2889 tz->Bias = (int32_t)int_from_json(json,
"Bias", INT32_MIN, INT32_MAX);
2890 tz->StandardBias = (int32_t)int_from_json(json,
"StandardBias", INT32_MIN, INT32_MAX);
2891 tz->DaylightBias = (int32_t)int_from_json(json,
"DaylightBias", INT32_MIN, INT32_MAX);
2895 if (!systemtime_from_json(json,
"StandardDate", &tz->StandardDate))
2897 if (!systemtime_from_json(json,
"DaylightDate", &tz->DaylightDate))
2900 if (!wchar_from_json(tz->StandardName, ARRAYSIZE(tz->StandardName), json,
"StandardName"))
2902 if (!wchar_from_json(tz->DaylightName, ARRAYSIZE(tz->DaylightName), json,
"DaylightName"))
2908static BOOL ts_info_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2909 const WINPR_JSON* json)
2918 for (
size_t x = 0; x < count; x++)
2922 if (!ts_info_from_json(tz, obj))
2943 if (!wchar_to_json(obj,
"StandardName", tz.StandardName, ARRAYSIZE(tz.StandardName)))
2946 if (!systemtime_to_json(obj,
"StandardDate", &tz.StandardDate))
2952 if (!wchar_to_json(obj,
"DaylightName", tz.DaylightName, ARRAYSIZE(tz.DaylightName)))
2955 if (!systemtime_to_json(obj,
"DaylightDate", &tz.DaylightDate))
2988 for (
size_t x = 0; x < count; x++)
2990 if (!glyph_cache_def_to_json(json, &def[x]))
3005 def->cacheEntries = (uint16_t)uint_from_json(json,
"cacheEntries", UINT16_MAX);
3006 def->cacheMaximumCellSize = (uint16_t)uint_from_json(json,
"cacheMaximumCellSize", UINT16_MAX);
3010static BOOL glyph_cache_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3011 const WINPR_JSON* json)
3020 for (
size_t x = 0; x < count; x++)
3023 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3025 if (!glyph_cache_def_from_json(cache, obj))
3039 info->numEntries = (uint32_t)uint_from_json(json,
"numEntries", UINT32_MAX);
3051static BOOL bitmap_cache_v2_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3052 const WINPR_JSON* json)
3061 for (
size_t x = 0; x < count; x++)
3064 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3066 if (!bitmap_cache_v2_from_json(cache, obj))
3074 WINPR_ASSERT(cookie);
3081 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3082 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3083 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3092 if (len != ARRAYSIZE(cookie->securityVerifier))
3096 for (
size_t x = 0; x < len; x++)
3099 const uint64_t val = uint_from_json_item(citem, UINT8_MAX);
3100 cookie->securityVerifier[x] = (uint8_t)val;
3105static BOOL client_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3106 const WINPR_JSON* json)
3115 for (
size_t x = 0; x < count; x++)
3119 if (!client_cookie_from_json(cache, obj))
3127 WINPR_ASSERT(cookie);
3133 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3134 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3135 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3144 if (len != ARRAYSIZE(cookie->arcRandomBits))
3148 for (
size_t x = 0; x < len; x++)
3151 cookie->arcRandomBits[x] = (uint8_t)uint_from_json_item(citem, UINT8_MAX);
3156static BOOL server_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3157 const WINPR_JSON* json)
3166 for (
size_t x = 0; x < count; x++)
3170 if (!server_cookie_from_json(cache, obj))
3176static BOOL channel_def_from_json(
CHANNEL_DEF* cookie,
const WINPR_JSON* json)
3178 WINPR_ASSERT(cookie);
3185 cookie->options = (uint32_t)uint_from_json(json,
"options", UINT32_MAX);
3195 memset(cookie->name, 0,
sizeof(cookie->name));
3198 strncpy(cookie->name, str, strnlen(str, ARRAYSIZE(cookie->name)));
3203static BOOL channel_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3204 const WINPR_JSON* json)
3213 for (
size_t x = 0; x < count; x++)
3215 CHANNEL_DEF* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3217 if (!channel_def_from_json(cache, obj))
3223static BOOL monitor_attributes_from_json(
MONITOR_ATTRIBUTES* attributes,
const WINPR_JSON* json)
3225 WINPR_ASSERT(attributes);
3234 attributes->physicalWidth = (uint32_t)uint_from_json(obj,
"physicalWidth", UINT32_MAX);
3235 attributes->physicalHeight = (uint32_t)uint_from_json(obj,
"physicalHeight", UINT32_MAX);
3236 attributes->orientation = (uint32_t)uint_from_json(obj,
"orientation", UINT32_MAX);
3237 attributes->desktopScaleFactor =
3238 (uint32_t)uint_from_json(obj,
"desktopScaleFactor", UINT32_MAX);
3239 attributes->deviceScaleFactor = (uint32_t)uint_from_json(obj,
"deviceScaleFactor", UINT32_MAX);
3243static BOOL monitor_def_from_json(
rdpMonitor* monitor,
const WINPR_JSON* json)
3245 WINPR_ASSERT(monitor);
3251 monitor->x = (int32_t)int_from_json(json,
"x", INT32_MIN, INT32_MAX);
3252 monitor->y = (int32_t)int_from_json(json,
"y", INT32_MIN, INT32_MAX);
3253 monitor->width = (int32_t)int_from_json(json,
"width", 0, INT32_MAX);
3254 monitor->height = (int32_t)int_from_json(json,
"height", 0, INT32_MAX);
3255 monitor->orig_screen = (uint32_t)uint_from_json(json,
"orig_screen", UINT32_MAX);
3266 return monitor_attributes_from_json(&monitor->attributes, json);
3269static BOOL monitor_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3270 const WINPR_JSON* json)
3279 for (
size_t x = 0; x < count; x++)
3281 rdpMonitor* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3283 if (!monitor_def_from_json(cache, obj))
3307 for (
size_t x = 0; x < ARRAYSIZE(cs->securityVerifier); x++)
3321 for (
size_t x = 0; x < count; x++)
3323 if (!client_cookie_to_json(json, &cs[x]))
3347 for (
size_t x = 0; x < ARRAYSIZE(cs->arcRandomBits); x++)
3361 for (
size_t x = 0; x < count; x++)
3363 if (!server_cookie_to_json(json, &cs[x]))
3387 for (
size_t x = 0; x < count; x++)
3389 if (!bitmap_cache_v2_to_json(json, &info[x]))
3395static BOOL monitor_attributes_to_json(WINPR_JSON* pobj,
const MONITOR_ATTRIBUTES* attributes)
3397 WINPR_ASSERT(attributes);
3414static BOOL monitor_def_to_json(WINPR_JSON* json,
const rdpMonitor* monitor)
3416 WINPR_ASSERT(monitor);
3435 return monitor_attributes_to_json(obj, &monitor->attributes);
3438static BOOL monitor_def_array_to_json(WINPR_JSON* json,
const rdpMonitor* monitors,
size_t count)
3440 for (
size_t x = 0; x < count; x++)
3442 if (!monitor_def_to_json(json, &monitors[x]))
3448static BOOL channel_def_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channel)
3450 WINPR_ASSERT(channel);
3464static BOOL channel_def_array_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channels,
size_t count)
3466 for (
size_t x = 0; x < count; x++)
3468 if (!channel_def_to_json(json, &channels[x]))
3474static BOOL serialize_pointer(
const rdpSettings* settings, WINPR_JSON* json,
3475 FreeRDP_Settings_Keys_Pointer
id)
3491 case FreeRDP_instance:
3500 return fill_array(jval, &ptr.u,
sizeof(ptr.u));
3502 case FreeRDP_ServerRandom:
3505 return fill_array(jval, val, len);
3507 case FreeRDP_ServerCertificate:
3509 const uint32_t len =
3511 return fill_array(jval, val, len);
3513 case FreeRDP_ClientRandom:
3516 return fill_array(jval, val, len);
3518 case FreeRDP_ServerLicenseProductIssuers:
3520 const uint32_t len =
3522 return string_array_to_json(jval, settings, len, FreeRDP_ServerLicenseProductIssuers);
3524 case FreeRDP_RedirectionPassword:
3526 const uint32_t len =
3528 return fill_array(jval, val, len);
3530 case FreeRDP_RedirectionGuid:
3532 const uint32_t len =
3534 return fill_array(jval, val, len);
3536 case FreeRDP_LoadBalanceInfo:
3538 const uint32_t len =
3540 return fill_array(jval, val, len);
3542 case FreeRDP_ClientTimeZone:
3544 return tz_info_to_json(jval, val);
3546 case FreeRDP_RedirectionTsvUrl:
3548 const uint32_t len =
3550 return fill_array(jval, val, len);
3552 case FreeRDP_GlyphCache:
3554 return glyph_cache_def_array_to_json(jval, val, val ? 10 : 0);
3556 case FreeRDP_FragCache:
3558 return glyph_cache_def_array_to_json(jval, val, val ? 1 : 0);
3560 case FreeRDP_BitmapCacheV2CellInfo:
3562 const uint32_t len =
3564 return bitmap_cache_v2_array_to_json(jval, val, len);
3566 case FreeRDP_OrderSupport:
3568 const uint32_t len = 32;
3569 return fill_array(jval, val, len);
3571 case FreeRDP_ClientAutoReconnectCookie:
3573 return client_cookie_array_to_json(jval, val, 1);
3575 case FreeRDP_ServerAutoReconnectCookie:
3577 return server_cookie_array_to_json(jval, val, 1);
3579 case FreeRDP_Password51:
3582 return fill_array(jval, val, len);
3584 case FreeRDP_ReceivedCapabilities:
3586 const uint32_t len =
3588 return fill_array(jval, val, len);
3590 case FreeRDP_MonitorIds:
3593 return fill_uint32_array(jval, val, len);
3595 case FreeRDP_TargetNetPorts:
3597 const uint32_t len =
3599 return fill_uint32_array(jval, val, len);
3601 case FreeRDP_MonitorDefArray:
3604 return monitor_def_array_to_json(jval, val, len);
3606 case FreeRDP_ChannelDefArray:
3609 return channel_def_array_to_json(jval, val, len);
3611 case FreeRDP_ReceivedCapabilityDataSizes:
3613 const uint32_t len =
3615 return fill_uint32_array(jval, val, len);
3617 case FreeRDP_ReceivedCapabilityData:
3619 const uint32_t len =
3621 const UINT32* pclen =
3626 for (uint32_t x = 0; x < len; x++)
3628 const char* cval = freerdp_settings_get_pointer_array(settings,
id, x);
3635 if (!fill_array(item, cval, pclen[x]))
3640 case FreeRDP_TargetNetAddresses:
3642 const uint32_t len =
3644 return string_array_to_json(jval, settings, len,
id);
3646 case FreeRDP_RedirectionTargetCertificate:
3647 case FreeRDP_RdpServerCertificate:
3649 WINPR_JSON* item = NULL;
3651 char* pem = freerdp_certificate_get_pem(val, &len);
3664 case FreeRDP_RdpServerRsaKey:
3666 WINPR_JSON* item = NULL;
3668 char* pem = freerdp_key_get_pem(val, &len, NULL);
3677 case FreeRDP_DeviceArray:
3680 return json_from_device_item_array(jval, settings,
id, len);
3682 case FreeRDP_StaticChannelArray:
3684 const uint32_t len =
3686 return json_from_addin_item_array(jval, settings,
id, len);
3688 case FreeRDP_DynamicChannelArray:
3690 const uint32_t len =
3692 return json_from_addin_item_array(jval, settings,
id, len);
3694 case FreeRDP_POINTER_UNUSED:
3732 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
3736 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
3742 FreeRDP_Settings_Keys_Bool b;
3743 FreeRDP_Settings_Keys_Int16 i16;
3744 FreeRDP_Settings_Keys_UInt16 u16;
3745 FreeRDP_Settings_Keys_Int32 i32;
3746 FreeRDP_Settings_Keys_UInt32 u32;
3747 FreeRDP_Settings_Keys_Int64 i64;
3748 FreeRDP_Settings_Keys_UInt64 u64;
3749 FreeRDP_Settings_Keys_String str;
3750 FreeRDP_Settings_Keys_Pointer ptr;
3758 case RDP_SETTINGS_TYPE_BOOL:
3765 case RDP_SETTINGS_TYPE_UINT16:
3772 case RDP_SETTINGS_TYPE_INT16:
3779 case RDP_SETTINGS_TYPE_UINT32:
3786 case RDP_SETTINGS_TYPE_INT32:
3793 case RDP_SETTINGS_TYPE_UINT64:
3800 case RDP_SETTINGS_TYPE_INT64:
3807 case RDP_SETTINGS_TYPE_STRING:
3821 case RDP_SETTINGS_TYPE_POINTER:
3822 if (!serialize_pointer(settings, jpointer, iter.ptr))
3838 *plength = strlen(str);
3845static BOOL val_from_array(rdpSettings* settings,
const WINPR_JSON* json,
3846 FreeRDP_Settings_Keys_Pointer key,
size_t esize)
3857 size_t count = len / esize;
3858 if (count * esize != len)
3869 for (
size_t x = 0; x < len; x++)
3872 data[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3878static BOOL uintptr_from_array(rdpSettings* settings,
const WINPR_JSON* json)
3880 FreeRDP_Settings_Keys_Pointer key = FreeRDP_instance;
3885 if (len >
sizeof(
void*))
3894 uint8_t u[
sizeof(
void*)];
3898 for (
size_t x = 0; x < len; x++)
3901 ptr.u[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3908static BOOL val_from_uint32_array(rdpSettings* settings,
const WINPR_JSON* json,
3909 FreeRDP_Settings_Keys_Pointer key,
3910 FreeRDP_Settings_Keys_UInt32 keyId)
3925 for (
size_t x = 0; x < len; x++)
3927 UINT32* data = freerdp_settings_get_pointer_array_writable(settings, key, x);
3932 data[0] = (uint32_t)uint_from_json_item(val, UINT32_MAX);
3937static BOOL caps_data_entry_from_json(rdpSettings* settings,
size_t offset,
const WINPR_JSON* json)
3945 return freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset,
3949 uint8_t* data = calloc(size,
sizeof(uint8_t));
3953 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset, data))
3960 for (
size_t x = 0; x < size; x++)
3963 data[x] = (uint8_t)uint_from_json_item(item, UINT8_MAX);
3970static BOOL caps_data_array_from_json(rdpSettings* settings,
const WINPR_JSON* json)
3979 for (uint32_t x = 0; x < count; x++)
3982 if (!caps_data_entry_from_json(settings, x, array))
3988static BOOL str_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
3989 FreeRDP_Settings_Keys_Pointer key)
4000 for (
size_t x = 0; x < len; x++)
4009 if (!freerdp_settings_set_pointer_array(settings, key, x, val))
4015static BOOL addin_argv_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4016 FreeRDP_Settings_Keys_Pointer key)
4028 for (
size_t x = 0; x < len; x++)
4035 if (!jargc || !array)
4040 const int argc = (int)int_from_json_item(jargc, INT32_MIN, INT32_MAX);
4044 if (jlen != (
size_t)argc)
4049 const char** argv = (
const char**)calloc(jlen,
sizeof(
char*));
4052 for (
size_t y = 0; y < jlen; y++)
4063 ADDIN_ARGV* cval = freerdp_addin_argv_new(jlen, argv);
4067 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, x, cval);
4068 freerdp_addin_argv_free(cval);
4076static char* get_string(
const WINPR_JSON* json,
const char* key)
4082 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
4085static BOOL get_bool(
const WINPR_JSON* json,
const char* key)
4093static BOOL device_from_json_item(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
4094 size_t offset,
const WINPR_JSON* val)
4110 memset(&device, 0,
sizeof(device));
4113 device.base.Id = (uint32_t)uint_from_json(val,
"Id", UINT32_MAX);
4114 device.base.Type = (uint32_t)uint_from_json(val,
"Type", UINT32_MAX);
4117 device.base.Name = get_string(val,
"Name");
4118 if (!device.base.Name)
4121 switch (device.base.Type)
4123 case RDPDR_DTYP_SERIAL:
4124 device.serial.Path = get_string(val,
"Path");
4125 device.serial.Driver = get_string(val,
"Driver");
4126 device.serial.Permissive = get_string(val,
"Permissive");
4128 case RDPDR_DTYP_PARALLEL:
4129 device.parallel.Path = get_string(val,
"Path");
4131 case RDPDR_DTYP_PRINT:
4132 device.printer.DriverName = get_string(val,
"DriverName");
4133 device.printer.IsDefault = get_bool(val,
"IsDefault");
4135 case RDPDR_DTYP_FILESYSTEM:
4136 device.drive.Path = get_string(val,
"Path");
4137 device.drive.automount = get_bool(val,
"automount");
4139 case RDPDR_DTYP_SMARTCARD:
4143 return freerdp_settings_set_pointer_array(settings, key, offset, &device);
4146static BOOL device_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4147 FreeRDP_Settings_Keys_Pointer key)
4159 for (
size_t x = 0; x < len; x++)
4162 if (!device_from_json_item(settings, key, x, val))
4168static const char* pem_from_json(
const WINPR_JSON* jval,
size_t* plen, BOOL* pvalid)
4172 WINPR_ASSERT(pvalid);
4198static BOOL deserialize_pointer(
const WINPR_JSON* json, rdpSettings* settings,
4199 FreeRDP_Settings_Keys_Pointer
id)
4214 case FreeRDP_instance:
4215 return uintptr_from_array(settings, jval);
4216 case FreeRDP_ServerRandom:
4217 case FreeRDP_ServerCertificate:
4218 case FreeRDP_ClientRandom:
4219 case FreeRDP_RedirectionPassword:
4220 case FreeRDP_RedirectionGuid:
4221 case FreeRDP_LoadBalanceInfo:
4222 case FreeRDP_RedirectionTsvUrl:
4223 case FreeRDP_OrderSupport:
4224 case FreeRDP_Password51:
4225 return val_from_array(settings, jval,
id, 1);
4226 case FreeRDP_ReceivedCapabilities:
4227 return val_from_array(settings, jval,
id, 1);
4228 case FreeRDP_ClientTimeZone:
4229 return ts_info_array_from_json(settings,
id, jval);
4230 case FreeRDP_GlyphCache:
4231 return glyph_cache_def_array_from_json(settings,
id, jval);
4232 case FreeRDP_FragCache:
4233 return glyph_cache_def_array_from_json(settings,
id, jval);
4234 case FreeRDP_BitmapCacheV2CellInfo:
4235 return bitmap_cache_v2_array_from_json(settings,
id, jval);
4236 case FreeRDP_ClientAutoReconnectCookie:
4237 return client_cookie_array_from_json(settings,
id, jval);
4238 case FreeRDP_ServerAutoReconnectCookie:
4239 return server_cookie_array_from_json(settings,
id, jval);
4240 case FreeRDP_MonitorDefArray:
4241 return monitor_def_array_from_json(settings,
id, jval);
4242 case FreeRDP_ChannelDefArray:
4243 return channel_def_array_from_json(settings,
id, jval);
4244 case FreeRDP_MonitorIds:
4245 return val_from_uint32_array(settings, jval,
id, FreeRDP_NumMonitorIds);
4246 case FreeRDP_TargetNetPorts:
4247 return val_from_uint32_array(settings, jval,
id, FreeRDP_TargetNetAddressCount);
4248 case FreeRDP_ServerLicenseProductIssuers:
4249 case FreeRDP_TargetNetAddresses:
4250 return str_array_from_json(settings, jval,
id);
4251 case FreeRDP_ReceivedCapabilityDataSizes:
4252 return val_from_uint32_array(settings, jval,
id, FreeRDP_ReceivedCapabilitiesSize);
4253 case FreeRDP_ReceivedCapabilityData:
4254 return caps_data_array_from_json(settings, jval);
4255 case FreeRDP_RedirectionTargetCertificate:
4256 case FreeRDP_RdpServerCertificate:
4260 const char* pem = pem_from_json(jval, &len, &valid);
4266 rdpCertificate* cert = NULL;
4270 if (strnlen(pem, 2) == 0)
4271 cert = freerdp_certificate_new();
4273 cert = freerdp_certificate_new_from_pem(pem);
4278 case FreeRDP_RdpServerRsaKey:
4282 const char* pem = pem_from_json(jval, &len, &valid);
4290 rdpPrivateKey* key = freerdp_key_new_from_pem_enc(pem, NULL);
4295 case FreeRDP_DeviceArray:
4296 return device_array_from_json(settings, jval,
id);
4297 case FreeRDP_StaticChannelArray:
4298 case FreeRDP_DynamicChannelArray:
4299 return addin_argv_from_json(settings, jval,
id);
4300 case FreeRDP_POINTER_UNUSED:
4334 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
4338 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4344 FreeRDP_Settings_Keys_Bool b;
4345 FreeRDP_Settings_Keys_Int16 i16;
4346 FreeRDP_Settings_Keys_UInt16 u16;
4347 FreeRDP_Settings_Keys_Int32 i32;
4348 FreeRDP_Settings_Keys_UInt32 u32;
4349 FreeRDP_Settings_Keys_Int64 i64;
4350 FreeRDP_Settings_Keys_UInt64 u64;
4351 FreeRDP_Settings_Keys_String str;
4352 FreeRDP_Settings_Keys_Pointer ptr;
4359 case RDP_SETTINGS_TYPE_POINTER:
4360 if (!deserialize_pointer(jpointer, settings, iter.ptr))
4368 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4374 FreeRDP_Settings_Keys_Bool b;
4375 FreeRDP_Settings_Keys_Int16 i16;
4376 FreeRDP_Settings_Keys_UInt16 u16;
4377 FreeRDP_Settings_Keys_Int32 i32;
4378 FreeRDP_Settings_Keys_UInt32 u32;
4379 FreeRDP_Settings_Keys_Int64 i64;
4380 FreeRDP_Settings_Keys_UInt64 u64;
4381 FreeRDP_Settings_Keys_String str;
4382 FreeRDP_Settings_Keys_Pointer ptr;
4390 case RDP_SETTINGS_TYPE_BOOL:
4402 case RDP_SETTINGS_TYPE_UINT16:
4405 const uint16_t val = (uint16_t)uint_from_json_item(item, UINT16_MAX);
4412 case RDP_SETTINGS_TYPE_INT16:
4415 const int16_t val = (int16_t)int_from_json_item(item, INT16_MIN, INT16_MAX);
4422 case RDP_SETTINGS_TYPE_UINT32:
4425 const uint32_t val = (uint32_t)uint_from_json_item(item, UINT32_MAX);
4432 case RDP_SETTINGS_TYPE_INT32:
4434 const int64_t val = int_from_json(jint32, name, INT32_MIN, INT32_MAX);
4441 case RDP_SETTINGS_TYPE_UINT64:
4443 const uint64_t val = uint_from_json(juint64, name, UINT64_MAX);
4450 case RDP_SETTINGS_TYPE_INT64:
4453 const int64_t val = int_from_json_item(item, INT64_MIN, INT64_MAX);
4460 case RDP_SETTINGS_TYPE_STRING:
4462 const char* val = NULL;
4476 case RDP_SETTINGS_TYPE_POINTER:
WINPR_API WINPR_JSON * WINPR_JSON_CreateString(const char *string)
WINPR_JSON_CreateString.
WINPR_API BOOL WINPR_JSON_HasObjectItem(const WINPR_JSON *object, const char *string)
Check if JSON has an object matching the name.
WINPR_API WINPR_JSON * WINPR_JSON_AddNumberToObject(WINPR_JSON *object, const char *name, double number)
WINPR_JSON_AddNumberToObject.
WINPR_API BOOL WINPR_JSON_IsNull(const WINPR_JSON *item)
Check if JSON item is Null.
WINPR_API BOOL WINPR_JSON_IsString(const WINPR_JSON *item)
Check if JSON item is of type String.
WINPR_API BOOL WINPR_JSON_AddItemToArray(WINPR_JSON *array, WINPR_JSON *item)
Add an item to an existing array.
WINPR_API WINPR_JSON * WINPR_JSON_AddArrayToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddArrayToObject.
WINPR_API BOOL WINPR_JSON_IsBool(const WINPR_JSON *item)
Check if JSON item is of type BOOL.
WINPR_API double WINPR_JSON_GetNumberValue(const WINPR_JSON *item)
Return the Number value of a JSON item.
WINPR_API WINPR_JSON * WINPR_JSON_CreateObject(void)
WINPR_JSON_CreateObject.
WINPR_API WINPR_JSON * WINPR_JSON_CreateArray(void)
WINPR_JSON_CreateArray.
WINPR_API char * WINPR_JSON_Print(WINPR_JSON *item)
Serialize a JSON instance to string for minimal size without formatting see WINPR_JSON_PrintUnformatt...
WINPR_API BOOL WINPR_JSON_IsNumber(const WINPR_JSON *item)
Check if JSON item is of type Number.
WINPR_API WINPR_JSON * WINPR_JSON_GetArrayItem(const WINPR_JSON *array, size_t index)
Return a pointer to an item in the array.
WINPR_API WINPR_JSON * WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON *object, const char *string)
Same as WINPR_JSON_GetObjectItem but with case sensitive matching.
WINPR_API WINPR_JSON * WINPR_JSON_AddStringToObject(WINPR_JSON *object, const char *name, const char *string)
WINPR_JSON_AddStringToObject.
WINPR_API WINPR_JSON * WINPR_JSON_ParseWithLength(const char *value, size_t buffer_length)
Parse a JSON string.
WINPR_API WINPR_JSON * WINPR_JSON_CreateNumber(double num)
WINPR_JSON_CreateNumber.
WINPR_API BOOL WINPR_JSON_IsObject(const WINPR_JSON *item)
Check if JSON item is of type Object.
WINPR_API WINPR_JSON * WINPR_JSON_AddBoolToObject(WINPR_JSON *object, const char *name, BOOL boolean)
WINPR_JSON_AddBoolToObject.
WINPR_API char * WINPR_JSON_PrintUnformatted(WINPR_JSON *item)
Serialize a JSON instance to string without formatting for human readable formatted output see WINPR_...
WINPR_API WINPR_JSON * WINPR_JSON_CreateNull(void)
WINPR_JSON_CreateNull.
WINPR_API const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.
WINPR_API WINPR_JSON * WINPR_JSON_AddNullToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddNullToObject.
WINPR_API void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
WINPR_API size_t WINPR_JSON_GetArraySize(const WINPR_JSON *array)
Get the number of arrayitems from an array.
WINPR_API BOOL WINPR_JSON_IsArray(const WINPR_JSON *item)
Check if JSON item is of type Array.
WINPR_API WINPR_JSON * WINPR_JSON_AddObjectToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddObjectToObject.
WINPR_API BOOL WINPR_JSON_IsTrue(const WINPR_JSON *item)
Check if JSON item is BOOL value True.
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
const char * freerdp_rail_support_flags_to_string(UINT32 flags, char *buffer, size_t length)
Returns a stringified representation of RAIL support flags.
BOOL freerdp_settings_update_from_caps(rdpSettings *settings, const BYTE *capsFlags, const BYTE **capsData, const UINT32 *capsSizes, UINT32 capsCount, BOOL serverReceivedCaps)
Parse capability data and apply to settings.
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.
const char * freerdp_supported_color_depths_string(UINT16 mask, char *buffer, size_t size)
returns a string representation of RNS_UD_XXBPP_SUPPORT values
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.
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.
const char * freerdp_rdp_version_string(UINT32 version)
Returns a stringified representation of the RDP protocol version.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.
BOOL freerdp_settings_are_valid(const rdpSettings *settings)
Returns TRUE if settings are in a valid state, FALSE otherwise.
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.
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.
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.
const char * freerdp_rdpdr_dtyp_string(UINT32 type)
Returns a string representation of RDPDR_DTYP_*.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
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.
WCHAR * freerdp_settings_get_string_as_utf16(const rdpSettings *settings, FreeRDP_Settings_Keys_String id, size_t *pCharLen)
Return an allocated UTF16 string.
BOOL freerdp_device_collection_del(rdpSettings *settings, const RDPDR_DEVICE *device)
Removed a device from the settings, returns ownership of the allocated device to caller.
BOOL freerdp_set_gateway_usage_method(rdpSettings *settings, UINT32 GatewayUsageMethod)
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.
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.
const char * freerdp_settings_get_server_name(const rdpSettings *settings)
A helper function to return the correct server name.
const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
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.
BOOL freerdp_settings_append_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *separator, const char *param)
appends a string to a settings value. The param is copied. If the initial value of the setting was no...
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 const char * freerdp_settings_get_type_name_for_type(SSIZE_T type)
Returns the type name for a type.
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.
rdpSettings * freerdp_settings_deserialize(const char *jstr, size_t length)
A function that converts a JSON string to a rdpSettings struct.