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")
45static const char magic[] =
"RDPDR_DEVICE_EX";
62BOOL freerdp_addin_argv_add_argument_ex(
ADDIN_ARGV* args,
const char* argument,
size_t len)
64 if (!args || !argument)
68 len = strlen(argument);
70 char** new_argv = (
char**)realloc(
71 (
void*)args->argv,
sizeof(
char*) * (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc) + 1));
76 args->argv = new_argv;
78 char* str = calloc(len + 1,
sizeof(
char));
81 memcpy(str, argument, len);
82 args->argv[args->argc++] = str;
86BOOL freerdp_addin_argv_add_argument(
ADDIN_ARGV* args,
const char* argument)
88 return freerdp_addin_argv_add_argument_ex(args, argument, 0);
91BOOL freerdp_addin_argv_del_argument(
ADDIN_ARGV* args,
const char* argument)
93 if (!args || !argument)
95 for (
int x = 0; x < args->argc; x++)
97 char* arg = args->argv[x];
98 if (strcmp(argument, arg) == 0)
102 memmove_s((
void*)&args->argv[x],
103 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) *
sizeof(
char*),
104 (
void*)&args->argv[x + 1],
105 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) *
107 args->argv[args->argc - 1] =
nullptr;
115int freerdp_addin_set_argument(
ADDIN_ARGV* args,
const char* argument)
117 if (!args || !argument)
120 for (
int i = 0; i < args->argc; i++)
122 if (strcmp(args->argv[i], argument) == 0)
128 if (!freerdp_addin_argv_add_argument(args, argument))
133int freerdp_addin_replace_argument(
ADDIN_ARGV* args,
const char* previous,
const char* argument)
135 if (!args || !previous || !argument)
138 for (
int i = 0; i < args->argc; i++)
140 if (strcmp(args->argv[i], previous) == 0)
144 if (!(args->argv[i] = _strdup(argument)))
151 if (!freerdp_addin_argv_add_argument(args, argument))
156int freerdp_addin_set_argument_value(
ADDIN_ARGV* args,
const char* option,
const char* value)
162 if (!args || !option || !value)
164 length = strlen(option) + strlen(value) + 1;
165 str = (
char*)calloc(length + 1,
sizeof(
char));
170 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
172 for (
int i = 0; i < args->argc; i++)
174 p = strchr(args->argv[i],
':');
178 if (strncmp(args->argv[i], option,
179 WINPR_ASSERTING_INT_CAST(
size_t, p - args->argv[i])) == 0)
188 rc = freerdp_addin_argv_add_argument(args, str);
195int freerdp_addin_replace_argument_value(
ADDIN_ARGV* args,
const char* previous,
const char* option,
201 if (!args || !previous || !option || !value)
203 length = strlen(option) + strlen(value) + 1;
204 str = (
char*)calloc(length + 1,
sizeof(
char));
209 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
211 for (
int i = 0; i < args->argc; i++)
213 if (strcmp(args->argv[i], previous) == 0)
221 rc = freerdp_addin_argv_add_argument(args, str);
228BOOL freerdp_device_collection_add(rdpSettings* settings,
RDPDR_DEVICE* device)
232 WINPR_ASSERT(settings);
233 WINPR_ASSERT(device);
239 const size_t new_size = (old + 32);
246 settings->DeviceArray = new_array;
247 for (
size_t x = old; x < new_size; x++)
248 settings->DeviceArray[x] =
nullptr;
251 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
255 settings->DeviceArray[settings->DeviceCount++] = device;
261 WINPR_ASSERT(settings);
266 const UINT32 count = settings->DeviceCount;
267 for (
size_t x = 0; x < count; x++)
272 for (
size_t y = x + 1; y < count; y++)
275 settings->DeviceArray[y - 1] = next;
277 settings->DeviceArray[count - 1] =
nullptr;
278 settings->DeviceCount--;
286RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings,
const char* name)
290 WINPR_ASSERT(settings);
292 for (UINT32 index = 0; index < settings->DeviceCount; index++)
294 device = settings->DeviceArray[index];
299 if (strcmp(device->Name, name) == 0)
306RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
309 WINPR_ASSERT(settings);
311 for (UINT32 index = 0; index < settings->DeviceCount; index++)
313 device = settings->DeviceArray[index];
315 if (device->Type == type)
322RDPDR_DEVICE* freerdp_device_new(UINT32 Type,
size_t count,
const char*
const args[])
324 WINPR_ASSERT(args || (count == 0));
328 case RDPDR_DTYP_PRINT:
329 case RDPDR_DTYP_SERIAL:
330 case RDPDR_DTYP_PARALLEL:
331 case RDPDR_DTYP_SMARTCARD:
332 case RDPDR_DTYP_FILESYSTEM:
338 const size_t size =
sizeof(
struct RDPDR_DEVICE_EX);
339 struct RDPDR_DEVICE_EX* device = calloc(1, size);
342 device->u.base.Id = 0;
343 device->u.base.Type = Type;
345 WINPR_STATIC_ASSERT(
sizeof(magic) ==
sizeof(device->magic));
346 memcpy(device->magic, magic,
sizeof(device->magic));
350 device->u.base.Name = _strdup(args[0]);
351 if (!device->u.base.Name)
356 case RDPDR_DTYP_PRINT:
359 device->u.printer.DriverName = _strdup(args[1]);
360 if (!device->u.printer.DriverName)
366 device->u.printer.IsDefault = _stricmp(args[2],
"default") == 0;
369 case RDPDR_DTYP_SERIAL:
372 device->u.serial.Path = _strdup(args[1]);
373 if (!device->u.serial.Path)
379 device->u.serial.Driver = _strdup(args[2]);
380 if (!device->u.serial.Driver)
386 device->u.serial.Permissive = _strdup(args[3]);
387 if (!device->u.serial.Permissive)
391 case RDPDR_DTYP_PARALLEL:
394 device->u.parallel.Path = _strdup(args[1]);
395 if (!device->u.serial.Path)
399 case RDPDR_DTYP_SMARTCARD:
401 case RDPDR_DTYP_FILESYSTEM:
404 device->u.drive.Path = _strdup(args[1]);
405 if (!device->u.drive.Path)
409 device->u.drive.automount = (args[2] ==
nullptr);
415 device->args = freerdp_addin_argv_new(count, args);
419 return &device->u.base;
423 freerdp_device_free(&device->u.base);
435 struct RDPDR_DEVICE_EX* ex;
440 switch (device->Type)
442 case RDPDR_DTYP_PRINT:
443 free(cnv.ex->u.printer.DriverName);
445 case RDPDR_DTYP_SERIAL:
446 free(cnv.ex->u.serial.Path);
447 free(cnv.ex->u.serial.Driver);
448 free(cnv.ex->u.serial.Permissive);
450 case RDPDR_DTYP_PARALLEL:
451 free(cnv.ex->u.parallel.Path);
453 case RDPDR_DTYP_SMARTCARD:
455 case RDPDR_DTYP_FILESYSTEM:
456 free(cnv.ex->u.drive.Path);
462 WINPR_STATIC_ASSERT(
sizeof(magic) ==
sizeof(cnv.ex->magic));
463 if (memcmp(magic, cnv.ex->magic,
sizeof(magic)) == 0)
464 freerdp_addin_argv_free(cnv.ex->args);
467 "freerdp_device_free called with argument not allocated by freerdp_device_new! "
468 "This is not supported with FreeRDP 3.x and might crash your application");
476 const struct RDPDR_DEVICE_EX* src = (
const struct RDPDR_DEVICE_EX*)device;
482 const char*
const* argv =
nullptr;
485 argc = src->args->argc;
488 argv = (
const char*
const*)src->args->argv;
492 freerdp_device_new(device->Type, WINPR_ASSERTING_INT_CAST(
size_t, argc), argv);
495 copy->Id = device->Id;
499void freerdp_device_collection_free(rdpSettings* settings)
501 WINPR_ASSERT(settings);
503 if (settings->DeviceArray)
505 for (UINT32 index = 0; index < settings->DeviceArraySize; index++)
508 freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index,
nullptr);
511 "freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, "
512 "index=%" PRIu32
", nullptr) failed",
517 free((
void*)settings->DeviceArray);
521 "freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, nullptr) failed");
523 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0) failed");
525 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0) failed");
528BOOL freerdp_static_channel_collection_del(rdpSettings* settings,
const char* name)
531 if (!settings || !settings->StaticChannelArray)
534 for (UINT32 x = 0; x < count; x++)
536 ADDIN_ARGV* cur = settings->StaticChannelArray[x];
537 if (cur && (cur->argc > 0))
539 if (strcmp(name, cur->argv[0]) == 0)
541 const BOOL success = memmove_s((
void*)&settings->StaticChannelArray[x],
543 (
void*)&settings->StaticChannelArray[x + 1],
545 for (
size_t y = count - 1; y < settings->StaticChannelArraySize; y++)
546 settings->StaticChannelArray[y] =
nullptr;
548 freerdp_addin_argv_free(cur);
556 for (
size_t x = count; x < settings->StaticChannelArraySize; x++)
557 settings->StaticChannelArray[x] =
nullptr;
562BOOL freerdp_static_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
566 WINPR_ASSERT(settings);
567 WINPR_ASSERT(channel);
572 const UINT32 oldSize =
574 const size_t new_size = oldSize + 32ul;
581 settings->StaticChannelArray = new_array;
583 for (
size_t x = oldSize; x < new_size; x++)
584 settings->StaticChannelArray[x] =
nullptr;
587 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
593 ADDIN_ARGV** cur = &settings->StaticChannelArray[count++];
594 freerdp_addin_argv_free(*cur);
599ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings,
const char* name)
603 WINPR_ASSERT(settings);
606 for (UINT32 index = 0;
609 channel = settings->StaticChannelArray[index];
611 if (strcmp(channel->argv[0], name) == 0)
618void freerdp_static_channel_collection_free(rdpSettings* settings)
623 if (settings->StaticChannelArray)
627 freerdp_addin_argv_free(settings->StaticChannelArray[i]);
630 free((
void*)settings->StaticChannelArray);
633 TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0) failed");
634 settings->StaticChannelArray =
nullptr;
637 "freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0) failed");
640BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings,
const char* name)
643 if (!settings || !settings->DynamicChannelArray)
646 for (UINT32 x = 0; x < count; x++)
648 ADDIN_ARGV* cur = settings->DynamicChannelArray[x];
649 if (cur && (cur->argc > 0))
651 if (strcmp(name, cur->argv[0]) == 0)
653 const BOOL success = memmove_s((
void*)&settings->DynamicChannelArray[x],
655 (
void*)&settings->DynamicChannelArray[x + 1],
657 for (
size_t y = count - 1; y < settings->DynamicChannelArraySize; y++)
658 settings->DynamicChannelArray[y] =
nullptr;
660 freerdp_addin_argv_free(cur);
671BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
676 WINPR_ASSERT(settings);
677 WINPR_ASSERT(channel);
684 const size_t size = oldSize + 32;
691 settings->DynamicChannelArray = new_array;
693 for (
size_t x = oldSize; x < size; x++)
694 settings->DynamicChannelArray[x] =
nullptr;
697 WINPR_ASSERTING_INT_CAST(uint32_t, size)))
702 settings->DynamicChannelArray[count++] = channel;
706ADDIN_ARGV* freerdp_dynamic_channel_collection_find(
const rdpSettings* settings,
const char* name)
708 WINPR_ASSERT(settings);
711 for (UINT32 index = 0;
714 ADDIN_ARGV* channel = settings->DynamicChannelArray[index];
716 if (strcmp(channel->argv[0], name) == 0)
730 for (
int index = 0; index < args->argc; index++)
731 free(args->argv[index]);
732 free((
void*)args->argv);
738ADDIN_ARGV* freerdp_addin_argv_new(
size_t argc,
const char*
const argv[])
740 if (argc > INT32_MAX)
749 args->argc = (int)argc;
750 args->argv = (
char**)calloc(argc,
sizeof(
char*));
760 for (
size_t x = 0; x < argc; x++)
764 args->argv[x] = _strdup(argv[x]);
772 WINPR_PRAGMA_DIAG_PUSH
773 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
774 freerdp_addin_argv_free(args);
775 WINPR_PRAGMA_DIAG_POP
789 return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
792void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
794 WINPR_ASSERT(settings);
796 if (settings->DynamicChannelArray)
800 freerdp_addin_argv_free(settings->DynamicChannelArray[i]);
803 free((
void*)settings->DynamicChannelArray);
807 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0) failed");
808 settings->DynamicChannelArray =
nullptr;
811 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0) failed");
814static void freerdp_capability_data_free(rdpSettings* settings,
size_t offset, BOOL full)
816 WINPR_ASSERT(settings);
818 if (settings->ReceivedCapabilityData)
820 for (
size_t x = offset; x < settings->ReceivedCapabilitiesSize; x++)
822 free(settings->ReceivedCapabilityData[x]);
823 settings->ReceivedCapabilityData[x] =
nullptr;
827 free((
void*)settings->ReceivedCapabilityData);
828 settings->ReceivedCapabilityData =
nullptr;
833void freerdp_capability_buffer_free(rdpSettings* settings)
835 WINPR_ASSERT(settings);
837 freerdp_capability_data_free(settings, 0, TRUE);
839 free(settings->ReceivedCapabilityDataSizes);
840 settings->ReceivedCapabilityDataSizes =
nullptr;
842 free(settings->ReceivedCapabilities);
843 settings->ReceivedCapabilities =
nullptr;
845 settings->ReceivedCapabilitiesSize = 0;
848static BOOL resize_setting(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
size_t oldsize,
849 size_t size,
size_t base)
852 uint8_t* ptr = realloc(old, size * base);
858 const size_t diff = size - oldsize;
859 memset(&ptr[oldsize * base], 0, diff * base);
866static BOOL resize_setting_ptr(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
867 size_t oldsize,
size_t size,
size_t base)
869 WINPR_ASSERT(base ==
sizeof(
void*));
874 uint8_t** optr = WINPR_REINTERPRET_CAST(old, uint8_t*, uint8_t**);
875 for (
size_t x = size; x < oldsize; x++)
877 uint8_t* ptr = optr[x];
881 uint8_t* ptr = realloc(old, size * base);
885 uint8_t** optr = WINPR_REINTERPRET_CAST(ptr, uint8_t*, uint8_t**);
886 for (
size_t x = oldsize; x < size; x++)
895BOOL freerdp_capability_buffer_resize(rdpSettings* settings,
size_t count, BOOL force)
897 WINPR_ASSERT(settings);
899 const uint32_t len = settings->ReceivedCapabilitiesSize;
906 freerdp_capability_data_free(settings, count, FALSE);
910 freerdp_capability_buffer_free(settings);
914 const size_t oldsize = settings->ReceivedCapabilitiesSize;
915 if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count,
918 if (!resize_setting_ptr(settings, FreeRDP_ReceivedCapabilityData, oldsize, count,
921 if (!resize_setting(settings, FreeRDP_ReceivedCapabilities, oldsize, count,
sizeof(uint32_t)))
924 settings->ReceivedCapabilitiesSize = WINPR_ASSERTING_INT_CAST(uint32_t, count);
928BOOL freerdp_capability_buffer_copy(rdpSettings* settings,
const rdpSettings* src)
930 WINPR_ASSERT(settings);
933 if (src->ReceivedCapabilitiesSize == 0)
936 if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize, TRUE))
939 for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++)
941 WINPR_ASSERT(settings->ReceivedCapabilities);
942 settings->ReceivedCapabilities[x] = src->ReceivedCapabilities[x];
944 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
945 settings->ReceivedCapabilityDataSizes[x] = src->ReceivedCapabilityDataSizes[x];
947 WINPR_ASSERT(settings->ReceivedCapabilityData);
948 if (src->ReceivedCapabilityDataSizes[x] > 0)
950 void* tmp = realloc(settings->ReceivedCapabilityData[x],
951 settings->ReceivedCapabilityDataSizes[x]);
954 memcpy(tmp, src->ReceivedCapabilityData[x], src->ReceivedCapabilityDataSizes[x]);
955 settings->ReceivedCapabilityData[x] = tmp;
959 free(settings->ReceivedCapabilityData[x]);
960 settings->ReceivedCapabilityData[x] =
nullptr;
966static void target_net_addresses_free(rdpSettings* settings,
size_t offset)
968 WINPR_ASSERT(settings);
970 if (settings->TargetNetAddresses)
972 for (
size_t index = offset; index < settings->TargetNetAddressCount; index++)
974 free(settings->TargetNetAddresses[index]);
975 settings->TargetNetAddresses[index] =
nullptr;
980void freerdp_target_net_addresses_free(rdpSettings* settings)
982 WINPR_ASSERT(settings);
984 target_net_addresses_free(settings, 0);
986 free((
void*)settings->TargetNetAddresses);
987 settings->TargetNetAddresses =
nullptr;
989 free(settings->TargetNetPorts);
990 settings->TargetNetPorts =
nullptr;
992 settings->TargetNetAddressCount = 0;
995BOOL freerdp_target_net_addresses_resize(rdpSettings* settings,
size_t count)
997 WINPR_ASSERT(settings);
1001 freerdp_target_net_addresses_free(settings);
1005 const uint32_t len = settings->TargetNetAddressCount;
1006 if (!resize_setting_ptr(settings, FreeRDP_TargetNetAddresses, len, count,
sizeof(
char*)))
1008 if (!resize_setting(settings, FreeRDP_TargetNetPorts, len, count,
sizeof(uint32_t)))
1011 settings->TargetNetAddressCount = WINPR_ASSERTING_INT_CAST(uint32_t, count);
1015void freerdp_server_license_issuers_free(rdpSettings* settings)
1017 WINPR_ASSERT(settings);
1019 if (settings->ServerLicenseProductIssuers)
1021 for (UINT32 x = 0; x < settings->ServerLicenseProductIssuersCount; x++)
1022 free(settings->ServerLicenseProductIssuers[x]);
1024 free((
void*)settings->ServerLicenseProductIssuers);
1025 settings->ServerLicenseProductIssuers =
nullptr;
1026 settings->ServerLicenseProductIssuersCount = 0;
1029BOOL freerdp_server_license_issuers_copy(rdpSettings* settings,
char** issuers, UINT32 count)
1031 WINPR_ASSERT(settings);
1032 WINPR_ASSERT(issuers || (count == 0));
1038 for (UINT32 x = 0; x < count; x++)
1040 char* issuer = _strdup(issuers[x]);
1043 settings->ServerLicenseProductIssuers[x] = issuer;
1049void freerdp_performance_flags_make(rdpSettings* settings)
1051 UINT32 PerformanceFlags = PERF_FLAG_NONE;
1054 PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
1057 PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
1060 PerformanceFlags |= PERF_DISABLE_WALLPAPER;
1063 PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
1066 PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
1069 PerformanceFlags |= PERF_DISABLE_THEMING;
1072 "freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, 0x%08" PRIx32
1077void freerdp_performance_flags_split(rdpSettings* settings)
1082 PERF_ENABLE_FONT_SMOOTHING) != 0);
1084 settings, FreeRDP_AllowDesktopComposition,
1086 PERF_ENABLE_DESKTOP_COMPOSITION) != 0))
1089 settings, FreeRDP_DisableWallpaper,
1091 PERF_DISABLE_WALLPAPER) != 0))
1094 settings, FreeRDP_DisableFullWindowDrag,
1096 PERF_DISABLE_FULLWINDOWDRAG) != 0))
1099 settings, FreeRDP_DisableMenuAnims,
1101 PERF_DISABLE_MENUANIMATIONS) != 0))
1104 settings, FreeRDP_DisableThemes,
1106 PERF_DISABLE_THEMING) != 0))
1110 WLog_WARN(TAG,
"freerdp_performance_flags_split() failed");
1119 if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
1125 else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
1131 else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
1137 else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
1148 else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
1158UINT32 freerdp_get_gateway_usage_method(
const rdpSettings* settings)
1163 return TSC_PROXY_MODE_DETECT;
1164 return TSC_PROXY_MODE_DIRECT;
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;
1184 "freerdp_set_gateway_usage_method(settings, GatewayUsageMethod=%" PRIu32
1186 GatewayUsageMethod);
1189#if defined(WITH_FREERDP_DEPRECATED)
1190BOOL freerdp_get_param_bool(
const rdpSettings* settings,
int id)
1195int freerdp_set_param_bool(rdpSettings* settings,
int id, BOOL param)
1200int freerdp_get_param_int(
const rdpSettings* settings,
int id)
1205int freerdp_set_param_int(rdpSettings* settings,
int id,
int param)
1210UINT32 freerdp_get_param_uint32(
const rdpSettings* settings,
int id)
1215int freerdp_set_param_uint32(rdpSettings* settings,
int id, UINT32 param)
1220UINT64 freerdp_get_param_uint64(
const rdpSettings* settings,
int id)
1225int freerdp_set_param_uint64(rdpSettings* settings,
int id, UINT64 param)
1230char* freerdp_get_param_string(
const rdpSettings* settings,
int id)
1233 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
1236int freerdp_set_param_string(rdpSettings* settings,
int id,
const char* param)
1242static BOOL value_to_uint(
const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max)
1244 char* endptr =
nullptr;
1245 unsigned long long rc = 0;
1247 if (!value || !result)
1251 rc = _strtoui64(value, &endptr, 0);
1256 if (endptr == value)
1259 if ((rc < min) || (rc > max))
1266static BOOL value_to_int(
const char* value, LONGLONG* result, LONGLONG min, LONGLONG max)
1268 char* endptr =
nullptr;
1271 if (!value || !result)
1275 rc = _strtoi64(value, &endptr, 0);
1280 if (endptr == value)
1283 if ((rc < min) || (rc > max))
1290static BOOL parsing_fail(
const char* key,
const char* type,
const char* value)
1292 WLog_ERR(TAG,
"Failed to parse key [%s] of type [%s]: value [%s]", key, type, value);
1296BOOL freerdp_settings_set_value_for_name(rdpSettings* settings,
const char* name,
const char* value)
1302 if (!settings || !name)
1308 WLog_ERR(TAG,
"Invalid settings key [%s]", name);
1312 const SSIZE_T index = i;
1318 case RDP_SETTINGS_TYPE_BOOL:
1320 const BOOL val = (_strnicmp(value,
"TRUE", 5) == 0) || (_strnicmp(value,
"ON", 5) == 0);
1322 (_strnicmp(value,
"FALSE", 6) == 0) || (_strnicmp(value,
"OFF", 6) == 0);
1324 return parsing_fail(name,
"BOOL", value);
1329 case RDP_SETTINGS_TYPE_UINT16:
1330 if (!value_to_uint(value, &uval, 0, UINT16_MAX))
1331 return parsing_fail(name,
"UINT16", value);
1336 return parsing_fail(name,
"UINT16", value);
1339 case RDP_SETTINGS_TYPE_INT16:
1340 if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX))
1341 return parsing_fail(name,
"INT16", value);
1346 return parsing_fail(name,
"INT16", value);
1348 case RDP_SETTINGS_TYPE_UINT32:
1349 if (!value_to_uint(value, &uval, 0, UINT32_MAX))
1350 return parsing_fail(name,
"UINT32", value);
1355 return parsing_fail(name,
"UINT32", value);
1357 case RDP_SETTINGS_TYPE_INT32:
1358 if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX))
1359 return parsing_fail(name,
"INT32", value);
1364 return parsing_fail(name,
"INT32", value);
1366 case RDP_SETTINGS_TYPE_UINT64:
1367 if (!value_to_uint(value, &uval, 0, UINT64_MAX))
1368 return parsing_fail(name,
"UINT64", value);
1372 return parsing_fail(name,
"UINT64", value);
1374 case RDP_SETTINGS_TYPE_INT64:
1375 if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX))
1376 return parsing_fail(name,
"INT64", value);
1380 return parsing_fail(name,
"INT64", value);
1383 case RDP_SETTINGS_TYPE_STRING:
1387 case RDP_SETTINGS_TYPE_POINTER:
1388 return parsing_fail(name,
"POINTER", value);
1395BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1396 FreeRDP_Settings_Keys_UInt32 lenId,
const void* data,
1397 size_t len,
size_t size)
1400 void* copy =
nullptr;
1405 if (lenId != FreeRDP_UINT32_UNUSED)
1411 if (len > UINT32_MAX)
1415 copy = calloc(len, size);
1419 memcpy(copy, data, len * size);
1429 if (lenId == FreeRDP_UINT32_UNUSED)
1435 FreeRDP_Settings_Keys_Pointer
id)
1439 const rdpSettings* pc;
1447 const void* data,
size_t len)
1461 case FreeRDP_instance:
1462 if ((len != 0) && (len !=
sizeof(
void*)))
1464 WLog_ERR(TAG,
"FreeRDP_instance::len must be 0 or %" PRIuz,
sizeof(
void*));
1467 settings->instance = cnv.v;
1469 case FreeRDP_RdpServerCertificate:
1470 freerdp_certificate_free(settings->RdpServerCertificate);
1474 WLog_ERR(TAG,
"FreeRDP_RdpServerCertificate::len must be 0 or 1");
1477 settings->RdpServerCertificate = cnv.v;
1478 if (!settings->RdpServerCertificate && (len > 0))
1480 settings->RdpServerCertificate = freerdp_certificate_new();
1481 if (!settings->RdpServerCertificate)
1485 case FreeRDP_RdpServerRsaKey:
1486 freerdp_key_free(settings->RdpServerRsaKey);
1489 WLog_ERR(TAG,
"FreeRDP_RdpServerRsaKey::len must be 0 or 1");
1492 settings->RdpServerRsaKey = (rdpPrivateKey*)cnv.v;
1493 if (!settings->RdpServerRsaKey && (len > 0))
1495 settings->RdpServerRsaKey = freerdp_key_new();
1496 if (!settings->RdpServerRsaKey)
1500 case FreeRDP_RedirectionPassword:
1501 return freerdp_settings_set_pointer_len_(
1502 settings,
id, FreeRDP_RedirectionPasswordLength, data, len,
sizeof(
char));
1503 case FreeRDP_RedirectionTsvUrl:
1504 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionTsvUrlLength,
1505 data, len,
sizeof(
char));
1506 case FreeRDP_RedirectionTargetCertificate:
1507 freerdp_certificate_free(settings->RedirectionTargetCertificate);
1511 WLog_ERR(TAG,
"FreeRDP_RedirectionTargetCertificate::len must be 0 or 1");
1514 settings->RedirectionTargetCertificate = cnv.v;
1515 if (!settings->RedirectionTargetCertificate && (len > 0))
1517 settings->RedirectionTargetCertificate = freerdp_certificate_new();
1518 if (!settings->RedirectionTargetCertificate)
1522 case FreeRDP_RedirectionGuid:
1523 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionGuidLength,
1524 data, len,
sizeof(BYTE));
1525 case FreeRDP_LoadBalanceInfo:
1526 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_LoadBalanceInfoLength,
1527 data, len,
sizeof(
char));
1528 case FreeRDP_ServerRandom:
1529 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerRandomLength, data,
1531 case FreeRDP_ClientRandom:
1532 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ClientRandomLength, data,
1534 case FreeRDP_ServerCertificate:
1535 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerCertificateLength,
1536 data, len,
sizeof(
char));
1537 case FreeRDP_TargetNetAddresses:
1538 if (!freerdp_target_net_addresses_resize(settings, len))
1540 if (data ==
nullptr)
1541 target_net_addresses_free(settings, 0);
1543 case FreeRDP_ServerLicenseProductIssuers:
1544 if (data ==
nullptr)
1545 freerdp_server_license_issuers_free(settings);
1546 return freerdp_settings_set_pointer_len_(
1547 settings,
id, FreeRDP_ServerLicenseProductIssuersCount, data, len,
sizeof(
char*));
1548 case FreeRDP_TargetNetPorts:
1549 if (!freerdp_target_net_addresses_resize(settings, len))
1551 if (data ==
nullptr)
1553 for (
size_t x = 0; x < len; x++)
1554 settings->TargetNetPorts[x] = 0;
1557 case FreeRDP_DeviceArray:
1558 if (data ==
nullptr)
1559 freerdp_device_collection_free(settings);
1560 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DeviceArraySize, data,
1562 case FreeRDP_ChannelDefArray:
1563 if ((len > 0) && (len < CHANNEL_MAX_COUNT))
1565 "FreeRDP_ChannelDefArray::len expected to be >= %d, but have %" PRIuz,
1566 CHANNEL_MAX_COUNT, len);
1567 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ChannelDefArray,
1568 FreeRDP_ChannelDefArraySize, data, len,
1570 case FreeRDP_MonitorDefArray:
1571 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_MonitorDefArraySize,
1573 case FreeRDP_ClientAutoReconnectCookie:
1574 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1576 case FreeRDP_ServerAutoReconnectCookie:
1577 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1579 case FreeRDP_ClientTimeZone:
1582 WLog_ERR(TAG,
"FreeRDP_ClientTimeZone::len must be 0 or 1");
1585 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1587 case FreeRDP_BitmapCacheV2CellInfo:
1590 WLog_ERR(TAG,
"FreeRDP_BitmapCacheV2CellInfo::len must be >= 0 and <= 5");
1593 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_BitmapCacheV2NumCells,
1595 case FreeRDP_GlyphCache:
1596 if ((len != 0) && (len != 10))
1598 WLog_ERR(TAG,
"FreeRDP_GlyphCache::len must be 0 or 10");
1601 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1603 case FreeRDP_FragCache:
1606 WLog_ERR(TAG,
"FreeRDP_FragCache::len must be 0 or 1");
1609 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1611 case FreeRDP_StaticChannelArray:
1612 if (data ==
nullptr)
1613 freerdp_static_channel_collection_free(settings);
1614 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_StaticChannelArraySize,
1616 case FreeRDP_DynamicChannelArray:
1617 if (data ==
nullptr)
1618 freerdp_dynamic_channel_collection_free(settings);
1619 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DynamicChannelArraySize,
1621 case FreeRDP_ReceivedCapabilityData:
1622 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1624 if (data ==
nullptr)
1626 freerdp_capability_data_free(settings, 0, FALSE);
1629 case FreeRDP_ReceivedCapabilities:
1630 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1632 if (data ==
nullptr)
1634 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1636 settings->ReceivedCapabilities[x] = 0;
1640 case FreeRDP_OrderSupport:
1641 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1644 case FreeRDP_MonitorIds:
1645 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_NumMonitorIds, data, len,
1648 case FreeRDP_ReceivedCapabilityDataSizes:
1649 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1651 if (data ==
nullptr)
1653 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1654 settings->ReceivedCapabilityDataSizes[x] = 0;
1658 case FreeRDP_Password51:
1659 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_Password51Length, data,
1662 if ((data ==
nullptr) && (len == 0))
1668 WLog_WARN(TAG,
"Invalid id %d",
id);
1673void* freerdp_settings_get_pointer_array_writable(
const rdpSettings* settings,
1674 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1681 case FreeRDP_ClientAutoReconnectCookie:
1683 if ((offset >= max) || !settings->ClientAutoReconnectCookie)
1685 return &settings->ClientAutoReconnectCookie[offset];
1686 case FreeRDP_ServerAutoReconnectCookie:
1688 if ((offset >= max) || !settings->ServerAutoReconnectCookie)
1690 return &settings->ServerAutoReconnectCookie[offset];
1691 case FreeRDP_ServerCertificate:
1695 return &settings->ServerCertificate[offset];
1696 case FreeRDP_ServerRandom:
1700 return &settings->ServerRandom[offset];
1701 case FreeRDP_ClientRandom:
1705 return &settings->ClientRandom[offset];
1706 case FreeRDP_LoadBalanceInfo:
1710 return &settings->LoadBalanceInfo[offset];
1712 case FreeRDP_RedirectionTsvUrl:
1716 return &settings->RedirectionTsvUrl[offset];
1718 case FreeRDP_RedirectionPassword:
1722 return &settings->RedirectionPassword[offset];
1724 case FreeRDP_OrderSupport:
1728 return &settings->OrderSupport[offset];
1729 case FreeRDP_MonitorIds:
1733 return &settings->MonitorIds[offset];
1734 case FreeRDP_MonitorDefArray:
1738 return &settings->MonitorDefArray[offset];
1739 case FreeRDP_ChannelDefArray:
1743 return &settings->ChannelDefArray[offset];
1744 case FreeRDP_DeviceArray:
1748 return settings->DeviceArray[offset];
1749 case FreeRDP_StaticChannelArray:
1753 return settings->StaticChannelArray[offset];
1754 case FreeRDP_DynamicChannelArray:
1758 return settings->DynamicChannelArray[offset];
1759 case FreeRDP_FragCache:
1763 return &settings->FragCache[offset];
1764 case FreeRDP_GlyphCache:
1768 return &settings->GlyphCache[offset];
1769 case FreeRDP_BitmapCacheV2CellInfo:
1773 return &settings->BitmapCacheV2CellInfo[offset];
1774 case FreeRDP_ReceivedCapabilities:
1778 return &settings->ReceivedCapabilities[offset];
1779 case FreeRDP_TargetNetAddresses:
1783 WINPR_ASSERT(settings->TargetNetAddresses);
1784 return settings->TargetNetAddresses[offset];
1785 case FreeRDP_TargetNetPorts:
1789 WINPR_ASSERT(settings->TargetNetPorts);
1790 return &settings->TargetNetPorts[offset];
1791 case FreeRDP_ClientTimeZone:
1795 return settings->ClientTimeZone;
1796 case FreeRDP_RdpServerCertificate:
1800 return settings->RdpServerCertificate;
1801 case FreeRDP_RdpServerRsaKey:
1805 return settings->RdpServerRsaKey;
1806 case FreeRDP_ServerLicenseProductIssuers:
1810 return settings->ServerLicenseProductIssuers[offset];
1811 case FreeRDP_ReceivedCapabilityData:
1815 WINPR_ASSERT(settings->ReceivedCapabilityData);
1816 return settings->ReceivedCapabilityData[offset];
1818 case FreeRDP_ReceivedCapabilityDataSizes:
1822 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1823 return &settings->ReceivedCapabilityDataSizes[offset];
1830 WLog_WARN(TAG,
"Invalid offset for %s [%d]: size=%" PRIuz
", offset=%" PRIuz,
1835BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1836 size_t offset,
const void* data)
1838 size_t maxOffset = 0;
1843 case FreeRDP_ClientAutoReconnectCookie:
1845 if ((offset >= maxOffset) || !data || !settings->ClientAutoReconnectCookie)
1849 case FreeRDP_ServerAutoReconnectCookie:
1851 if ((offset >= maxOffset) || !data || !settings->ServerAutoReconnectCookie)
1855 case FreeRDP_ServerCertificate:
1857 if ((offset >= maxOffset) || !data)
1859 settings->ServerCertificate[offset] = *(
const BYTE*)data;
1861 case FreeRDP_DeviceArray:
1863 if (offset >= maxOffset)
1865 freerdp_device_free(settings->DeviceArray[offset]);
1866 settings->DeviceArray[offset] = freerdp_device_clone(data);
1868 case FreeRDP_TargetNetAddresses:
1870 if ((offset >= maxOffset) || !data)
1872 WINPR_ASSERT(settings->TargetNetAddresses);
1873 free(settings->TargetNetAddresses[offset]);
1874 settings->TargetNetAddresses[offset] = _strdup((
const char*)data);
1875 return settings->TargetNetAddresses[offset] !=
nullptr;
1876 case FreeRDP_TargetNetPorts:
1878 if ((offset >= maxOffset) || !data)
1880 WINPR_ASSERT(settings->TargetNetPorts);
1881 settings->TargetNetPorts[offset] = *((
const UINT32*)data);
1883 case FreeRDP_StaticChannelArray:
1885 if ((offset >= maxOffset) || !data)
1887 freerdp_addin_argv_free(settings->StaticChannelArray[offset]);
1888 settings->StaticChannelArray[offset] = freerdp_addin_argv_clone(data);
1890 case FreeRDP_DynamicChannelArray:
1892 if ((offset >= maxOffset) || !data)
1894 freerdp_addin_argv_free(settings->DynamicChannelArray[offset]);
1895 settings->DynamicChannelArray[offset] = freerdp_addin_argv_clone(data);
1897 case FreeRDP_BitmapCacheV2CellInfo:
1899 if ((offset >= maxOffset) || !data)
1903 settings->BitmapCacheV2CellInfo[offset] = *cdata;
1906 case FreeRDP_ServerRandom:
1908 if ((offset >= maxOffset) || !data)
1910 settings->ServerRandom[offset] = *(
const BYTE*)data;
1912 case FreeRDP_ClientRandom:
1914 if ((offset >= maxOffset) || !data)
1916 settings->ClientRandom[offset] = *(
const BYTE*)data;
1918 case FreeRDP_LoadBalanceInfo:
1920 if ((offset >= maxOffset) || !data)
1922 settings->LoadBalanceInfo[offset] = *(
const BYTE*)data;
1924 case FreeRDP_RedirectionTsvUrl:
1926 if ((offset >= maxOffset) || !data)
1928 settings->RedirectionTsvUrl[offset] = *(
const BYTE*)data;
1930 case FreeRDP_RedirectionPassword:
1932 if ((offset >= maxOffset) || !data)
1934 settings->RedirectionPassword[offset] = *(
const BYTE*)data;
1936 case FreeRDP_OrderSupport:
1938 if (!settings->OrderSupport)
1940 if ((offset >= maxOffset) || !data)
1942 settings->OrderSupport[offset] = *(
const BOOL*)data ? 1 : 0;
1944 case FreeRDP_GlyphCache:
1946 if (!settings->GlyphCache)
1948 if ((offset >= maxOffset) || !data)
1952 case FreeRDP_FragCache:
1954 if (!settings->FragCache)
1956 if ((offset >= maxOffset) || !data)
1960 case FreeRDP_MonitorIds:
1962 if ((offset >= maxOffset) || !data)
1964 settings->MonitorIds[offset] = *(
const UINT32*)data;
1966 case FreeRDP_ChannelDefArray:
1968 if ((offset >= maxOffset) || !data)
1970 settings->ChannelDefArray[offset] = *(
const CHANNEL_DEF*)data;
1972 case FreeRDP_MonitorDefArray:
1974 if ((offset >= maxOffset) || !data)
1976 settings->MonitorDefArray[offset] = *(
const rdpMonitor*)data;
1979 case FreeRDP_ClientTimeZone:
1981 if ((offset >= maxOffset) || !data || !settings->ClientTimeZone)
1986 case FreeRDP_ServerLicenseProductIssuers:
1989 if ((offset >= maxOffset) || !settings->ServerLicenseProductIssuers)
1991 free(settings->ServerLicenseProductIssuers[offset]);
1992 settings->ServerLicenseProductIssuers[offset] =
nullptr;
1994 settings->ServerLicenseProductIssuers[offset] = _strdup((
const char*)data);
1997 case FreeRDP_ReceivedCapabilityData:
1999 if (offset >= maxOffset)
2001 WINPR_ASSERT(settings->ReceivedCapabilityData);
2002 settings->ReceivedCapabilityData[offset] = WINPR_CAST_CONST_PTR_AWAY(data, BYTE*);
2004 case FreeRDP_ReceivedCapabilityDataSizes:
2006 if (offset >= maxOffset)
2008 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
2009 settings->ReceivedCapabilityDataSizes[offset] = *(
const uint32_t*)data;
2017 WLog_WARN(TAG,
"[%s] Invalid offset=%" PRIuz
" [%" PRIuz
"] or nullptr data=%p",
2022const void* freerdp_settings_get_pointer_array(
const rdpSettings* settings,
2023 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
2025 return freerdp_settings_get_pointer_array_writable(settings,
id, offset);
2030 UINT32 flags = FREERDP_CODEC_ALL;
2031 if (settings->RemoteFxCodec == FALSE)
2033 flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
2035 if (settings->NSCodec == FALSE)
2037 flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
2045 WINPR_ASSERT(settings);
2046 const char* hostname = settings->ServerHostname;
2048 if (settings->UserSpecifiedServerName)
2049 hostname = settings->UserSpecifiedServerName;
2054#if defined(WITH_FREERDP_DEPRECATED)
2057 return freerdp_addin_argv_clone(channel);
2062 return freerdp_addin_argv_clone(channel);
2066BOOL freerdp_target_net_addresses_copy(rdpSettings* settings,
char** addresses, UINT32 count)
2068 WINPR_ASSERT(settings);
2069 WINPR_ASSERT(addresses);
2071 if (!freerdp_target_net_adresses_reset(settings, count))
2074 for (UINT32 i = 0; i < settings->TargetNetAddressCount; i++)
2076 const char* address = addresses[i];
2077 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_TargetNetAddresses, i, address))
2079 freerdp_target_net_addresses_free(settings);
2089 if (!what && !other)
2091 if (!what || !other)
2094 if (what->Id != other->Id)
2096 if (what->Type != other->Type)
2098 if (what->Name && other->Name)
2100 if (strcmp(what->Name, other->Name) != 0)
2105 if (what->Name != other->Name)
2111 case RDPDR_DTYP_PRINT:
2115 if (a->DriverName && b->DriverName)
2116 return strcmp(a->DriverName, b->DriverName) == 0;
2117 return a->DriverName == b->DriverName;
2120 case RDPDR_DTYP_SERIAL:
2125 if (a->Path && b->Path)
2127 if (strcmp(a->Path, b->Path) != 0)
2130 else if (a->Path != b->Path)
2133 if (a->Driver && b->Driver)
2135 if (strcmp(a->Driver, b->Driver) != 0)
2138 else if (a->Driver != b->Driver)
2140 if (a->Permissive && b->Permissive)
2141 return strcmp(a->Permissive, b->Permissive) == 0;
2142 return a->Permissive == b->Permissive;
2145 case RDPDR_DTYP_PARALLEL:
2149 if (a->Path && b->Path)
2150 return strcmp(a->Path, b->Path) == 0;
2151 return a->Path == b->Path;
2154 case RDPDR_DTYP_SMARTCARD:
2156 case RDPDR_DTYP_FILESYSTEM:
2160 if (a->automount != b->automount)
2162 if (a->Path && b->Path)
2163 return strcmp(a->Path, b->Path) == 0;
2164 return a->Path == b->Path;
2177 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
2178 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
2179 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED |
2180 RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED;
2182 if (flags & RAIL_LEVEL_SUPPORTED)
2183 winpr_str_append(
"RAIL_LEVEL_SUPPORTED", buffer, length,
"|");
2184 if (flags & RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED)
2185 winpr_str_append(
"RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED", buffer, length,
"|");
2186 if (flags & RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED)
2187 winpr_str_append(
"RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED", buffer, length,
"|");
2188 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2189 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2190 if (flags & RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED)
2191 winpr_str_append(
"RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED", buffer, length,
"|");
2192 if (flags & RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED)
2193 winpr_str_append(
"RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED", buffer, length,
"|");
2194 if (flags & RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED)
2195 winpr_str_append(
"RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED", buffer, length,
"|");
2196 if (flags & RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED)
2197 winpr_str_append(
"RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED", buffer, length,
"|");
2199 if ((flags & ~mask) != 0)
2201 char tbuffer[64] = WINPR_C_ARRAY_INIT;
2202 (void)_snprintf(tbuffer,
sizeof(tbuffer),
"RAIL_FLAG_UNKNOWN 0x%08" PRIx32, flags & mask);
2203 winpr_str_append(tbuffer, buffer, length,
"|");
2209 const BYTE** capsData,
const UINT32* capsSizes,
2210 UINT32 capsCount, BOOL serverReceivedCaps)
2212 WINPR_ASSERT(settings);
2213 WINPR_ASSERT(capsFlags || (capsCount == 0));
2214 WINPR_ASSERT(capsData || (capsCount == 0));
2215 WINPR_ASSERT(capsSizes || (capsCount == 0));
2216 WINPR_ASSERT(capsCount <= UINT16_MAX);
2218 wLog* log = WLog_Get(TAG);
2220 for (UINT32 x = 0; x < capsCount; x++)
2224 wStream buffer = WINPR_C_ARRAY_INIT;
2225 wStream* sub = Stream_StaticConstInit(&buffer, capsData[x], capsSizes[x]);
2227 if (!rdp_read_capability_set(log, sub, (UINT16)x, settings, serverReceivedCaps))
2240 return "RDP_VERSION_4";
2241 case RDP_VERSION_5_PLUS:
2242 return "RDP_VERSION_5_PLUS";
2243 case RDP_VERSION_10_0:
2244 return "RDP_VERSION_10_0";
2245 case RDP_VERSION_10_1:
2246 return "RDP_VERSION_10_1";
2247 case RDP_VERSION_10_2:
2248 return "RDP_VERSION_10_2";
2249 case RDP_VERSION_10_3:
2250 return "RDP_VERSION_10_3";
2251 case RDP_VERSION_10_4:
2252 return "RDP_VERSION_10_4";
2253 case RDP_VERSION_10_5:
2254 return "RDP_VERSION_10_5";
2255 case RDP_VERSION_10_6:
2256 return "RDP_VERSION_10_6";
2257 case RDP_VERSION_10_7:
2258 return "RDP_VERSION_10_7";
2259 case RDP_VERSION_10_8:
2260 return "RDP_VERSION_10_8";
2261 case RDP_VERSION_10_9:
2262 return "RDP_VERSION_10_9";
2263 case RDP_VERSION_10_10:
2264 return "RDP_VERSION_10_10";
2265 case RDP_VERSION_10_11:
2266 return "RDP_VERSION_10_11";
2267 case RDP_VERSION_10_12:
2268 return "RDP_VERSION_10_12";
2270 return "RDP_VERSION_UNKNOWN";
2277 WINPR_ASSERT(settings);
2280 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, 0, TRUE);
2284 char* str = ConvertWCharToUtf8Alloc(param, &len);
2285 if (!str && (len != 0))
2288 return freerdp_settings_set_string_(settings,
id, str, len);
2292 const WCHAR* param,
size_t length)
2296 WINPR_ASSERT(settings);
2299 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, length, TRUE);
2301 char* str = ConvertWCharNToUtf8Alloc(param, length, &len);
2302 if (!str && (length != 0))
2306 const size_t wlen = _wcsnlen(param, length);
2311 return freerdp_settings_set_string_(settings,
id, str, len);
2315 FreeRDP_Settings_Keys_String
id,
size_t* pCharLen)
2322 return ConvertUtf8ToWCharAlloc(str, pCharLen);
2329 case RDPDR_DTYP_FILESYSTEM:
2330 return "RDPDR_DTYP_FILESYSTEM";
2331 case RDPDR_DTYP_PARALLEL:
2332 return "RDPDR_DTYP_PARALLEL";
2333 case RDPDR_DTYP_PRINT:
2334 return "RDPDR_DTYP_PRINT";
2335 case RDPDR_DTYP_SERIAL:
2336 return "RDPDR_DTYP_SERIAL";
2337 case RDPDR_DTYP_SMARTCARD:
2338 return "RDPDR_DTYP_SMARTCARD";
2340 return "RDPDR_DTYP_UNKNOWN";
2344const char* freerdp_encryption_level_string(UINT32 EncryptionLevel)
2346 switch (EncryptionLevel)
2348 case ENCRYPTION_LEVEL_NONE:
2349 return "ENCRYPTION_LEVEL_NONE";
2350 case ENCRYPTION_LEVEL_LOW:
2351 return "ENCRYPTION_LEVEL_LOW";
2352 case ENCRYPTION_LEVEL_CLIENT_COMPATIBLE:
2353 return "ENCRYPTION_LEVEL_CLIENT_COMPATIBLE";
2354 case ENCRYPTION_LEVEL_HIGH:
2355 return "ENCRYPTION_LEVEL_HIGH";
2356 case ENCRYPTION_LEVEL_FIPS:
2357 return "ENCRYPTION_LEVEL_FIPS";
2359 return "ENCRYPTION_LEVEL_UNKNOWN";
2363const char* freerdp_encryption_methods_string(UINT32 EncryptionMethods,
char* buffer,
size_t size)
2365 if (EncryptionMethods == ENCRYPTION_METHOD_NONE)
2367 winpr_str_append(
"ENCRYPTION_METHOD_NONE", buffer, size,
"|");
2371 if (EncryptionMethods & ENCRYPTION_METHOD_40BIT)
2373 winpr_str_append(
"ENCRYPTION_METHOD_40BIT", buffer, size,
"|");
2375 if (EncryptionMethods & ENCRYPTION_METHOD_128BIT)
2377 winpr_str_append(
"ENCRYPTION_METHOD_128BIT", buffer, size,
"|");
2379 if (EncryptionMethods & ENCRYPTION_METHOD_56BIT)
2381 winpr_str_append(
"ENCRYPTION_METHOD_56BIT", buffer, size,
"|");
2383 if (EncryptionMethods & ENCRYPTION_METHOD_FIPS)
2385 winpr_str_append(
"ENCRYPTION_METHOD_FIPS", buffer, size,
"|");
2393 const UINT32 invalid = mask & ~(RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
2394 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT);
2396 if (mask & RNS_UD_32BPP_SUPPORT)
2397 winpr_str_append(
"RNS_UD_32BPP_SUPPORT", buffer, size,
"|");
2398 if (mask & RNS_UD_24BPP_SUPPORT)
2399 winpr_str_append(
"RNS_UD_24BPP_SUPPORT", buffer, size,
"|");
2400 if (mask & RNS_UD_16BPP_SUPPORT)
2401 winpr_str_append(
"RNS_UD_16BPP_SUPPORT", buffer, size,
"|");
2402 if (mask & RNS_UD_15BPP_SUPPORT)
2403 winpr_str_append(
"RNS_UD_15BPP_SUPPORT", buffer, size,
"|");
2407 char str[32] = WINPR_C_ARRAY_INIT;
2408 (void)_snprintf(str,
sizeof(str),
"RNS_UD_INVALID[0x%04" PRIx32
"]", invalid);
2409 winpr_str_append(str, buffer, size,
"|");
2411 char hex[32] = WINPR_C_ARRAY_INIT;
2412 (void)_snprintf(hex,
sizeof(hex),
"[0x%04" PRIx16
"]", mask);
2417 const char* separator,
const char* param)
2422 char* str =
nullptr;
2425 winpr_asprintf(&str, &len,
"%s", param);
2426 else if (!separator)
2427 winpr_asprintf(&str, &len,
"%s%s", old, param);
2429 winpr_asprintf(&str, &len,
"%s%s%s", old, separator, param);
2438 return settings !=
nullptr;
2445static int sort_monitor_fn(
const void* pva,
const void* pvb)
2451 if (a->is_primary && b->is_primary)
2459 return (a->x < b->x) ? -1 : 1;
2461 return (a->y < b->y) ? -1 : 1;
2468 WINPR_ASSERT(monitors || (count == 0));
2482 for (
size_t x = 0; x < count; x++)
2485 if (cur->is_primary)
2493 for (
size_t x = 0; x < count; x++)
2496 if ((cur->x == 0) && (cur->y == 0))
2506 WLog_ERR(TAG,
"Could not find primary monitor, aborting");
2513 WINPR_ASSERT(sorted);
2518 sorted[sortpos] = *primary;
2519 sorted[sortpos].x = 0;
2520 sorted[sortpos].y = 0;
2521 sorted[sortpos].is_primary = TRUE;
2525 const INT32 offsetX = primary->x;
2526 const INT32 offsetY = primary->y;
2532 for (
size_t x = 0; x < count; x++)
2541 sorted[sortpos++] = m;
2545 qsort(sorted, count,
sizeof(
rdpMonitor), sort_monitor_fn);
2548 WINPR_ASSERTING_INT_CAST(uint32_t, count));
2551static BOOL fill_array(WINPR_JSON* array,
const void* data,
size_t length)
2553 const BYTE* pdata = data;
2554 for (
size_t x = 0; x < length; x++)
2556 BYTE val = pdata[x];
2563static BOOL fill_uint32_array(WINPR_JSON* array,
const uint32_t* data,
size_t length)
2565 for (
size_t x = 0; x < length; x++)
2567 uint32_t val = data[x];
2574static WINPR_JSON* json_from_addin_item(
const ADDIN_ARGV* val)
2588 for (
int x = 0; x < val->argc; x++)
2590 const char* str = val->argv[x];
2592 WINPR_JSON* item =
nullptr;
2613static BOOL json_from_addin_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2614 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2619 for (uint32_t x = 0; x < count; x++)
2621 const ADDIN_ARGV* cval = freerdp_settings_get_pointer_array(settings, key, x);
2628static BOOL add_string_or_null(WINPR_JSON* json,
const char* key,
const char* value)
2636static WINPR_JSON* json_from_device_item(
const RDPDR_DEVICE* val)
2661 if (!add_string_or_null(obj,
"Name", val->Name))
2665 case RDPDR_DTYP_SERIAL:
2666 if (!add_string_or_null(obj,
"Path", device.serial->Path))
2668 if (!add_string_or_null(obj,
"Driver", device.serial->Driver))
2670 if (!add_string_or_null(obj,
"Permissive", device.serial->Permissive))
2673 case RDPDR_DTYP_PARALLEL:
2674 if (!add_string_or_null(obj,
"Path", device.parallel->Path))
2677 case RDPDR_DTYP_PRINT:
2678 if (!add_string_or_null(obj,
"DriverName", device.printer->DriverName))
2683 case RDPDR_DTYP_FILESYSTEM:
2684 if (!add_string_or_null(obj,
"Path", device.drive->Path))
2689 case RDPDR_DTYP_SMARTCARD:
2701static BOOL json_from_device_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2702 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2707 for (uint32_t x = 0; x < count; x++)
2709 const RDPDR_DEVICE* cval = freerdp_settings_get_pointer_array(settings, key, x);
2716static BOOL string_array_to_json(WINPR_JSON* json,
const rdpSettings* settings, uint32_t argc,
2717 FreeRDP_Settings_Keys_Pointer key)
2719 for (uint32_t x = 0; x < argc; x++)
2721 const char* cval = freerdp_settings_get_pointer_array(settings, key, x);
2723 WINPR_JSON* item =
nullptr;
2734static BOOL wchar_to_json(WINPR_JSON* obj,
const char* key,
const WCHAR* wstr,
size_t len)
2739 const size_t slen = len * 6;
2740 char* str = calloc(1, slen);
2744 WINPR_JSON* jstr =
nullptr;
2745 SSIZE_T rc = ConvertWCharNToUtf8(wstr, len, str, slen);
2749 return jstr !=
nullptr;
2752static BOOL wchar_from_json(WCHAR* wstr,
size_t len,
const WINPR_JSON* obj,
const char* key)
2763 memset(wstr, 0,
sizeof(WCHAR) * len);
2767 SSIZE_T rc = ConvertUtf8ToWChar(str, wstr, len);
2771static int64_t int_from_json_item(
const WINPR_JSON* item, int64_t min, int64_t max)
2780 if (isinf(val) || isnan(val))
2786 const int64_t ival = (int64_t)val;
2787 if ((ival < min) || (ival > max))
2796static int64_t int_from_json(
const WINPR_JSON* obj,
const char* key, int64_t min, int64_t max)
2804 return int_from_json_item(item, min, max);
2807static uint64_t uint_from_json_item(
const WINPR_JSON* item, uint64_t max)
2816 if (isinf(val) || isnan(val) || (val < 0.0))
2822 const uint64_t uval = (uint64_t)val;
2831static uint64_t uint_from_json(
const WINPR_JSON* obj,
const char* key, uint64_t max)
2840 return uint_from_json_item(item, max);
2843static WINPR_JSON* systemtime_to_json(WINPR_JSON* parent,
const char* key,
const SYSTEMTIME* st)
2874static BOOL systemtime_from_json(
const WINPR_JSON* pobj,
const char* key,
SYSTEMTIME* st)
2886 st->wYear = (uint16_t)uint_from_json(obj,
"wYear", UINT16_MAX);
2887 st->wMonth = (uint16_t)uint_from_json(obj,
"wMonth", UINT16_MAX);
2888 st->wDayOfWeek = (uint16_t)uint_from_json(obj,
"wDayOfWeek", UINT16_MAX);
2889 st->wDay = (uint16_t)uint_from_json(obj,
"wDay", UINT16_MAX);
2890 st->wHour = (uint16_t)uint_from_json(obj,
"wHour", UINT16_MAX);
2891 st->wMinute = (uint16_t)uint_from_json(obj,
"wMinute", UINT16_MAX);
2892 st->wSecond = (uint16_t)uint_from_json(obj,
"wSecond", UINT16_MAX);
2893 st->wMilliseconds = (uint16_t)uint_from_json(obj,
"wMilliseconds", UINT16_MAX);
2905 tz->Bias = (int32_t)int_from_json(json,
"Bias", INT32_MIN, INT32_MAX);
2906 tz->StandardBias = (int32_t)int_from_json(json,
"StandardBias", INT32_MIN, INT32_MAX);
2907 tz->DaylightBias = (int32_t)int_from_json(json,
"DaylightBias", INT32_MIN, INT32_MAX);
2911 if (!systemtime_from_json(json,
"StandardDate", &tz->StandardDate))
2913 if (!systemtime_from_json(json,
"DaylightDate", &tz->DaylightDate))
2916 if (!wchar_from_json(tz->StandardName, ARRAYSIZE(tz->StandardName), json,
"StandardName"))
2918 if (!wchar_from_json(tz->DaylightName, ARRAYSIZE(tz->DaylightName), json,
"DaylightName"))
2924static BOOL ts_info_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2925 const WINPR_JSON* json)
2934 for (
size_t x = 0; x < count; x++)
2938 if (!ts_info_from_json(tz, obj))
2959 if (!wchar_to_json(obj,
"StandardName", tz.StandardName, ARRAYSIZE(tz.StandardName)))
2962 if (!systemtime_to_json(obj,
"StandardDate", &tz.StandardDate))
2968 if (!wchar_to_json(obj,
"DaylightName", tz.DaylightName, ARRAYSIZE(tz.DaylightName)))
2971 if (!systemtime_to_json(obj,
"DaylightDate", &tz.DaylightDate))
3004 for (
size_t x = 0; x < count; x++)
3006 if (!glyph_cache_def_to_json(json, &def[x]))
3021 def->cacheEntries = (uint16_t)uint_from_json(json,
"cacheEntries", UINT16_MAX);
3022 def->cacheMaximumCellSize = (uint16_t)uint_from_json(json,
"cacheMaximumCellSize", UINT16_MAX);
3026static BOOL glyph_cache_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3027 const WINPR_JSON* json)
3036 for (
size_t x = 0; x < count; x++)
3039 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3041 if (!glyph_cache_def_from_json(cache, obj))
3055 info->numEntries = (uint32_t)uint_from_json(json,
"numEntries", UINT32_MAX);
3067static BOOL bitmap_cache_v2_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3068 const WINPR_JSON* json)
3077 for (
size_t x = 0; x < count; x++)
3080 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3082 if (!bitmap_cache_v2_from_json(cache, obj))
3090 WINPR_ASSERT(cookie);
3097 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3098 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3099 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3108 if (len != ARRAYSIZE(cookie->securityVerifier))
3112 for (
size_t x = 0; x < len; x++)
3115 const uint64_t val = uint_from_json_item(citem, UINT8_MAX);
3116 cookie->securityVerifier[x] = (uint8_t)val;
3121static BOOL client_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3122 const WINPR_JSON* json)
3131 for (
size_t x = 0; x < count; x++)
3135 if (!client_cookie_from_json(cache, obj))
3143 WINPR_ASSERT(cookie);
3149 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3150 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3151 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3160 if (len != ARRAYSIZE(cookie->arcRandomBits))
3164 for (
size_t x = 0; x < len; x++)
3167 cookie->arcRandomBits[x] = (uint8_t)uint_from_json_item(citem, UINT8_MAX);
3172static BOOL server_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3173 const WINPR_JSON* json)
3182 for (
size_t x = 0; x < count; x++)
3186 if (!server_cookie_from_json(cache, obj))
3192static BOOL channel_def_from_json(
CHANNEL_DEF* cookie,
const WINPR_JSON* json)
3194 WINPR_ASSERT(cookie);
3201 cookie->options = (uint32_t)uint_from_json(json,
"options", UINT32_MAX);
3211 memset(cookie->name, 0,
sizeof(cookie->name));
3214 strncpy(cookie->name, str, strnlen(str, ARRAYSIZE(cookie->name)));
3219static BOOL channel_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3220 const WINPR_JSON* json)
3229 for (
size_t x = 0; x < count; x++)
3231 CHANNEL_DEF* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3233 if (!channel_def_from_json(cache, obj))
3239static BOOL monitor_attributes_from_json(
MONITOR_ATTRIBUTES* attributes,
const WINPR_JSON* json)
3241 WINPR_ASSERT(attributes);
3250 attributes->physicalWidth = (uint32_t)uint_from_json(obj,
"physicalWidth", UINT32_MAX);
3251 attributes->physicalHeight = (uint32_t)uint_from_json(obj,
"physicalHeight", UINT32_MAX);
3252 attributes->orientation = (uint32_t)uint_from_json(obj,
"orientation", UINT32_MAX);
3253 attributes->desktopScaleFactor =
3254 (uint32_t)uint_from_json(obj,
"desktopScaleFactor", UINT32_MAX);
3255 attributes->deviceScaleFactor = (uint32_t)uint_from_json(obj,
"deviceScaleFactor", UINT32_MAX);
3259static BOOL monitor_def_from_json(
rdpMonitor* monitor,
const WINPR_JSON* json)
3261 WINPR_ASSERT(monitor);
3267 monitor->x = (int32_t)int_from_json(json,
"x", INT32_MIN, INT32_MAX);
3268 monitor->y = (int32_t)int_from_json(json,
"y", INT32_MIN, INT32_MAX);
3269 monitor->width = (int32_t)int_from_json(json,
"width", 0, INT32_MAX);
3270 monitor->height = (int32_t)int_from_json(json,
"height", 0, INT32_MAX);
3271 monitor->orig_screen = (uint32_t)uint_from_json(json,
"orig_screen", UINT32_MAX);
3282 return monitor_attributes_from_json(&monitor->attributes, json);
3285static BOOL monitor_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3286 const WINPR_JSON* json)
3295 for (
size_t x = 0; x < count; x++)
3297 rdpMonitor* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3299 if (!monitor_def_from_json(cache, obj))
3323 for (
size_t x = 0; x < ARRAYSIZE(cs->securityVerifier); x++)
3337 for (
size_t x = 0; x < count; x++)
3339 if (!client_cookie_to_json(json, &cs[x]))
3363 for (
size_t x = 0; x < ARRAYSIZE(cs->arcRandomBits); x++)
3377 for (
size_t x = 0; x < count; x++)
3379 if (!server_cookie_to_json(json, &cs[x]))
3403 for (
size_t x = 0; x < count; x++)
3405 if (!bitmap_cache_v2_to_json(json, &info[x]))
3411static BOOL monitor_attributes_to_json(WINPR_JSON* pobj,
const MONITOR_ATTRIBUTES* attributes)
3413 WINPR_ASSERT(attributes);
3430static BOOL monitor_def_to_json(WINPR_JSON* json,
const rdpMonitor* monitor)
3432 WINPR_ASSERT(monitor);
3451 return monitor_attributes_to_json(obj, &monitor->attributes);
3454static BOOL monitor_def_array_to_json(WINPR_JSON* json,
const rdpMonitor* monitors,
size_t count)
3456 for (
size_t x = 0; x < count; x++)
3458 if (!monitor_def_to_json(json, &monitors[x]))
3464static BOOL channel_def_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channel)
3466 WINPR_ASSERT(channel);
3480static BOOL channel_def_array_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channels,
size_t count)
3482 for (
size_t x = 0; x < count; x++)
3484 if (!channel_def_to_json(json, &channels[x]))
3490static BOOL serialize_pointer(
const rdpSettings* settings, WINPR_JSON* json,
3491 FreeRDP_Settings_Keys_Pointer
id)
3507 case FreeRDP_instance:
3516 return fill_array(jval, &ptr.u,
sizeof(ptr.u));
3518 case FreeRDP_ServerRandom:
3521 return fill_array(jval, val, len);
3523 case FreeRDP_ServerCertificate:
3525 const uint32_t len =
3527 return fill_array(jval, val, len);
3529 case FreeRDP_ClientRandom:
3532 return fill_array(jval, val, len);
3534 case FreeRDP_ServerLicenseProductIssuers:
3536 const uint32_t len =
3538 return string_array_to_json(jval, settings, len, FreeRDP_ServerLicenseProductIssuers);
3540 case FreeRDP_RedirectionPassword:
3542 const uint32_t len =
3544 return fill_array(jval, val, len);
3546 case FreeRDP_RedirectionGuid:
3548 const uint32_t len =
3550 return fill_array(jval, val, len);
3552 case FreeRDP_LoadBalanceInfo:
3554 const uint32_t len =
3556 return fill_array(jval, val, len);
3558 case FreeRDP_ClientTimeZone:
3560 return tz_info_to_json(jval, val);
3562 case FreeRDP_RedirectionTsvUrl:
3564 const uint32_t len =
3566 return fill_array(jval, val, len);
3568 case FreeRDP_GlyphCache:
3570 return glyph_cache_def_array_to_json(jval, val, val ? 10 : 0);
3572 case FreeRDP_FragCache:
3574 return glyph_cache_def_array_to_json(jval, val, val ? 1 : 0);
3576 case FreeRDP_BitmapCacheV2CellInfo:
3578 const uint32_t len =
3580 return bitmap_cache_v2_array_to_json(jval, val, len);
3582 case FreeRDP_OrderSupport:
3584 const uint32_t len = 32;
3585 return fill_array(jval, val, len);
3587 case FreeRDP_ClientAutoReconnectCookie:
3589 return client_cookie_array_to_json(jval, val, 1);
3591 case FreeRDP_ServerAutoReconnectCookie:
3593 return server_cookie_array_to_json(jval, val, 1);
3595 case FreeRDP_Password51:
3598 return fill_array(jval, val, len);
3600 case FreeRDP_ReceivedCapabilities:
3602 const uint32_t len =
3604 return fill_array(jval, val, len);
3606 case FreeRDP_MonitorIds:
3609 return fill_uint32_array(jval, val, len);
3611 case FreeRDP_TargetNetPorts:
3613 const uint32_t len =
3615 return fill_uint32_array(jval, val, len);
3617 case FreeRDP_MonitorDefArray:
3620 return monitor_def_array_to_json(jval, val, len);
3622 case FreeRDP_ChannelDefArray:
3625 return channel_def_array_to_json(jval, val, len);
3627 case FreeRDP_ReceivedCapabilityDataSizes:
3629 const uint32_t len =
3631 return fill_uint32_array(jval, val, len);
3633 case FreeRDP_ReceivedCapabilityData:
3635 const uint32_t len =
3637 const UINT32* pclen =
3642 for (uint32_t x = 0; x < len; x++)
3644 const char* cval = freerdp_settings_get_pointer_array(settings,
id, x);
3651 if (!fill_array(item, cval, pclen[x]))
3656 case FreeRDP_TargetNetAddresses:
3658 const uint32_t len =
3660 return string_array_to_json(jval, settings, len,
id);
3662 case FreeRDP_RedirectionTargetCertificate:
3663 case FreeRDP_RdpServerCertificate:
3665 WINPR_JSON* item =
nullptr;
3667 char* pem = freerdp_certificate_get_pem(val, &len);
3680 case FreeRDP_RdpServerRsaKey:
3682 WINPR_JSON* item =
nullptr;
3684 char* pem = freerdp_key_get_pem(val, &len,
nullptr);
3693 case FreeRDP_DeviceArray:
3696 return json_from_device_item_array(jval, settings,
id, len);
3698 case FreeRDP_StaticChannelArray:
3700 const uint32_t len =
3702 return json_from_addin_item_array(jval, settings,
id, len);
3704 case FreeRDP_DynamicChannelArray:
3706 const uint32_t len =
3708 return json_from_addin_item_array(jval, settings,
id, len);
3710 case FreeRDP_POINTER_UNUSED:
3718 char* str =
nullptr;
3748 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
3752 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
3758 FreeRDP_Settings_Keys_Bool b;
3759 FreeRDP_Settings_Keys_Int16 i16;
3760 FreeRDP_Settings_Keys_UInt16 u16;
3761 FreeRDP_Settings_Keys_Int32 i32;
3762 FreeRDP_Settings_Keys_UInt32 u32;
3763 FreeRDP_Settings_Keys_Int64 i64;
3764 FreeRDP_Settings_Keys_UInt64 u64;
3765 FreeRDP_Settings_Keys_String str;
3766 FreeRDP_Settings_Keys_Pointer ptr;
3774 case RDP_SETTINGS_TYPE_BOOL:
3781 case RDP_SETTINGS_TYPE_UINT16:
3788 case RDP_SETTINGS_TYPE_INT16:
3795 case RDP_SETTINGS_TYPE_UINT32:
3802 case RDP_SETTINGS_TYPE_INT32:
3809 case RDP_SETTINGS_TYPE_UINT64:
3816 case RDP_SETTINGS_TYPE_INT64:
3823 case RDP_SETTINGS_TYPE_STRING:
3838 case RDP_SETTINGS_TYPE_POINTER:
3839 if (!serialize_pointer(settings, jpointer, iter.ptr))
3855 *plength = strlen(str);
3862static BOOL val_from_array(rdpSettings* settings,
const WINPR_JSON* json,
3863 FreeRDP_Settings_Keys_Pointer key,
size_t esize)
3874 size_t count = len / esize;
3875 if (count * esize != len)
3886 for (
size_t x = 0; x < len; x++)
3889 data[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3895static BOOL uintptr_from_array(rdpSettings* settings,
const WINPR_JSON* json)
3897 FreeRDP_Settings_Keys_Pointer key = FreeRDP_instance;
3902 if (len >
sizeof(
void*))
3911 uint8_t u[
sizeof(
void*)];
3915 for (
size_t x = 0; x < len; x++)
3918 ptr.u[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3925static BOOL val_from_uint32_array(rdpSettings* settings,
const WINPR_JSON* json,
3926 FreeRDP_Settings_Keys_Pointer key,
3927 FreeRDP_Settings_Keys_UInt32 keyId)
3942 for (
size_t x = 0; x < len; x++)
3944 UINT32* data = freerdp_settings_get_pointer_array_writable(settings, key, x);
3949 data[0] = (uint32_t)uint_from_json_item(val, UINT32_MAX);
3954static BOOL caps_data_entry_from_json(rdpSettings* settings,
size_t offset,
const WINPR_JSON* json)
3962 return freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset,
3966 uint8_t* data = calloc(size,
sizeof(uint8_t));
3970 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset, data))
3977 for (
size_t x = 0; x < size; x++)
3980 data[x] = (uint8_t)uint_from_json_item(item, UINT8_MAX);
3987static BOOL caps_data_array_from_json(rdpSettings* settings,
const WINPR_JSON* json)
3996 for (uint32_t x = 0; x < count; x++)
3999 if (!caps_data_entry_from_json(settings, x, array))
4005static BOOL str_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4006 FreeRDP_Settings_Keys_Pointer key)
4017 for (
size_t x = 0; x < len; x++)
4026 if (!freerdp_settings_set_pointer_array(settings, key, x, val))
4032static BOOL addin_argv_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4033 FreeRDP_Settings_Keys_Pointer key)
4045 for (
size_t x = 0; x < len; x++)
4052 if (!jargc || !array)
4057 const int argc = (int)int_from_json_item(jargc, INT32_MIN, INT32_MAX);
4061 if (jlen != (
size_t)argc)
4066 const char** argv = (
const char**)calloc(jlen,
sizeof(
char*));
4069 for (
size_t y = 0; y < jlen; y++)
4080 ADDIN_ARGV* cval = freerdp_addin_argv_new(jlen, argv);
4084 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, x, cval);
4085 freerdp_addin_argv_free(cval);
4093static const char* get_string(
const WINPR_JSON* json,
const char* key)
4101static BOOL get_bool(
const WINPR_JSON* json,
const char* key)
4109static BOOL device_from_json_item(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
4110 size_t offset,
const WINPR_JSON* val)
4117 const uint64_t type = uint_from_json(val,
"Type", UINT32_MAX);
4118 if (type > UINT32_MAX)
4121 const char* name = get_string(val,
"Name");
4125 const char* args[6] = WINPR_C_ARRAY_INIT;
4127 args[count++] = name;
4130 case RDPDR_DTYP_SERIAL:
4131 args[count] = get_string(val,
"Path");
4135 args[count] = get_string(val,
"Driver");
4139 args[count] = get_string(val,
"Permissive");
4145 case RDPDR_DTYP_PARALLEL:
4146 args[count] = get_string(val,
"Path");
4150 case RDPDR_DTYP_PRINT:
4151 args[count] = get_string(val,
"DriverName");
4155 if (get_bool(val,
"IsDefault"))
4156 args[count++] =
"default";
4159 case RDPDR_DTYP_FILESYSTEM:
4160 args[count] = get_string(val,
"Path");
4164 if (get_bool(val,
"automount"))
4165 args[count++] =
"automount";
4168 case RDPDR_DTYP_SMARTCARD:
4173 RDPDR_DEVICE* device = freerdp_device_new(WINPR_ASSERTING_INT_CAST(UINT32, type), count, args);
4178 device->Id = (uint32_t)uint_from_json(val,
"Id", UINT32_MAX);
4181 freerdp_device_free(device);
4185 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, offset, device);
4186 freerdp_device_free(device);
4190static BOOL device_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4191 FreeRDP_Settings_Keys_Pointer key)
4203 for (
size_t x = 0; x < len; x++)
4206 if (!device_from_json_item(settings, key, x, val))
4212static const char* pem_from_json(
const WINPR_JSON* jval,
size_t* plen, BOOL* pvalid)
4216 WINPR_ASSERT(pvalid);
4242static BOOL deserialize_pointer(
const WINPR_JSON* json, rdpSettings* settings,
4243 FreeRDP_Settings_Keys_Pointer
id)
4258 case FreeRDP_instance:
4259 return uintptr_from_array(settings, jval);
4260 case FreeRDP_ServerRandom:
4261 case FreeRDP_ServerCertificate:
4262 case FreeRDP_ClientRandom:
4263 case FreeRDP_RedirectionPassword:
4264 case FreeRDP_RedirectionGuid:
4265 case FreeRDP_LoadBalanceInfo:
4266 case FreeRDP_RedirectionTsvUrl:
4267 case FreeRDP_OrderSupport:
4268 case FreeRDP_Password51:
4269 return val_from_array(settings, jval,
id, 1);
4270 case FreeRDP_ReceivedCapabilities:
4271 return val_from_array(settings, jval,
id, 1);
4272 case FreeRDP_ClientTimeZone:
4273 return ts_info_array_from_json(settings,
id, jval);
4274 case FreeRDP_GlyphCache:
4275 return glyph_cache_def_array_from_json(settings,
id, jval);
4276 case FreeRDP_FragCache:
4277 return glyph_cache_def_array_from_json(settings,
id, jval);
4278 case FreeRDP_BitmapCacheV2CellInfo:
4279 return bitmap_cache_v2_array_from_json(settings,
id, jval);
4280 case FreeRDP_ClientAutoReconnectCookie:
4281 return client_cookie_array_from_json(settings,
id, jval);
4282 case FreeRDP_ServerAutoReconnectCookie:
4283 return server_cookie_array_from_json(settings,
id, jval);
4284 case FreeRDP_MonitorDefArray:
4285 return monitor_def_array_from_json(settings,
id, jval);
4286 case FreeRDP_ChannelDefArray:
4287 return channel_def_array_from_json(settings,
id, jval);
4288 case FreeRDP_MonitorIds:
4289 return val_from_uint32_array(settings, jval,
id, FreeRDP_NumMonitorIds);
4290 case FreeRDP_TargetNetPorts:
4291 return val_from_uint32_array(settings, jval,
id, FreeRDP_TargetNetAddressCount);
4292 case FreeRDP_ServerLicenseProductIssuers:
4293 case FreeRDP_TargetNetAddresses:
4294 return str_array_from_json(settings, jval,
id);
4295 case FreeRDP_ReceivedCapabilityDataSizes:
4296 return val_from_uint32_array(settings, jval,
id, FreeRDP_ReceivedCapabilitiesSize);
4297 case FreeRDP_ReceivedCapabilityData:
4298 return caps_data_array_from_json(settings, jval);
4299 case FreeRDP_RedirectionTargetCertificate:
4300 case FreeRDP_RdpServerCertificate:
4304 const char* pem = pem_from_json(jval, &len, &valid);
4310 rdpCertificate* cert =
nullptr;
4314 if (strnlen(pem, 2) == 0)
4315 cert = freerdp_certificate_new();
4317 cert = freerdp_certificate_new_from_pem(pem);
4322 case FreeRDP_RdpServerRsaKey:
4326 const char* pem = pem_from_json(jval, &len, &valid);
4334 rdpPrivateKey* key = freerdp_key_new_from_pem_enc(pem,
nullptr);
4339 case FreeRDP_DeviceArray:
4340 return device_array_from_json(settings, jval,
id);
4341 case FreeRDP_StaticChannelArray:
4342 case FreeRDP_DynamicChannelArray:
4343 return addin_argv_from_json(settings, jval,
id);
4344 case FreeRDP_POINTER_UNUSED:
4350static WINPR_JSON* settings_json_get(wLog* log, WINPR_JSON* jbool,
const char* name)
4355 WLog_Print(log, WLOG_ERROR,
"settings entry %s not found", name);
4360static BOOL settings_json_get_uint(wLog* log, WINPR_JSON* jval,
const char* name, UINT64 max,
4367 WINPR_JSON* item = settings_json_get(log, jval, name);
4373 WLog_Print(log, WLOG_ERROR,
"settings entry %s not of type NUMBER", name);
4377 const uint64_t val = uint_from_json_item(item, max);
4380 char buffer[128] = WINPR_C_ARRAY_INIT;
4381 WLog_Print(log, WLOG_ERROR,
"settings entry %s invalid NUMBER '%s'", name,
4382 winpr_strerror(errno, buffer,
sizeof(buffer)));
4389static BOOL settings_json_get_int(wLog* log, WINPR_JSON* jval,
const char* name, INT64 min,
4390 INT64 max, INT64* pval)
4396 WINPR_JSON* item = settings_json_get(log, jval, name);
4402 WLog_Print(log, WLOG_ERROR,
"settings entry %s not of type NUMBER", name);
4406 const int64_t val = int_from_json_item(item, min, max);
4409 char buffer[128] = WINPR_C_ARRAY_INIT;
4410 WLog_Print(log, WLOG_ERROR,
"settings entry %s invalid NUMBER '%s'", name,
4411 winpr_strerror(errno, buffer,
sizeof(buffer)));
4418static BOOL settings_json_bool(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_Bool key,
4419 WINPR_JSON* jbool,
const char* name)
4421 WINPR_JSON* item = settings_json_get(log, jbool, name);
4426 WLog_Print(log, WLOG_ERROR,
"settings entry %s not of type BOOL", name);
4432 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4438static BOOL settings_json_uint16(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_UInt16 key,
4439 WINPR_JSON* jbool,
const char* name)
4442 if (!settings_json_get_uint(log, jbool, name, UINT16_MAX, &val))
4446 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4452static BOOL settings_json_int16(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_Int16 key,
4453 WINPR_JSON* jbool,
const char* name)
4456 if (!settings_json_get_int(log, jbool, name, INT16_MIN, INT16_MAX, &val))
4460 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4466static BOOL settings_json_uint32(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_UInt32 key,
4467 WINPR_JSON* jbool,
const char* name)
4470 if (!settings_json_get_uint(log, jbool, name, UINT32_MAX, &val))
4474 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4480static BOOL settings_json_int32(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_Int32 key,
4481 WINPR_JSON* jbool,
const char* name)
4484 if (!settings_json_get_int(log, jbool, name, INT32_MIN, INT32_MAX, &val))
4488 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4494static BOOL settings_json_uint64(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_UInt64 key,
4495 WINPR_JSON* jbool,
const char* name)
4498 if (!settings_json_get_uint(log, jbool, name, UINT64_MAX, &val))
4502 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4508static BOOL settings_json_int64(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_Int64 key,
4509 WINPR_JSON* jbool,
const char* name)
4512 if (!settings_json_get_int(log, jbool, name, INT64_MIN, INT64_MAX, &val))
4516 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4522static BOOL settings_json_string(wLog* log, rdpSettings* settings, FreeRDP_Settings_Keys_String key,
4523 WINPR_JSON* jstring,
const char* name)
4525 const char* val =
nullptr;
4531 WLog_Print(log, WLOG_ERROR,
"settings entry %s not of type STRING", name);
4537 WLog_Print(log, WLOG_ERROR,
"settings entry %s: nullptr value", name);
4543 WLog_Print(log, WLOG_ERROR,
"settings entry %s: failed to update rdpSettings", name);
4551 wLog* log = WLog_Get(TAG);
4555 WLog_Print(log, WLOG_ERROR,
"JSON parsing failed");
4562 WLog_Print(log, WLOG_ERROR,
"freerdp_settings_new failed");
4566 if (!freerdp_settings_apply_from_json(settings, json))
4578BOOL freerdp_settings_apply_from_json(rdpSettings* settings, WINPR_JSON* json)
4580 wLog* log = WLog_Get(TAG);
4582 WINPR_ASSERT(settings);
4604 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
4608 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4614 FreeRDP_Settings_Keys_Bool b;
4615 FreeRDP_Settings_Keys_Int16 i16;
4616 FreeRDP_Settings_Keys_UInt16 u16;
4617 FreeRDP_Settings_Keys_Int32 i32;
4618 FreeRDP_Settings_Keys_UInt32 u32;
4619 FreeRDP_Settings_Keys_Int64 i64;
4620 FreeRDP_Settings_Keys_UInt64 u64;
4621 FreeRDP_Settings_Keys_String str;
4622 FreeRDP_Settings_Keys_Pointer ptr;
4629 case RDP_SETTINGS_TYPE_POINTER:
4630 if (!deserialize_pointer(jpointer, settings, iter.ptr))
4638 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4644 FreeRDP_Settings_Keys_Bool b;
4645 FreeRDP_Settings_Keys_Int16 i16;
4646 FreeRDP_Settings_Keys_UInt16 u16;
4647 FreeRDP_Settings_Keys_Int32 i32;
4648 FreeRDP_Settings_Keys_UInt32 u32;
4649 FreeRDP_Settings_Keys_Int64 i64;
4650 FreeRDP_Settings_Keys_UInt64 u64;
4651 FreeRDP_Settings_Keys_String str;
4652 FreeRDP_Settings_Keys_Pointer ptr;
4660 case RDP_SETTINGS_TYPE_BOOL:
4661 if (!settings_json_bool(log, settings, iter.b, jbool, name))
4664 case RDP_SETTINGS_TYPE_UINT16:
4665 if (!settings_json_uint16(log, settings, iter.u16, juint16, name))
4668 case RDP_SETTINGS_TYPE_INT16:
4669 if (!settings_json_int16(log, settings, iter.i16, jint16, name))
4672 case RDP_SETTINGS_TYPE_UINT32:
4673 if (!settings_json_uint32(log, settings, iter.u32, juint32, name))
4676 case RDP_SETTINGS_TYPE_INT32:
4677 if (!settings_json_int32(log, settings, iter.i32, jint32, name))
4680 case RDP_SETTINGS_TYPE_UINT64:
4681 if (!settings_json_uint64(log, settings, iter.u64, juint64, name))
4684 case RDP_SETTINGS_TYPE_INT64:
4685 if (!settings_json_int64(log, settings, iter.i64, jint64, name))
4688 case RDP_SETTINGS_TYPE_STRING:
4689 if (!settings_json_string(log, settings, iter.str, jstring, name))
4692 case RDP_SETTINGS_TYPE_POINTER:
4711 const struct RDPDR_DEVICE_EX* ex;
4715 return cnv.ex->args;
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.
const ADDIN_ARGV * freerdp_device_get_args(const RDPDR_DEVICE *device)
return the arguments passed to the device channel.
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.