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")
59BOOL freerdp_addin_argv_add_argument_ex(
ADDIN_ARGV* args,
const char* argument,
size_t len)
61 if (!args || !argument)
65 len = strlen(argument);
67 char** new_argv = (
char**)realloc(
68 (
void*)args->argv,
sizeof(
char*) * (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc) + 1));
73 args->argv = new_argv;
75 char* str = calloc(len + 1,
sizeof(
char));
78 memcpy(str, argument, len);
79 args->argv[args->argc++] = str;
83BOOL freerdp_addin_argv_add_argument(
ADDIN_ARGV* args,
const char* argument)
85 return freerdp_addin_argv_add_argument_ex(args, argument, 0);
88BOOL freerdp_addin_argv_del_argument(
ADDIN_ARGV* args,
const char* argument)
90 if (!args || !argument)
92 for (
int x = 0; x < args->argc; x++)
94 char* arg = args->argv[x];
95 if (strcmp(argument, arg) == 0)
99 memmove_s((
void*)&args->argv[x],
100 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) *
sizeof(
char*),
101 (
void*)&args->argv[x + 1],
102 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) *
104 args->argv[args->argc - 1] =
nullptr;
112int freerdp_addin_set_argument(
ADDIN_ARGV* args,
const char* argument)
114 if (!args || !argument)
117 for (
int i = 0; i < args->argc; i++)
119 if (strcmp(args->argv[i], argument) == 0)
125 if (!freerdp_addin_argv_add_argument(args, argument))
130int freerdp_addin_replace_argument(
ADDIN_ARGV* args,
const char* previous,
const char* argument)
132 if (!args || !previous || !argument)
135 for (
int i = 0; i < args->argc; i++)
137 if (strcmp(args->argv[i], previous) == 0)
141 if (!(args->argv[i] = _strdup(argument)))
148 if (!freerdp_addin_argv_add_argument(args, argument))
153int freerdp_addin_set_argument_value(
ADDIN_ARGV* args,
const char* option,
const char* value)
159 if (!args || !option || !value)
161 length = strlen(option) + strlen(value) + 1;
162 str = (
char*)calloc(length + 1,
sizeof(
char));
167 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
169 for (
int i = 0; i < args->argc; i++)
171 p = strchr(args->argv[i],
':');
175 if (strncmp(args->argv[i], option,
176 WINPR_ASSERTING_INT_CAST(
size_t, p - args->argv[i])) == 0)
185 rc = freerdp_addin_argv_add_argument(args, str);
192int freerdp_addin_replace_argument_value(
ADDIN_ARGV* args,
const char* previous,
const char* option,
198 if (!args || !previous || !option || !value)
200 length = strlen(option) + strlen(value) + 1;
201 str = (
char*)calloc(length + 1,
sizeof(
char));
206 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
208 for (
int i = 0; i < args->argc; i++)
210 if (strcmp(args->argv[i], previous) == 0)
218 rc = freerdp_addin_argv_add_argument(args, str);
225BOOL freerdp_device_collection_add(rdpSettings* settings,
RDPDR_DEVICE* device)
229 WINPR_ASSERT(settings);
230 WINPR_ASSERT(device);
236 const size_t new_size = (old + 32);
243 settings->DeviceArray = new_array;
244 for (
size_t x = old; x < new_size; x++)
245 settings->DeviceArray[x] =
nullptr;
248 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
252 settings->DeviceArray[settings->DeviceCount++] = device;
258 WINPR_ASSERT(settings);
263 const UINT32 count = settings->DeviceCount;
264 for (
size_t x = 0; x < count; x++)
269 for (
size_t y = x + 1; y < count; y++)
272 settings->DeviceArray[y - 1] = next;
274 settings->DeviceArray[count - 1] =
nullptr;
275 settings->DeviceCount--;
283RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings,
const char* name)
287 WINPR_ASSERT(settings);
289 for (UINT32 index = 0; index < settings->DeviceCount; index++)
291 device = settings->DeviceArray[index];
296 if (strcmp(device->Name, name) == 0)
303RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
306 WINPR_ASSERT(settings);
308 for (UINT32 index = 0; index < settings->DeviceCount; index++)
310 device = settings->DeviceArray[index];
312 if (device->Type == type)
319RDPDR_DEVICE* freerdp_device_new(UINT32 Type,
size_t count,
const char*
const args[])
321 WINPR_ASSERT(args || (count == 0));
325 case RDPDR_DTYP_PRINT:
326 case RDPDR_DTYP_SERIAL:
327 case RDPDR_DTYP_PARALLEL:
328 case RDPDR_DTYP_SMARTCARD:
329 case RDPDR_DTYP_FILESYSTEM:
335 const size_t size =
sizeof(
struct RDPDR_DEVICE_EX);
336 struct RDPDR_DEVICE_EX* device = calloc(1, size);
339 device->u.base.Id = 0;
340 device->u.base.Type = Type;
344 device->u.base.Name = _strdup(args[0]);
345 if (!device->u.base.Name)
350 case RDPDR_DTYP_PRINT:
353 device->u.printer.DriverName = _strdup(args[1]);
354 if (!device->u.printer.DriverName)
360 device->u.printer.IsDefault = _stricmp(args[2],
"default") == 0;
363 case RDPDR_DTYP_SERIAL:
366 device->u.serial.Path = _strdup(args[1]);
367 if (!device->u.serial.Path)
373 device->u.serial.Driver = _strdup(args[2]);
374 if (!device->u.serial.Driver)
380 device->u.serial.Permissive = _strdup(args[3]);
381 if (!device->u.serial.Permissive)
385 case RDPDR_DTYP_PARALLEL:
388 device->u.parallel.Path = _strdup(args[1]);
389 if (!device->u.serial.Path)
393 case RDPDR_DTYP_SMARTCARD:
395 case RDPDR_DTYP_FILESYSTEM:
398 device->u.drive.Path = _strdup(args[1]);
399 if (!device->u.drive.Path)
403 device->u.drive.automount = (args[2] ==
nullptr);
409 device->args = freerdp_addin_argv_new(count, args);
413 return &device->u.base;
417 freerdp_device_free(&device->u.base);
429 struct RDPDR_DEVICE_EX* ex;
434 switch (device->Type)
436 case RDPDR_DTYP_PRINT:
437 free(cnv.ex->u.printer.DriverName);
439 case RDPDR_DTYP_SERIAL:
440 free(cnv.ex->u.serial.Path);
441 free(cnv.ex->u.serial.Driver);
442 free(cnv.ex->u.serial.Permissive);
444 case RDPDR_DTYP_PARALLEL:
445 free(cnv.ex->u.parallel.Path);
447 case RDPDR_DTYP_SMARTCARD:
449 case RDPDR_DTYP_FILESYSTEM:
450 free(cnv.ex->u.drive.Path);
455 freerdp_addin_argv_free(cnv.ex->args);
462 const struct RDPDR_DEVICE_EX* src = (
const struct RDPDR_DEVICE_EX*)device;
468 const char*
const* argv =
nullptr;
471 argc = src->args->argc;
474 argv = (
const char*
const*)src->args->argv;
478 freerdp_device_new(device->Type, WINPR_ASSERTING_INT_CAST(
size_t, argc), argv);
481 copy->Id = device->Id;
485void freerdp_device_collection_free(rdpSettings* settings)
487 WINPR_ASSERT(settings);
489 if (settings->DeviceArray)
491 for (UINT32 index = 0; index < settings->DeviceArraySize; index++)
494 freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index,
nullptr);
497 "freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, "
498 "index=%" PRIu32
", nullptr) failed",
503 free((
void*)settings->DeviceArray);
507 "freerdp_settings_set_pointer(settings, FreeRDP_DeviceArray, nullptr) failed");
509 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0) failed");
511 WLog_WARN(TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_DeviceCount, 0) failed");
514BOOL freerdp_static_channel_collection_del(rdpSettings* settings,
const char* name)
517 if (!settings || !settings->StaticChannelArray)
520 for (UINT32 x = 0; x < count; x++)
522 ADDIN_ARGV* cur = settings->StaticChannelArray[x];
523 if (cur && (cur->argc > 0))
525 if (strcmp(name, cur->argv[0]) == 0)
527 const BOOL success = memmove_s((
void*)&settings->StaticChannelArray[x],
529 (
void*)&settings->StaticChannelArray[x + 1],
531 for (
size_t y = count - 1; y < settings->StaticChannelArraySize; y++)
532 settings->StaticChannelArray[y] =
nullptr;
534 freerdp_addin_argv_free(cur);
542 for (
size_t x = count; x < settings->StaticChannelArraySize; x++)
543 settings->StaticChannelArray[x] =
nullptr;
548BOOL freerdp_static_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
552 WINPR_ASSERT(settings);
553 WINPR_ASSERT(channel);
558 const UINT32 oldSize =
560 const size_t new_size = oldSize + 32ul;
567 settings->StaticChannelArray = new_array;
569 for (
size_t x = oldSize; x < new_size; x++)
570 settings->StaticChannelArray[x] =
nullptr;
573 WINPR_ASSERTING_INT_CAST(uint32_t, new_size)))
579 ADDIN_ARGV** cur = &settings->StaticChannelArray[count++];
580 freerdp_addin_argv_free(*cur);
585ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings,
const char* name)
589 WINPR_ASSERT(settings);
592 for (UINT32 index = 0;
595 channel = settings->StaticChannelArray[index];
597 if (strcmp(channel->argv[0], name) == 0)
604void freerdp_static_channel_collection_free(rdpSettings* settings)
609 if (settings->StaticChannelArray)
613 freerdp_addin_argv_free(settings->StaticChannelArray[i]);
616 free((
void*)settings->StaticChannelArray);
619 TAG,
"freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0) failed");
620 settings->StaticChannelArray =
nullptr;
623 "freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0) failed");
626BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings,
const char* name)
629 if (!settings || !settings->DynamicChannelArray)
632 for (UINT32 x = 0; x < count; x++)
634 ADDIN_ARGV* cur = settings->DynamicChannelArray[x];
635 if (cur && (cur->argc > 0))
637 if (strcmp(name, cur->argv[0]) == 0)
639 const BOOL success = memmove_s((
void*)&settings->DynamicChannelArray[x],
641 (
void*)&settings->DynamicChannelArray[x + 1],
643 for (
size_t y = count - 1; y < settings->DynamicChannelArraySize; y++)
644 settings->DynamicChannelArray[y] =
nullptr;
646 freerdp_addin_argv_free(cur);
657BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
662 WINPR_ASSERT(settings);
663 WINPR_ASSERT(channel);
670 const size_t size = oldSize + 32;
677 settings->DynamicChannelArray = new_array;
679 for (
size_t x = oldSize; x < size; x++)
680 settings->DynamicChannelArray[x] =
nullptr;
683 WINPR_ASSERTING_INT_CAST(uint32_t, size)))
688 settings->DynamicChannelArray[count++] = channel;
692ADDIN_ARGV* freerdp_dynamic_channel_collection_find(
const rdpSettings* settings,
const char* name)
694 WINPR_ASSERT(settings);
697 for (UINT32 index = 0;
700 ADDIN_ARGV* channel = settings->DynamicChannelArray[index];
702 if (strcmp(channel->argv[0], name) == 0)
716 for (
int index = 0; index < args->argc; index++)
717 free(args->argv[index]);
718 free((
void*)args->argv);
724ADDIN_ARGV* freerdp_addin_argv_new(
size_t argc,
const char*
const argv[])
726 if (argc > INT32_MAX)
735 args->argc = (int)argc;
736 args->argv = (
char**)calloc(argc,
sizeof(
char*));
742 for (
size_t x = 0; x < argc; x++)
744 args->argv[x] = _strdup(argv[x]);
752 WINPR_PRAGMA_DIAG_PUSH
753 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
754 freerdp_addin_argv_free(args);
755 WINPR_PRAGMA_DIAG_POP
769 return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
772void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
774 WINPR_ASSERT(settings);
776 if (settings->DynamicChannelArray)
780 freerdp_addin_argv_free(settings->DynamicChannelArray[i]);
783 free((
void*)settings->DynamicChannelArray);
787 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0) failed");
788 settings->DynamicChannelArray =
nullptr;
791 "freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0) failed");
794static void freerdp_capability_data_free(rdpSettings* settings,
size_t offset, BOOL full)
796 WINPR_ASSERT(settings);
798 if (settings->ReceivedCapabilityData)
800 for (
size_t x = offset; x < settings->ReceivedCapabilitiesSize; x++)
802 free(settings->ReceivedCapabilityData[x]);
803 settings->ReceivedCapabilityData[x] =
nullptr;
807 free((
void*)settings->ReceivedCapabilityData);
808 settings->ReceivedCapabilityData =
nullptr;
813void freerdp_capability_buffer_free(rdpSettings* settings)
815 WINPR_ASSERT(settings);
817 freerdp_capability_data_free(settings, 0, TRUE);
819 free(settings->ReceivedCapabilityDataSizes);
820 settings->ReceivedCapabilityDataSizes =
nullptr;
822 free(settings->ReceivedCapabilities);
823 settings->ReceivedCapabilities =
nullptr;
825 settings->ReceivedCapabilitiesSize = 0;
828static BOOL resize_setting(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
size_t oldsize,
829 size_t size,
size_t base)
832 uint8_t* ptr = realloc(old, size * base);
838 const size_t diff = size - oldsize;
839 memset(&ptr[oldsize * base], 0, diff * base);
846static BOOL resize_setting_ptr(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
847 size_t oldsize,
size_t size,
size_t base)
849 WINPR_ASSERT(base ==
sizeof(
void*));
854 uint8_t** optr = WINPR_REINTERPRET_CAST(old, uint8_t*, uint8_t**);
855 for (
size_t x = size; x < oldsize; x++)
857 uint8_t* ptr = optr[x];
861 uint8_t* ptr = realloc(old, size * base);
865 uint8_t** optr = WINPR_REINTERPRET_CAST(ptr, uint8_t*, uint8_t**);
866 for (
size_t x = oldsize; x < size; x++)
875BOOL freerdp_capability_buffer_resize(rdpSettings* settings,
size_t count, BOOL force)
877 WINPR_ASSERT(settings);
879 const uint32_t len = settings->ReceivedCapabilitiesSize;
886 freerdp_capability_data_free(settings, count, FALSE);
890 freerdp_capability_buffer_free(settings);
894 const size_t oldsize = settings->ReceivedCapabilitiesSize;
895 if (!resize_setting(settings, FreeRDP_ReceivedCapabilityDataSizes, oldsize, count,
898 if (!resize_setting_ptr(settings, FreeRDP_ReceivedCapabilityData, oldsize, count,
901 if (!resize_setting(settings, FreeRDP_ReceivedCapabilities, oldsize, count,
sizeof(uint32_t)))
904 settings->ReceivedCapabilitiesSize = WINPR_ASSERTING_INT_CAST(uint32_t, count);
908BOOL freerdp_capability_buffer_copy(rdpSettings* settings,
const rdpSettings* src)
910 WINPR_ASSERT(settings);
913 if (src->ReceivedCapabilitiesSize == 0)
916 if (!freerdp_capability_buffer_resize(settings, src->ReceivedCapabilitiesSize, TRUE))
919 for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++)
921 WINPR_ASSERT(settings->ReceivedCapabilities);
922 settings->ReceivedCapabilities[x] = src->ReceivedCapabilities[x];
924 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
925 settings->ReceivedCapabilityDataSizes[x] = src->ReceivedCapabilityDataSizes[x];
927 WINPR_ASSERT(settings->ReceivedCapabilityData);
928 if (src->ReceivedCapabilityDataSizes[x] > 0)
930 void* tmp = realloc(settings->ReceivedCapabilityData[x],
931 settings->ReceivedCapabilityDataSizes[x]);
934 memcpy(tmp, src->ReceivedCapabilityData[x], src->ReceivedCapabilityDataSizes[x]);
935 settings->ReceivedCapabilityData[x] = tmp;
939 free(settings->ReceivedCapabilityData[x]);
940 settings->ReceivedCapabilityData[x] =
nullptr;
946static void target_net_addresses_free(rdpSettings* settings,
size_t offset)
948 WINPR_ASSERT(settings);
950 if (settings->TargetNetAddresses)
952 for (
size_t index = offset; index < settings->TargetNetAddressCount; index++)
954 free(settings->TargetNetAddresses[index]);
955 settings->TargetNetAddresses[index] =
nullptr;
960void freerdp_target_net_addresses_free(rdpSettings* settings)
962 WINPR_ASSERT(settings);
964 target_net_addresses_free(settings, 0);
966 free((
void*)settings->TargetNetAddresses);
967 settings->TargetNetAddresses =
nullptr;
969 free(settings->TargetNetPorts);
970 settings->TargetNetPorts =
nullptr;
972 settings->TargetNetAddressCount = 0;
975BOOL freerdp_target_net_addresses_resize(rdpSettings* settings,
size_t count)
977 WINPR_ASSERT(settings);
981 freerdp_target_net_addresses_free(settings);
985 const uint32_t len = settings->TargetNetAddressCount;
986 if (!resize_setting_ptr(settings, FreeRDP_TargetNetAddresses, len, count,
sizeof(
char*)))
988 if (!resize_setting(settings, FreeRDP_TargetNetPorts, len, count,
sizeof(uint32_t)))
991 settings->TargetNetAddressCount = WINPR_ASSERTING_INT_CAST(uint32_t, count);
995void freerdp_server_license_issuers_free(rdpSettings* settings)
997 WINPR_ASSERT(settings);
999 if (settings->ServerLicenseProductIssuers)
1001 for (UINT32 x = 0; x < settings->ServerLicenseProductIssuersCount; x++)
1002 free(settings->ServerLicenseProductIssuers[x]);
1004 free((
void*)settings->ServerLicenseProductIssuers);
1005 settings->ServerLicenseProductIssuers =
nullptr;
1006 settings->ServerLicenseProductIssuersCount = 0;
1009BOOL freerdp_server_license_issuers_copy(rdpSettings* settings,
char** issuers, UINT32 count)
1011 WINPR_ASSERT(settings);
1012 WINPR_ASSERT(issuers || (count == 0));
1018 for (UINT32 x = 0; x < count; x++)
1020 char* issuer = _strdup(issuers[x]);
1023 settings->ServerLicenseProductIssuers[x] = issuer;
1029void freerdp_performance_flags_make(rdpSettings* settings)
1031 UINT32 PerformanceFlags = PERF_FLAG_NONE;
1034 PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
1037 PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
1040 PerformanceFlags |= PERF_DISABLE_WALLPAPER;
1043 PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
1046 PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
1049 PerformanceFlags |= PERF_DISABLE_THEMING;
1052 "freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, 0x%08" PRIx32
1057void freerdp_performance_flags_split(rdpSettings* settings)
1062 PERF_ENABLE_FONT_SMOOTHING) != 0);
1064 settings, FreeRDP_AllowDesktopComposition,
1066 PERF_ENABLE_DESKTOP_COMPOSITION) != 0))
1069 settings, FreeRDP_DisableWallpaper,
1071 PERF_DISABLE_WALLPAPER) != 0))
1074 settings, FreeRDP_DisableFullWindowDrag,
1076 PERF_DISABLE_FULLWINDOWDRAG) != 0))
1079 settings, FreeRDP_DisableMenuAnims,
1081 PERF_DISABLE_MENUANIMATIONS) != 0))
1084 settings, FreeRDP_DisableThemes,
1086 PERF_DISABLE_THEMING) != 0))
1090 WLog_WARN(TAG,
"freerdp_performance_flags_split() failed");
1099 if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
1105 else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
1111 else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
1117 else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
1128 else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
1138UINT32 freerdp_get_gateway_usage_method(
const rdpSettings* settings)
1143 return TSC_PROXY_MODE_DETECT;
1144 return TSC_PROXY_MODE_DIRECT;
1150void freerdp_update_gateway_usage_method(rdpSettings* settings, UINT32 GatewayEnabled,
1151 UINT32 GatewayBypassLocal)
1153 UINT32 GatewayUsageMethod = 0;
1155 if (!GatewayEnabled && !GatewayBypassLocal)
1156 GatewayUsageMethod = TSC_PROXY_MODE_NONE_DIRECT;
1157 else if (GatewayEnabled && !GatewayBypassLocal)
1158 GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
1159 else if (GatewayEnabled && GatewayBypassLocal)
1160 GatewayUsageMethod = TSC_PROXY_MODE_DETECT;
1164 "freerdp_set_gateway_usage_method(settings, GatewayUsageMethod=%" PRIu32
1166 GatewayUsageMethod);
1169#if defined(WITH_FREERDP_DEPRECATED)
1170BOOL freerdp_get_param_bool(
const rdpSettings* settings,
int id)
1175int freerdp_set_param_bool(rdpSettings* settings,
int id, BOOL param)
1180int freerdp_get_param_int(
const rdpSettings* settings,
int id)
1185int freerdp_set_param_int(rdpSettings* settings,
int id,
int param)
1190UINT32 freerdp_get_param_uint32(
const rdpSettings* settings,
int id)
1195int freerdp_set_param_uint32(rdpSettings* settings,
int id, UINT32 param)
1200UINT64 freerdp_get_param_uint64(
const rdpSettings* settings,
int id)
1205int freerdp_set_param_uint64(rdpSettings* settings,
int id, UINT64 param)
1210char* freerdp_get_param_string(
const rdpSettings* settings,
int id)
1213 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
1216int freerdp_set_param_string(rdpSettings* settings,
int id,
const char* param)
1222static BOOL value_to_uint(
const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max)
1224 char* endptr =
nullptr;
1225 unsigned long long rc = 0;
1227 if (!value || !result)
1231 rc = _strtoui64(value, &endptr, 0);
1236 if (endptr == value)
1239 if ((rc < min) || (rc > max))
1246static BOOL value_to_int(
const char* value, LONGLONG* result, LONGLONG min, LONGLONG max)
1248 char* endptr =
nullptr;
1251 if (!value || !result)
1255 rc = _strtoi64(value, &endptr, 0);
1260 if (endptr == value)
1263 if ((rc < min) || (rc > max))
1270static BOOL parsing_fail(
const char* key,
const char* type,
const char* value)
1272 WLog_ERR(TAG,
"Failed to parse key [%s] of type [%s]: value [%s]", key, type, value);
1276BOOL freerdp_settings_set_value_for_name(rdpSettings* settings,
const char* name,
const char* value)
1282 if (!settings || !name)
1288 WLog_ERR(TAG,
"Invalid settings key [%s]", name);
1292 const SSIZE_T index = i;
1298 case RDP_SETTINGS_TYPE_BOOL:
1300 const BOOL val = (_strnicmp(value,
"TRUE", 5) == 0) || (_strnicmp(value,
"ON", 5) == 0);
1302 (_strnicmp(value,
"FALSE", 6) == 0) || (_strnicmp(value,
"OFF", 6) == 0);
1304 return parsing_fail(name,
"BOOL", value);
1309 case RDP_SETTINGS_TYPE_UINT16:
1310 if (!value_to_uint(value, &uval, 0, UINT16_MAX))
1311 return parsing_fail(name,
"UINT16", value);
1316 return parsing_fail(name,
"UINT16", value);
1319 case RDP_SETTINGS_TYPE_INT16:
1320 if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX))
1321 return parsing_fail(name,
"INT16", value);
1326 return parsing_fail(name,
"INT16", value);
1328 case RDP_SETTINGS_TYPE_UINT32:
1329 if (!value_to_uint(value, &uval, 0, UINT32_MAX))
1330 return parsing_fail(name,
"UINT32", value);
1335 return parsing_fail(name,
"UINT32", value);
1337 case RDP_SETTINGS_TYPE_INT32:
1338 if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX))
1339 return parsing_fail(name,
"INT32", value);
1344 return parsing_fail(name,
"INT32", value);
1346 case RDP_SETTINGS_TYPE_UINT64:
1347 if (!value_to_uint(value, &uval, 0, UINT64_MAX))
1348 return parsing_fail(name,
"UINT64", value);
1352 return parsing_fail(name,
"UINT64", value);
1354 case RDP_SETTINGS_TYPE_INT64:
1355 if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX))
1356 return parsing_fail(name,
"INT64", value);
1360 return parsing_fail(name,
"INT64", value);
1363 case RDP_SETTINGS_TYPE_STRING:
1367 case RDP_SETTINGS_TYPE_POINTER:
1368 return parsing_fail(name,
"POINTER", value);
1375BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1376 FreeRDP_Settings_Keys_UInt32 lenId,
const void* data,
1377 size_t len,
size_t size)
1380 void* copy =
nullptr;
1385 if (lenId != FreeRDP_UINT32_UNUSED)
1391 if (len > UINT32_MAX)
1395 copy = calloc(len, size);
1399 memcpy(copy, data, len * size);
1409 if (lenId == FreeRDP_UINT32_UNUSED)
1415 FreeRDP_Settings_Keys_Pointer
id)
1419 const rdpSettings* pc;
1427 const void* data,
size_t len)
1441 case FreeRDP_instance:
1442 if ((len != 0) && (len !=
sizeof(
void*)))
1444 WLog_ERR(TAG,
"FreeRDP_instance::len must be 0 or %" PRIuz,
sizeof(
void*));
1447 settings->instance = cnv.v;
1449 case FreeRDP_RdpServerCertificate:
1450 freerdp_certificate_free(settings->RdpServerCertificate);
1454 WLog_ERR(TAG,
"FreeRDP_RdpServerCertificate::len must be 0 or 1");
1457 settings->RdpServerCertificate = cnv.v;
1458 if (!settings->RdpServerCertificate && (len > 0))
1460 settings->RdpServerCertificate = freerdp_certificate_new();
1461 if (!settings->RdpServerCertificate)
1465 case FreeRDP_RdpServerRsaKey:
1466 freerdp_key_free(settings->RdpServerRsaKey);
1469 WLog_ERR(TAG,
"FreeRDP_RdpServerRsaKey::len must be 0 or 1");
1472 settings->RdpServerRsaKey = (rdpPrivateKey*)cnv.v;
1473 if (!settings->RdpServerRsaKey && (len > 0))
1475 settings->RdpServerRsaKey = freerdp_key_new();
1476 if (!settings->RdpServerRsaKey)
1480 case FreeRDP_RedirectionPassword:
1481 return freerdp_settings_set_pointer_len_(
1482 settings,
id, FreeRDP_RedirectionPasswordLength, data, len,
sizeof(
char));
1483 case FreeRDP_RedirectionTsvUrl:
1484 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionTsvUrlLength,
1485 data, len,
sizeof(
char));
1486 case FreeRDP_RedirectionTargetCertificate:
1487 freerdp_certificate_free(settings->RedirectionTargetCertificate);
1491 WLog_ERR(TAG,
"FreeRDP_RedirectionTargetCertificate::len must be 0 or 1");
1494 settings->RedirectionTargetCertificate = cnv.v;
1495 if (!settings->RedirectionTargetCertificate && (len > 0))
1497 settings->RedirectionTargetCertificate = freerdp_certificate_new();
1498 if (!settings->RedirectionTargetCertificate)
1502 case FreeRDP_RedirectionGuid:
1503 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionGuidLength,
1504 data, len,
sizeof(BYTE));
1505 case FreeRDP_LoadBalanceInfo:
1506 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_LoadBalanceInfoLength,
1507 data, len,
sizeof(
char));
1508 case FreeRDP_ServerRandom:
1509 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerRandomLength, data,
1511 case FreeRDP_ClientRandom:
1512 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ClientRandomLength, data,
1514 case FreeRDP_ServerCertificate:
1515 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerCertificateLength,
1516 data, len,
sizeof(
char));
1517 case FreeRDP_TargetNetAddresses:
1518 if (!freerdp_target_net_addresses_resize(settings, len))
1520 if (data ==
nullptr)
1521 target_net_addresses_free(settings, 0);
1523 case FreeRDP_ServerLicenseProductIssuers:
1524 if (data ==
nullptr)
1525 freerdp_server_license_issuers_free(settings);
1526 return freerdp_settings_set_pointer_len_(
1527 settings,
id, FreeRDP_ServerLicenseProductIssuersCount, data, len,
sizeof(
char*));
1528 case FreeRDP_TargetNetPorts:
1529 if (!freerdp_target_net_addresses_resize(settings, len))
1531 if (data ==
nullptr)
1533 for (
size_t x = 0; x < len; x++)
1534 settings->TargetNetPorts[x] = 0;
1537 case FreeRDP_DeviceArray:
1538 if (data ==
nullptr)
1539 freerdp_device_collection_free(settings);
1540 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DeviceArraySize, data,
1542 case FreeRDP_ChannelDefArray:
1543 if ((len > 0) && (len < CHANNEL_MAX_COUNT))
1545 "FreeRDP_ChannelDefArray::len expected to be >= %d, but have %" PRIuz,
1546 CHANNEL_MAX_COUNT, len);
1547 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ChannelDefArray,
1548 FreeRDP_ChannelDefArraySize, data, len,
1550 case FreeRDP_MonitorDefArray:
1551 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_MonitorDefArraySize,
1553 case FreeRDP_ClientAutoReconnectCookie:
1554 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1556 case FreeRDP_ServerAutoReconnectCookie:
1557 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1559 case FreeRDP_ClientTimeZone:
1562 WLog_ERR(TAG,
"FreeRDP_ClientTimeZone::len must be 0 or 1");
1565 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1567 case FreeRDP_BitmapCacheV2CellInfo:
1568 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_BitmapCacheV2NumCells,
1570 case FreeRDP_GlyphCache:
1571 if ((len != 0) && (len != 10))
1573 WLog_ERR(TAG,
"FreeRDP_GlyphCache::len must be 0 or 10");
1576 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1578 case FreeRDP_FragCache:
1581 WLog_ERR(TAG,
"FreeRDP_FragCache::len must be 0 or 1");
1584 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1586 case FreeRDP_StaticChannelArray:
1587 if (data ==
nullptr)
1588 freerdp_static_channel_collection_free(settings);
1589 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_StaticChannelArraySize,
1591 case FreeRDP_DynamicChannelArray:
1592 if (data ==
nullptr)
1593 freerdp_dynamic_channel_collection_free(settings);
1594 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DynamicChannelArraySize,
1596 case FreeRDP_ReceivedCapabilityData:
1597 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1599 if (data ==
nullptr)
1601 freerdp_capability_data_free(settings, 0, FALSE);
1604 case FreeRDP_ReceivedCapabilities:
1605 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1607 if (data ==
nullptr)
1609 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1611 settings->ReceivedCapabilities[x] = 0;
1615 case FreeRDP_OrderSupport:
1616 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1619 case FreeRDP_MonitorIds:
1620 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_NumMonitorIds, data, len,
1623 case FreeRDP_ReceivedCapabilityDataSizes:
1624 if (!freerdp_capability_buffer_resize(settings, len, FALSE))
1626 if (data ==
nullptr)
1628 for (
size_t x = 0; x < settings->ReceivedCapabilitiesSize; x++)
1629 settings->ReceivedCapabilityDataSizes[x] = 0;
1633 case FreeRDP_Password51:
1634 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_Password51Length, data,
1637 if ((data ==
nullptr) && (len == 0))
1643 WLog_WARN(TAG,
"Invalid id %d",
id);
1648void* freerdp_settings_get_pointer_array_writable(
const rdpSettings* settings,
1649 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1656 case FreeRDP_ClientAutoReconnectCookie:
1658 if ((offset >= max) || !settings->ClientAutoReconnectCookie)
1660 return &settings->ClientAutoReconnectCookie[offset];
1661 case FreeRDP_ServerAutoReconnectCookie:
1663 if ((offset >= max) || !settings->ServerAutoReconnectCookie)
1665 return &settings->ServerAutoReconnectCookie[offset];
1666 case FreeRDP_ServerCertificate:
1670 return &settings->ServerCertificate[offset];
1671 case FreeRDP_ServerRandom:
1675 return &settings->ServerRandom[offset];
1676 case FreeRDP_ClientRandom:
1680 return &settings->ClientRandom[offset];
1681 case FreeRDP_LoadBalanceInfo:
1685 return &settings->LoadBalanceInfo[offset];
1687 case FreeRDP_RedirectionTsvUrl:
1691 return &settings->RedirectionTsvUrl[offset];
1693 case FreeRDP_RedirectionPassword:
1697 return &settings->RedirectionPassword[offset];
1699 case FreeRDP_OrderSupport:
1703 return &settings->OrderSupport[offset];
1704 case FreeRDP_MonitorIds:
1708 return &settings->MonitorIds[offset];
1709 case FreeRDP_MonitorDefArray:
1713 return &settings->MonitorDefArray[offset];
1714 case FreeRDP_ChannelDefArray:
1718 return &settings->ChannelDefArray[offset];
1719 case FreeRDP_DeviceArray:
1723 return settings->DeviceArray[offset];
1724 case FreeRDP_StaticChannelArray:
1728 return settings->StaticChannelArray[offset];
1729 case FreeRDP_DynamicChannelArray:
1733 return settings->DynamicChannelArray[offset];
1734 case FreeRDP_FragCache:
1738 return &settings->FragCache[offset];
1739 case FreeRDP_GlyphCache:
1743 return &settings->GlyphCache[offset];
1744 case FreeRDP_BitmapCacheV2CellInfo:
1748 return &settings->BitmapCacheV2CellInfo[offset];
1749 case FreeRDP_ReceivedCapabilities:
1753 return &settings->ReceivedCapabilities[offset];
1754 case FreeRDP_TargetNetAddresses:
1758 WINPR_ASSERT(settings->TargetNetAddresses);
1759 return settings->TargetNetAddresses[offset];
1760 case FreeRDP_TargetNetPorts:
1764 WINPR_ASSERT(settings->TargetNetPorts);
1765 return &settings->TargetNetPorts[offset];
1766 case FreeRDP_ClientTimeZone:
1770 return settings->ClientTimeZone;
1771 case FreeRDP_RdpServerCertificate:
1775 return settings->RdpServerCertificate;
1776 case FreeRDP_RdpServerRsaKey:
1780 return settings->RdpServerRsaKey;
1781 case FreeRDP_ServerLicenseProductIssuers:
1785 return settings->ServerLicenseProductIssuers[offset];
1786 case FreeRDP_ReceivedCapabilityData:
1790 WINPR_ASSERT(settings->ReceivedCapabilityData);
1791 return settings->ReceivedCapabilityData[offset];
1793 case FreeRDP_ReceivedCapabilityDataSizes:
1797 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1798 return &settings->ReceivedCapabilityDataSizes[offset];
1805 WLog_WARN(TAG,
"Invalid offset for %s [%d]: size=%" PRIuz
", offset=%" PRIuz,
1810BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1811 size_t offset,
const void* data)
1813 size_t maxOffset = 0;
1818 case FreeRDP_ClientAutoReconnectCookie:
1820 if ((offset >= maxOffset) || !data || !settings->ClientAutoReconnectCookie)
1824 case FreeRDP_ServerAutoReconnectCookie:
1826 if ((offset >= maxOffset) || !data || !settings->ServerAutoReconnectCookie)
1830 case FreeRDP_ServerCertificate:
1832 if ((offset >= maxOffset) || !data)
1834 settings->ServerCertificate[offset] = *(
const BYTE*)data;
1836 case FreeRDP_DeviceArray:
1838 if (offset >= maxOffset)
1840 freerdp_device_free(settings->DeviceArray[offset]);
1841 settings->DeviceArray[offset] = freerdp_device_clone(data);
1843 case FreeRDP_TargetNetAddresses:
1845 if ((offset >= maxOffset) || !data)
1847 WINPR_ASSERT(settings->TargetNetAddresses);
1848 free(settings->TargetNetAddresses[offset]);
1849 settings->TargetNetAddresses[offset] = _strdup((
const char*)data);
1850 return settings->TargetNetAddresses[offset] !=
nullptr;
1851 case FreeRDP_TargetNetPorts:
1853 if ((offset >= maxOffset) || !data)
1855 WINPR_ASSERT(settings->TargetNetPorts);
1856 settings->TargetNetPorts[offset] = *((
const UINT32*)data);
1858 case FreeRDP_StaticChannelArray:
1860 if ((offset >= maxOffset) || !data)
1862 freerdp_addin_argv_free(settings->StaticChannelArray[offset]);
1863 settings->StaticChannelArray[offset] = freerdp_addin_argv_clone(data);
1865 case FreeRDP_DynamicChannelArray:
1867 if ((offset >= maxOffset) || !data)
1869 freerdp_addin_argv_free(settings->DynamicChannelArray[offset]);
1870 settings->DynamicChannelArray[offset] = freerdp_addin_argv_clone(data);
1872 case FreeRDP_BitmapCacheV2CellInfo:
1874 if ((offset >= maxOffset) || !data)
1878 settings->BitmapCacheV2CellInfo[offset] = *cdata;
1881 case FreeRDP_ServerRandom:
1883 if ((offset >= maxOffset) || !data)
1885 settings->ServerRandom[offset] = *(
const BYTE*)data;
1887 case FreeRDP_ClientRandom:
1889 if ((offset >= maxOffset) || !data)
1891 settings->ClientRandom[offset] = *(
const BYTE*)data;
1893 case FreeRDP_LoadBalanceInfo:
1895 if ((offset >= maxOffset) || !data)
1897 settings->LoadBalanceInfo[offset] = *(
const BYTE*)data;
1899 case FreeRDP_RedirectionTsvUrl:
1901 if ((offset >= maxOffset) || !data)
1903 settings->RedirectionTsvUrl[offset] = *(
const BYTE*)data;
1905 case FreeRDP_RedirectionPassword:
1907 if ((offset >= maxOffset) || !data)
1909 settings->RedirectionPassword[offset] = *(
const BYTE*)data;
1911 case FreeRDP_OrderSupport:
1913 if (!settings->OrderSupport)
1915 if ((offset >= maxOffset) || !data)
1917 settings->OrderSupport[offset] = *(
const BOOL*)data ? 1 : 0;
1919 case FreeRDP_GlyphCache:
1921 if (!settings->GlyphCache)
1923 if ((offset >= maxOffset) || !data)
1927 case FreeRDP_FragCache:
1929 if (!settings->FragCache)
1931 if ((offset >= maxOffset) || !data)
1935 case FreeRDP_MonitorIds:
1937 if ((offset >= maxOffset) || !data)
1939 settings->MonitorIds[offset] = *(
const UINT32*)data;
1941 case FreeRDP_ChannelDefArray:
1943 if ((offset >= maxOffset) || !data)
1945 settings->ChannelDefArray[offset] = *(
const CHANNEL_DEF*)data;
1947 case FreeRDP_MonitorDefArray:
1949 if ((offset >= maxOffset) || !data)
1951 settings->MonitorDefArray[offset] = *(
const rdpMonitor*)data;
1954 case FreeRDP_ClientTimeZone:
1956 if ((offset >= maxOffset) || !data || !settings->ClientTimeZone)
1961 case FreeRDP_ServerLicenseProductIssuers:
1964 if ((offset >= maxOffset) || !settings->ServerLicenseProductIssuers)
1966 free(settings->ServerLicenseProductIssuers[offset]);
1967 settings->ServerLicenseProductIssuers[offset] =
nullptr;
1969 settings->ServerLicenseProductIssuers[offset] = _strdup((
const char*)data);
1972 case FreeRDP_ReceivedCapabilityData:
1974 if (offset >= maxOffset)
1976 WINPR_ASSERT(settings->ReceivedCapabilityData);
1977 settings->ReceivedCapabilityData[offset] = WINPR_CAST_CONST_PTR_AWAY(data, BYTE*);
1979 case FreeRDP_ReceivedCapabilityDataSizes:
1981 if (offset >= maxOffset)
1983 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
1984 settings->ReceivedCapabilityDataSizes[offset] = *(
const uint32_t*)data;
1992 WLog_WARN(TAG,
"[%s] Invalid offset=%" PRIuz
" [%" PRIuz
"] or nullptr data=%p",
1997const void* freerdp_settings_get_pointer_array(
const rdpSettings* settings,
1998 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
2000 return freerdp_settings_get_pointer_array_writable(settings,
id, offset);
2005 UINT32 flags = FREERDP_CODEC_ALL;
2006 if (settings->RemoteFxCodec == FALSE)
2008 flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
2010 if (settings->NSCodec == FALSE)
2012 flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
2020 WINPR_ASSERT(settings);
2021 const char* hostname = settings->ServerHostname;
2023 if (settings->UserSpecifiedServerName)
2024 hostname = settings->UserSpecifiedServerName;
2029#if defined(WITH_FREERDP_DEPRECATED)
2032 return freerdp_addin_argv_clone(channel);
2037 return freerdp_addin_argv_clone(channel);
2041BOOL freerdp_target_net_addresses_copy(rdpSettings* settings,
char** addresses, UINT32 count)
2043 WINPR_ASSERT(settings);
2044 WINPR_ASSERT(addresses);
2046 if (!freerdp_target_net_adresses_reset(settings, count))
2049 for (UINT32 i = 0; i < settings->TargetNetAddressCount; i++)
2051 const char* address = addresses[i];
2052 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_TargetNetAddresses, i, address))
2054 freerdp_target_net_addresses_free(settings);
2064 if (!what && !other)
2066 if (!what || !other)
2069 if (what->Id != other->Id)
2071 if (what->Type != other->Type)
2073 if (what->Name && other->Name)
2075 if (strcmp(what->Name, other->Name) != 0)
2080 if (what->Name != other->Name)
2086 case RDPDR_DTYP_PRINT:
2090 if (a->DriverName && b->DriverName)
2091 return strcmp(a->DriverName, b->DriverName) == 0;
2092 return a->DriverName == b->DriverName;
2095 case RDPDR_DTYP_SERIAL:
2100 if (a->Path && b->Path)
2102 if (strcmp(a->Path, b->Path) != 0)
2105 else if (a->Path != b->Path)
2108 if (a->Driver && b->Driver)
2110 if (strcmp(a->Driver, b->Driver) != 0)
2113 else if (a->Driver != b->Driver)
2115 if (a->Permissive && b->Permissive)
2116 return strcmp(a->Permissive, b->Permissive) == 0;
2117 return a->Permissive == b->Permissive;
2120 case RDPDR_DTYP_PARALLEL:
2124 if (a->Path && b->Path)
2125 return strcmp(a->Path, b->Path) == 0;
2126 return a->Path == b->Path;
2129 case RDPDR_DTYP_SMARTCARD:
2131 case RDPDR_DTYP_FILESYSTEM:
2135 if (a->automount != b->automount)
2137 if (a->Path && b->Path)
2138 return strcmp(a->Path, b->Path) == 0;
2139 return a->Path == b->Path;
2152 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
2153 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
2154 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED |
2155 RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED;
2157 if (flags & RAIL_LEVEL_SUPPORTED)
2158 winpr_str_append(
"RAIL_LEVEL_SUPPORTED", buffer, length,
"|");
2159 if (flags & RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED)
2160 winpr_str_append(
"RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED", buffer, length,
"|");
2161 if (flags & RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED)
2162 winpr_str_append(
"RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED", buffer, length,
"|");
2163 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2164 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2165 if (flags & RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED)
2166 winpr_str_append(
"RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED", buffer, length,
"|");
2167 if (flags & RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED)
2168 winpr_str_append(
"RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED", buffer, length,
"|");
2169 if (flags & RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED)
2170 winpr_str_append(
"RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED", buffer, length,
"|");
2171 if (flags & RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED)
2172 winpr_str_append(
"RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED", buffer, length,
"|");
2174 if ((flags & ~mask) != 0)
2176 char tbuffer[64] = WINPR_C_ARRAY_INIT;
2177 (void)_snprintf(tbuffer,
sizeof(tbuffer),
"RAIL_FLAG_UNKNOWN 0x%08" PRIx32, flags & mask);
2178 winpr_str_append(tbuffer, buffer, length,
"|");
2184 const BYTE** capsData,
const UINT32* capsSizes,
2185 UINT32 capsCount, BOOL serverReceivedCaps)
2187 WINPR_ASSERT(settings);
2188 WINPR_ASSERT(capsFlags || (capsCount == 0));
2189 WINPR_ASSERT(capsData || (capsCount == 0));
2190 WINPR_ASSERT(capsSizes || (capsCount == 0));
2191 WINPR_ASSERT(capsCount <= UINT16_MAX);
2193 wLog* log = WLog_Get(TAG);
2195 for (UINT32 x = 0; x < capsCount; x++)
2199 wStream buffer = WINPR_C_ARRAY_INIT;
2200 wStream* sub = Stream_StaticConstInit(&buffer, capsData[x], capsSizes[x]);
2202 if (!rdp_read_capability_set(log, sub, (UINT16)x, settings, serverReceivedCaps))
2215 return "RDP_VERSION_4";
2216 case RDP_VERSION_5_PLUS:
2217 return "RDP_VERSION_5_PLUS";
2218 case RDP_VERSION_10_0:
2219 return "RDP_VERSION_10_0";
2220 case RDP_VERSION_10_1:
2221 return "RDP_VERSION_10_1";
2222 case RDP_VERSION_10_2:
2223 return "RDP_VERSION_10_2";
2224 case RDP_VERSION_10_3:
2225 return "RDP_VERSION_10_3";
2226 case RDP_VERSION_10_4:
2227 return "RDP_VERSION_10_4";
2228 case RDP_VERSION_10_5:
2229 return "RDP_VERSION_10_5";
2230 case RDP_VERSION_10_6:
2231 return "RDP_VERSION_10_6";
2232 case RDP_VERSION_10_7:
2233 return "RDP_VERSION_10_7";
2234 case RDP_VERSION_10_8:
2235 return "RDP_VERSION_10_8";
2236 case RDP_VERSION_10_9:
2237 return "RDP_VERSION_10_9";
2238 case RDP_VERSION_10_10:
2239 return "RDP_VERSION_10_10";
2240 case RDP_VERSION_10_11:
2241 return "RDP_VERSION_10_11";
2242 case RDP_VERSION_10_12:
2243 return "RDP_VERSION_10_12";
2245 return "RDP_VERSION_UNKNOWN";
2252 WINPR_ASSERT(settings);
2255 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, 0, TRUE);
2259 char* str = ConvertWCharToUtf8Alloc(param, &len);
2260 if (!str && (len != 0))
2263 return freerdp_settings_set_string_(settings,
id, str, len);
2267 const WCHAR* param,
size_t length)
2271 WINPR_ASSERT(settings);
2274 return freerdp_settings_set_string_copy_(settings,
id,
nullptr, length, TRUE);
2276 char* str = ConvertWCharNToUtf8Alloc(param, length, &len);
2277 if (!str && (length != 0))
2281 const size_t wlen = _wcsnlen(param, length);
2286 return freerdp_settings_set_string_(settings,
id, str, len);
2290 FreeRDP_Settings_Keys_String
id,
size_t* pCharLen)
2297 return ConvertUtf8ToWCharAlloc(str, pCharLen);
2304 case RDPDR_DTYP_FILESYSTEM:
2305 return "RDPDR_DTYP_FILESYSTEM";
2306 case RDPDR_DTYP_PARALLEL:
2307 return "RDPDR_DTYP_PARALLEL";
2308 case RDPDR_DTYP_PRINT:
2309 return "RDPDR_DTYP_PRINT";
2310 case RDPDR_DTYP_SERIAL:
2311 return "RDPDR_DTYP_SERIAL";
2312 case RDPDR_DTYP_SMARTCARD:
2313 return "RDPDR_DTYP_SMARTCARD";
2315 return "RDPDR_DTYP_UNKNOWN";
2319const char* freerdp_encryption_level_string(UINT32 EncryptionLevel)
2321 switch (EncryptionLevel)
2323 case ENCRYPTION_LEVEL_NONE:
2324 return "ENCRYPTION_LEVEL_NONE";
2325 case ENCRYPTION_LEVEL_LOW:
2326 return "ENCRYPTION_LEVEL_LOW";
2327 case ENCRYPTION_LEVEL_CLIENT_COMPATIBLE:
2328 return "ENCRYPTION_LEVEL_CLIENT_COMPATIBLE";
2329 case ENCRYPTION_LEVEL_HIGH:
2330 return "ENCRYPTION_LEVEL_HIGH";
2331 case ENCRYPTION_LEVEL_FIPS:
2332 return "ENCRYPTION_LEVEL_FIPS";
2334 return "ENCRYPTION_LEVEL_UNKNOWN";
2338const char* freerdp_encryption_methods_string(UINT32 EncryptionMethods,
char* buffer,
size_t size)
2340 if (EncryptionMethods == ENCRYPTION_METHOD_NONE)
2342 winpr_str_append(
"ENCRYPTION_METHOD_NONE", buffer, size,
"|");
2346 if (EncryptionMethods & ENCRYPTION_METHOD_40BIT)
2348 winpr_str_append(
"ENCRYPTION_METHOD_40BIT", buffer, size,
"|");
2350 if (EncryptionMethods & ENCRYPTION_METHOD_128BIT)
2352 winpr_str_append(
"ENCRYPTION_METHOD_128BIT", buffer, size,
"|");
2354 if (EncryptionMethods & ENCRYPTION_METHOD_56BIT)
2356 winpr_str_append(
"ENCRYPTION_METHOD_56BIT", buffer, size,
"|");
2358 if (EncryptionMethods & ENCRYPTION_METHOD_FIPS)
2360 winpr_str_append(
"ENCRYPTION_METHOD_FIPS", buffer, size,
"|");
2368 const UINT32 invalid = mask & ~(RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
2369 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT);
2371 if (mask & RNS_UD_32BPP_SUPPORT)
2372 winpr_str_append(
"RNS_UD_32BPP_SUPPORT", buffer, size,
"|");
2373 if (mask & RNS_UD_24BPP_SUPPORT)
2374 winpr_str_append(
"RNS_UD_24BPP_SUPPORT", buffer, size,
"|");
2375 if (mask & RNS_UD_16BPP_SUPPORT)
2376 winpr_str_append(
"RNS_UD_16BPP_SUPPORT", buffer, size,
"|");
2377 if (mask & RNS_UD_15BPP_SUPPORT)
2378 winpr_str_append(
"RNS_UD_15BPP_SUPPORT", buffer, size,
"|");
2382 char str[32] = WINPR_C_ARRAY_INIT;
2383 (void)_snprintf(str,
sizeof(str),
"RNS_UD_INVALID[0x%04" PRIx32
"]", invalid);
2384 winpr_str_append(str, buffer, size,
"|");
2386 char hex[32] = WINPR_C_ARRAY_INIT;
2387 (void)_snprintf(hex,
sizeof(hex),
"[0x%04" PRIx16
"]", mask);
2392 const char* separator,
const char* param)
2397 char* str =
nullptr;
2400 winpr_asprintf(&str, &len,
"%s", param);
2401 else if (!separator)
2402 winpr_asprintf(&str, &len,
"%s%s", old, param);
2404 winpr_asprintf(&str, &len,
"%s%s%s", old, separator, param);
2413 return settings !=
nullptr;
2420static int sort_monitor_fn(
const void* pva,
const void* pvb)
2426 if (a->is_primary && b->is_primary)
2434 return (a->x < b->x) ? -1 : 1;
2436 return (a->y < b->y) ? -1 : 1;
2443 WINPR_ASSERT(monitors || (count == 0));
2457 for (
size_t x = 0; x < count; x++)
2460 if (cur->is_primary)
2468 for (
size_t x = 0; x < count; x++)
2471 if ((cur->x == 0) && (cur->y == 0))
2481 WLog_ERR(TAG,
"Could not find primary monitor, aborting");
2488 WINPR_ASSERT(sorted);
2493 sorted[sortpos] = *primary;
2494 sorted[sortpos].x = 0;
2495 sorted[sortpos].y = 0;
2496 sorted[sortpos].is_primary = TRUE;
2500 const INT32 offsetX = primary->x;
2501 const INT32 offsetY = primary->y;
2507 for (
size_t x = 0; x < count; x++)
2516 sorted[sortpos++] = m;
2520 qsort(sorted, count,
sizeof(
rdpMonitor), sort_monitor_fn);
2523 WINPR_ASSERTING_INT_CAST(uint32_t, count));
2526static BOOL fill_array(WINPR_JSON* array,
const void* data,
size_t length)
2528 const BYTE* pdata = data;
2529 for (
size_t x = 0; x < length; x++)
2531 BYTE val = pdata[x];
2538static BOOL fill_uint32_array(WINPR_JSON* array,
const uint32_t* data,
size_t length)
2540 for (
size_t x = 0; x < length; x++)
2542 uint32_t val = data[x];
2549static WINPR_JSON* json_from_addin_item(
const ADDIN_ARGV* val)
2563 for (
int x = 0; x < val->argc; x++)
2565 const char* str = val->argv[x];
2567 WINPR_JSON* item =
nullptr;
2588static BOOL json_from_addin_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2589 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2594 for (uint32_t x = 0; x < count; x++)
2596 const ADDIN_ARGV* cval = freerdp_settings_get_pointer_array(settings, key, x);
2603static BOOL add_string_or_null(WINPR_JSON* json,
const char* key,
const char* value)
2611static WINPR_JSON* json_from_device_item(
const RDPDR_DEVICE* val)
2636 if (!add_string_or_null(obj,
"Name", val->Name))
2640 case RDPDR_DTYP_SERIAL:
2641 if (!add_string_or_null(obj,
"Path", device.serial->Path))
2643 if (!add_string_or_null(obj,
"Driver", device.serial->Driver))
2645 if (!add_string_or_null(obj,
"Permissive", device.serial->Permissive))
2648 case RDPDR_DTYP_PARALLEL:
2649 if (!add_string_or_null(obj,
"Path", device.parallel->Path))
2652 case RDPDR_DTYP_PRINT:
2653 if (!add_string_or_null(obj,
"DriverName", device.printer->DriverName))
2658 case RDPDR_DTYP_FILESYSTEM:
2659 if (!add_string_or_null(obj,
"Path", device.drive->Path))
2664 case RDPDR_DTYP_SMARTCARD:
2676static BOOL json_from_device_item_array(WINPR_JSON* json,
const rdpSettings* settings,
2677 FreeRDP_Settings_Keys_Pointer key,
size_t count)
2682 for (uint32_t x = 0; x < count; x++)
2684 const RDPDR_DEVICE* cval = freerdp_settings_get_pointer_array(settings, key, x);
2691static BOOL string_array_to_json(WINPR_JSON* json,
const rdpSettings* settings, uint32_t argc,
2692 FreeRDP_Settings_Keys_Pointer key)
2694 for (uint32_t x = 0; x < argc; x++)
2696 const char* cval = freerdp_settings_get_pointer_array(settings, key, x);
2698 WINPR_JSON* item =
nullptr;
2709static BOOL wchar_to_json(WINPR_JSON* obj,
const char* key,
const WCHAR* wstr,
size_t len)
2714 const size_t slen = len * 6;
2715 char* str = calloc(1, slen);
2719 WINPR_JSON* jstr =
nullptr;
2720 SSIZE_T rc = ConvertWCharNToUtf8(wstr, len, str, slen);
2724 return jstr !=
nullptr;
2727static BOOL wchar_from_json(WCHAR* wstr,
size_t len,
const WINPR_JSON* obj,
const char* key)
2738 memset(wstr, 0,
sizeof(WCHAR) * len);
2742 SSIZE_T rc = ConvertUtf8ToWChar(str, wstr, len);
2746static int64_t int_from_json_item(
const WINPR_JSON* item, int64_t min, int64_t max)
2755 if (isinf(val) || isnan(val))
2761 const int64_t ival = (int64_t)val;
2762 if ((ival < min) || (ival > max))
2771static int64_t int_from_json(
const WINPR_JSON* obj,
const char* key, int64_t min, int64_t max)
2779 return int_from_json_item(item, min, max);
2782static uint64_t uint_from_json_item(
const WINPR_JSON* item, uint64_t max)
2791 if (isinf(val) || isnan(val) || (val < 0.0))
2797 const uint64_t uval = (uint64_t)val;
2806static uint64_t uint_from_json(
const WINPR_JSON* obj,
const char* key, uint64_t max)
2815 return uint_from_json_item(item, max);
2818static WINPR_JSON* systemtime_to_json(WINPR_JSON* parent,
const char* key,
const SYSTEMTIME* st)
2849static BOOL systemtime_from_json(
const WINPR_JSON* pobj,
const char* key,
SYSTEMTIME* st)
2861 st->wYear = (uint16_t)uint_from_json(obj,
"wYear", UINT16_MAX);
2862 st->wMonth = (uint16_t)uint_from_json(obj,
"wMonth", UINT16_MAX);
2863 st->wDayOfWeek = (uint16_t)uint_from_json(obj,
"wDayOfWeek", UINT16_MAX);
2864 st->wDay = (uint16_t)uint_from_json(obj,
"wDay", UINT16_MAX);
2865 st->wHour = (uint16_t)uint_from_json(obj,
"wHour", UINT16_MAX);
2866 st->wMinute = (uint16_t)uint_from_json(obj,
"wMinute", UINT16_MAX);
2867 st->wSecond = (uint16_t)uint_from_json(obj,
"wSecond", UINT16_MAX);
2868 st->wMilliseconds = (uint16_t)uint_from_json(obj,
"wMilliseconds", UINT16_MAX);
2880 tz->Bias = (int32_t)int_from_json(json,
"Bias", INT32_MIN, INT32_MAX);
2881 tz->StandardBias = (int32_t)int_from_json(json,
"StandardBias", INT32_MIN, INT32_MAX);
2882 tz->DaylightBias = (int32_t)int_from_json(json,
"DaylightBias", INT32_MIN, INT32_MAX);
2886 if (!systemtime_from_json(json,
"StandardDate", &tz->StandardDate))
2888 if (!systemtime_from_json(json,
"DaylightDate", &tz->DaylightDate))
2891 if (!wchar_from_json(tz->StandardName, ARRAYSIZE(tz->StandardName), json,
"StandardName"))
2893 if (!wchar_from_json(tz->DaylightName, ARRAYSIZE(tz->DaylightName), json,
"DaylightName"))
2899static BOOL ts_info_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2900 const WINPR_JSON* json)
2909 for (
size_t x = 0; x < count; x++)
2913 if (!ts_info_from_json(tz, obj))
2934 if (!wchar_to_json(obj,
"StandardName", tz.StandardName, ARRAYSIZE(tz.StandardName)))
2937 if (!systemtime_to_json(obj,
"StandardDate", &tz.StandardDate))
2943 if (!wchar_to_json(obj,
"DaylightName", tz.DaylightName, ARRAYSIZE(tz.DaylightName)))
2946 if (!systemtime_to_json(obj,
"DaylightDate", &tz.DaylightDate))
2979 for (
size_t x = 0; x < count; x++)
2981 if (!glyph_cache_def_to_json(json, &def[x]))
2996 def->cacheEntries = (uint16_t)uint_from_json(json,
"cacheEntries", UINT16_MAX);
2997 def->cacheMaximumCellSize = (uint16_t)uint_from_json(json,
"cacheMaximumCellSize", UINT16_MAX);
3001static BOOL glyph_cache_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3002 const WINPR_JSON* json)
3011 for (
size_t x = 0; x < count; x++)
3014 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3016 if (!glyph_cache_def_from_json(cache, obj))
3030 info->numEntries = (uint32_t)uint_from_json(json,
"numEntries", UINT32_MAX);
3042static BOOL bitmap_cache_v2_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3043 const WINPR_JSON* json)
3052 for (
size_t x = 0; x < count; x++)
3055 freerdp_settings_get_pointer_array_writable(settings,
id, x);
3057 if (!bitmap_cache_v2_from_json(cache, obj))
3065 WINPR_ASSERT(cookie);
3072 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3073 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3074 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3083 if (len != ARRAYSIZE(cookie->securityVerifier))
3087 for (
size_t x = 0; x < len; x++)
3090 const uint64_t val = uint_from_json_item(citem, UINT8_MAX);
3091 cookie->securityVerifier[x] = (uint8_t)val;
3096static BOOL client_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3097 const WINPR_JSON* json)
3106 for (
size_t x = 0; x < count; x++)
3110 if (!client_cookie_from_json(cache, obj))
3118 WINPR_ASSERT(cookie);
3124 cookie->cbLen = (uint32_t)uint_from_json(json,
"cbLen", UINT32_MAX);
3125 cookie->version = (uint32_t)uint_from_json(json,
"version", UINT32_MAX);
3126 cookie->logonId = (uint32_t)uint_from_json(json,
"logonId", UINT32_MAX);
3135 if (len != ARRAYSIZE(cookie->arcRandomBits))
3139 for (
size_t x = 0; x < len; x++)
3142 cookie->arcRandomBits[x] = (uint8_t)uint_from_json_item(citem, UINT8_MAX);
3147static BOOL server_cookie_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3148 const WINPR_JSON* json)
3157 for (
size_t x = 0; x < count; x++)
3161 if (!server_cookie_from_json(cache, obj))
3167static BOOL channel_def_from_json(
CHANNEL_DEF* cookie,
const WINPR_JSON* json)
3169 WINPR_ASSERT(cookie);
3176 cookie->options = (uint32_t)uint_from_json(json,
"options", UINT32_MAX);
3186 memset(cookie->name, 0,
sizeof(cookie->name));
3189 strncpy(cookie->name, str, strnlen(str, ARRAYSIZE(cookie->name)));
3194static BOOL channel_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3195 const WINPR_JSON* json)
3204 for (
size_t x = 0; x < count; x++)
3206 CHANNEL_DEF* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3208 if (!channel_def_from_json(cache, obj))
3214static BOOL monitor_attributes_from_json(
MONITOR_ATTRIBUTES* attributes,
const WINPR_JSON* json)
3216 WINPR_ASSERT(attributes);
3225 attributes->physicalWidth = (uint32_t)uint_from_json(obj,
"physicalWidth", UINT32_MAX);
3226 attributes->physicalHeight = (uint32_t)uint_from_json(obj,
"physicalHeight", UINT32_MAX);
3227 attributes->orientation = (uint32_t)uint_from_json(obj,
"orientation", UINT32_MAX);
3228 attributes->desktopScaleFactor =
3229 (uint32_t)uint_from_json(obj,
"desktopScaleFactor", UINT32_MAX);
3230 attributes->deviceScaleFactor = (uint32_t)uint_from_json(obj,
"deviceScaleFactor", UINT32_MAX);
3234static BOOL monitor_def_from_json(
rdpMonitor* monitor,
const WINPR_JSON* json)
3236 WINPR_ASSERT(monitor);
3242 monitor->x = (int32_t)int_from_json(json,
"x", INT32_MIN, INT32_MAX);
3243 monitor->y = (int32_t)int_from_json(json,
"y", INT32_MIN, INT32_MAX);
3244 monitor->width = (int32_t)int_from_json(json,
"width", 0, INT32_MAX);
3245 monitor->height = (int32_t)int_from_json(json,
"height", 0, INT32_MAX);
3246 monitor->orig_screen = (uint32_t)uint_from_json(json,
"orig_screen", UINT32_MAX);
3257 return monitor_attributes_from_json(&monitor->attributes, json);
3260static BOOL monitor_def_array_from_json(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
3261 const WINPR_JSON* json)
3270 for (
size_t x = 0; x < count; x++)
3272 rdpMonitor* cache = freerdp_settings_get_pointer_array_writable(settings,
id, x);
3274 if (!monitor_def_from_json(cache, obj))
3298 for (
size_t x = 0; x < ARRAYSIZE(cs->securityVerifier); x++)
3312 for (
size_t x = 0; x < count; x++)
3314 if (!client_cookie_to_json(json, &cs[x]))
3338 for (
size_t x = 0; x < ARRAYSIZE(cs->arcRandomBits); x++)
3352 for (
size_t x = 0; x < count; x++)
3354 if (!server_cookie_to_json(json, &cs[x]))
3378 for (
size_t x = 0; x < count; x++)
3380 if (!bitmap_cache_v2_to_json(json, &info[x]))
3386static BOOL monitor_attributes_to_json(WINPR_JSON* pobj,
const MONITOR_ATTRIBUTES* attributes)
3388 WINPR_ASSERT(attributes);
3405static BOOL monitor_def_to_json(WINPR_JSON* json,
const rdpMonitor* monitor)
3407 WINPR_ASSERT(monitor);
3426 return monitor_attributes_to_json(obj, &monitor->attributes);
3429static BOOL monitor_def_array_to_json(WINPR_JSON* json,
const rdpMonitor* monitors,
size_t count)
3431 for (
size_t x = 0; x < count; x++)
3433 if (!monitor_def_to_json(json, &monitors[x]))
3439static BOOL channel_def_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channel)
3441 WINPR_ASSERT(channel);
3455static BOOL channel_def_array_to_json(WINPR_JSON* json,
const CHANNEL_DEF* channels,
size_t count)
3457 for (
size_t x = 0; x < count; x++)
3459 if (!channel_def_to_json(json, &channels[x]))
3465static BOOL serialize_pointer(
const rdpSettings* settings, WINPR_JSON* json,
3466 FreeRDP_Settings_Keys_Pointer
id)
3482 case FreeRDP_instance:
3491 return fill_array(jval, &ptr.u,
sizeof(ptr.u));
3493 case FreeRDP_ServerRandom:
3496 return fill_array(jval, val, len);
3498 case FreeRDP_ServerCertificate:
3500 const uint32_t len =
3502 return fill_array(jval, val, len);
3504 case FreeRDP_ClientRandom:
3507 return fill_array(jval, val, len);
3509 case FreeRDP_ServerLicenseProductIssuers:
3511 const uint32_t len =
3513 return string_array_to_json(jval, settings, len, FreeRDP_ServerLicenseProductIssuers);
3515 case FreeRDP_RedirectionPassword:
3517 const uint32_t len =
3519 return fill_array(jval, val, len);
3521 case FreeRDP_RedirectionGuid:
3523 const uint32_t len =
3525 return fill_array(jval, val, len);
3527 case FreeRDP_LoadBalanceInfo:
3529 const uint32_t len =
3531 return fill_array(jval, val, len);
3533 case FreeRDP_ClientTimeZone:
3535 return tz_info_to_json(jval, val);
3537 case FreeRDP_RedirectionTsvUrl:
3539 const uint32_t len =
3541 return fill_array(jval, val, len);
3543 case FreeRDP_GlyphCache:
3545 return glyph_cache_def_array_to_json(jval, val, val ? 10 : 0);
3547 case FreeRDP_FragCache:
3549 return glyph_cache_def_array_to_json(jval, val, val ? 1 : 0);
3551 case FreeRDP_BitmapCacheV2CellInfo:
3553 const uint32_t len =
3555 return bitmap_cache_v2_array_to_json(jval, val, len);
3557 case FreeRDP_OrderSupport:
3559 const uint32_t len = 32;
3560 return fill_array(jval, val, len);
3562 case FreeRDP_ClientAutoReconnectCookie:
3564 return client_cookie_array_to_json(jval, val, 1);
3566 case FreeRDP_ServerAutoReconnectCookie:
3568 return server_cookie_array_to_json(jval, val, 1);
3570 case FreeRDP_Password51:
3573 return fill_array(jval, val, len);
3575 case FreeRDP_ReceivedCapabilities:
3577 const uint32_t len =
3579 return fill_array(jval, val, len);
3581 case FreeRDP_MonitorIds:
3584 return fill_uint32_array(jval, val, len);
3586 case FreeRDP_TargetNetPorts:
3588 const uint32_t len =
3590 return fill_uint32_array(jval, val, len);
3592 case FreeRDP_MonitorDefArray:
3595 return monitor_def_array_to_json(jval, val, len);
3597 case FreeRDP_ChannelDefArray:
3600 return channel_def_array_to_json(jval, val, len);
3602 case FreeRDP_ReceivedCapabilityDataSizes:
3604 const uint32_t len =
3606 return fill_uint32_array(jval, val, len);
3608 case FreeRDP_ReceivedCapabilityData:
3610 const uint32_t len =
3612 const UINT32* pclen =
3617 for (uint32_t x = 0; x < len; x++)
3619 const char* cval = freerdp_settings_get_pointer_array(settings,
id, x);
3626 if (!fill_array(item, cval, pclen[x]))
3631 case FreeRDP_TargetNetAddresses:
3633 const uint32_t len =
3635 return string_array_to_json(jval, settings, len,
id);
3637 case FreeRDP_RedirectionTargetCertificate:
3638 case FreeRDP_RdpServerCertificate:
3640 WINPR_JSON* item =
nullptr;
3642 char* pem = freerdp_certificate_get_pem(val, &len);
3655 case FreeRDP_RdpServerRsaKey:
3657 WINPR_JSON* item =
nullptr;
3659 char* pem = freerdp_key_get_pem(val, &len,
nullptr);
3668 case FreeRDP_DeviceArray:
3671 return json_from_device_item_array(jval, settings,
id, len);
3673 case FreeRDP_StaticChannelArray:
3675 const uint32_t len =
3677 return json_from_addin_item_array(jval, settings,
id, len);
3679 case FreeRDP_DynamicChannelArray:
3681 const uint32_t len =
3683 return json_from_addin_item_array(jval, settings,
id, len);
3685 case FreeRDP_POINTER_UNUSED:
3693 char* str =
nullptr;
3723 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
3727 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
3733 FreeRDP_Settings_Keys_Bool b;
3734 FreeRDP_Settings_Keys_Int16 i16;
3735 FreeRDP_Settings_Keys_UInt16 u16;
3736 FreeRDP_Settings_Keys_Int32 i32;
3737 FreeRDP_Settings_Keys_UInt32 u32;
3738 FreeRDP_Settings_Keys_Int64 i64;
3739 FreeRDP_Settings_Keys_UInt64 u64;
3740 FreeRDP_Settings_Keys_String str;
3741 FreeRDP_Settings_Keys_Pointer ptr;
3749 case RDP_SETTINGS_TYPE_BOOL:
3756 case RDP_SETTINGS_TYPE_UINT16:
3763 case RDP_SETTINGS_TYPE_INT16:
3770 case RDP_SETTINGS_TYPE_UINT32:
3777 case RDP_SETTINGS_TYPE_INT32:
3784 case RDP_SETTINGS_TYPE_UINT64:
3791 case RDP_SETTINGS_TYPE_INT64:
3798 case RDP_SETTINGS_TYPE_STRING:
3813 case RDP_SETTINGS_TYPE_POINTER:
3814 if (!serialize_pointer(settings, jpointer, iter.ptr))
3830 *plength = strlen(str);
3837static BOOL val_from_array(rdpSettings* settings,
const WINPR_JSON* json,
3838 FreeRDP_Settings_Keys_Pointer key,
size_t esize)
3849 size_t count = len / esize;
3850 if (count * esize != len)
3861 for (
size_t x = 0; x < len; x++)
3864 data[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3870static BOOL uintptr_from_array(rdpSettings* settings,
const WINPR_JSON* json)
3872 FreeRDP_Settings_Keys_Pointer key = FreeRDP_instance;
3877 if (len >
sizeof(
void*))
3886 uint8_t u[
sizeof(
void*)];
3890 for (
size_t x = 0; x < len; x++)
3893 ptr.u[x] = (uint8_t)uint_from_json_item(val, UINT8_MAX);
3900static BOOL val_from_uint32_array(rdpSettings* settings,
const WINPR_JSON* json,
3901 FreeRDP_Settings_Keys_Pointer key,
3902 FreeRDP_Settings_Keys_UInt32 keyId)
3917 for (
size_t x = 0; x < len; x++)
3919 UINT32* data = freerdp_settings_get_pointer_array_writable(settings, key, x);
3924 data[0] = (uint32_t)uint_from_json_item(val, UINT32_MAX);
3929static BOOL caps_data_entry_from_json(rdpSettings* settings,
size_t offset,
const WINPR_JSON* json)
3937 return freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset,
3941 uint8_t* data = calloc(size,
sizeof(uint8_t));
3945 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_ReceivedCapabilityData, offset, data))
3952 for (
size_t x = 0; x < size; x++)
3955 data[x] = (uint8_t)uint_from_json_item(item, UINT8_MAX);
3962static BOOL caps_data_array_from_json(rdpSettings* settings,
const WINPR_JSON* json)
3971 for (uint32_t x = 0; x < count; x++)
3974 if (!caps_data_entry_from_json(settings, x, array))
3980static BOOL str_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
3981 FreeRDP_Settings_Keys_Pointer key)
3992 for (
size_t x = 0; x < len; x++)
4001 if (!freerdp_settings_set_pointer_array(settings, key, x, val))
4007static BOOL addin_argv_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4008 FreeRDP_Settings_Keys_Pointer key)
4020 for (
size_t x = 0; x < len; x++)
4027 if (!jargc || !array)
4032 const int argc = (int)int_from_json_item(jargc, INT32_MIN, INT32_MAX);
4036 if (jlen != (
size_t)argc)
4041 const char** argv = (
const char**)calloc(jlen,
sizeof(
char*));
4044 for (
size_t y = 0; y < jlen; y++)
4055 ADDIN_ARGV* cval = freerdp_addin_argv_new(jlen, argv);
4059 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, x, cval);
4060 freerdp_addin_argv_free(cval);
4068static const char* get_string(
const WINPR_JSON* json,
const char* key)
4076static BOOL get_bool(
const WINPR_JSON* json,
const char* key)
4084static BOOL device_from_json_item(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
4085 size_t offset,
const WINPR_JSON* val)
4092 const uint64_t type = uint_from_json(val,
"Type", UINT32_MAX);
4093 if (type > UINT32_MAX)
4096 const char* name = get_string(val,
"Name");
4100 const char* args[6] = WINPR_C_ARRAY_INIT;
4102 args[count++] = name;
4105 case RDPDR_DTYP_SERIAL:
4106 args[count] = get_string(val,
"Path");
4110 args[count] = get_string(val,
"Driver");
4114 args[count] = get_string(val,
"Permissive");
4120 case RDPDR_DTYP_PARALLEL:
4121 args[count] = get_string(val,
"Path");
4125 case RDPDR_DTYP_PRINT:
4126 args[count] = get_string(val,
"DriverName");
4130 if (get_bool(val,
"IsDefault"))
4131 args[count++] =
"default";
4134 case RDPDR_DTYP_FILESYSTEM:
4135 args[count] = get_string(val,
"Path");
4139 if (get_bool(val,
"automount"))
4140 args[count++] =
"automount";
4143 case RDPDR_DTYP_SMARTCARD:
4148 RDPDR_DEVICE* device = freerdp_device_new(WINPR_ASSERTING_INT_CAST(UINT32, type), count, args);
4153 device->Id = (uint32_t)uint_from_json(val,
"Id", UINT32_MAX);
4156 freerdp_device_free(device);
4160 const BOOL rc = freerdp_settings_set_pointer_array(settings, key, offset, device);
4161 freerdp_device_free(device);
4165static BOOL device_array_from_json(rdpSettings* settings,
const WINPR_JSON* json,
4166 FreeRDP_Settings_Keys_Pointer key)
4178 for (
size_t x = 0; x < len; x++)
4181 if (!device_from_json_item(settings, key, x, val))
4187static const char* pem_from_json(
const WINPR_JSON* jval,
size_t* plen, BOOL* pvalid)
4191 WINPR_ASSERT(pvalid);
4217static BOOL deserialize_pointer(
const WINPR_JSON* json, rdpSettings* settings,
4218 FreeRDP_Settings_Keys_Pointer
id)
4233 case FreeRDP_instance:
4234 return uintptr_from_array(settings, jval);
4235 case FreeRDP_ServerRandom:
4236 case FreeRDP_ServerCertificate:
4237 case FreeRDP_ClientRandom:
4238 case FreeRDP_RedirectionPassword:
4239 case FreeRDP_RedirectionGuid:
4240 case FreeRDP_LoadBalanceInfo:
4241 case FreeRDP_RedirectionTsvUrl:
4242 case FreeRDP_OrderSupport:
4243 case FreeRDP_Password51:
4244 return val_from_array(settings, jval,
id, 1);
4245 case FreeRDP_ReceivedCapabilities:
4246 return val_from_array(settings, jval,
id, 1);
4247 case FreeRDP_ClientTimeZone:
4248 return ts_info_array_from_json(settings,
id, jval);
4249 case FreeRDP_GlyphCache:
4250 return glyph_cache_def_array_from_json(settings,
id, jval);
4251 case FreeRDP_FragCache:
4252 return glyph_cache_def_array_from_json(settings,
id, jval);
4253 case FreeRDP_BitmapCacheV2CellInfo:
4254 return bitmap_cache_v2_array_from_json(settings,
id, jval);
4255 case FreeRDP_ClientAutoReconnectCookie:
4256 return client_cookie_array_from_json(settings,
id, jval);
4257 case FreeRDP_ServerAutoReconnectCookie:
4258 return server_cookie_array_from_json(settings,
id, jval);
4259 case FreeRDP_MonitorDefArray:
4260 return monitor_def_array_from_json(settings,
id, jval);
4261 case FreeRDP_ChannelDefArray:
4262 return channel_def_array_from_json(settings,
id, jval);
4263 case FreeRDP_MonitorIds:
4264 return val_from_uint32_array(settings, jval,
id, FreeRDP_NumMonitorIds);
4265 case FreeRDP_TargetNetPorts:
4266 return val_from_uint32_array(settings, jval,
id, FreeRDP_TargetNetAddressCount);
4267 case FreeRDP_ServerLicenseProductIssuers:
4268 case FreeRDP_TargetNetAddresses:
4269 return str_array_from_json(settings, jval,
id);
4270 case FreeRDP_ReceivedCapabilityDataSizes:
4271 return val_from_uint32_array(settings, jval,
id, FreeRDP_ReceivedCapabilitiesSize);
4272 case FreeRDP_ReceivedCapabilityData:
4273 return caps_data_array_from_json(settings, jval);
4274 case FreeRDP_RedirectionTargetCertificate:
4275 case FreeRDP_RdpServerCertificate:
4279 const char* pem = pem_from_json(jval, &len, &valid);
4285 rdpCertificate* cert =
nullptr;
4289 if (strnlen(pem, 2) == 0)
4290 cert = freerdp_certificate_new();
4292 cert = freerdp_certificate_new_from_pem(pem);
4297 case FreeRDP_RdpServerRsaKey:
4301 const char* pem = pem_from_json(jval, &len, &valid);
4309 rdpPrivateKey* key = freerdp_key_new_from_pem_enc(pem,
nullptr);
4314 case FreeRDP_DeviceArray:
4315 return device_array_from_json(settings, jval,
id);
4316 case FreeRDP_StaticChannelArray:
4317 case FreeRDP_DynamicChannelArray:
4318 return addin_argv_from_json(settings, jval,
id);
4319 case FreeRDP_POINTER_UNUSED:
4353 if (!jbool || !juint16 || !jint16 || !juint32 || !jint32 || !juint64 || !jint64 || !jstring ||
4357 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4363 FreeRDP_Settings_Keys_Bool b;
4364 FreeRDP_Settings_Keys_Int16 i16;
4365 FreeRDP_Settings_Keys_UInt16 u16;
4366 FreeRDP_Settings_Keys_Int32 i32;
4367 FreeRDP_Settings_Keys_UInt32 u32;
4368 FreeRDP_Settings_Keys_Int64 i64;
4369 FreeRDP_Settings_Keys_UInt64 u64;
4370 FreeRDP_Settings_Keys_String str;
4371 FreeRDP_Settings_Keys_Pointer ptr;
4378 case RDP_SETTINGS_TYPE_POINTER:
4379 if (!deserialize_pointer(jpointer, settings, iter.ptr))
4387 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
4393 FreeRDP_Settings_Keys_Bool b;
4394 FreeRDP_Settings_Keys_Int16 i16;
4395 FreeRDP_Settings_Keys_UInt16 u16;
4396 FreeRDP_Settings_Keys_Int32 i32;
4397 FreeRDP_Settings_Keys_UInt32 u32;
4398 FreeRDP_Settings_Keys_Int64 i64;
4399 FreeRDP_Settings_Keys_UInt64 u64;
4400 FreeRDP_Settings_Keys_String str;
4401 FreeRDP_Settings_Keys_Pointer ptr;
4409 case RDP_SETTINGS_TYPE_BOOL:
4421 case RDP_SETTINGS_TYPE_UINT16:
4424 const uint16_t val = (uint16_t)uint_from_json_item(item, UINT16_MAX);
4431 case RDP_SETTINGS_TYPE_INT16:
4434 const int16_t val = (int16_t)int_from_json_item(item, INT16_MIN, INT16_MAX);
4441 case RDP_SETTINGS_TYPE_UINT32:
4444 const uint32_t val = (uint32_t)uint_from_json_item(item, UINT32_MAX);
4451 case RDP_SETTINGS_TYPE_INT32:
4453 const int64_t val = int_from_json(jint32, name, INT32_MIN, INT32_MAX);
4460 case RDP_SETTINGS_TYPE_UINT64:
4462 const uint64_t val = uint_from_json(juint64, name, UINT64_MAX);
4469 case RDP_SETTINGS_TYPE_INT64:
4472 const int64_t val = int_from_json_item(item, INT64_MIN, INT64_MAX);
4479 case RDP_SETTINGS_TYPE_STRING:
4481 const char* val =
nullptr;
4495 case RDP_SETTINGS_TYPE_POINTER:
4517 const struct RDPDR_DEVICE_EX* ex;
4521 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.