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)
85 memmove_s((
void*)&args->argv[x],
86 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) *
sizeof(
char*),
87 (
void*)&args->argv[x + 1],
88 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) *
90 args->argv[args->argc - 1] =
nullptr;
98int freerdp_addin_set_argument(
ADDIN_ARGV* args,
const char* argument)
100 if (!args || !argument)
103 for (
int i = 0; i < args->argc; i++)
105 if (strcmp(args->argv[i], argument) == 0)
111 if (!freerdp_addin_argv_add_argument(args, argument))
116int freerdp_addin_replace_argument(
ADDIN_ARGV* args,
const char* previous,
const char* argument)
118 if (!args || !previous || !argument)
121 for (
int i = 0; i < args->argc; i++)
123 if (strcmp(args->argv[i], previous) == 0)
127 if (!(args->argv[i] = _strdup(argument)))
134 if (!freerdp_addin_argv_add_argument(args, argument))
139int freerdp_addin_set_argument_value(
ADDIN_ARGV* args,
const char* option,
const char* value)
145 if (!args || !option || !value)
147 length = strlen(option) + strlen(value) + 1;
148 str = (
char*)calloc(length + 1,
sizeof(
char));
153 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
155 for (
int i = 0; i < args->argc; i++)
157 p = strchr(args->argv[i],
':');
161 if (strncmp(args->argv[i], option,
162 WINPR_ASSERTING_INT_CAST(
size_t, p - args->argv[i])) == 0)
171 rc = freerdp_addin_argv_add_argument(args, str);
178int freerdp_addin_replace_argument_value(
ADDIN_ARGV* args,
const char* previous,
const char* option,
184 if (!args || !previous || !option || !value)
186 length = strlen(option) + strlen(value) + 1;
187 str = (
char*)calloc(length + 1,
sizeof(
char));
192 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
194 for (
int i = 0; i < args->argc; i++)
196 if (strcmp(args->argv[i], previous) == 0)
204 rc = freerdp_addin_argv_add_argument(args, str);
211BOOL freerdp_device_collection_add(rdpSettings* settings,
RDPDR_DEVICE* device)
215 WINPR_ASSERT(settings);
216 WINPR_ASSERT(device);
222 const size_t new_size = (old + 32);
229 settings->DeviceArray = new_array;
230 for (
size_t x = old; x < new_size; x++)
231 settings->DeviceArray[x] =
nullptr;
234 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
238 settings->DeviceArray[settings->DeviceCount++] = device;
244 WINPR_ASSERT(settings);
249 const UINT32 count = settings->DeviceCount;
250 for (
size_t x = 0; x < count; x++)
255 for (
size_t y = x + 1; y < count; y++)
258 settings->DeviceArray[y - 1] = next;
260 settings->DeviceArray[count - 1] =
nullptr;
261 settings->DeviceCount--;
269RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings,
const char* name)
273 WINPR_ASSERT(settings);
275 for (UINT32 index = 0; index < settings->DeviceCount; index++)
277 device = settings->DeviceArray[index];
282 if (strcmp(device->Name, name) == 0)
289RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
292 WINPR_ASSERT(settings);
294 for (UINT32 index = 0; index < settings->DeviceCount; index++)
296 device = settings->DeviceArray[index];
298 if (device->Type == type)
305RDPDR_DEVICE* freerdp_device_new(UINT32 Type,
size_t count,
const char*
const args[])
318 device.base =
nullptr;
319 WINPR_ASSERT(args || (count == 0));
323 case RDPDR_DTYP_PRINT:
326 case RDPDR_DTYP_SERIAL:
329 case RDPDR_DTYP_PARALLEL:
332 case RDPDR_DTYP_SMARTCARD:
335 case RDPDR_DTYP_FILESYSTEM:
342 device.base = calloc(1, size);
346 device.base->Type = Type;
350 device.base->Name = _strdup(args[0]);
351 if (!device.base->Name)
356 case RDPDR_DTYP_PRINT:
359 device.printer->DriverName = _strdup(args[1]);
360 if (!device.printer->DriverName)
366 device.printer->IsDefault = _stricmp(args[2],
"default") == 0;
369 case RDPDR_DTYP_SERIAL:
372 device.serial->Path = _strdup(args[1]);
373 if (!device.serial->Path)
379 device.serial->Driver = _strdup(args[2]);
380 if (!device.serial->Driver)
386 device.serial->Permissive = _strdup(args[3]);
387 if (!device.serial->Permissive)
391 case RDPDR_DTYP_PARALLEL:
394 device.parallel->Path = _strdup(args[1]);
395 if (!device.serial->Path)
399 case RDPDR_DTYP_SMARTCARD:
401 case RDPDR_DTYP_FILESYSTEM:
404 device.drive->Path = _strdup(args[1]);
405 if (!device.drive->Path)
409 device.drive->automount = (args[2] ==
nullptr);
418 freerdp_device_free(device.base);
439 switch (device->Type)
441 case RDPDR_DTYP_PRINT:
442 free(cnv.printer->DriverName);
444 case RDPDR_DTYP_SERIAL:
445 free(cnv.serial->Path);
446 free(cnv.serial->Driver);
447 free(cnv.serial->Permissive);
449 case RDPDR_DTYP_PARALLEL:
450 free(cnv.parallel->Path);
452 case RDPDR_DTYP_SMARTCARD:
454 case RDPDR_DTYP_FILESYSTEM:
455 free(cnv.drive->Path);
486 const char* args[4] = WINPR_C_ARRAY_INIT;
496 args[count++] = device->Name;
499 switch (device->Type)
501 case RDPDR_DTYP_FILESYSTEM:
504 args[count++] = src.drive->Path;
505 args[count++] = src.drive->automount ? nullptr : src.drive->Path;
509 case RDPDR_DTYP_PRINT:
510 if (src.printer->DriverName)
511 args[count++] = src.printer->DriverName;
514 case RDPDR_DTYP_SMARTCARD:
517 case RDPDR_DTYP_SERIAL:
518 if (src.serial->Path)
519 args[count++] = src.serial->Path;
521 if (src.serial->Driver)
522 args[count++] = src.serial->Driver;
524 if (src.serial->Permissive)
525 args[count++] = src.serial->Permissive;
528 case RDPDR_DTYP_PARALLEL:
529 if (src.parallel->Path)
530 args[count++] = src.parallel->Path;
533 WLog_ERR(TAG,
"unknown device type %" PRIu32
"", device->Type);
537 copy.dev = freerdp_device_new(device->Type, count, args);
541 copy.dev->Id = device->Id;
546void freerdp_device_collection_free(rdpSettings* settings)
548 WINPR_ASSERT(settings);
550 if (settings->DeviceArray)
552 for (UINT32 index = 0; index < settings->DeviceArraySize; index++)
555 freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index,
nullptr);
558 "freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, "
559 "index=%" PRIu32
", nullptr) failed",
564 free((
void*)settings->DeviceArray);
568 "freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, nullptr) failed");
570 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0) failed");
572 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0) failed");
575BOOL freerdp_static_channel_collection_del(rdpSettings* settings,
const char* name)
578 if (!settings || !settings->StaticChannelArray)
581 for (UINT32 x = 0; x < count; x++)
583 ADDIN_ARGV* cur = settings->StaticChannelArray[x];
584 if (cur && (cur->argc > 0))
586 if (strcmp(name, cur->argv[0]) == 0)
588 const BOOL success = memmove_s((
void*)&settings->StaticChannelArray[x],
590 (
void*)&settings->StaticChannelArray[x + 1],
592 for (
size_t y = count - 1; y < settings->StaticChannelArraySize; y++)
593 settings->StaticChannelArray[y] =
nullptr;
595 freerdp_addin_argv_free(cur);
603 for (
size_t x = count; x < settings->StaticChannelArraySize; x++)
604 settings->StaticChannelArray[x] =
nullptr;
609BOOL freerdp_static_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
613 WINPR_ASSERT(settings);
614 WINPR_ASSERT(channel);
619 const UINT32 oldSize =
621 const size_t new_size = oldSize + 32ul;
628 settings->StaticChannelArray = new_array;
630 for (
size_t x = oldSize; x < new_size; x++)
631 settings->StaticChannelArray[x] =
nullptr;
634 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
640 ADDIN_ARGV** cur = &settings->StaticChannelArray[count++];
641 freerdp_addin_argv_free(*cur);
646ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings,
const char* name)
650 WINPR_ASSERT(settings);
653 for (UINT32 index = 0;
656 channel = settings->StaticChannelArray[index];
658 if (strcmp(channel->argv[0], name) == 0)
665void freerdp_static_channel_collection_free(rdpSettings* settings)
670 if (settings->StaticChannelArray)
674 freerdp_addin_argv_free(settings->StaticChannelArray[i]);
677 free((
void*)settings->StaticChannelArray);
680 TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0) failed");
681 settings->StaticChannelArray =
nullptr;
684 "freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0) failed");
687BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings,
const char* name)
690 if (!settings || !settings->DynamicChannelArray)
693 for (UINT32 x = 0; x < count; x++)
695 ADDIN_ARGV* cur = settings->DynamicChannelArray[x];
696 if (cur && (cur->argc > 0))
698 if (strcmp(name, cur->argv[0]) == 0)
700 const BOOL success = memmove_s((
void*)&settings->DynamicChannelArray[x],
702 (
void*)&settings->DynamicChannelArray[x + 1],
704 for (
size_t y = count - 1; y < settings->DynamicChannelArraySize; y++)
705 settings->DynamicChannelArray[y] =
nullptr;
707 freerdp_addin_argv_free(cur);
718BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
723 WINPR_ASSERT(settings);
724 WINPR_ASSERT(channel);
731 const size_t size = oldSize + 32;
738 settings->DynamicChannelArray = new_array;
740 for (
size_t x = oldSize; x < size; x++)
741 settings->DynamicChannelArray[x] =
nullptr;
744 WINPR_ASSERTING_INT_CAST(uint32_t, size)))
749 settings->DynamicChannelArray[count++] = channel;
753ADDIN_ARGV* freerdp_dynamic_channel_collection_find(
const rdpSettings* settings,
const char* name)
755 WINPR_ASSERT(settings);
758 for (UINT32 index = 0;
761 ADDIN_ARGV* channel = settings->DynamicChannelArray[index];
763 if (strcmp(channel->argv[0], name) == 0)
777 for (
int index = 0; index < args->argc; index++)
778 free(args->argv[index]);
779 free((
void*)args->argv);
785ADDIN_ARGV* freerdp_addin_argv_new(
size_t argc,
const char*
const argv[])
787 if (argc > INT32_MAX)
796 args->argc = (int)argc;
797 args->argv = (
char**)calloc(argc,
sizeof(
char*));
803 for (
size_t x = 0; x < argc; x++)
805 args->argv[x] = _strdup(argv[x]);
813 WINPR_PRAGMA_DIAG_PUSH
814 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
815 freerdp_addin_argv_free(args);
816 WINPR_PRAGMA_DIAG_POP
830 return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
833void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
835 WINPR_ASSERT(settings);
837 if (settings->DynamicChannelArray)
841 freerdp_addin_argv_free(settings->DynamicChannelArray[i]);
844 free((
void*)settings->DynamicChannelArray);
848 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0) failed");
849 settings->DynamicChannelArray =
nullptr;
852 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0) failed");
855static void freerdp_capability_data_free(rdpSettings* settings,
size_t offset, BOOL full)
857 WINPR_ASSERT(settings);
859 if (settings->ReceivedCapabilityData)
861 for (
size_t x = offset; x < settings->ReceivedCapabilitiesSize; x++)
863 free(settings->ReceivedCapabilityData[x]);
864 settings->ReceivedCapabilityData[x] =
nullptr;
868 free((
void*)settings->ReceivedCapabilityData);
869 settings->ReceivedCapabilityData =
nullptr;
874void freerdp_capability_buffer_free(rdpSettings* settings)
876 WINPR_ASSERT(settings);
878 freerdp_capability_data_free(settings, 0, TRUE);
880 free(settings->ReceivedCapabilityDataSizes);
881 settings->ReceivedCapabilityDataSizes =
nullptr;
883 free(settings->ReceivedCapabilities);
884 settings->ReceivedCapabilities =
nullptr;
886 settings->ReceivedCapabilitiesSize = 0;
889static BOOL resize_setting(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
size_t oldsize,
890 size_t size,
size_t base)
893 uint8_t* ptr = realloc(old, size * base);
899 const size_t diff = size - oldsize;
900 memset(&ptr[oldsize * base], 0, diff * base);
907static BOOL resize_setting_ptr(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
908 size_t oldsize,
size_t size,
size_t base)
910 WINPR_ASSERT(base ==
sizeof(
void*));
915 uint8_t** optr = WINPR_REINTERPRET_CAST(old, uint8_t*, uint8_t**);
916 for (
size_t x = size; x < oldsize; x++)
918 uint8_t* ptr = optr[x];
922 uint8_t* ptr = realloc(old, size * base);
926 uint8_t** optr = WINPR_REINTERPRET_CAST(ptr, uint8_t*, uint8_t**);
927 for (
size_t x = oldsize; x < size; x++)
936BOOL freerdp_capability_buffer_resize(rdpSettings* settings,
size_t count, BOOL force)
938 WINPR_ASSERT(settings);
940 const uint32_t len = settings->ReceivedCapabilitiesSize;
947 freerdp_capability_data_free(settings, count, FALSE);
951 freerdp_capability_buffer_free(settings);
955 const size_t oldsize = settings->ReceivedCapabilitiesSize;
956 if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count,
959 if (!resize_setting_ptr(settings, FreeRDP_ReceivedCapabilityData, oldsize, count,
962 if (!resize_setting(settings, FreeRDP_ReceivedCapabilities, oldsize, count,
sizeof(uint32_t)))
965 settings->ReceivedCapabilitiesSize = WINPR_ASSERTING_INT_CAST(uint32_t, count);
969BOOL freerdp_capability_buffer_copy(rdpSettings* settings,
const rdpSettings* src)
971 WINPR_ASSERT(settings);
974 if (src->ReceivedCapabilitiesSize == 0)
977 if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize, TRUE))
980 for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++)
982 WINPR_ASSERT(settings->ReceivedCapabilities);
983 settings->ReceivedCapabilities[x] = src->ReceivedCapabilities[x];
985 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
986 settings->ReceivedCapabilityDataSizes[x] = src->ReceivedCapabilityDataSizes[x];
988 WINPR_ASSERT(settings->ReceivedCapabilityData);
989 if (src->ReceivedCapabilityDataSizes[x] > 0)
991 void* tmp = realloc(settings->ReceivedCapabilityData[x],
992 settings->ReceivedCapabilityDataSizes[x]);
995 memcpy(tmp, src->ReceivedCapabilityData[x], src->ReceivedCapabilityDataSizes[x]);
996 settings->ReceivedCapabilityData[x] = tmp;
1000 free(settings->ReceivedCapabilityData[x]);
1001 settings->ReceivedCapabilityData[x] =
nullptr;
1007static void target_net_addresses_free(rdpSettings* settings,
size_t offset)
1009 WINPR_ASSERT(settings);
1011 if (settings->TargetNetAddresses)
1013 for (
size_t index = offset; index < settings->TargetNetAddressCount; index++)
1015 free(settings->TargetNetAddresses[index]);
1016 settings->TargetNetAddresses[index] =
nullptr;
1021void freerdp_target_net_addresses_free(rdpSettings* settings)
1023 WINPR_ASSERT(settings);
1025 target_net_addresses_free(settings, 0);
1027 free((
void*)settings->TargetNetAddresses);
1028 settings->TargetNetAddresses =
nullptr;
1030 free(settings->TargetNetPorts);
1031 settings->TargetNetPorts =
nullptr;
1033 settings->TargetNetAddressCount = 0;
1036BOOL freerdp_target_net_addresses_resize(rdpSettings* settings,
size_t count)
1038 WINPR_ASSERT(settings);
1042 freerdp_target_net_addresses_free(settings);
1046 const uint32_t len = settings->TargetNetAddressCount;
1047 if (!resize_setting_ptr(settings, FreeRDP_TargetNetAddresses, len, count,
sizeof(
char*)))
1049 if (!resize_setting(settings, FreeRDP_TargetNetPorts, len, count,
sizeof(uint32_t)))
1052 settings->TargetNetAddressCount = WINPR_ASSERTING_INT_CAST(uint32_t, count);
1056void freerdp_server_license_issuers_free(rdpSettings* settings)
1058 WINPR_ASSERT(settings);
1060 if (settings->ServerLicenseProductIssuers)
1062 for (UINT32 x = 0; x < settings->ServerLicenseProductIssuersCount; x++)
1063 free(settings->ServerLicenseProductIssuers[x]);
1065 free((
void*)settings->ServerLicenseProductIssuers);
1066 settings->ServerLicenseProductIssuers =
nullptr;
1067 settings->ServerLicenseProductIssuersCount = 0;
1070BOOL freerdp_server_license_issuers_copy(rdpSettings* settings,
char** issuers, UINT32 count)
1072 WINPR_ASSERT(settings);
1073 WINPR_ASSERT(issuers || (count == 0));
1079 for (UINT32 x = 0; x < count; x++)
1081 char* issuer = _strdup(issuers[x]);
1084 settings->ServerLicenseProductIssuers[x] = issuer;
1090void freerdp_performance_flags_make(rdpSettings* settings)
1092 UINT32 PerformanceFlags = PERF_FLAG_NONE;
1095 PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
1098 PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
1101 PerformanceFlags |= PERF_DISABLE_WALLPAPER;
1104 PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
1107 PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
1110 PerformanceFlags |= PERF_DISABLE_THEMING;
1113 "freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, 0x%08" PRIx32
1118void freerdp_performance_flags_split(rdpSettings* settings)
1123 PERF_ENABLE_FONT_SMOOTHING) != 0);
1125 settings, FreeRDP_AllowDesktopComposition,
1127 PERF_ENABLE_DESKTOP_COMPOSITION) != 0))
1130 settings, FreeRDP_DisableWallpaper,
1132 PERF_DISABLE_WALLPAPER) != 0))
1135 settings, FreeRDP_DisableFullWindowDrag,
1137 PERF_DISABLE_FULLWINDOWDRAG) != 0))
1140 settings, FreeRDP_DisableMenuAnims,
1142 PERF_DISABLE_MENUANIMATIONS) != 0))
1145 settings, FreeRDP_DisableThemes,
1147 PERF_DISABLE_THEMING) != 0))
1151 WLog_WARN(TAG,
"freerdp_performance_flags_split() failed");
1160 if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
1166 else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
1172 else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
1178 else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
1189 else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
1199UINT32 freerdp_get_gateway_usage_method(
const rdpSettings* settings)
1204 return TSC_PROXY_MODE_DETECT;
1205 return TSC_PROXY_MODE_DIRECT;
1211void freerdp_update_gateway_usage_method(rdpSettings* settings, UINT32 GatewayEnabled,
1212 UINT32 GatewayBypassLocal)
1214 UINT32 GatewayUsageMethod = 0;
1216 if (!GatewayEnabled && !GatewayBypassLocal)
1217 GatewayUsageMethod = TSC_PROXY_MODE_NONE_DIRECT;
1218 else if (GatewayEnabled && !GatewayBypassLocal)
1219 GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
1220 else if (GatewayEnabled && GatewayBypassLocal)
1221 GatewayUsageMethod = TSC_PROXY_MODE_DETECT;
1225 "freerdp_set_gateway_usage_method(settings, GatewayUsageMethod=%" PRIu32
1227 GatewayUsageMethod);
1230#if defined(WITH_FREERDP_DEPRECATED)
1231BOOL freerdp_get_param_bool(
const rdpSettings* settings,
int id)
1236int freerdp_set_param_bool(rdpSettings* settings,
int id, BOOL param)
1241int freerdp_get_param_int(
const rdpSettings* settings,
int id)
1246int freerdp_set_param_int(rdpSettings* settings,
int id,
int param)
1251UINT32 freerdp_get_param_uint32(
const rdpSettings* settings,
int id)
1256int freerdp_set_param_uint32(rdpSettings* settings,
int id, UINT32 param)
1261UINT64 freerdp_get_param_uint64(
const rdpSettings* settings,
int id)
1266int freerdp_set_param_uint64(rdpSettings* settings,
int id, UINT64 param)
1271char* freerdp_get_param_string(
const rdpSettings* settings,
int id)
1274 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
1277int freerdp_set_param_string(rdpSettings* settings,
int id,
const char* param)
1283static BOOL value_to_uint(
const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max)
1285 char* endptr =
nullptr;
1286 unsigned long long rc = 0;
1288 if (!value || !result)
1292 rc = _strtoui64(value, &endptr, 0);
1297 if (endptr == value)
1300 if ((rc < min) || (rc > max))
1307static BOOL value_to_int(
const char* value, LONGLONG* result, LONGLONG min, LONGLONG max)
1309 char* endptr =
nullptr;
1312 if (!value || !result)
1316 rc = _strtoi64(value, &endptr, 0);
1321 if (endptr == value)
1324 if ((rc < min) || (rc > max))
1331static BOOL parsing_fail(
const char* key,
const char* type,
const char* value)
1333 WLog_ERR(TAG,
"Failed to parse key [%s] of type [%s]: value [%s]", key, type, value);
1337BOOL freerdp_settings_set_value_for_name(rdpSettings* settings,
const char* name,
const char* value)
1343 if (!settings || !name)
1349 WLog_ERR(TAG,
"Invalid settings key [%s]", name);
1353 const SSIZE_T index = i;
1359 case RDP_SETTINGS_TYPE_BOOL:
1361 const BOOL val = (_strnicmp(value,
"TRUE", 5) == 0) || (_strnicmp(value,
"ON", 5) == 0);
1363 (_strnicmp(value,
"FALSE", 6) == 0) || (_strnicmp(value,
"OFF", 6) == 0);
1365 return parsing_fail(name,
"BOOL", value);
1370 case RDP_SETTINGS_TYPE_UINT16:
1371 if (!value_to_uint(value, &uval, 0, UINT16_MAX))
1372 return parsing_fail(name,
"UINT16", value);
1377 return parsing_fail(name,
"UINT16", value);
1380 case RDP_SETTINGS_TYPE_INT16:
1381 if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX))
1382 return parsing_fail(name,
"INT16", value);
1387 return parsing_fail(name,
"INT16", value);
1389 case RDP_SETTINGS_TYPE_UINT32:
1390 if (!value_to_uint(value, &uval, 0, UINT32_MAX))
1391 return parsing_fail(name,
"UINT32", value);
1396 return parsing_fail(name,
"UINT32", value);
1398 case RDP_SETTINGS_TYPE_INT32:
1399 if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX))
1400 return parsing_fail(name,
"INT32", value);
1405 return parsing_fail(name,
"INT32", value);
1407 case RDP_SETTINGS_TYPE_UINT64:
1408 if (!value_to_uint(value, &uval, 0, UINT64_MAX))
1409 return parsing_fail(name,
"UINT64", value);
1413 return parsing_fail(name,
"UINT64", value);
1415 case RDP_SETTINGS_TYPE_INT64:
1416 if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX))
1417 return parsing_fail(name,
"INT64", value);
1421 return parsing_fail(name,
"INT64", value);
1424 case RDP_SETTINGS_TYPE_STRING:
1428 case RDP_SETTINGS_TYPE_POINTER:
1429 return parsing_fail(name,
"POINTER", value);
1436BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1437 FreeRDP_Settings_Keys_UInt32 lenId,
const void* data,
1438 size_t len,
size_t size)
1441 void* copy =
nullptr;
1446 if (lenId != FreeRDP_UINT32_UNUSED)
1452 if (len > UINT32_MAX)
1456 copy = calloc(len, size);
1460 memcpy(copy, data, len * size);
1470 if (lenId == FreeRDP_UINT32_UNUSED)
1476 FreeRDP_Settings_Keys_Pointer
id)
1480 const rdpSettings* pc;
1488 const void* data,
size_t len)
1502 case FreeRDP_instance:
1503 if ((len != 0) && (len !=
sizeof(
void*)))
1505 WLog_ERR(TAG,
"FreeRDP_instance::len must be 0 or %" PRIuz,
sizeof(
void*));
1508 settings->instance = cnv.v;
1510 case FreeRDP_RdpServerCertificate:
1511 freerdp_certificate_free(settings->RdpServerCertificate);
1515 WLog_ERR(TAG,
"FreeRDP_RdpServerCertificate::len must be 0 or 1");
1518 settings->RdpServerCertificate = cnv.v;
1519 if (!settings->RdpServerCertificate && (len > 0))
1521 settings->RdpServerCertificate = freerdp_certificate_new();
1522 if (!settings->RdpServerCertificate)
1526 case FreeRDP_RdpServerRsaKey:
1527 freerdp_key_free(settings->RdpServerRsaKey);
1530 WLog_ERR(TAG,
"FreeRDP_RdpServerRsaKey::len must be 0 or 1");
1533 settings->RdpServerRsaKey = (rdpPrivateKey*)cnv.v;
1534 if (!settings->RdpServerRsaKey && (len > 0))
1536 settings->RdpServerRsaKey = freerdp_key_new();
1537 if (!settings->RdpServerRsaKey)
1541 case FreeRDP_RedirectionPassword:
1542 return freerdp_settings_set_pointer_len_(
1543 settings,
id, FreeRDP_RedirectionPasswordLength, data, len,
sizeof(
char));
1544 case FreeRDP_RedirectionTsvUrl:
1545 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionTsvUrlLength,
1546 data, len,
sizeof(
char));
1547 case FreeRDP_RedirectionTargetCertificate:
1548 freerdp_certificate_free(settings->RedirectionTargetCertificate);
1552 WLog_ERR(TAG,
"FreeRDP_RedirectionTargetCertificate::len must be 0 or 1");
1555 settings->RedirectionTargetCertificate = cnv.v;
1556 if (!settings->RedirectionTargetCertificate && (len > 0))
1558 settings->RedirectionTargetCertificate = freerdp_certificate_new();
1559 if (!settings->RedirectionTargetCertificate)
1563 case FreeRDP_RedirectionGuid:
1564 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionGuidLength,
1565 data, len,
sizeof(BYTE));
1566 case FreeRDP_LoadBalanceInfo:
1567 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_LoadBalanceInfoLength,
1568 data, len,
sizeof(
char));
1569 case FreeRDP_ServerRandom:
1570 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerRandomLength, data,
1572 case FreeRDP_ClientRandom:
1573 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ClientRandomLength, data,
1575 case FreeRDP_ServerCertificate:
1576 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerCertificateLength,
1577 data, len,
sizeof(
char));
1578 case FreeRDP_TargetNetAddresses:
1579 if (!freerdp_target_net_addresses_resize(settings, len))
1581 if (data ==
nullptr)
1582 target_net_addresses_free(settings, 0);
1584 case FreeRDP_ServerLicenseProductIssuers:
1585 if (data ==
nullptr)
1586 freerdp_server_license_issuers_free(settings);
1587 return freerdp_settings_set_pointer_len_(
1588 settings,
id, FreeRDP_ServerLicenseProductIssuersCount, data, len,
sizeof(
char*));
1589 case FreeRDP_TargetNetPorts:
1590 if (!freerdp_target_net_addresses_resize(settings, len))
1592 if (data ==
nullptr)
1594 for (
size_t x = 0; x < len; x++)
1595 settings->TargetNetPorts[x] = 0;
1598 case FreeRDP_DeviceArray:
1599 if (data ==
nullptr)
1600 freerdp_device_collection_free(settings);
1601 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DeviceArraySize, data,
1603 case FreeRDP_ChannelDefArray:
1604 if ((len > 0) && (len < CHANNEL_MAX_COUNT))
1606 "FreeRDP_ChannelDefArray::len expected to be >= %d, but have %" PRIuz,
1607 CHANNEL_MAX_COUNT, len);
1608 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ChannelDefArray,
1609 FreeRDP_ChannelDefArraySize, data, len,
1611 case FreeRDP_MonitorDefArray:
1612 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_MonitorDefArraySize,
1614 case FreeRDP_ClientAutoReconnectCookie:
1615 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1617 case FreeRDP_ServerAutoReconnectCookie:
1618 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1620 case FreeRDP_ClientTimeZone:
1623 WLog_ERR(TAG,
"FreeRDP_ClientTimeZone::len must be 0 or 1");
1626 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1628 case FreeRDP_BitmapCacheV2CellInfo:
1629 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_BitmapCacheV2NumCells,
1631 case FreeRDP_GlyphCache:
1632 if ((len != 0) && (len != 10))
1634 WLog_ERR(TAG,
"FreeRDP_GlyphCache::len must be 0 or 10");
1637 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1639 case FreeRDP_FragCache:
1642 WLog_ERR(TAG,
"FreeRDP_FragCache::len must be 0 or 1");
1645 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1647 case FreeRDP_StaticChannelArray:
1648 if (data ==
nullptr)
1649 freerdp_static_channel_collection_free(settings);
1650 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_StaticChannelArraySize,
1652 case FreeRDP_DynamicChannelArray:
1653 if (data ==
nullptr)
1654 freerdp_dynamic_channel_collection_free(settings);
1655 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DynamicChannelArraySize,
1657 case FreeRDP_ReceivedCapabilityData:
1658 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1660 if (data ==
nullptr)
1662 freerdp_capability_data_free(settings, 0, FALSE);
1665 case FreeRDP_ReceivedCapabilities:
1666 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1668 if (data ==
nullptr)
1670 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1672 settings->ReceivedCapabilities[x] = 0;
1676 case FreeRDP_OrderSupport:
1677 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1680 case FreeRDP_MonitorIds:
1681 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_NumMonitorIds, data, len,
1684 case FreeRDP_ReceivedCapabilityDataSizes:
1685 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1687 if (data ==
nullptr)
1689 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1690 settings->ReceivedCapabilityDataSizes[x] = 0;
1694 case FreeRDP_Password51:
1695 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_Password51Length, data,
1698 if ((data ==
nullptr) && (len == 0))
1704 WLog_WARN(TAG,
"Invalid id %d",
id);
1709void* freerdp_settings_get_pointer_array_writable(
const rdpSettings* settings,
1710 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1717 case FreeRDP_ClientAutoReconnectCookie:
1719 if ((offset >= max) || !settings->ClientAutoReconnectCookie)
1721 return &settings->ClientAutoReconnectCookie[offset];
1722 case FreeRDP_ServerAutoReconnectCookie:
1724 if ((offset >= max) || !settings->ServerAutoReconnectCookie)
1726 return &settings->ServerAutoReconnectCookie[offset];
1727 case FreeRDP_ServerCertificate:
1731 return &settings->ServerCertificate[offset];
1732 case FreeRDP_ServerRandom:
1736 return &settings->ServerRandom[offset];
1737 case FreeRDP_ClientRandom:
1741 return &settings->ClientRandom[offset];
1742 case FreeRDP_LoadBalanceInfo:
1746 return &settings->LoadBalanceInfo[offset];
1748 case FreeRDP_RedirectionTsvUrl:
1752 return &settings->RedirectionTsvUrl[offset];
1754 case FreeRDP_RedirectionPassword:
1758 return &settings->RedirectionPassword[offset];
1760 case FreeRDP_OrderSupport:
1764 return &settings->OrderSupport[offset];
1765 case FreeRDP_MonitorIds:
1769 return &settings->MonitorIds[offset];
1770 case FreeRDP_MonitorDefArray:
1774 return &settings->MonitorDefArray[offset];
1775 case FreeRDP_ChannelDefArray:
1779 return &settings->ChannelDefArray[offset];
1780 case FreeRDP_DeviceArray:
1784 return settings->DeviceArray[offset];
1785 case FreeRDP_StaticChannelArray:
1789 return settings->StaticChannelArray[offset];
1790 case FreeRDP_DynamicChannelArray:
1794 return settings->DynamicChannelArray[offset];
1795 case FreeRDP_FragCache:
1799 return &settings->FragCache[offset];
1800 case FreeRDP_GlyphCache:
1804 return &settings->GlyphCache[offset];
1805 case FreeRDP_BitmapCacheV2CellInfo:
1809 return &settings->BitmapCacheV2CellInfo[offset];
1810 case FreeRDP_ReceivedCapabilities:
1814 return &settings->ReceivedCapabilities[offset];
1815 case FreeRDP_TargetNetAddresses:
1819 WINPR_ASSERT(settings->TargetNetAddresses);
1820 return settings->TargetNetAddresses[offset];
1821 case FreeRDP_TargetNetPorts:
1825 WINPR_ASSERT(settings->TargetNetPorts);
1826 return &settings->TargetNetPorts[offset];
1827 case FreeRDP_ClientTimeZone:
1831 return settings->ClientTimeZone;
1832 case FreeRDP_RdpServerCertificate:
1836 return settings->RdpServerCertificate;
1837 case FreeRDP_RdpServerRsaKey:
1841 return settings->RdpServerRsaKey;
1842 case FreeRDP_ServerLicenseProductIssuers:
1846 return settings->ServerLicenseProductIssuers[offset];
1847 case FreeRDP_ReceivedCapabilityData:
1851 WINPR_ASSERT(settings->ReceivedCapabilityData);
1852 return settings->ReceivedCapabilityData[offset];
1854 case FreeRDP_ReceivedCapabilityDataSizes:
1858 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1859 return &settings->ReceivedCapabilityDataSizes[offset];
1866 WLog_WARN(TAG,
"Invalid offset for %s [%d]: size=%" PRIuz
", offset=%" PRIuz,
1871BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1872 size_t offset,
const void* data)
1874 size_t maxOffset = 0;
1879 case FreeRDP_ClientAutoReconnectCookie:
1881 if ((offset >= maxOffset) || !data || !settings->ClientAutoReconnectCookie)
1885 case FreeRDP_ServerAutoReconnectCookie:
1887 if ((offset >= maxOffset) || !data || !settings->ServerAutoReconnectCookie)
1891 case FreeRDP_ServerCertificate:
1893 if ((offset >= maxOffset) || !data)
1895 settings->ServerCertificate[offset] = *(
const BYTE*)data;
1897 case FreeRDP_DeviceArray:
1899 if (offset >= maxOffset)
1901 freerdp_device_free(settings->DeviceArray[offset]);
1902 settings->DeviceArray[offset] = freerdp_device_clone(data);
1904 case FreeRDP_TargetNetAddresses:
1906 if ((offset >= maxOffset) || !data)
1908 WINPR_ASSERT(settings->TargetNetAddresses);
1909 free(settings->TargetNetAddresses[offset]);
1910 settings->TargetNetAddresses[offset] = _strdup((
const char*)data);
1911 return settings->TargetNetAddresses[offset] !=
nullptr;
1912 case FreeRDP_TargetNetPorts:
1914 if ((offset >= maxOffset) || !data)
1916 WINPR_ASSERT(settings->TargetNetPorts);
1917 settings->TargetNetPorts[offset] = *((
const UINT32*)data);
1919 case FreeRDP_StaticChannelArray:
1921 if ((offset >= maxOffset) || !data)
1923 freerdp_addin_argv_free(settings->StaticChannelArray[offset]);
1924 settings->StaticChannelArray[offset] = freerdp_addin_argv_clone(data);
1926 case FreeRDP_DynamicChannelArray:
1928 if ((offset >= maxOffset) || !data)
1930 freerdp_addin_argv_free(settings->DynamicChannelArray[offset]);
1931 settings->DynamicChannelArray[offset] = freerdp_addin_argv_clone(data);
1933 case FreeRDP_BitmapCacheV2CellInfo:
1935 if ((offset >= maxOffset) || !data)
1939 settings->BitmapCacheV2CellInfo[offset] = *cdata;
1942 case FreeRDP_ServerRandom:
1944 if ((offset >= maxOffset) || !data)
1946 settings->ServerRandom[offset] = *(
const BYTE*)data;
1948 case FreeRDP_ClientRandom:
1950 if ((offset >= maxOffset) || !data)
1952 settings->ClientRandom[offset] = *(
const BYTE*)data;
1954 case FreeRDP_LoadBalanceInfo:
1956 if ((offset >= maxOffset) || !data)
1958 settings->LoadBalanceInfo[offset] = *(
const BYTE*)data;
1960 case FreeRDP_RedirectionTsvUrl:
1962 if ((offset >= maxOffset) || !data)
1964 settings->RedirectionTsvUrl[offset] = *(
const BYTE*)data;
1966 case FreeRDP_RedirectionPassword:
1968 if ((offset >= maxOffset) || !data)
1970 settings->RedirectionPassword[offset] = *(
const BYTE*)data;
1972 case FreeRDP_OrderSupport:
1974 if (!settings->OrderSupport)
1976 if ((offset >= maxOffset) || !data)
1978 settings->OrderSupport[offset] = *(
const BOOL*)data ? 1 : 0;
1980 case FreeRDP_GlyphCache:
1982 if (!settings->GlyphCache)
1984 if ((offset >= maxOffset) || !data)
1988 case FreeRDP_FragCache:
1990 if (!settings->FragCache)
1992 if ((offset >= maxOffset) || !data)
1996 case FreeRDP_MonitorIds:
1998 if ((offset >= maxOffset) || !data)
2000 settings->MonitorIds[offset] = *(
const UINT32*)data;
2002 case FreeRDP_ChannelDefArray:
2004 if ((offset >= maxOffset) || !data)
2006 settings->ChannelDefArray[offset] = *(
const CHANNEL_DEF*)data;
2008 case FreeRDP_MonitorDefArray:
2010 if ((offset >= maxOffset) || !data)
2012 settings->MonitorDefArray[offset] = *(
const rdpMonitor*)data;
2015 case FreeRDP_ClientTimeZone:
2017 if ((offset >= maxOffset) || !data || !settings->ClientTimeZone)
2022 case FreeRDP_ServerLicenseProductIssuers:
2025 if ((offset >= maxOffset) || !settings->ServerLicenseProductIssuers)
2027 free(settings->ServerLicenseProductIssuers[offset]);
2028 settings->ServerLicenseProductIssuers[offset] =
nullptr;
2030 settings->ServerLicenseProductIssuers[offset] = _strdup((
const char*)data);
2033 case FreeRDP_ReceivedCapabilityData:
2035 if (offset >= maxOffset)
2037 WINPR_ASSERT(settings->ReceivedCapabilityData);
2038 settings->ReceivedCapabilityData[offset] = WINPR_CAST_CONST_PTR_AWAY(data, BYTE*);
2040 case FreeRDP_ReceivedCapabilityDataSizes:
2042 if (offset >= maxOffset)
2044 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
2045 settings->ReceivedCapabilityDataSizes[offset] = *(
const uint32_t*)data;
2053 WLog_WARN(TAG,
"[%s] Invalid offset=%" PRIuz
" [%" PRIuz
"] or nullptr data=%p",
2058const void* freerdp_settings_get_pointer_array(
const rdpSettings* settings,
2059 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
2061 return freerdp_settings_get_pointer_array_writable(settings,
id, offset);
2066 UINT32 flags = FREERDP_CODEC_ALL;
2067 if (settings->RemoteFxCodec == FALSE)
2069 flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
2071 if (settings->NSCodec == FALSE)
2073 flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
2081 WINPR_ASSERT(settings);
2082 const char* hostname = settings->ServerHostname;
2084 if (settings->UserSpecifiedServerName)
2085 hostname = settings->UserSpecifiedServerName;
2090#if defined(WITH_FREERDP_DEPRECATED)
2093 return freerdp_addin_argv_clone(channel);
2098 return freerdp_addin_argv_clone(channel);
2102BOOL freerdp_target_net_addresses_copy(rdpSettings* settings,
char** addresses, UINT32 count)
2104 WINPR_ASSERT(settings);
2105 WINPR_ASSERT(addresses);
2107 if (!freerdp_target_net_adresses_reset(settings, count))
2110 for (UINT32 i = 0; i < settings->TargetNetAddressCount; i++)
2112 const char* address = addresses[i];
2113 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_TargetNetAddresses, i, address))
2115 freerdp_target_net_addresses_free(settings);
2125 if (!what && !other)
2127 if (!what || !other)
2130 if (what->Id != other->Id)
2132 if (what->Type != other->Type)
2134 if (what->Name && other->Name)
2136 if (strcmp(what->Name, other->Name) != 0)
2141 if (what->Name != other->Name)
2147 case RDPDR_DTYP_PRINT:
2151 if (a->DriverName && b->DriverName)
2152 return strcmp(a->DriverName, b->DriverName) == 0;
2153 return a->DriverName == b->DriverName;
2156 case RDPDR_DTYP_SERIAL:
2161 if (a->Path && b->Path)
2163 if (strcmp(a->Path, b->Path) != 0)
2166 else if (a->Path != b->Path)
2169 if (a->Driver && b->Driver)
2171 if (strcmp(a->Driver, b->Driver) != 0)
2174 else if (a->Driver != b->Driver)
2176 if (a->Permissive && b->Permissive)
2177 return strcmp(a->Permissive, b->Permissive) == 0;
2178 return a->Permissive == b->Permissive;
2181 case RDPDR_DTYP_PARALLEL:
2185 if (a->Path && b->Path)
2186 return strcmp(a->Path, b->Path) == 0;
2187 return a->Path == b->Path;
2190 case RDPDR_DTYP_SMARTCARD:
2192 case RDPDR_DTYP_FILESYSTEM:
2196 if (a->automount != b->automount)
2198 if (a->Path && b->Path)
2199 return strcmp(a->Path, b->Path) == 0;
2200 return a->Path == b->Path;
2213 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
2214 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
2215 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED |
2216 RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED;
2218 if (flags & RAIL_LEVEL_SUPPORTED)
2219 winpr_str_append(
"RAIL_LEVEL_SUPPORTED", buffer, length,
"|");
2220 if (flags & RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED)
2221 winpr_str_append(
"RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED", buffer, length,
"|");
2222 if (flags & RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED)
2223 winpr_str_append(
"RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED", buffer, length,
"|");
2224 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2225 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2226 if (flags & RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED)
2227 winpr_str_append(
"RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED", buffer, length,
"|");
2228 if (flags & RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED)
2229 winpr_str_append(
"RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED", buffer, length,
"|");
2230 if (flags & RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED)
2231 winpr_str_append(
"RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED", buffer, length,
"|");
2232 if (flags & RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED)
2233 winpr_str_append(
"RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED", buffer, length,
"|");
2234 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2235 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2236 if ((flags & ~mask) != 0)
2238 char tbuffer[64] = WINPR_C_ARRAY_INIT;
2239 (void)_snprintf(tbuffer,
sizeof(tbuffer),
"RAIL_FLAG_UNKNOWN 0x%08" PRIx32, flags & mask);
2240 winpr_str_append(tbuffer, buffer, length,
"|");
2246 const BYTE** capsData,
const UINT32* capsSizes,
2247 UINT32 capsCount, BOOL serverReceivedCaps)
2249 WINPR_ASSERT(settings);
2250 WINPR_ASSERT(capsFlags || (capsCount == 0));
2251 WINPR_ASSERT(capsData || (capsCount == 0));
2252 WINPR_ASSERT(capsSizes || (capsCount == 0));
2253 WINPR_ASSERT(capsCount <= UINT16_MAX);
2255 wLog* log = WLog_Get(TAG);
2257 for (UINT32 x = 0; x < capsCount; x++)
2261 wStream buffer = WINPR_C_ARRAY_INIT;
2262 wStream* sub = Stream_StaticConstInit(&buffer, capsData[x], capsSizes[x]);
2264 if (!rdp_read_capability_set(log, sub, (UINT16)x, settings, serverReceivedCaps))
2277 return "RDP_VERSION_4";
2278 case RDP_VERSION_5_PLUS:
2279 return "RDP_VERSION_5_PLUS";
2280 case RDP_VERSION_10_0:
2281 return "RDP_VERSION_10_0";
2282 case RDP_VERSION_10_1:
2283 return "RDP_VERSION_10_1";
2284 case RDP_VERSION_10_2:
2285 return "RDP_VERSION_10_2";
2286 case RDP_VERSION_10_3:
2287 return "RDP_VERSION_10_3";
2288 case RDP_VERSION_10_4:
2289 return "RDP_VERSION_10_4";
2290 case RDP_VERSION_10_5:
2291 return "RDP_VERSION_10_5";
2292 case RDP_VERSION_10_6:
2293 return "RDP_VERSION_10_6";
2294 case RDP_VERSION_10_7:
2295 return "RDP_VERSION_10_7";
2296 case RDP_VERSION_10_8:
2297 return "RDP_VERSION_10_8";
2298 case RDP_VERSION_10_9:
2299 return "RDP_VERSION_10_9";
2300 case RDP_VERSION_10_10:
2301 return "RDP_VERSION_10_10";
2302 case RDP_VERSION_10_11:
2303 return "RDP_VERSION_10_11";
2304 case RDP_VERSION_10_12:
2305 return "RDP_VERSION_10_12";
2307 return "RDP_VERSION_UNKNOWN";
2314 WINPR_ASSERT(settings);
2317 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, 0, TRUE);
2321 char* str = ConvertWCharToUtf8Alloc(param, &len);
2322 if (!str && (len != 0))
2325 return freerdp_settings_set_string_(settings,
id, str, len);
2329 const WCHAR* param,
size_t length)
2333 WINPR_ASSERT(settings);
2336 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, length, TRUE);
2338 char* str = ConvertWCharNToUtf8Alloc(param, length, &len);
2339 if (!str && (length != 0))
2343 const size_t wlen = _wcsnlen(param, length);
2348 return freerdp_settings_set_string_(settings,
id, str, len);
2352 FreeRDP_Settings_Keys_String
id,
size_t* pCharLen)
2359 return ConvertUtf8ToWCharAlloc(str, pCharLen);
2366 case RDPDR_DTYP_FILESYSTEM:
2367 return "RDPDR_DTYP_FILESYSTEM";
2368 case RDPDR_DTYP_PARALLEL:
2369 return "RDPDR_DTYP_PARALLEL";
2370 case RDPDR_DTYP_PRINT:
2371 return "RDPDR_DTYP_PRINT";
2372 case RDPDR_DTYP_SERIAL:
2373 return "RDPDR_DTYP_SERIAL";
2374 case RDPDR_DTYP_SMARTCARD:
2375 return "RDPDR_DTYP_SMARTCARD";
2377 return "RDPDR_DTYP_UNKNOWN";
2381const char* freerdp_encryption_level_string(UINT32 EncryptionLevel)
2383 switch (EncryptionLevel)
2385 case ENCRYPTION_LEVEL_NONE:
2386 return "ENCRYPTION_LEVEL_NONE";
2387 case ENCRYPTION_LEVEL_LOW:
2388 return "ENCRYPTION_LEVEL_LOW";
2389 case ENCRYPTION_LEVEL_CLIENT_COMPATIBLE:
2390 return "ENCRYPTION_LEVEL_CLIENT_COMPATIBLE";
2391 case ENCRYPTION_LEVEL_HIGH:
2392 return "ENCRYPTION_LEVEL_HIGH";
2393 case ENCRYPTION_LEVEL_FIPS:
2394 return "ENCRYPTION_LEVEL_FIPS";
2396 return "ENCRYPTION_LEVEL_UNKNOWN";
2400const char* freerdp_encryption_methods_string(UINT32 EncryptionMethods,
char* buffer,
size_t size)
2402 if (EncryptionMethods == ENCRYPTION_METHOD_NONE)
2404 winpr_str_append(
"ENCRYPTION_METHOD_NONE", buffer, size,
"|");
2408 if (EncryptionMethods & ENCRYPTION_METHOD_40BIT)
2410 winpr_str_append(
"ENCRYPTION_METHOD_40BIT", buffer, size,
"|");
2412 if (EncryptionMethods & ENCRYPTION_METHOD_128BIT)
2414 winpr_str_append(
"ENCRYPTION_METHOD_128BIT", buffer, size,
"|");
2416 if (EncryptionMethods & ENCRYPTION_METHOD_56BIT)
2418 winpr_str_append(
"ENCRYPTION_METHOD_56BIT", buffer, size,
"|");
2420 if (EncryptionMethods & ENCRYPTION_METHOD_FIPS)
2422 winpr_str_append(
"ENCRYPTION_METHOD_FIPS", buffer, size,
"|");
2430 const UINT32 invalid = mask & ~(RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
2431 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT);
2433 if (mask & RNS_UD_32BPP_SUPPORT)
2434 winpr_str_append(
"RNS_UD_32BPP_SUPPORT", buffer, size,
"|");
2435 if (mask & RNS_UD_24BPP_SUPPORT)
2436 winpr_str_append(
"RNS_UD_24BPP_SUPPORT", buffer, size,
"|");
2437 if (mask & RNS_UD_16BPP_SUPPORT)
2438 winpr_str_append(
"RNS_UD_16BPP_SUPPORT", buffer, size,
"|");
2439 if (mask & RNS_UD_15BPP_SUPPORT)
2440 winpr_str_append(
"RNS_UD_15BPP_SUPPORT", buffer, size,
"|");
2444 char str[32] = WINPR_C_ARRAY_INIT;
2445 (void)_snprintf(str,
sizeof(str),
"RNS_UD_INVALID[0x%04" PRIx32
"]", invalid);
2446 winpr_str_append(str, buffer, size,
"|");
2448 char hex[32] = WINPR_C_ARRAY_INIT;
2449 (void)_snprintf(hex,
sizeof(hex),
"[0x%04" PRIx16
"]", mask);
2454 const char* separator,
const char* param)
2459 char* str =
nullptr;
2462 winpr_asprintf(&str, &len,
"%s", param);
2463 else if (!separator)
2464 winpr_asprintf(&str, &len,
"%s%s", old, param);
2466 winpr_asprintf(&str, &len,
"%s%s%s", old, separator, param);
2475 return settings !=
nullptr;
2482static int sort_monitor_fn(
const void* pva,
const void* pvb)
2488 if (a->is_primary && b->is_primary)
2505 WINPR_ASSERT(monitors || (count == 0));
2519 for (
size_t x = 0; x < count; x++)
2522 if (cur->is_primary)
2530 for (
size_t x = 0; x < count; x++)
2533 if ((cur->x == 0) && (cur->y == 0))
2543 WLog_ERR(TAG,
"Could not find primary monitor, aborting");
2550 WINPR_ASSERT(sorted);
2555 sorted[sortpos] = *primary;
2556 sorted[sortpos].x = 0;
2557 sorted[sortpos].y = 0;
2558 sorted[sortpos].is_primary = TRUE;
2562 const INT32 offsetX = primary->x;
2563 const INT32 offsetY = primary->y;
2569 for (
size_t x = 0; x < count; x++)
2578 sorted[sortpos++] = m;
2582 qsort(sorted, count,
sizeof(
rdpMonitor), sort_monitor_fn);
2585 WINPR_ASSERTING_INT_CAST(uint32_t, count));
2588static BOOL fill_array(WINPR_JSON* array,
const void* data,
size_t length)
2590 const BYTE* pdata = data;
2591 for (
size_t x = 0; x < length; x++)
2593 BYTE val = pdata[x];
2600static BOOL fill_uint32_array(WINPR_JSON* array,
const uint32_t* data,
size_t length)
2602 for (
size_t x = 0; x < length; x++)
2604 uint32_t val = data[x];
2611static WINPR_JSON* json_from_addin_item(
const ADDIN_ARGV* val)
2625 for (
int x = 0; x < val->argc; x++)
2627 const char* str = val->argv[x];
2629 WINPR_JSON* item =
nullptr;
2650static BOOL json_from_addin_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2651 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2656 for (uint32_t x = 0; x < count; x++)
2658 const ADDIN_ARGV* cval = freerdp_settings_get_pointer_array(settings, key, x);
2665static BOOL add_string_or_null(WINPR_JSON* json,
const char* key,
const char* value)
2674static WINPR_JSON* json_from_device_item(
const RDPDR_DEVICE* val)
2699 if (!add_string_or_null(obj,
"Name", val->Name))
2703 case RDPDR_DTYP_SERIAL:
2704 if (!add_string_or_null(obj,
"Path", device.serial->Path))
2706 if (!add_string_or_null(obj,
"Driver", device.serial->Driver))
2708 if (!add_string_or_null(obj,
"Permissive", device.serial->Permissive))
2711 case RDPDR_DTYP_PARALLEL:
2712 if (!add_string_or_null(obj,
"Path", device.parallel->Path))
2715 case RDPDR_DTYP_PRINT:
2716 if (!add_string_or_null(obj,
"DriverName", device.printer->DriverName))
2721 case RDPDR_DTYP_FILESYSTEM:
2722 if (!add_string_or_null(obj,
"Path", device.drive->Path))
2727 case RDPDR_DTYP_SMARTCARD:
2739static BOOL json_from_device_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2740 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2745 for (uint32_t x = 0; x < count; x++)
2747 const RDPDR_DEVICE* cval = freerdp_settings_get_pointer_array(settings, key, x);
2754static BOOL string_array_to_json(WINPR_JSON* json,
const rdpSettings* settings, uint32_t argc,
2755 FreeRDP_Settings_Keys_Pointer key)
2757 for (uint32_t x = 0; x < argc; x++)
2759 const char* cval = freerdp_settings_get_pointer_array(settings, key, x);
2761 WINPR_JSON* item =
nullptr;
2772static BOOL wchar_to_json(WINPR_JSON* obj,
const char* key,
const WCHAR* wstr,
size_t len)
2777 const size_t slen = len * 6;
2778 char* str = calloc(1, slen);
2782 WINPR_JSON* jstr =
nullptr;
2783 SSIZE_T rc = ConvertWCharNToUtf8(wstr, len, str, slen);
2787 return jstr !=
nullptr;
2790static BOOL wchar_from_json(WCHAR* wstr,
size_t len,
const WINPR_JSON* obj,
const char* key)
2801 memset(wstr, 0,
sizeof(WCHAR) * len);
2805 SSIZE_T rc = ConvertUtf8ToWChar(str, wstr, len);
2809static int64_t int_from_json_item(
const WINPR_JSON* item, int64_t min, int64_t max)
2818 if (isinf(val) || isnan(val))
2824 const int64_t ival = (int64_t)val;
2825 if ((ival < min) || (ival > max))
2834static int64_t int_from_json(
const WINPR_JSON* obj,
const char* key, int64_t min, int64_t max)
2842 return int_from_json_item(item, min, max);
2845static uint64_t uint_from_json_item(
const WINPR_JSON* item, uint64_t max)
2854 if (isinf(val) || isnan(val) || (val < 0.0))
2860 const uint64_t uval = (uint64_t)val;
2869static uint64_t uint_from_json(
const WINPR_JSON* obj,
const char* key, uint64_t max)
2878 return uint_from_json_item(item, max);
2881static WINPR_JSON* systemtime_to_json(WINPR_JSON* parent,
const char* key,
const SYSTEMTIME* st)
2912static BOOL systemtime_from_json(
const WINPR_JSON* pobj,
const char* key,
SYSTEMTIME* st)
2924 st->wYear = (uint16_t)uint_from_json(obj,
"wYear", UINT16_MAX);
2925 st->wMonth = (uint16_t)uint_from_json(obj,
"wMonth", UINT16_MAX);
2926 st->wDayOfWeek = (uint16_t)uint_from_json(obj,
"wDayOfWeek", UINT16_MAX);
2927 st->wDay = (uint16_t)uint_from_json(obj,
"wDay", UINT16_MAX);
2928 st->wHour = (uint16_t)uint_from_json(obj,
"wHour", UINT16_MAX);
2929 st->wMinute = (uint16_t)uint_from_json(obj,
"wMinute", UINT16_MAX);
2930 st->wSecond = (uint16_t)uint_from_json(obj,
"wSecond", UINT16_MAX);
2931 st->wMilliseconds = (uint16_t)uint_from_json(obj,
"wMilliseconds", UINT16_MAX);
2943 tz->Bias = (int32_t)int_from_json(json,
"Bias", INT32_MIN, INT32_MAX);
2944 tz->StandardBias = (int32_t)int_from_json(json,
"StandardBias", INT32_MIN, INT32_MAX);
2945 tz->DaylightBias = (int32_t)int_from_json(json,
"DaylightBias", INT32_MIN, INT32_MAX);
2949 if (!systemtime_from_json(json,
"StandardDate", &tz->StandardDate))
2951 if (!systemtime_from_json(json,
"DaylightDate", &tz->DaylightDate))
2954 if (!wchar_from_json(tz->StandardName, ARRAYSIZE(tz->StandardName), json,
"StandardName"))
2956 if (!wchar_from_json(tz->DaylightName, ARRAYSIZE(tz->DaylightName), json,
"DaylightName"))
2962static BOOL ts_info_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2963 const WINPR_JSON* json)
2972 for (
size_t x = 0; x < count; x++)
2976 if (!ts_info_from_json(tz, obj))
2997 if (!wchar_to_json(obj,
"StandardName", tz.StandardName, ARRAYSIZE(tz.StandardName)))
3000 if (!systemtime_to_json(obj,
"StandardDate", &tz.StandardDate))
3006 if (!wchar_to_json(obj,
"DaylightName", tz.DaylightName, ARRAYSIZE(tz.DaylightName)))
3009 if (!systemtime_to_json(obj,
"DaylightDate", &tz.DaylightDate))
3042 for (
size_t x = 0; x < count; x++)
3044 if (!glyph_cache_def_to_json(json, &def[x]))
3059 def->cacheEntries = (uint16_t)uint_from_json(json,
"cacheEntries", UINT16_MAX);
3060 def->cacheMaximumCellSize = (uint16_t)uint_from_json(json,
"cacheMaximumCellSize", UINT16_MAX);
3064static BOOL glyph_cache_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3065 const WINPR_JSON* json)
3074 for (
size_t x = 0; x < count; x++)
3077 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3079 if (!glyph_cache_def_from_json(cache, obj))
3093 info->numEntries = (uint32_t)uint_from_json(json,
"numEntries", UINT32_MAX);
3105static BOOL bitmap_cache_v2_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3106 const WINPR_JSON* json)
3115 for (
size_t x = 0; x < count; x++)
3118 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3120 if (!bitmap_cache_v2_from_json(cache, obj))
3128 WINPR_ASSERT(cookie);
3135 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3136 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3137 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3146 if (len != ARRAYSIZE(cookie->securityVerifier))
3150 for (
size_t x = 0; x < len; x++)
3153 const uint64_t val = uint_from_json_item(citem, UINT8_MAX);
3154 cookie->securityVerifier[x] = (uint8_t)val;
3159static BOOL client_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3160 const WINPR_JSON* json)
3169 for (
size_t x = 0; x < count; x++)
3173 if (!client_cookie_from_json(cache, obj))
3181 WINPR_ASSERT(cookie);
3187 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3188 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3189 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3198 if (len != ARRAYSIZE(cookie->arcRandomBits))
3202 for (
size_t x = 0; x < len; x++)
3205 cookie->arcRandomBits[x] = (uint8_t)uint_from_json_item(citem, UINT8_MAX);
3210static BOOL server_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3211 const WINPR_JSON* json)
3220 for (
size_t x = 0; x < count; x++)
3224 if (!server_cookie_from_json(cache, obj))
3230static BOOL channel_def_from_json(
CHANNEL_DEF* cookie,
const WINPR_JSON* json)
3232 WINPR_ASSERT(cookie);
3239 cookie->options = (uint32_t)uint_from_json(json,
"options", UINT32_MAX);
3249 memset(cookie->name, 0,
sizeof(cookie->name));
3252 strncpy(cookie->name, str, strnlen(str, ARRAYSIZE(cookie->name)));
3257static BOOL channel_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3258 const WINPR_JSON* json)
3267 for (
size_t x = 0; x < count; x++)
3269 CHANNEL_DEF* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3271 if (!channel_def_from_json(cache, obj))
3277static BOOL monitor_attributes_from_json(
MONITOR_ATTRIBUTES* attributes,
const WINPR_JSON* json)
3279 WINPR_ASSERT(attributes);
3288 attributes->physicalWidth = (uint32_t)uint_from_json(obj,
"physicalWidth", UINT32_MAX);
3289 attributes->physicalHeight = (uint32_t)uint_from_json(obj,
"physicalHeight", UINT32_MAX);
3290 attributes->orientation = (uint32_t)uint_from_json(obj,
"orientation", UINT32_MAX);
3291 attributes->desktopScaleFactor =
3292 (uint32_t)uint_from_json(obj,
"desktopScaleFactor", UINT32_MAX);
3293 attributes->deviceScaleFactor = (uint32_t)uint_from_json(obj,
"deviceScaleFactor", UINT32_MAX);
3297static BOOL monitor_def_from_json(
rdpMonitor* monitor,
const WINPR_JSON* json)
3299 WINPR_ASSERT(monitor);
3305 monitor->x = (int32_t)int_from_json(json,
"x", INT32_MIN, INT32_MAX);
3306 monitor->y = (int32_t)int_from_json(json,
"y", INT32_MIN, INT32_MAX);
3307 monitor->width = (int32_t)int_from_json(json,
"width", 0, INT32_MAX);
3308 monitor->height = (int32_t)int_from_json(json,
"height", 0, INT32_MAX);
3309 monitor->orig_screen = (uint32_t)uint_from_json(json,
"orig_screen", UINT32_MAX);
3320 return monitor_attributes_from_json(&monitor->attributes, json);
3323static BOOL monitor_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3324 const WINPR_JSON* json)
3333 for (
size_t x = 0; x < count; x++)
3335 rdpMonitor* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3337 if (!monitor_def_from_json(cache, obj))
3361 for (
size_t x = 0; x < ARRAYSIZE(cs->securityVerifier); x++)
3375 for (
size_t x = 0; x < count; x++)
3377 if (!client_cookie_to_json(json, &cs[x]))
3401 for (
size_t x = 0; x < ARRAYSIZE(cs->arcRandomBits); x++)
3415 for (
size_t x = 0; x < count; x++)
3417 if (!server_cookie_to_json(json, &cs[x]))
3441 for (
size_t x = 0; x < count; x++)
3443 if (!bitmap_cache_v2_to_json(json, &info[x]))
3449static BOOL monitor_attributes_to_json(WINPR_JSON* pobj,
const MONITOR_ATTRIBUTES* attributes)
3451 WINPR_ASSERT(attributes);
3468static BOOL monitor_def_to_json(WINPR_JSON* json,
const rdpMonitor* monitor)
3470 WINPR_ASSERT(monitor);
3489 return monitor_attributes_to_json(obj, &monitor->attributes);
3492static BOOL monitor_def_array_to_json(WINPR_JSON* json,
const rdpMonitor* monitors,
size_t count)
3494 for (
size_t x = 0; x < count; x++)
3496 if (!monitor_def_to_json(json, &monitors[x]))
3502static BOOL channel_def_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channel)
3504 WINPR_ASSERT(channel);
3518static BOOL channel_def_array_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channels,
size_t count)
3520 for (
size_t x = 0; x < count; x++)
3522 if (!channel_def_to_json(json, &channels[x]))
3528static BOOL serialize_pointer(
const rdpSettings* settings, WINPR_JSON* json,
3529 FreeRDP_Settings_Keys_Pointer
id)
3545 case FreeRDP_instance:
3554 return fill_array(jval, &ptr.u,
sizeof(ptr.u));
3556 case FreeRDP_ServerRandom:
3559 return fill_array(jval, val, len);
3561 case FreeRDP_ServerCertificate:
3563 const uint32_t len =
3565 return fill_array(jval, val, len);
3567 case FreeRDP_ClientRandom:
3570 return fill_array(jval, val, len);
3572 case FreeRDP_ServerLicenseProductIssuers:
3574 const uint32_t len =
3576 return string_array_to_json(jval, settings, len, FreeRDP_ServerLicenseProductIssuers);
3578 case FreeRDP_RedirectionPassword:
3580 const uint32_t len =
3582 return fill_array(jval, val, len);
3584 case FreeRDP_RedirectionGuid:
3586 const uint32_t len =
3588 return fill_array(jval, val, len);
3590 case FreeRDP_LoadBalanceInfo:
3592 const uint32_t len =
3594 return fill_array(jval, val, len);
3596 case FreeRDP_ClientTimeZone:
3598 return tz_info_to_json(jval, val);
3600 case FreeRDP_RedirectionTsvUrl:
3602 const uint32_t len =
3604 return fill_array(jval, val, len);
3606 case FreeRDP_GlyphCache:
3608 return glyph_cache_def_array_to_json(jval, val, val ? 10 : 0);
3610 case FreeRDP_FragCache:
3612 return glyph_cache_def_array_to_json(jval, val, val ? 1 : 0);
3614 case FreeRDP_BitmapCacheV2CellInfo:
3616 const uint32_t len =
3618 return bitmap_cache_v2_array_to_json(jval, val, len);
3620 case FreeRDP_OrderSupport:
3622 const uint32_t len = 32;
3623 return fill_array(jval, val, len);
3625 case FreeRDP_ClientAutoReconnectCookie:
3627 return client_cookie_array_to_json(jval, val, 1);
3629 case FreeRDP_ServerAutoReconnectCookie:
3631 return server_cookie_array_to_json(jval, val, 1);
3633 case FreeRDP_Password51:
3636 return fill_array(jval, val, len);
3638 case FreeRDP_ReceivedCapabilities:
3640 const uint32_t len =
3642 return fill_array(jval, val, len);
3644 case FreeRDP_MonitorIds:
3647 return fill_uint32_array(jval, val, len);
3649 case FreeRDP_TargetNetPorts:
3651 const uint32_t len =
3653 return fill_uint32_array(jval, val, len);
3655 case FreeRDP_MonitorDefArray:
3658 return monitor_def_array_to_json(jval, val, len);
3660 case FreeRDP_ChannelDefArray:
3663 return channel_def_array_to_json(jval, val, len);
3665 case FreeRDP_ReceivedCapabilityDataSizes:
3667 const uint32_t len =
3669 return fill_uint32_array(jval, val, len);
3671 case FreeRDP_ReceivedCapabilityData:
3673 const uint32_t len =
3675 const UINT32* pclen =
3680 for (uint32_t x = 0; x < len; x++)
3682 const char* cval = freerdp_settings_get_pointer_array(settings,
id, x);
3689 if (!fill_array(item, cval, pclen[x]))
3694 case FreeRDP_TargetNetAddresses:
3696 const uint32_t len =
3698 return string_array_to_json(jval, settings, len,
id);
3700 case FreeRDP_RedirectionTargetCertificate:
3701 case FreeRDP_RdpServerCertificate:
3703 WINPR_JSON* item =
nullptr;
3705 char* pem = freerdp_certificate_get_pem(val, &len);
3718 case FreeRDP_RdpServerRsaKey:
3720 WINPR_JSON* item =
nullptr;
3722 char* pem = freerdp_key_get_pem(val, &len,
nullptr);
3731 case FreeRDP_DeviceArray:
3734 return json_from_device_item_array(jval, settings,
id, len);
3736 case FreeRDP_StaticChannelArray:
3738 const uint32_t len =
3740 return json_from_addin_item_array(jval, settings,
id, len);
3742 case FreeRDP_DynamicChannelArray:
3744 const uint32_t len =
3746 return json_from_addin_item_array(jval, settings,
id, len);
3748 case FreeRDP_POINTER_UNUSED:
3756 char* str =
nullptr;
3786 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
3790 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
3796 FreeRDP_Settings_Keys_Bool b;
3797 FreeRDP_Settings_Keys_Int16 i16;
3798 FreeRDP_Settings_Keys_UInt16 u16;
3799 FreeRDP_Settings_Keys_Int32 i32;
3800 FreeRDP_Settings_Keys_UInt32 u32;
3801 FreeRDP_Settings_Keys_Int64 i64;
3802 FreeRDP_Settings_Keys_UInt64 u64;
3803 FreeRDP_Settings_Keys_String str;
3804 FreeRDP_Settings_Keys_Pointer ptr;
3812 case RDP_SETTINGS_TYPE_BOOL:
3819 case RDP_SETTINGS_TYPE_UINT16:
3826 case RDP_SETTINGS_TYPE_INT16:
3833 case RDP_SETTINGS_TYPE_UINT32:
3840 case RDP_SETTINGS_TYPE_INT32:
3847 case RDP_SETTINGS_TYPE_UINT64:
3854 case RDP_SETTINGS_TYPE_INT64:
3861 case RDP_SETTINGS_TYPE_STRING:
3875 case RDP_SETTINGS_TYPE_POINTER:
3876 if (!serialize_pointer(settings, jpointer, iter.ptr))
3892 *plength = strlen(str);
3899static BOOL val_from_array(rdpSettings* settings,
const WINPR_JSON* json,
3900 FreeRDP_Settings_Keys_Pointer key,
size_t esize)
3911 size_t count = len / esize;
3912 if (count * esize != len)
3923 for (
size_t x = 0; x < len; x++)
3926 data[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3932static BOOL uintptr_from_array(rdpSettings* settings,
const WINPR_JSON* json)
3934 FreeRDP_Settings_Keys_Pointer key = FreeRDP_instance;
3939 if (len >
sizeof(
void*))
3948 uint8_t u[
sizeof(
void*)];
3952 for (
size_t x = 0; x < len; x++)
3955 ptr.u[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3962static BOOL val_from_uint32_array(rdpSettings* settings,
const WINPR_JSON* json,
3963 FreeRDP_Settings_Keys_Pointer key,
3964 FreeRDP_Settings_Keys_UInt32 keyId)
3979 for (
size_t x = 0; x < len; x++)
3981 UINT32* data = freerdp_settings_get_pointer_array_writable(settings, key, x);
3986 data[0] = (uint32_t)uint_from_json_item(val, UINT32_MAX);
3991static BOOL caps_data_entry_from_json(rdpSettings* settings,
size_t offset,
const WINPR_JSON* json)
3999 return freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset,
4003 uint8_t* data = calloc(size,
sizeof(uint8_t));
4007 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset, data))
4014 for (
size_t x = 0; x < size; x++)
4017 data[x] = (uint8_t)uint_from_json_item(item, UINT8_MAX);
4024static BOOL caps_data_array_from_json(rdpSettings* settings,
const WINPR_JSON* json)
4033 for (uint32_t x = 0; x < count; x++)
4036 if (!caps_data_entry_from_json(settings, x, array))
4042static BOOL str_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4043 FreeRDP_Settings_Keys_Pointer key)
4054 for (
size_t x = 0; x < len; x++)
4063 if (!freerdp_settings_set_pointer_array(settings, key, x, val))
4069static BOOL addin_argv_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4070 FreeRDP_Settings_Keys_Pointer key)
4082 for (
size_t x = 0; x < len; x++)
4089 if (!jargc || !array)
4094 const int argc = (int)int_from_json_item(jargc, INT32_MIN, INT32_MAX);
4098 if (jlen != (
size_t)argc)
4103 const char** argv = (
const char**)calloc(jlen,
sizeof(
char*));
4106 for (
size_t y = 0; y < jlen; y++)
4117 ADDIN_ARGV* cval = freerdp_addin_argv_new(jlen, argv);
4121 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, x, cval);
4122 freerdp_addin_argv_free(cval);
4130static char* get_string(
const WINPR_JSON* json,
const char* key)
4136 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
4139static BOOL get_bool(
const WINPR_JSON* json,
const char* key)
4147static BOOL device_from_json_item(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
4148 size_t offset,
const WINPR_JSON* val)
4164 memset(&device, 0,
sizeof(device));
4167 device.base.Id = (uint32_t)uint_from_json(val,
"Id", UINT32_MAX);
4168 device.base.Type = (uint32_t)uint_from_json(val,
"Type", UINT32_MAX);
4171 device.base.Name = get_string(val,
"Name");
4172 if (!device.base.Name)
4175 switch (device.base.Type)
4177 case RDPDR_DTYP_SERIAL:
4178 device.serial.Path = get_string(val,
"Path");
4179 device.serial.Driver = get_string(val,
"Driver");
4180 device.serial.Permissive = get_string(val,
"Permissive");
4182 case RDPDR_DTYP_PARALLEL:
4183 device.parallel.Path = get_string(val,
"Path");
4185 case RDPDR_DTYP_PRINT:
4186 device.printer.DriverName = get_string(val,
"DriverName");
4187 device.printer.IsDefault = get_bool(val,
"IsDefault");
4189 case RDPDR_DTYP_FILESYSTEM:
4190 device.drive.Path = get_string(val,
"Path");
4191 device.drive.automount = get_bool(val,
"automount");
4193 case RDPDR_DTYP_SMARTCARD:
4197 return freerdp_settings_set_pointer_array(settings, key, offset, &device);
4200static BOOL device_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4201 FreeRDP_Settings_Keys_Pointer key)
4213 for (
size_t x = 0; x < len; x++)
4216 if (!device_from_json_item(settings, key, x, val))
4222static const char* pem_from_json(
const WINPR_JSON* jval,
size_t* plen, BOOL* pvalid)
4226 WINPR_ASSERT(pvalid);
4252static BOOL deserialize_pointer(
const WINPR_JSON* json, rdpSettings* settings,
4253 FreeRDP_Settings_Keys_Pointer
id)
4268 case FreeRDP_instance:
4269 return uintptr_from_array(settings, jval);
4270 case FreeRDP_ServerRandom:
4271 case FreeRDP_ServerCertificate:
4272 case FreeRDP_ClientRandom:
4273 case FreeRDP_RedirectionPassword:
4274 case FreeRDP_RedirectionGuid:
4275 case FreeRDP_LoadBalanceInfo:
4276 case FreeRDP_RedirectionTsvUrl:
4277 case FreeRDP_OrderSupport:
4278 case FreeRDP_Password51:
4279 return val_from_array(settings, jval,
id, 1);
4280 case FreeRDP_ReceivedCapabilities:
4281 return val_from_array(settings, jval,
id, 1);
4282 case FreeRDP_ClientTimeZone:
4283 return ts_info_array_from_json(settings,
id, jval);
4284 case FreeRDP_GlyphCache:
4285 return glyph_cache_def_array_from_json(settings,
id, jval);
4286 case FreeRDP_FragCache:
4287 return glyph_cache_def_array_from_json(settings,
id, jval);
4288 case FreeRDP_BitmapCacheV2CellInfo:
4289 return bitmap_cache_v2_array_from_json(settings,
id, jval);
4290 case FreeRDP_ClientAutoReconnectCookie:
4291 return client_cookie_array_from_json(settings,
id, jval);
4292 case FreeRDP_ServerAutoReconnectCookie:
4293 return server_cookie_array_from_json(settings,
id, jval);
4294 case FreeRDP_MonitorDefArray:
4295 return monitor_def_array_from_json(settings,
id, jval);
4296 case FreeRDP_ChannelDefArray:
4297 return channel_def_array_from_json(settings,
id, jval);
4298 case FreeRDP_MonitorIds:
4299 return val_from_uint32_array(settings, jval,
id, FreeRDP_NumMonitorIds);
4300 case FreeRDP_TargetNetPorts:
4301 return val_from_uint32_array(settings, jval,
id, FreeRDP_TargetNetAddressCount);
4302 case FreeRDP_ServerLicenseProductIssuers:
4303 case FreeRDP_TargetNetAddresses:
4304 return str_array_from_json(settings, jval,
id);
4305 case FreeRDP_ReceivedCapabilityDataSizes:
4306 return val_from_uint32_array(settings, jval,
id, FreeRDP_ReceivedCapabilitiesSize);
4307 case FreeRDP_ReceivedCapabilityData:
4308 return caps_data_array_from_json(settings, jval);
4309 case FreeRDP_RedirectionTargetCertificate:
4310 case FreeRDP_RdpServerCertificate:
4314 const char* pem = pem_from_json(jval, &len, &valid);
4320 rdpCertificate* cert =
nullptr;
4324 if (strnlen(pem, 2) == 0)
4325 cert = freerdp_certificate_new();
4327 cert = freerdp_certificate_new_from_pem(pem);
4332 case FreeRDP_RdpServerRsaKey:
4336 const char* pem = pem_from_json(jval, &len, &valid);
4344 rdpPrivateKey* key = freerdp_key_new_from_pem_enc(pem,
nullptr);
4349 case FreeRDP_DeviceArray:
4350 return device_array_from_json(settings, jval,
id);
4351 case FreeRDP_StaticChannelArray:
4352 case FreeRDP_DynamicChannelArray:
4353 return addin_argv_from_json(settings, jval,
id);
4354 case FreeRDP_POINTER_UNUSED:
4388 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
4392 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4398 FreeRDP_Settings_Keys_Bool b;
4399 FreeRDP_Settings_Keys_Int16 i16;
4400 FreeRDP_Settings_Keys_UInt16 u16;
4401 FreeRDP_Settings_Keys_Int32 i32;
4402 FreeRDP_Settings_Keys_UInt32 u32;
4403 FreeRDP_Settings_Keys_Int64 i64;
4404 FreeRDP_Settings_Keys_UInt64 u64;
4405 FreeRDP_Settings_Keys_String str;
4406 FreeRDP_Settings_Keys_Pointer ptr;
4413 case RDP_SETTINGS_TYPE_POINTER:
4414 if (!deserialize_pointer(jpointer, settings, iter.ptr))
4422 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4428 FreeRDP_Settings_Keys_Bool b;
4429 FreeRDP_Settings_Keys_Int16 i16;
4430 FreeRDP_Settings_Keys_UInt16 u16;
4431 FreeRDP_Settings_Keys_Int32 i32;
4432 FreeRDP_Settings_Keys_UInt32 u32;
4433 FreeRDP_Settings_Keys_Int64 i64;
4434 FreeRDP_Settings_Keys_UInt64 u64;
4435 FreeRDP_Settings_Keys_String str;
4436 FreeRDP_Settings_Keys_Pointer ptr;
4444 case RDP_SETTINGS_TYPE_BOOL:
4456 case RDP_SETTINGS_TYPE_UINT16:
4459 const uint16_t val = (uint16_t)uint_from_json_item(item, UINT16_MAX);
4466 case RDP_SETTINGS_TYPE_INT16:
4469 const int16_t val = (int16_t)int_from_json_item(item, INT16_MIN, INT16_MAX);
4476 case RDP_SETTINGS_TYPE_UINT32:
4479 const uint32_t val = (uint32_t)uint_from_json_item(item, UINT32_MAX);
4486 case RDP_SETTINGS_TYPE_INT32:
4488 const int64_t val = int_from_json(jint32, name, INT32_MIN, INT32_MAX);
4495 case RDP_SETTINGS_TYPE_UINT64:
4497 const uint64_t val = uint_from_json(juint64, name, UINT64_MAX);
4504 case RDP_SETTINGS_TYPE_INT64:
4507 const int64_t val = int_from_json_item(item, INT64_MIN, INT64_MAX);
4514 case RDP_SETTINGS_TYPE_STRING:
4516 const char* val =
nullptr;
4530 case RDP_SETTINGS_TYPE_POINTER:
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_CreateString(const char *string)
WINPR_JSON_CreateString.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_CreateNull(void)
WINPR_JSON_CreateNull.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsNull(const WINPR_JSON *item)
Check if JSON item is Null.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_CreateNumber(double num)
WINPR_JSON_CreateNumber.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddObjectToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddObjectToObject.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_CreateObject(void)
WINPR_JSON_CreateObject.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_HasObjectItem(const WINPR_JSON *object, const char *string)
Check if JSON has an object matching the name.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsBool(const WINPR_JSON *item)
Check if JSON item is of type BOOL.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_AddItemToArray(WINPR_JSON *array, WINPR_JSON *item)
Add an item to an existing array.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsNumber(const WINPR_JSON *item)
Check if JSON item is of type Number.
WINPR_ATTR_NODISCARD WINPR_API size_t WINPR_JSON_GetArraySize(const WINPR_JSON *array)
Get the number of arrayitems from an array.
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_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsTrue(const WINPR_JSON *item)
Check if JSON item is BOOL value True.
WINPR_ATTR_NODISCARD 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_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddNumberToObject(WINPR_JSON *object, const char *name, double number)
WINPR_JSON_AddNumberToObject.
WINPR_API WINPR_JSON * WINPR_JSON_ParseWithLength(const char *value, size_t buffer_length)
Parse a JSON string.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddArrayToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddArrayToObject.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsString(const WINPR_JSON *item)
Check if JSON item is of type String.
WINPR_ATTR_NODISCARD 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 char * WINPR_JSON_PrintUnformatted(WINPR_JSON *item)
Serialize a JSON instance to string without formatting for human readable formatted output see WINPR_...
WINPR_ATTR_NODISCARD WINPR_API double WINPR_JSON_GetNumberValue(const WINPR_JSON *item)
Return the Number value of a JSON item.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsArray(const WINPR_JSON *item)
Check if JSON item is of type Array.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsObject(const WINPR_JSON *item)
Check if JSON item is of type Object.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddNullToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddNullToObject.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddStringToObject(WINPR_JSON *object, const char *name, const char *string)
WINPR_JSON_AddStringToObject.
WINPR_API void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_CreateArray(void)
WINPR_JSON_CreateArray.
WINPR_ATTR_NODISCARD WINPR_API const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_AddBoolToObject(WINPR_JSON *object, const char *name, BOOL boolean)
WINPR_JSON_AddBoolToObject.
const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_type_name_for_type(SSIZE_T type)
Returns the type name for a type.
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.
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.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *val)
Set a pointer to value val.
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
const char * freerdp_settings_get_server_name(const rdpSettings *settings)
A helper function to return the correct server name.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id, INT64 val)
Sets a INT64 settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val, size_t len)
Sets a string settings value. The val is copied.
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.
WINPR_ATTR_NODISCARD FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id)
Returns a INT32 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.
WINPR_ATTR_NODISCARD FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.
rdpSettings * freerdp_settings_deserialize(const char *jstr, size_t length)
A function that converts a JSON string to a rdpSettings struct.
UINT32 freerdp_settings_get_codecs_flags(const rdpSettings *settings)
helper function to get a mask of supported codec flags.
WINPR_ATTR_NODISCARD FREERDP_API UINT16 freerdp_settings_get_uint16(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id)
Returns a UINT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id)
Returns a UINT64 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
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.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id, UINT64 val)
Sets a UINT64 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id, INT16 val)
Sets a INT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_int32(rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id, INT32 val)
Sets a INT32 settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
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...
WINPR_ATTR_NODISCARD FREERDP_API INT16 freerdp_settings_get_int16(const rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id)
Returns a INT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char *value)
Get a key index for the name string of that key.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API INT64 freerdp_settings_get_int64(const rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id)
Returns a INT64 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.
const char * freerdp_rdp_version_string(UINT32 version)
Returns a stringified representation of the RDP protocol version.
BOOL freerdp_settings_are_valid(const rdpSettings *settings)
Returns TRUE if settings are in a valid state, FALSE otherwise.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 val)
Sets a UINT16 settings value.
char * freerdp_settings_serialize(const rdpSettings *settings, BOOL pretty, size_t *plength)
A function that converts a rdpSettings struct to a JSON serialized string.
BOOL freerdp_settings_set_monitor_def_array_sorted(rdpSettings *settings, const rdpMonitor *monitors, size_t count)
Sort monitor array according to:
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_set_gateway_usage_method(rdpSettings *settings, UINT32 GatewayUsageMethod)
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val)
Sets a string settings value. The param is copied.
const char * freerdp_rdpdr_dtyp_string(UINT32 type)
Returns a string representation of RDPDR_DTYP_*.
const char * freerdp_supported_color_depths_string(UINT16 mask, char *buffer, size_t size)
returns a string representation of RNS_UD_XXBPP_SUPPORT values
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
WINPR_ATTR_NODISCARD FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.