23#include <freerdp/config.h>
31#include <winpr/assert.h>
32#include <winpr/cast.h>
34#include "../core/settings.h"
35#include "../core/capabilities.h"
37#include <freerdp/crypto/certificate.h>
38#include <freerdp/settings.h>
39#include <freerdp/freerdp.h>
40#include <freerdp/log.h>
42#define TAG FREERDP_TAG("common")
44BOOL freerdp_addin_argv_add_argument_ex(
ADDIN_ARGV* args,
const char* argument,
size_t len)
47 char** new_argv = NULL;
49 if (!args || !argument)
53 len = strlen(argument);
55 new_argv = (
char**)realloc(
56 (
void*)args->argv,
sizeof(
char*) * (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc) + 1));
61 args->argv = new_argv;
63 str = calloc(len + 1,
sizeof(
char));
66 memcpy(str, argument, len);
67 args->argv[args->argc++] = str;
71BOOL freerdp_addin_argv_add_argument(
ADDIN_ARGV* args,
const char* argument)
73 return freerdp_addin_argv_add_argument_ex(args, argument, 0);
76BOOL freerdp_addin_argv_del_argument(
ADDIN_ARGV* args,
const char* argument)
78 if (!args || !argument)
80 for (
int x = 0; x < args->argc; x++)
82 char* arg = args->argv[x];
83 if (strcmp(argument, arg) == 0)
86 memmove_s((
void*)&args->argv[x],
87 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x)) *
sizeof(
char*),
88 (
void*)&args->argv[x + 1],
89 (WINPR_ASSERTING_INT_CAST(uint32_t, args->argc - x - 1)) *
sizeof(
char*));
90 args->argv[args->argc - 1] = NULL;
98int freerdp_addin_set_argument(
ADDIN_ARGV* args,
const char* argument)
100 if (!args || !argument)
103 for (
int i = 0; i < args->argc; i++)
105 if (strcmp(args->argv[i], argument) == 0)
111 if (!freerdp_addin_argv_add_argument(args, argument))
116int freerdp_addin_replace_argument(
ADDIN_ARGV* args,
const char* previous,
const char* argument)
118 if (!args || !previous || !argument)
121 for (
int i = 0; i < args->argc; i++)
123 if (strcmp(args->argv[i], previous) == 0)
127 if (!(args->argv[i] = _strdup(argument)))
134 if (!freerdp_addin_argv_add_argument(args, argument))
139int freerdp_addin_set_argument_value(
ADDIN_ARGV* args,
const char* option,
const char* value)
145 if (!args || !option || !value)
147 length = strlen(option) + strlen(value) + 1;
148 str = (
char*)calloc(length + 1,
sizeof(
char));
153 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
155 for (
int i = 0; i < args->argc; i++)
157 p = strchr(args->argv[i],
':');
161 if (strncmp(args->argv[i], option,
162 WINPR_ASSERTING_INT_CAST(
size_t, p - args->argv[i])) == 0)
171 rc = freerdp_addin_argv_add_argument(args, str);
178int freerdp_addin_replace_argument_value(
ADDIN_ARGV* args,
const char* previous,
const char* option,
184 if (!args || !previous || !option || !value)
186 length = strlen(option) + strlen(value) + 1;
187 str = (
char*)calloc(length + 1,
sizeof(
char));
192 (void)sprintf_s(str, length + 1,
"%s:%s", option, value);
194 for (
int i = 0; i < args->argc; i++)
196 if (strcmp(args->argv[i], previous) == 0)
204 rc = freerdp_addin_argv_add_argument(args, str);
211BOOL freerdp_device_collection_add(rdpSettings* settings,
RDPDR_DEVICE* device)
215 WINPR_ASSERT(settings);
216 WINPR_ASSERT(device);
222 UINT32 new_size = old * 2;
226 new_size = count * 2;
234 settings->DeviceArray = new_array;
235 memset((
void*)&settings->DeviceArray[old], 0, (new_size - old) *
sizeof(
RDPDR_DEVICE*));
241 settings->DeviceArray[settings->DeviceCount++] = device;
247 WINPR_ASSERT(settings);
252 const UINT32 count = settings->DeviceCount;
253 for (
size_t x = 0; x < count; x++)
258 for (
size_t y = x + 1; y < count; y++)
261 settings->DeviceArray[y - 1] = next;
263 settings->DeviceArray[count - 1] = NULL;
264 settings->DeviceCount--;
272RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings,
const char* name)
276 WINPR_ASSERT(settings);
278 for (UINT32 index = 0; index < settings->DeviceCount; index++)
280 device = settings->DeviceArray[index];
285 if (strcmp(device->Name, name) == 0)
292RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
295 WINPR_ASSERT(settings);
297 for (UINT32 index = 0; index < settings->DeviceCount; index++)
299 device = settings->DeviceArray[index];
301 if (device->Type == type)
308RDPDR_DEVICE* freerdp_device_new(UINT32 Type,
size_t count,
const char*
const args[])
322 WINPR_ASSERT(args || (count == 0));
326 case RDPDR_DTYP_PRINT:
329 case RDPDR_DTYP_SERIAL:
332 case RDPDR_DTYP_PARALLEL:
335 case RDPDR_DTYP_SMARTCARD:
338 case RDPDR_DTYP_FILESYSTEM:
345 device.base = calloc(1, size);
349 device.base->Type = Type;
353 device.base->Name = _strdup(args[0]);
354 if (!device.base->Name)
359 case RDPDR_DTYP_PRINT:
362 device.printer->DriverName = _strdup(args[1]);
363 if (!device.printer->DriverName)
369 device.printer->IsDefault = _stricmp(args[2],
"default") == 0;
372 case RDPDR_DTYP_SERIAL:
375 device.serial->Path = _strdup(args[1]);
376 if (!device.serial->Path)
382 device.serial->Driver = _strdup(args[2]);
383 if (!device.serial->Driver)
389 device.serial->Permissive = _strdup(args[3]);
390 if (!device.serial->Permissive)
394 case RDPDR_DTYP_PARALLEL:
397 device.parallel->Path = _strdup(args[1]);
398 if (!device.serial->Path)
402 case RDPDR_DTYP_SMARTCARD:
404 case RDPDR_DTYP_FILESYSTEM:
407 device.drive->Path = _strdup(args[1]);
408 if (!device.drive->Path)
412 device.drive->automount = (args[2] == NULL) ? TRUE : FALSE;
421 freerdp_device_free(device.base);
442 switch (device->Type)
444 case RDPDR_DTYP_PRINT:
445 free(cnv.printer->DriverName);
447 case RDPDR_DTYP_SERIAL:
448 free(cnv.serial->Path);
449 free(cnv.serial->Driver);
450 free(cnv.serial->Permissive);
452 case RDPDR_DTYP_PARALLEL:
453 free(cnv.parallel->Path);
455 case RDPDR_DTYP_SMARTCARD:
457 case RDPDR_DTYP_FILESYSTEM:
458 free(cnv.drive->Path);
489 const char* args[4] = { 0 };
500 args[0] = device->Name;
503 switch (device->Type)
505 case RDPDR_DTYP_FILESYSTEM:
508 args[1] = src.drive->Path;
513 case RDPDR_DTYP_PRINT:
514 if (src.printer->DriverName)
516 args[1] = src.printer->DriverName;
521 case RDPDR_DTYP_SMARTCARD:
524 case RDPDR_DTYP_SERIAL:
525 if (src.serial->Path)
527 args[1] = src.serial->Path;
531 if (src.serial->Driver)
533 args[2] = src.serial->Driver;
537 if (src.serial->Permissive)
539 args[3] = src.serial->Permissive;
544 case RDPDR_DTYP_PARALLEL:
545 if (src.parallel->Path)
547 args[1] = src.parallel->Path;
552 WLog_ERR(TAG,
"unknown device type %" PRIu32
"", device->Type);
556 copy.dev = freerdp_device_new(device->Type, count, args);
560 copy.dev->Id = device->Id;
565void freerdp_device_collection_free(rdpSettings* settings)
567 WINPR_ASSERT(settings);
569 if (settings->DeviceArray)
571 for (UINT32 index = 0; index < settings->DeviceArraySize; index++)
572 (
void)freerdp_settings_set_pointer_array(settings, FreeRDP_DeviceArray, index, NULL);
575 free((
void*)settings->DeviceArray);
582BOOL freerdp_static_channel_collection_del(rdpSettings* settings,
const char* name)
585 if (!settings || !settings->StaticChannelArray)
588 for (UINT32 x = 0; x < count; x++)
590 ADDIN_ARGV* cur = settings->StaticChannelArray[x];
591 if (cur && (cur->argc > 0))
593 if (strcmp(name, cur->argv[0]) == 0)
595 const size_t rem = settings->StaticChannelArraySize - count + 1;
596 memmove_s((
void*)&settings->StaticChannelArray[x],
598 (
void*)&settings->StaticChannelArray[x + 1],
600 memset((
void*)&settings->StaticChannelArray[count - 1], 0,
603 freerdp_addin_argv_free(cur);
609 const size_t rem = settings->StaticChannelArraySize - count;
610 memset((
void*)&settings->StaticChannelArray[count], 0,
sizeof(
ADDIN_ARGV*) * rem);
615BOOL freerdp_static_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
619 WINPR_ASSERT(settings);
620 WINPR_ASSERT(channel);
625 const UINT32 oldSize =
627 UINT32 new_size = oldSize * 2ul;
630 new_size = count * 2ul;
632 new_array = (
ADDIN_ARGV**)realloc((
void*)settings->StaticChannelArray,
638 settings->StaticChannelArray = new_array;
640 const size_t rem = new_size - oldSize;
641 memset((
void*)&settings->StaticChannelArray[oldSize], 0,
sizeof(
ADDIN_ARGV*) * rem);
649 ADDIN_ARGV** cur = &settings->StaticChannelArray[count++];
650 freerdp_addin_argv_free(*cur);
655ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings,
const char* name)
659 WINPR_ASSERT(settings);
662 for (UINT32 index = 0;
665 channel = settings->StaticChannelArray[index];
667 if (strcmp(channel->argv[0], name) == 0)
674void freerdp_static_channel_collection_free(rdpSettings* settings)
679 if (settings->StaticChannelArray)
683 freerdp_addin_argv_free(settings->StaticChannelArray[i]);
686 free((
void*)settings->StaticChannelArray);
688 settings->StaticChannelArray = NULL;
692BOOL freerdp_dynamic_channel_collection_del(rdpSettings* settings,
const char* name)
695 if (!settings || !settings->DynamicChannelArray)
698 for (UINT32 x = 0; x < count; x++)
700 ADDIN_ARGV* cur = settings->DynamicChannelArray[x];
701 if (cur && (cur->argc > 0))
703 if (strcmp(name, cur->argv[0]) == 0)
705 const size_t rem = settings->DynamicChannelArraySize - count + 1;
706 memmove_s((
void*)&settings->DynamicChannelArray[x],
708 (
void*)&settings->DynamicChannelArray[x + 1],
710 memset((
void*)&settings->DynamicChannelArray[count - 1], 0,
713 freerdp_addin_argv_free(cur);
723BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings,
ADDIN_ARGV* channel)
728 WINPR_ASSERT(settings);
729 WINPR_ASSERT(channel);
736 UINT32 size = oldSize * 2;
746 settings->DynamicChannelArray = new_array;
748 const size_t rem = size - oldSize;
749 memset((
void*)&settings->DynamicChannelArray[oldSize], 0,
sizeof(
ADDIN_ARGV*) * rem);
756 settings->DynamicChannelArray[count++] = channel;
760ADDIN_ARGV* freerdp_dynamic_channel_collection_find(
const rdpSettings* settings,
const char* name)
762 WINPR_ASSERT(settings);
765 for (UINT32 index = 0;
768 ADDIN_ARGV* channel = settings->DynamicChannelArray[index];
770 if (strcmp(channel->argv[0], name) == 0)
784 for (
int index = 0; index < args->argc; index++)
785 free(args->argv[index]);
786 free((
void*)args->argv);
792ADDIN_ARGV* freerdp_addin_argv_new(
size_t argc,
const char*
const argv[])
794 if (argc > INT32_MAX)
803 args->argc = (int)argc;
804 args->argv = (
char**)calloc(argc,
sizeof(
char*));
810 for (
size_t x = 0; x < argc; x++)
812 args->argv[x] = _strdup(argv[x]);
820 WINPR_PRAGMA_DIAG_PUSH
821 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
822 freerdp_addin_argv_free(args);
823 WINPR_PRAGMA_DIAG_POP
837 return freerdp_addin_argv_new(WINPR_ASSERTING_INT_CAST(uint32_t, args->argc), cnv.cc);
840void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
842 WINPR_ASSERT(settings);
844 if (settings->DynamicChannelArray)
848 freerdp_addin_argv_free(settings->DynamicChannelArray[i]);
851 free((
void*)settings->DynamicChannelArray);
853 settings->DynamicChannelArray = NULL;
857void freerdp_capability_buffer_free(rdpSettings* settings)
859 WINPR_ASSERT(settings);
861 if (settings->ReceivedCapabilityData)
863 for (UINT32 x = 0; x < settings->ReceivedCapabilitiesSize; x++)
865 free(settings->ReceivedCapabilityData[x]);
866 settings->ReceivedCapabilityData[x] = NULL;
869 settings->ReceivedCapabilitiesSize = 0;
871 free(settings->ReceivedCapabilityDataSizes);
872 settings->ReceivedCapabilityDataSizes = NULL;
874 free((
void*)settings->ReceivedCapabilityData);
875 settings->ReceivedCapabilityData = NULL;
876 free(settings->ReceivedCapabilities);
877 settings->ReceivedCapabilities = NULL;
880BOOL freerdp_capability_buffer_copy(rdpSettings* settings,
const rdpSettings* src)
882 WINPR_ASSERT(settings);
885 if (src->ReceivedCapabilitiesSize == 0)
888 if (!freerdp_capability_buffer_allocate(settings, src->ReceivedCapabilitiesSize))
891 for (UINT32 x = 0; x < src->ReceivedCapabilitiesSize; x++)
893 WINPR_ASSERT(settings->ReceivedCapabilities);
894 settings->ReceivedCapabilities[x] = src->ReceivedCapabilities[x];
896 WINPR_ASSERT(settings->ReceivedCapabilityDataSizes);
897 settings->ReceivedCapabilityDataSizes[x] = src->ReceivedCapabilityDataSizes[x];
899 WINPR_ASSERT(settings->ReceivedCapabilityData);
900 if (src->ReceivedCapabilityDataSizes[x] > 0)
902 void* tmp = realloc(settings->ReceivedCapabilityData[x],
903 settings->ReceivedCapabilityDataSizes[x]);
906 memcpy(tmp, src->ReceivedCapabilityData[x], src->ReceivedCapabilityDataSizes[x]);
907 settings->ReceivedCapabilityData[x] = tmp;
911 free(settings->ReceivedCapabilityData[x]);
912 settings->ReceivedCapabilityData[x] = NULL;
918void freerdp_target_net_addresses_free(rdpSettings* settings)
920 WINPR_ASSERT(settings);
922 if (settings->TargetNetAddresses)
924 for (UINT32 index = 0; index < settings->TargetNetAddressCount; index++)
925 free(settings->TargetNetAddresses[index]);
928 free((
void*)settings->TargetNetAddresses);
929 free(settings->TargetNetPorts);
930 settings->TargetNetAddressCount = 0;
931 settings->TargetNetAddresses = NULL;
932 settings->TargetNetPorts = NULL;
935void freerdp_server_license_issuers_free(rdpSettings* settings)
937 WINPR_ASSERT(settings);
939 if (settings->ServerLicenseProductIssuers)
941 for (UINT32 x = 0; x < settings->ServerLicenseProductIssuersCount; x++)
942 free(settings->ServerLicenseProductIssuers[x]);
944 free((
void*)settings->ServerLicenseProductIssuers);
945 settings->ServerLicenseProductIssuers = NULL;
946 settings->ServerLicenseProductIssuersCount = 0;
949BOOL freerdp_server_license_issuers_copy(rdpSettings* settings,
char** issuers, UINT32 count)
951 WINPR_ASSERT(settings);
952 WINPR_ASSERT(issuers || (count == 0));
958 for (UINT32 x = 0; x < count; x++)
960 char* issuer = _strdup(issuers[x]);
963 settings->ServerLicenseProductIssuers[x] = issuer;
969void freerdp_performance_flags_make(rdpSettings* settings)
971 UINT32 PerformanceFlags = PERF_FLAG_NONE;
974 PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
977 PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
980 PerformanceFlags |= PERF_DISABLE_WALLPAPER;
983 PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
986 PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
989 PerformanceFlags |= PERF_DISABLE_THEMING;
993void freerdp_performance_flags_split(rdpSettings* settings)
996 settings, FreeRDP_AllowFontSmoothing,
998 PERF_ENABLE_FONT_SMOOTHING)
1002 settings, FreeRDP_AllowDesktopComposition,
1004 PERF_ENABLE_DESKTOP_COMPOSITION)
1008 settings, FreeRDP_DisableWallpaper,
1013 settings, FreeRDP_DisableFullWindowDrag,
1015 PERF_DISABLE_FULLWINDOWDRAG)
1019 settings, FreeRDP_DisableMenuAnims,
1021 PERF_DISABLE_MENUANIMATIONS)
1025 settings, FreeRDP_DisableThemes,
1036 if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
1042 else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
1048 else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
1054 else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
1065 else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
1075void freerdp_update_gateway_usage_method(rdpSettings* settings, UINT32 GatewayEnabled,
1076 UINT32 GatewayBypassLocal)
1078 UINT32 GatewayUsageMethod = 0;
1080 if (!GatewayEnabled && !GatewayBypassLocal)
1081 GatewayUsageMethod = TSC_PROXY_MODE_NONE_DIRECT;
1082 else if (GatewayEnabled && !GatewayBypassLocal)
1083 GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
1084 else if (GatewayEnabled && GatewayBypassLocal)
1085 GatewayUsageMethod = TSC_PROXY_MODE_DETECT;
1090#if defined(WITH_FREERDP_DEPRECATED)
1091BOOL freerdp_get_param_bool(
const rdpSettings* settings,
int id)
1096int freerdp_set_param_bool(rdpSettings* settings,
int id, BOOL param)
1101int freerdp_get_param_int(
const rdpSettings* settings,
int id)
1106int freerdp_set_param_int(rdpSettings* settings,
int id,
int param)
1111UINT32 freerdp_get_param_uint32(
const rdpSettings* settings,
int id)
1116int freerdp_set_param_uint32(rdpSettings* settings,
int id, UINT32 param)
1121UINT64 freerdp_get_param_uint64(
const rdpSettings* settings,
int id)
1126int freerdp_set_param_uint64(rdpSettings* settings,
int id, UINT64 param)
1131char* freerdp_get_param_string(
const rdpSettings* settings,
int id)
1134 return WINPR_CAST_CONST_PTR_AWAY(str,
char*);
1137int freerdp_set_param_string(rdpSettings* settings,
int id,
const char* param)
1143static BOOL value_to_uint(
const char* value, ULONGLONG* result, ULONGLONG min, ULONGLONG max)
1145 char* endptr = NULL;
1146 unsigned long long rc = 0;
1148 if (!value || !result)
1152 rc = _strtoui64(value, &endptr, 0);
1157 if (endptr == value)
1160 if ((rc < min) || (rc > max))
1167static BOOL value_to_int(
const char* value, LONGLONG* result, LONGLONG min, LONGLONG max)
1169 char* endptr = NULL;
1172 if (!value || !result)
1176 rc = _strtoi64(value, &endptr, 0);
1181 if (endptr == value)
1184 if ((rc < min) || (rc > max))
1191static BOOL parsing_fail(
const char* key,
const char* type,
const char* value)
1193 WLog_ERR(TAG,
"Failed to parse key [%s] of type [%s]: value [%s]", key, type, value);
1197BOOL freerdp_settings_set_value_for_name(rdpSettings* settings,
const char* name,
const char* value)
1203 if (!settings || !name)
1209 WLog_ERR(TAG,
"Invalid settings key [%s]", name);
1213 const SSIZE_T index = i;
1219 case RDP_SETTINGS_TYPE_BOOL:
1221 const BOOL val = (_strnicmp(value,
"TRUE", 5) == 0) || (_strnicmp(value,
"ON", 5) == 0);
1223 (_strnicmp(value,
"FALSE", 6) == 0) || (_strnicmp(value,
"OFF", 6) == 0);
1225 return parsing_fail(name,
"BOOL", value);
1230 case RDP_SETTINGS_TYPE_UINT16:
1231 if (!value_to_uint(value, &uval, 0, UINT16_MAX))
1232 return parsing_fail(name,
"UINT16", value);
1237 return parsing_fail(name,
"UINT16", value);
1240 case RDP_SETTINGS_TYPE_INT16:
1241 if (!value_to_int(value, &ival, INT16_MIN, INT16_MAX))
1242 return parsing_fail(name,
"INT16", value);
1247 return parsing_fail(name,
"INT16", value);
1249 case RDP_SETTINGS_TYPE_UINT32:
1250 if (!value_to_uint(value, &uval, 0, UINT32_MAX))
1251 return parsing_fail(name,
"UINT32", value);
1256 return parsing_fail(name,
"UINT32", value);
1258 case RDP_SETTINGS_TYPE_INT32:
1259 if (!value_to_int(value, &ival, INT32_MIN, INT32_MAX))
1260 return parsing_fail(name,
"INT32", value);
1265 return parsing_fail(name,
"INT32", value);
1267 case RDP_SETTINGS_TYPE_UINT64:
1268 if (!value_to_uint(value, &uval, 0, UINT64_MAX))
1269 return parsing_fail(name,
"UINT64", value);
1273 return parsing_fail(name,
"UINT64", value);
1275 case RDP_SETTINGS_TYPE_INT64:
1276 if (!value_to_int(value, &ival, INT64_MIN, INT64_MAX))
1277 return parsing_fail(name,
"INT64", value);
1281 return parsing_fail(name,
"INT64", value);
1284 case RDP_SETTINGS_TYPE_STRING:
1288 case RDP_SETTINGS_TYPE_POINTER:
1289 return parsing_fail(name,
"POINTER", value);
1296BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1297 FreeRDP_Settings_Keys_UInt32 lenId,
const void* data,
1298 size_t len,
size_t size)
1306 if (lenId != FreeRDP_UINT32_UNUSED)
1312 if (len > UINT32_MAX)
1316 copy = calloc(len, size);
1320 memcpy(copy, data, len * size);
1330 if (lenId == FreeRDP_UINT32_UNUSED)
1336 FreeRDP_Settings_Keys_Pointer
id)
1340 const rdpSettings* pc;
1348 const void* data,
size_t len)
1362 case FreeRDP_RdpServerCertificate:
1363 freerdp_certificate_free(settings->RdpServerCertificate);
1367 WLog_ERR(TAG,
"FreeRDP_RdpServerCertificate::len must be 0 or 1");
1370 settings->RdpServerCertificate = cnv.v;
1371 if (!settings->RdpServerCertificate && (len > 0))
1373 settings->RdpServerCertificate = freerdp_certificate_new();
1374 if (!settings->RdpServerCertificate)
1378 case FreeRDP_RdpServerRsaKey:
1379 freerdp_key_free(settings->RdpServerRsaKey);
1382 WLog_ERR(TAG,
"FreeRDP_RdpServerRsaKey::len must be 0 or 1");
1385 settings->RdpServerRsaKey = (rdpPrivateKey*)cnv.v;
1386 if (!settings->RdpServerRsaKey && (len > 0))
1388 settings->RdpServerRsaKey = freerdp_key_new();
1389 if (!settings->RdpServerRsaKey)
1393 case FreeRDP_RedirectionPassword:
1394 return freerdp_settings_set_pointer_len_(
1395 settings,
id, FreeRDP_RedirectionPasswordLength, data, len,
sizeof(
char));
1396 case FreeRDP_RedirectionTsvUrl:
1397 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionTsvUrlLength,
1398 data, len,
sizeof(
char));
1399 case FreeRDP_RedirectionTargetCertificate:
1400 freerdp_certificate_free(settings->RedirectionTargetCertificate);
1404 WLog_ERR(TAG,
"FreeRDP_RedirectionTargetCertificate::len must be 0 or 1");
1407 settings->RedirectionTargetCertificate = cnv.v;
1408 if (!settings->RedirectionTargetCertificate && (len > 0))
1410 settings->RedirectionTargetCertificate = freerdp_certificate_new();
1411 if (!settings->RedirectionTargetCertificate)
1415 case FreeRDP_RedirectionGuid:
1416 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_RedirectionGuidLength,
1417 data, len,
sizeof(BYTE));
1418 case FreeRDP_LoadBalanceInfo:
1419 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_LoadBalanceInfoLength,
1420 data, len,
sizeof(
char));
1421 case FreeRDP_ServerRandom:
1422 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerRandomLength, data,
1424 case FreeRDP_ClientRandom:
1425 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ClientRandomLength, data,
1427 case FreeRDP_ServerCertificate:
1428 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ServerCertificateLength,
1429 data, len,
sizeof(
char));
1430 case FreeRDP_TargetNetAddresses:
1431 if ((data == NULL) && (len == 0))
1433 freerdp_target_net_addresses_free(settings);
1438 "[BUG] FreeRDP_TargetNetAddresses must not be resized from outside the library!");
1440 case FreeRDP_ServerLicenseProductIssuers:
1442 freerdp_server_license_issuers_free(settings);
1443 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ServerLicenseProductIssuers,
1444 FreeRDP_ServerLicenseProductIssuersCount, data,
1445 len,
sizeof(
char*));
1446 case FreeRDP_TargetNetPorts:
1447 if ((data == NULL) && (len == 0))
1449 freerdp_target_net_addresses_free(settings);
1453 "[BUG] FreeRDP_TargetNetPorts must not be resized from outside the library!");
1455 case FreeRDP_DeviceArray:
1457 freerdp_device_collection_free(settings);
1458 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DeviceArraySize, data,
1460 case FreeRDP_ChannelDefArray:
1461 if ((len > 0) && (len < CHANNEL_MAX_COUNT))
1463 "FreeRDP_ChannelDefArray::len expected to be >= %" PRIu32
1464 ", but have %" PRIu32,
1465 CHANNEL_MAX_COUNT, len);
1466 return freerdp_settings_set_pointer_len_(settings, FreeRDP_ChannelDefArray,
1467 FreeRDP_ChannelDefArraySize, data, len,
1469 case FreeRDP_MonitorDefArray:
1470 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_MonitorDefArraySize,
1472 case FreeRDP_ClientAutoReconnectCookie:
1473 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1475 case FreeRDP_ServerAutoReconnectCookie:
1476 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1478 case FreeRDP_ClientTimeZone:
1481 WLog_ERR(TAG,
"FreeRDP_ClientTimeZone::len must be 0 or 1");
1484 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1486 case FreeRDP_BitmapCacheV2CellInfo:
1487 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_BitmapCacheV2NumCells,
1489 case FreeRDP_GlyphCache:
1490 if ((len != 0) && (len != 10))
1492 WLog_ERR(TAG,
"FreeRDP_GlyphCache::len must be 0 or 10");
1495 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1497 case FreeRDP_FragCache:
1500 WLog_ERR(TAG,
"FreeRDP_FragCache::len must be 0 or 1");
1503 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1505 case FreeRDP_StaticChannelArray:
1507 freerdp_static_channel_collection_free(settings);
1508 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_StaticChannelArraySize,
1510 case FreeRDP_DynamicChannelArray:
1512 freerdp_dynamic_channel_collection_free(settings);
1513 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_DynamicChannelArraySize,
1515 case FreeRDP_ReceivedCapabilityData:
1517 freerdp_capability_buffer_free(settings);
1518 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ReceivedCapabilitiesSize,
1519 data, len,
sizeof(BYTE*));
1520 case FreeRDP_ReceivedCapabilities:
1522 freerdp_capability_buffer_free(settings);
1523 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_ReceivedCapabilitiesSize,
1524 data, len,
sizeof(
char));
1525 case FreeRDP_OrderSupport:
1526 return freerdp_settings_set_pointer_len_(settings,
id, FreeRDP_UINT32_UNUSED, data, len,
1529 case FreeRDP_MonitorIds:
1530 return freerdp_settings_set_pointer_len_(
1531 settings, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, data, len,
sizeof(UINT32));
1534 if ((data == NULL) && (len == 0))
1539 WLog_WARN(TAG,
"Invalid id %" PRIuz,
id);
1544void* freerdp_settings_get_pointer_array_writable(
const rdpSettings* settings,
1545 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1552 case FreeRDP_ClientAutoReconnectCookie:
1554 if ((offset >= max) || !settings->ClientAutoReconnectCookie)
1556 return &settings->ClientAutoReconnectCookie[offset];
1557 case FreeRDP_ServerAutoReconnectCookie:
1559 if ((offset >= max) || !settings->ServerAutoReconnectCookie)
1561 return &settings->ServerAutoReconnectCookie[offset];
1562 case FreeRDP_ServerCertificate:
1566 return &settings->ServerCertificate[offset];
1567 case FreeRDP_ServerRandom:
1571 return &settings->ServerRandom[offset];
1572 case FreeRDP_ClientRandom:
1576 return &settings->ClientRandom[offset];
1577 case FreeRDP_LoadBalanceInfo:
1581 return &settings->LoadBalanceInfo[offset];
1583 case FreeRDP_RedirectionTsvUrl:
1587 return &settings->RedirectionTsvUrl[offset];
1589 case FreeRDP_RedirectionPassword:
1593 return &settings->RedirectionPassword[offset];
1595 case FreeRDP_OrderSupport:
1599 return &settings->OrderSupport[offset];
1600 case FreeRDP_MonitorIds:
1604 return &settings->MonitorIds[offset];
1605 case FreeRDP_MonitorDefArray:
1609 return &settings->MonitorDefArray[offset];
1610 case FreeRDP_ChannelDefArray:
1614 return &settings->ChannelDefArray[offset];
1615 case FreeRDP_DeviceArray:
1619 return settings->DeviceArray[offset];
1620 case FreeRDP_StaticChannelArray:
1624 return settings->StaticChannelArray[offset];
1625 case FreeRDP_DynamicChannelArray:
1629 return settings->DynamicChannelArray[offset];
1630 case FreeRDP_FragCache:
1634 return &settings->FragCache[offset];
1635 case FreeRDP_GlyphCache:
1639 return &settings->GlyphCache[offset];
1640 case FreeRDP_BitmapCacheV2CellInfo:
1644 return &settings->BitmapCacheV2CellInfo[offset];
1645 case FreeRDP_ReceivedCapabilities:
1649 return &settings->ReceivedCapabilities[offset];
1650 case FreeRDP_TargetNetAddresses:
1654 return settings->TargetNetAddresses[offset];
1655 case FreeRDP_TargetNetPorts:
1659 return &settings->TargetNetPorts[offset];
1660 case FreeRDP_ClientTimeZone:
1664 return settings->ClientTimeZone;
1665 case FreeRDP_RdpServerCertificate:
1669 return settings->RdpServerCertificate;
1670 case FreeRDP_RdpServerRsaKey:
1674 return settings->RdpServerRsaKey;
1681 WLog_WARN(TAG,
"Invalid offset for %s [%" PRIuz
"]: size=%" PRIuz
", offset=%" PRIuz,
1686BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer
id,
1687 size_t offset,
const void* data)
1689 size_t maxOffset = 0;
1694 case FreeRDP_ClientAutoReconnectCookie:
1696 if ((offset >= maxOffset) || !data || !settings->ClientAutoReconnectCookie)
1700 case FreeRDP_ServerAutoReconnectCookie:
1702 if ((offset >= maxOffset) || !data || !settings->ServerAutoReconnectCookie)
1706 case FreeRDP_ServerCertificate:
1708 if ((offset >= maxOffset) || !data)
1710 settings->ServerCertificate[offset] = *(
const BYTE*)data;
1712 case FreeRDP_DeviceArray:
1714 if (offset >= maxOffset)
1716 freerdp_device_free(settings->DeviceArray[offset]);
1717 settings->DeviceArray[offset] = freerdp_device_clone(data);
1719 case FreeRDP_TargetNetAddresses:
1721 if ((offset >= maxOffset) || !data)
1723 free(settings->TargetNetAddresses[offset]);
1724 settings->TargetNetAddresses[offset] = _strdup((
const char*)data);
1725 return settings->TargetNetAddresses[offset] != NULL;
1726 case FreeRDP_TargetNetPorts:
1728 if ((offset >= maxOffset) || !data)
1730 settings->TargetNetPorts[offset] = *((
const UINT32*)data);
1732 case FreeRDP_StaticChannelArray:
1734 if ((offset >= maxOffset) || !data)
1736 freerdp_addin_argv_free(settings->StaticChannelArray[offset]);
1737 settings->StaticChannelArray[offset] = freerdp_addin_argv_clone(data);
1739 case FreeRDP_DynamicChannelArray:
1741 if ((offset >= maxOffset) || !data)
1743 freerdp_addin_argv_free(settings->DynamicChannelArray[offset]);
1744 settings->DynamicChannelArray[offset] = freerdp_addin_argv_clone(data);
1746 case FreeRDP_BitmapCacheV2CellInfo:
1748 if ((offset >= maxOffset) || !data)
1752 settings->BitmapCacheV2CellInfo[offset] = *cdata;
1755 case FreeRDP_ServerRandom:
1757 if ((offset >= maxOffset) || !data)
1759 settings->ServerRandom[offset] = *(
const BYTE*)data;
1761 case FreeRDP_ClientRandom:
1763 if ((offset >= maxOffset) || !data)
1765 settings->ClientRandom[offset] = *(
const BYTE*)data;
1767 case FreeRDP_LoadBalanceInfo:
1769 if ((offset >= maxOffset) || !data)
1771 settings->LoadBalanceInfo[offset] = *(
const BYTE*)data;
1773 case FreeRDP_RedirectionTsvUrl:
1775 if ((offset >= maxOffset) || !data)
1777 settings->RedirectionTsvUrl[offset] = *(
const BYTE*)data;
1779 case FreeRDP_RedirectionPassword:
1781 if ((offset >= maxOffset) || !data)
1783 settings->RedirectionPassword[offset] = *(
const BYTE*)data;
1785 case FreeRDP_OrderSupport:
1787 if (!settings->OrderSupport)
1789 if ((offset >= maxOffset) || !data)
1791 settings->OrderSupport[offset] = *(
const BOOL*)data ? 1 : 0;
1793 case FreeRDP_GlyphCache:
1795 if (!settings->GlyphCache)
1797 if ((offset >= maxOffset) || !data)
1801 case FreeRDP_FragCache:
1803 if (!settings->FragCache)
1805 if ((offset >= maxOffset) || !data)
1809 case FreeRDP_MonitorIds:
1811 if ((offset >= maxOffset) || !data)
1813 settings->MonitorIds[offset] = *(
const UINT32*)data;
1815 case FreeRDP_ChannelDefArray:
1817 if ((offset >= maxOffset) || !data)
1819 settings->ChannelDefArray[offset] = *(
const CHANNEL_DEF*)data;
1821 case FreeRDP_MonitorDefArray:
1823 if ((offset >= maxOffset) || !data)
1825 settings->MonitorDefArray[offset] = *(
const rdpMonitor*)data;
1828 case FreeRDP_ClientTimeZone:
1830 if ((offset >= maxOffset) || !data || !settings->ClientTimeZone)
1841 WLog_WARN(TAG,
"[%s] Invalid offset=%" PRIuz
" [%" PRIuz
"] or NULL data=%p",
1846const void* freerdp_settings_get_pointer_array(
const rdpSettings* settings,
1847 FreeRDP_Settings_Keys_Pointer
id,
size_t offset)
1849 return freerdp_settings_get_pointer_array_writable(settings,
id, offset);
1854 UINT32 flags = FREERDP_CODEC_ALL;
1855 if (settings->RemoteFxCodec == FALSE)
1857 flags &= (uint32_t)~FREERDP_CODEC_REMOTEFX;
1859 if (settings->NSCodec == FALSE)
1861 flags &= (uint32_t)~FREERDP_CODEC_NSCODEC;
1869 WINPR_ASSERT(settings);
1870 const char* hostname = settings->ServerHostname;
1872 if (settings->UserSpecifiedServerName)
1873 hostname = settings->UserSpecifiedServerName;
1878#if defined(WITH_FREERDP_DEPRECATED)
1881 return freerdp_addin_argv_clone(channel);
1886 return freerdp_addin_argv_clone(channel);
1890BOOL freerdp_target_net_addresses_copy(rdpSettings* settings,
char** addresses, UINT32 count)
1892 WINPR_ASSERT(settings);
1893 WINPR_ASSERT(addresses);
1895 if (!freerdp_target_net_adresses_reset(settings, count))
1898 for (UINT32 i = 0; i < settings->TargetNetAddressCount; i++)
1900 if (!freerdp_settings_set_pointer_array(settings, FreeRDP_TargetNetAddresses, i,
1903 freerdp_target_net_addresses_free(settings);
1913 if (!what && !expect)
1915 if (!what || !expect)
1918 if (what->Id != expect->Id)
1920 if (what->Type != expect->Type)
1922 if (what->Name && expect->Name)
1924 if (strcmp(what->Name, expect->Name) != 0)
1929 if (what->Name != expect->Name)
1935 case RDPDR_DTYP_PRINT:
1939 if (a->DriverName && b->DriverName)
1940 return strcmp(a->DriverName, b->DriverName) == 0;
1941 return a->DriverName == b->DriverName;
1944 case RDPDR_DTYP_SERIAL:
1949 if (a->Path && b->Path)
1951 if (strcmp(a->Path, b->Path) != 0)
1954 else if (a->Path != b->Path)
1957 if (a->Driver && b->Driver)
1959 if (strcmp(a->Driver, b->Driver) != 0)
1962 else if (a->Driver != b->Driver)
1964 if (a->Permissive && b->Permissive)
1965 return strcmp(a->Permissive, b->Permissive) == 0;
1966 return a->Permissive == b->Permissive;
1969 case RDPDR_DTYP_PARALLEL:
1973 if (a->Path && b->Path)
1974 return strcmp(a->Path, b->Path) == 0;
1975 return a->Path == b->Path;
1978 case RDPDR_DTYP_SMARTCARD:
1980 case RDPDR_DTYP_FILESYSTEM:
1984 if (a->automount != b->automount)
1986 if (a->Path && b->Path)
1987 return strcmp(a->Path, b->Path) == 0;
1988 return a->Path == b->Path;
2001 RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED |
2002 RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED |
2003 RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED |
2004 RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED;
2006 if (flags & RAIL_LEVEL_SUPPORTED)
2007 winpr_str_append(
"RAIL_LEVEL_SUPPORTED", buffer, length,
"|");
2008 if (flags & RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED)
2009 winpr_str_append(
"RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED", buffer, length,
"|");
2010 if (flags & RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED)
2011 winpr_str_append(
"RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED", buffer, length,
"|");
2012 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2013 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2014 if (flags & RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED)
2015 winpr_str_append(
"RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED", buffer, length,
"|");
2016 if (flags & RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED)
2017 winpr_str_append(
"RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED", buffer, length,
"|");
2018 if (flags & RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED)
2019 winpr_str_append(
"RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED", buffer, length,
"|");
2020 if (flags & RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED)
2021 winpr_str_append(
"RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED", buffer, length,
"|");
2022 if (flags & RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED)
2023 winpr_str_append(
"RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED", buffer, length,
"|");
2024 if ((flags & ~mask) != 0)
2026 char tbuffer[64] = { 0 };
2027 (void)_snprintf(tbuffer,
sizeof(tbuffer),
"RAIL_FLAG_UNKNOWN 0x%08" PRIx32, flags & mask);
2028 winpr_str_append(tbuffer, buffer, length,
"|");
2034 const BYTE** capsData,
const UINT32* capsSizes,
2035 UINT32 capsCount, BOOL serverReceivedCaps)
2037 WINPR_ASSERT(settings);
2038 WINPR_ASSERT(capsFlags || (capsCount == 0));
2039 WINPR_ASSERT(capsData || (capsCount == 0));
2040 WINPR_ASSERT(capsSizes || (capsCount == 0));
2041 WINPR_ASSERT(capsCount <= UINT16_MAX);
2043 wLog* log = WLog_Get(TAG);
2045 for (UINT32 x = 0; x < capsCount; x++)
2050 wStream* sub = Stream_StaticConstInit(&buffer, capsData[x], capsSizes[x]);
2052 if (!rdp_read_capability_set(log, sub, (UINT16)x, settings, serverReceivedCaps))
2065 return "RDP_VERSION_4";
2066 case RDP_VERSION_5_PLUS:
2067 return "RDP_VERSION_5_PLUS";
2068 case RDP_VERSION_10_0:
2069 return "RDP_VERSION_10_0";
2070 case RDP_VERSION_10_1:
2071 return "RDP_VERSION_10_1";
2072 case RDP_VERSION_10_2:
2073 return "RDP_VERSION_10_2";
2074 case RDP_VERSION_10_3:
2075 return "RDP_VERSION_10_3";
2076 case RDP_VERSION_10_4:
2077 return "RDP_VERSION_10_4";
2078 case RDP_VERSION_10_5:
2079 return "RDP_VERSION_10_5";
2080 case RDP_VERSION_10_6:
2081 return "RDP_VERSION_10_6";
2082 case RDP_VERSION_10_7:
2083 return "RDP_VERSION_10_7";
2084 case RDP_VERSION_10_8:
2085 return "RDP_VERSION_10_8";
2086 case RDP_VERSION_10_9:
2087 return "RDP_VERSION_10_9";
2088 case RDP_VERSION_10_10:
2089 return "RDP_VERSION_10_10";
2090 case RDP_VERSION_10_11:
2091 return "RDP_VERSION_10_11";
2092 case RDP_VERSION_10_12:
2093 return "RDP_VERSION_10_12";
2095 return "RDP_VERSION_UNKNOWN";
2102 WINPR_ASSERT(settings);
2105 return freerdp_settings_set_string_copy_(settings,
id, NULL, 0, TRUE);
2109 char* str = ConvertWCharToUtf8Alloc(param, &len);
2110 if (!str && (len != 0))
2113 return freerdp_settings_set_string_(settings,
id, str, len);
2117 const WCHAR* param,
size_t length)
2121 WINPR_ASSERT(settings);
2124 return freerdp_settings_set_string_copy_(settings,
id, NULL, length, TRUE);
2126 char* str = ConvertWCharNToUtf8Alloc(param, length, &len);
2127 if (!str && (length != 0))
2131 const size_t wlen = _wcsnlen(param, length);
2136 return freerdp_settings_set_string_(settings,
id, str, len);
2140 FreeRDP_Settings_Keys_String
id,
size_t* pCharLen)
2147 return ConvertUtf8ToWCharAlloc(str, pCharLen);
2154 case RDPDR_DTYP_FILESYSTEM:
2155 return "RDPDR_DTYP_FILESYSTEM";
2156 case RDPDR_DTYP_PARALLEL:
2157 return "RDPDR_DTYP_PARALLEL";
2158 case RDPDR_DTYP_PRINT:
2159 return "RDPDR_DTYP_PRINT";
2160 case RDPDR_DTYP_SERIAL:
2161 return "RDPDR_DTYP_SERIAL";
2162 case RDPDR_DTYP_SMARTCARD:
2163 return "RDPDR_DTYP_SMARTCARD";
2165 return "RDPDR_DTYP_UNKNOWN";
2169const char* freerdp_encryption_level_string(UINT32 EncryptionLevel)
2171 switch (EncryptionLevel)
2173 case ENCRYPTION_LEVEL_NONE:
2174 return "ENCRYPTION_LEVEL_NONE";
2175 case ENCRYPTION_LEVEL_LOW:
2176 return "ENCRYPTION_LEVEL_LOW";
2177 case ENCRYPTION_LEVEL_CLIENT_COMPATIBLE:
2178 return "ENCRYPTION_LEVEL_CLIENT_COMPATIBLE";
2179 case ENCRYPTION_LEVEL_HIGH:
2180 return "ENCRYPTION_LEVEL_HIGH";
2181 case ENCRYPTION_LEVEL_FIPS:
2182 return "ENCRYPTION_LEVEL_FIPS";
2184 return "ENCRYPTION_LEVEL_UNKNOWN";
2188const char* freerdp_encryption_methods_string(UINT32 EncryptionMethods,
char* buffer,
size_t size)
2190 if (EncryptionMethods == ENCRYPTION_METHOD_NONE)
2192 winpr_str_append(
"ENCRYPTION_METHOD_NONE", buffer, size,
"|");
2196 if (EncryptionMethods & ENCRYPTION_METHOD_40BIT)
2198 winpr_str_append(
"ENCRYPTION_METHOD_40BIT", buffer, size,
"|");
2200 if (EncryptionMethods & ENCRYPTION_METHOD_128BIT)
2202 winpr_str_append(
"ENCRYPTION_METHOD_128BIT", buffer, size,
"|");
2204 if (EncryptionMethods & ENCRYPTION_METHOD_56BIT)
2206 winpr_str_append(
"ENCRYPTION_METHOD_56BIT", buffer, size,
"|");
2208 if (EncryptionMethods & ENCRYPTION_METHOD_FIPS)
2210 winpr_str_append(
"ENCRYPTION_METHOD_FIPS", buffer, size,
"|");
2218 const UINT32 invalid = mask & ~(RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT |
2219 RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT);
2221 if (mask & RNS_UD_32BPP_SUPPORT)
2222 winpr_str_append(
"RNS_UD_32BPP_SUPPORT", buffer, size,
"|");
2223 if (mask & RNS_UD_24BPP_SUPPORT)
2224 winpr_str_append(
"RNS_UD_24BPP_SUPPORT", buffer, size,
"|");
2225 if (mask & RNS_UD_16BPP_SUPPORT)
2226 winpr_str_append(
"RNS_UD_16BPP_SUPPORT", buffer, size,
"|");
2227 if (mask & RNS_UD_15BPP_SUPPORT)
2228 winpr_str_append(
"RNS_UD_15BPP_SUPPORT", buffer, size,
"|");
2232 char str[32] = { 0 };
2233 (void)_snprintf(str,
sizeof(str),
"RNS_UD_INVALID[0x%04" PRIx32
"]", invalid);
2234 winpr_str_append(str, buffer, size,
"|");
2236 char hex[32] = { 0 };
2237 (void)_snprintf(hex,
sizeof(hex),
"[0x%04" PRIx16
"]", mask);
2242 const char* separator,
const char* param)
2250 winpr_asprintf(&str, &len,
"%s", param);
2251 else if (!separator)
2252 winpr_asprintf(&str, &len,
"%s%s", old, param);
2254 winpr_asprintf(&str, &len,
"%s%s%s", old, separator, param);
2263 return settings != NULL;
2270static int sort_monitor_fn(
const void* pva,
const void* pvb)
2276 if (a->is_primary && b->is_primary)
2293 WINPR_ASSERT(monitors || (count == 0));
2308 for (
size_t x = 0; x < count; x++)
2311 if (cur->is_primary)
2319 for (
size_t x = 0; x < count; x++)
2322 if ((cur->x == 0) && (cur->y == 0))
2332 WLog_ERR(TAG,
"Could not find primary monitor, aborting");
2339 WINPR_ASSERT(sorted);
2344 sorted[sortpos] = *primary;
2345 sorted[sortpos].x = 0;
2346 sorted[sortpos].y = 0;
2347 sorted[sortpos].is_primary = TRUE;
2351 const INT32 offsetX = primary->x;
2352 const INT32 offsetY = primary->y;
2358 for (
size_t x = 0; x < count; x++)
2367 sorted[sortpos++] = m;
2371 qsort(sorted, count,
sizeof(
rdpMonitor), sort_monitor_fn);
2374 WINPR_ASSERTING_INT_CAST(uint32_t, count));
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
const char * freerdp_rail_support_flags_to_string(UINT32 flags, char *buffer, size_t length)
Returns a stringified representation of RAIL support flags.
BOOL freerdp_settings_update_from_caps(rdpSettings *settings, const BYTE *capsFlags, const BYTE **capsData, const UINT32 *capsSizes, UINT32 capsCount, BOOL serverReceivedCaps)
Parse capability data and apply to settings.
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
const char * freerdp_supported_color_depths_string(UINT16 mask, char *buffer, size_t size)
returns a string representation of RNS_UD_XXBPP_SUPPORT values
BOOL freerdp_settings_set_string_from_utf16N(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param, size_t length)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
const char * freerdp_rdp_version_string(UINT32 version)
Returns a stringified representation of the RDP protocol version.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.
BOOL freerdp_settings_are_valid(const rdpSettings *settings)
Returns TRUE if settings are in a valid state, FALSE otherwise.
FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id)
Returns a UINT64 settings value.
FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char *value)
Get a key index for the name string of that key.
BOOL freerdp_settings_set_pointer_len(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data, size_t len)
Set a pointer to value data.
FREERDP_API BOOL freerdp_settings_set_int32(rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id, INT32 param)
Sets a INT32 settings value.
const char * freerdp_rdpdr_dtyp_string(UINT32 type)
Returns a string representation of RDPDR_DTYP_*.
BOOL freerdp_settings_set_monitor_def_array_sorted(rdpSettings *settings, const rdpMonitor *monitors, size_t count)
Sort monitor array according to:
FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.
WCHAR * freerdp_settings_get_string_as_utf16(const rdpSettings *settings, FreeRDP_Settings_Keys_String id, size_t *pCharLen)
Return an allocated UTF16 string.
BOOL freerdp_device_collection_del(rdpSettings *settings, const RDPDR_DEVICE *device)
Removed a device from the settings, returns ownership of the allocated device to caller.
BOOL freerdp_set_gateway_usage_method(rdpSettings *settings, UINT32 GatewayUsageMethod)
FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id, UINT64 param)
Sets a UINT64 settings value.
FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id, INT16 param)
Sets a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id, INT64 param)
Sets a INT64 settings value.
BOOL freerdp_settings_set_string_from_utf16(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data)
Set a pointer to value data.
FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id)
Returns a INT32 settings value.
const char * freerdp_settings_get_server_name(const rdpSettings *settings)
A helper function to return the correct server name.
const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
UINT32 freerdp_settings_get_codecs_flags(const rdpSettings *settings)
helper function to get a mask of supported codec flags.
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param, size_t len)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.
BOOL freerdp_settings_append_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *separator, const char *param)
appends a string to a settings value. The param is copied. If the initial value of the setting was no...
FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 param)
Sets a UINT16 settings value.
FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL param)
Sets a BOOL settings value.