Added getter/setter for settings

This commit is contained in:
akallabeth
2020-11-19 10:09:34 +01:00
committed by akallabeth
parent cb0cba2d47
commit c67e4df96b
10 changed files with 1058 additions and 625 deletions

View File

@@ -347,6 +347,12 @@ if(NOT IOS)
find_package(Threads REQUIRED)
endif()
if (IOS)
set(HAVE_STRNDUP 1)
else()
CHECK_SYMBOL_EXISTS(strndup string.h HAVE_STRNDUP)
endif()
if(NOT WIN32)
CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)

View File

@@ -25,6 +25,7 @@
#cmakedefine HAVE_VALGRIND_MEMCHECK_H
#cmakedefine HAVE_EXECINFO_H
#cmakedefine HAVE_GETLOGIN_R
#cmakedefine HAVE_STRNDUP
/* Features */
#cmakedefine SWRESAMPLE_FOUND

View File

@@ -504,7 +504,6 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
/* ThreadingFlags */
#define THREADING_FLAGS_DISABLE_THREADS 0x00000001
/* Settings */
#ifdef __GNUC__
@@ -536,6 +535,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_MaxTimeInCheckLoop (26)
#define FreeRDP_AcceptedCert (27)
#define FreeRDP_AcceptedCertLength (28)
#define FreeRDP_ThreadingFlags (64)
#define FreeRDP_RdpVersion (128)
#define FreeRDP_DesktopWidth (129)
#define FreeRDP_DesktopHeight (130)
@@ -895,6 +895,8 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL;
#define FreeRDP_TcpKeepAliveDelay (5192)
#define FreeRDP_TcpKeepAliveInterval (5193)
#define FreeRDP_TcpAckTimeout (5194)
#define FreeRDP_ActionScript (5195)
#define FreeRDP_Floatbar (5196)
/**
* FreeRDP Settings Data Structure
@@ -928,9 +930,7 @@ struct rdp_settings
ALIGN64 UINT32 MaxTimeInCheckLoop; /* 26 */
ALIGN64 char* AcceptedCert; /* 27 */
ALIGN64 UINT32 AcceptedCertLength; /* 28 */
UINT64 padding0064[64 - 29]; /* 29 */
UINT64 padding0064[64 - 29]; /* 29 */
/* resource management related options */
ALIGN64 UINT32 ThreadingFlags; /* 64 */
@@ -1551,7 +1551,9 @@ struct rdp_settings
ALIGN64 UINT32 TcpKeepAliveDelay; /* 5192 */
ALIGN64 UINT32 TcpKeepAliveInterval; /* 5193 */
ALIGN64 UINT32 TcpAckTimeout; /* 5194 */
UINT64 padding5312[5312 - 5195]; /* 5195 */
ALIGN64 char* ActionScript; /* 5195 */
ALIGN64 UINT32 Floatbar; /* 5196 */
UINT64 padding5312[5312 - 5197]; /* 5197 */
/**
* WARNING: End of ABI stable zone!
@@ -1570,9 +1572,6 @@ struct rdp_settings
ALIGN64 BYTE* SettingsModified; /* byte array marking fields that have been modified from their
default value - currently UNUSED! */
ALIGN64 char* ActionScript;
ALIGN64 DWORD Floatbar;
ALIGN64 char* XSelectionAtom;
};
typedef struct rdp_settings rdpSettings;
@@ -1696,10 +1695,24 @@ extern "C"
FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings* settings, size_t id, UINT64 param);
FREERDP_API const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id);
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings* settings, size_t id,
const char* param, size_t len);
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id,
const char* param);
FREERDP_API const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id);
FREERDP_API void* freerdp_settings_get_pointer_writable(const rdpSettings* settings, size_t id);
FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings* settings, size_t id,
const void* data);
FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, size_t id,
const void* data, size_t len);
FREERDP_API const void* freerdp_settings_get_pointer_array(const rdpSettings* settings,
size_t id, size_t offset);
FREERDP_API void* freerdp_settings_get_pointer_array_writable(const rdpSettings* settings,
size_t id, size_t offset);
FREERDP_API BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, size_t id,
size_t offset, const void* data);
FREERDP_API BOOL freerdp_settings_set_value_for_name(rdpSettings* settings, const char* name,
const char* value);

View File

@@ -29,6 +29,8 @@
#include <winpr/crt.h>
#include "../core/settings.h"
#include "../core/certificate.h"
#include <freerdp/settings.h>
#include <freerdp/freerdp.h>
#include <freerdp/log.h>
@@ -182,11 +184,12 @@ BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
if (!settings->DeviceArray)
return FALSE;
if (settings->DeviceArraySize < (settings->DeviceCount + 1))
if (freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize) <
(settings->DeviceCount + 1))
{
UINT32 new_size;
RDPDR_DEVICE** new_array;
new_size = settings->DeviceArraySize * 2;
new_size = freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize) * 2;
new_array =
(RDPDR_DEVICE**)realloc(settings->DeviceArray, new_size * sizeof(RDPDR_DEVICE*));
@@ -194,7 +197,8 @@ BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
return FALSE;
settings->DeviceArray = new_array;
settings->DeviceArraySize = new_size;
if (!freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, new_size))
return FALSE;
}
settings->DeviceArray[settings->DeviceCount++] = device;
@@ -448,21 +452,23 @@ void freerdp_device_collection_free(rdpSettings* settings)
}
free(settings->DeviceArray);
settings->DeviceArraySize = 0;
freerdp_settings_set_uint32(settings, FreeRDP_DeviceArraySize, 0);
settings->DeviceArray = NULL;
settings->DeviceCount = 0;
}
BOOL freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
{
UINT32 count;
if (!settings->StaticChannelArray)
return FALSE;
if (settings->StaticChannelArraySize < (settings->StaticChannelCount + 1))
if (freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelArraySize) <
(freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount) + 1))
{
UINT32 new_size;
ADDIN_ARGV** new_array;
new_size = settings->StaticChannelArraySize * 2;
new_size = freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelArraySize) * 2;
new_array =
(ADDIN_ARGV**)realloc(settings->StaticChannelArray, new_size * sizeof(ADDIN_ARGV*));
@@ -470,11 +476,13 @@ BOOL freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* ch
return FALSE;
settings->StaticChannelArray = new_array;
settings->StaticChannelArraySize = new_size;
if (!freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, new_size))
return FALSE;
}
settings->StaticChannelArray[settings->StaticChannelCount++] = channel;
return TRUE;
count = freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount);
settings->StaticChannelArray[count++] = channel;
return freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, count);
}
ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const char* name)
@@ -482,7 +490,8 @@ ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const
UINT32 index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->StaticChannelCount; index++)
for (index = 0; index < freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount);
index++)
{
channel = settings->StaticChannelArray[index];
@@ -532,7 +541,7 @@ void freerdp_static_channel_collection_free(rdpSettings* settings)
int j;
UINT32 i;
for (i = 0; i < settings->StaticChannelCount; i++)
for (i = 0; i < freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount); i++)
{
if (!settings->StaticChannelArray[i])
continue;
@@ -545,31 +554,36 @@ void freerdp_static_channel_collection_free(rdpSettings* settings)
}
free(settings->StaticChannelArray);
settings->StaticChannelArraySize = 0;
freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelArraySize, 0);
settings->StaticChannelArray = NULL;
settings->StaticChannelCount = 0;
freerdp_settings_set_uint32(settings, FreeRDP_StaticChannelCount, 0);
}
BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
{
UINT32 count;
if (!settings->DynamicChannelArray)
return FALSE;
if (settings->DynamicChannelArraySize < (settings->DynamicChannelCount + 1))
if (freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelArraySize) <
(freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount) + 1))
{
ADDIN_ARGV** new_array;
new_array = realloc(settings->DynamicChannelArray,
settings->DynamicChannelArraySize * sizeof(ADDIN_ARGV*) * 2);
const size_t size =
freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelArraySize) * 2;
new_array = realloc(settings->DynamicChannelArray, sizeof(ADDIN_ARGV*) * size);
if (!new_array)
return FALSE;
settings->DynamicChannelArraySize *= 2;
settings->DynamicChannelArray = new_array;
if (!freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, size))
return FALSE;
}
settings->DynamicChannelArray[settings->DynamicChannelCount++] = channel;
return TRUE;
count = freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount);
settings->DynamicChannelArray[count++] = channel;
return freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, count);
}
ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* settings, const char* name)
@@ -577,7 +591,8 @@ ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* settings, const
UINT32 index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->DynamicChannelCount; index++)
for (index = 0; index < freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount);
index++)
{
channel = settings->DynamicChannelArray[index];
@@ -627,7 +642,7 @@ void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
int j;
UINT32 i;
for (i = 0; i < settings->DynamicChannelCount; i++)
for (i = 0; i < freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount); i++)
{
if (!settings->DynamicChannelArray[i])
continue;
@@ -640,9 +655,9 @@ void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
}
free(settings->DynamicChannelArray);
settings->DynamicChannelArraySize = 0;
freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelArraySize, 0);
settings->DynamicChannelArray = NULL;
settings->DynamicChannelCount = 0;
freerdp_settings_set_uint32(settings, FreeRDP_DynamicChannelCount, 0);
}
void freerdp_target_net_addresses_free(rdpSettings* settings)
@@ -661,40 +676,60 @@ void freerdp_target_net_addresses_free(rdpSettings* settings)
void freerdp_performance_flags_make(rdpSettings* settings)
{
settings->PerformanceFlags = PERF_FLAG_NONE;
UINT32 PerformanceFlags = PERF_FLAG_NONE;
if (settings->AllowFontSmoothing)
settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
if (freerdp_settings_get_bool(settings, FreeRDP_AllowFontSmoothing))
PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
if (settings->AllowDesktopComposition)
settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
if (freerdp_settings_get_bool(settings, FreeRDP_AllowDesktopComposition))
PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
if (settings->DisableWallpaper)
settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER;
if (freerdp_settings_get_bool(settings, FreeRDP_DisableWallpaper))
PerformanceFlags |= PERF_DISABLE_WALLPAPER;
if (settings->DisableFullWindowDrag)
settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
if (freerdp_settings_get_bool(settings, FreeRDP_DisableFullWindowDrag))
PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
if (settings->DisableMenuAnims)
settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
if (freerdp_settings_get_bool(settings, FreeRDP_DisableMenuAnims))
PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
if (settings->DisableThemes)
settings->PerformanceFlags |= PERF_DISABLE_THEMING;
if (freerdp_settings_get_bool(settings, FreeRDP_DisableThemes))
PerformanceFlags |= PERF_DISABLE_THEMING;
freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, PerformanceFlags);
}
void freerdp_performance_flags_split(rdpSettings* settings)
{
settings->AllowFontSmoothing =
(settings->PerformanceFlags & PERF_ENABLE_FONT_SMOOTHING) ? TRUE : FALSE;
settings->AllowDesktopComposition =
(settings->PerformanceFlags & PERF_ENABLE_DESKTOP_COMPOSITION) ? TRUE : FALSE;
settings->DisableWallpaper =
(settings->PerformanceFlags & PERF_DISABLE_WALLPAPER) ? TRUE : FALSE;
settings->DisableFullWindowDrag =
(settings->PerformanceFlags & PERF_DISABLE_FULLWINDOWDRAG) ? TRUE : FALSE;
settings->DisableMenuAnims =
(settings->PerformanceFlags & PERF_DISABLE_MENUANIMATIONS) ? TRUE : FALSE;
settings->DisableThemes = (settings->PerformanceFlags & PERF_DISABLE_THEMING) ? TRUE : FALSE;
freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) &
PERF_ENABLE_FONT_SMOOTHING)
? TRUE
: FALSE);
freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) &
PERF_ENABLE_DESKTOP_COMPOSITION)
? TRUE
: FALSE);
freerdp_settings_set_bool(
settings, FreeRDP_DisableWallpaper,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & PERF_DISABLE_WALLPAPER)
? TRUE
: FALSE);
freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) &
PERF_DISABLE_FULLWINDOWDRAG)
? TRUE
: FALSE);
freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) &
PERF_DISABLE_MENUANIMATIONS)
? TRUE
: FALSE);
freerdp_settings_set_bool(
settings, FreeRDP_DisableThemes,
(freerdp_settings_get_uint32(settings, FreeRDP_PerformanceFlags) & PERF_DISABLE_THEMING)
? TRUE
: FALSE);
}
BOOL freerdp_set_gateway_usage_method(rdpSettings* settings, UINT32 GatewayUsageMethod)
@@ -926,6 +961,241 @@ BOOL freerdp_settings_set_value_for_name(rdpSettings* settings, const char* name
return FALSE;
}
static BOOL freerdp_settings_set_pointer_len_(rdpSettings* settings, size_t id, SSIZE_T lenId,
const void* data, size_t len)
{
BOOL rc;
void* copy;
void* old = freerdp_settings_get_pointer_writable(settings, id);
free(old);
if (!freerdp_settings_set_pointer(settings, id, NULL))
return FALSE;
if (lenId >= 0)
{
if (!freerdp_settings_set_uint32(settings, lenId, 0))
return FALSE;
}
if (len == 0)
return TRUE;
copy = calloc(len, 1);
if (!copy)
return FALSE;
if (data)
memcpy(copy, data, len);
rc = freerdp_settings_set_pointer(settings, id, copy);
if (!rc)
{
free(copy);
return FALSE;
}
if (lenId < 0)
return TRUE;
return freerdp_settings_set_uint32(settings, lenId, len);
}
const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id)
{
return freerdp_settings_get_pointer_writable(settings, id);
}
BOOL freerdp_settings_set_pointer_len(rdpSettings* settings, size_t id, const void* data,
size_t len)
{
if (!settings)
return FALSE;
switch (id)
{
case FreeRDP_RdpServerCertificate:
certificate_free(settings->RdpServerCertificate);
settings->RdpServerCertificate = data;
return TRUE;
case FreeRDP_RdpServerRsaKey:
key_free(settings->RdpServerRsaKey);
settings->RdpServerRsaKey = (rdpRsaKey*)data;
return TRUE;
case FreeRDP_RedirectionPassword:
return freerdp_settings_set_pointer_len_(settings, id,
FreeRDP_RedirectionPasswordLength, data, len);
case FreeRDP_RedirectionTsvUrl:
return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_RedirectionTsvUrlLength,
data, len);
case FreeRDP_LoadBalanceInfo:
return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_LoadBalanceInfoLength,
data, len);
case FreeRDP_ServerRandom:
return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_ServerRandomLength, data,
len);
case FreeRDP_ClientRandom:
return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_ClientRandomLength, data,
len);
case FreeRDP_ServerCertificate:
return freerdp_settings_set_pointer_len_(settings, id, FreeRDP_ServerCertificateLength,
data, len);
case FreeRDP_TargetNetAddresses:
if (data == NULL)
{
freerdp_target_net_addresses_free(settings);
if (!freerdp_settings_set_uint32(settings, FreeRDP_TargetNetAddressCount, len))
return FALSE;
}
return freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetAddresses,
FreeRDP_TargetNetAddressCount, data, len);
case FreeRDP_TargetNetPorts:
if (data == NULL)
{
freerdp_target_net_addresses_free(settings);
if (!freerdp_settings_set_uint32(settings, FreeRDP_TargetNetAddressCount, len))
return FALSE;
}
return freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetPorts,
FreeRDP_TargetNetAddressCount, data, len);
case FreeRDP_ClientAutoReconnectCookie:
case FreeRDP_ServerAutoReconnectCookie:
case FreeRDP_ChannelDefArray:
case FreeRDP_MonitorDefArray:
case FreeRDP_MonitorIds:
case FreeRDP_ReceivedCapabilities:
case FreeRDP_OrderSupport:
case FreeRDP_ClientTimeZone:
case FreeRDP_BitmapCacheV2CellInfo:
case FreeRDP_GlyphCache:
case FreeRDP_FragCache:
return freerdp_settings_set_pointer_len_(settings, id, -1, data, len);
default:
if ((data == NULL) && (len == 0))
{
freerdp_settings_set_pointer(settings, id, NULL);
}
else
WLog_WARN(TAG, "Invalid id %" PRIuz " for %s", id, __FUNCTION__);
return FALSE;
}
}
void* freerdp_settings_get_pointer_array_writable(const rdpSettings* settings, size_t id,
size_t offset)
{
if (!settings)
return NULL;
switch (id)
{
case FreeRDP_OrderSupport:
if (offset >= 32)
return FALSE;
return &settings->OrderSupport[offset];
case FreeRDP_MonitorIds:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds))
return NULL;
return &settings->MonitorIds[offset];
case FreeRDP_MonitorDefArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_MonitorDefArraySize))
return NULL;
return &settings->MonitorDefArray[offset];
case FreeRDP_ChannelDefArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize))
return NULL;
return &settings->ChannelDefArray[offset];
case FreeRDP_DeviceArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_DeviceArraySize))
return NULL;
return &settings->DeviceArray[offset];
case FreeRDP_StaticChannelArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelArraySize))
return NULL;
return settings->StaticChannelArray[offset];
case FreeRDP_DynamicChannelArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelArraySize))
return NULL;
return settings->DynamicChannelArray[offset];
case FreeRDP_FragCache:
if (offset >= 1)
return NULL;
return &settings->FragCache[offset];
case FreeRDP_GlyphCache:
if (offset >= 10)
return NULL;
return &settings->GlyphCache[offset];
case FreeRDP_BitmapCacheV2CellInfo:
/* TODO: BitmapCacheV2NumCells should be limited to 4
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_BitmapCacheV2NumCells))
return NULL;
*/
return &settings->BitmapCacheV2CellInfo[offset];
case FreeRDP_ReceivedCapabilities:
if (offset > settings->ReceivedCapabilitiesSize)
return 0;
return &settings->ReceivedCapabilities[offset];
default:
WLog_WARN(TAG, "Invalid id %" PRIuz " for %s", id, __FUNCTION__);
return NULL;
}
}
BOOL freerdp_settings_set_pointer_array(rdpSettings* settings, size_t id, size_t offset,
const void* data)
{
if (!settings)
return FALSE;
switch (id)
{
case FreeRDP_TargetNetAddresses:
if ((offset >= settings->TargetNetAddressCount) || !data)
return FALSE;
free(settings->TargetNetAddresses[offset]);
settings->TargetNetAddresses[offset] = _strdup((const char*)data);
return settings->TargetNetAddresses[offset] != NULL;
case FreeRDP_TargetNetPorts:
if ((offset >= settings->TargetNetAddressCount) || !data)
return FALSE;
settings->TargetNetPorts[offset] = *((const UINT32*)data);
return TRUE;
case FreeRDP_BitmapCacheV2CellInfo:
if ((offset > 5) || !data)
return FALSE;
settings->BitmapCacheV2CellInfo[offset] = *(const BITMAP_CACHE_V2_CELL_INFO*)data;
return TRUE;
case FreeRDP_OrderSupport:
if ((offset >= 32) || !data)
return FALSE;
settings->OrderSupport[offset] = *(const BOOL*)data;
return TRUE;
case FreeRDP_GlyphCache:
if ((offset >= 10) || !data)
return FALSE;
settings->GlyphCache[offset] = *(const GLYPH_CACHE_DEFINITION*)data;
return TRUE;
case FreeRDP_FragCache:
if ((offset >= 1) || !data)
return FALSE;
settings->FragCache[offset] = *(const GLYPH_CACHE_DEFINITION*)data;
return TRUE;
case FreeRDP_MonitorIds:
if ((offset > freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds)) || !data)
return FALSE;
settings->MonitorIds[offset] = *(const UINT32*)data;
return TRUE;
case FreeRDP_ChannelDefArray:
if (offset > freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize))
return FALSE;
settings->ChannelDefArray[offset] = *(const CHANNEL_DEF*)data;
return TRUE;
default:
WLog_WARN(TAG, "Invalid id %" PRIuz " for %s", id, __FUNCTION__);
return FALSE;
}
}
const void* freerdp_settings_get_pointer_array(const rdpSettings* settings, size_t id,
size_t offset)
{
return freerdp_settings_get_pointer_array_writable(settings, id, offset);
}
UINT32 freerdp_settings_get_codecs_flags(const rdpSettings* settings)
{
UINT32 flags = FREERDP_CODEC_ALL;
@@ -939,4 +1209,4 @@ UINT32 freerdp_settings_get_codecs_flags(const rdpSettings* settings)
}
/*TODO: check other codecs flags */
return flags;
}
}

View File

@@ -3,6 +3,8 @@
#include <freerdp/settings.h>
#include <freerdp/log.h>
#include "../core/settings.h"
#define TAG FREERDP_TAG("common.settings")
BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id)
@@ -1360,6 +1362,9 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id)
case FreeRDP_ExtEncryptionMethods:
return settings->ExtEncryptionMethods;
case FreeRDP_Floatbar:
return settings->Floatbar;
case FreeRDP_FrameAcknowledge:
return settings->FrameAcknowledge;
@@ -1579,6 +1584,9 @@ UINT32 freerdp_settings_get_uint32(const rdpSettings* settings, size_t id)
case FreeRDP_TcpKeepAliveRetries:
return settings->TcpKeepAliveRetries;
case FreeRDP_ThreadingFlags:
return settings->ThreadingFlags;
case FreeRDP_TlsSecLevel:
return settings->TlsSecLevel;
@@ -1741,6 +1749,10 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val)
settings->ExtEncryptionMethods = val;
break;
case FreeRDP_Floatbar:
settings->Floatbar = val;
break;
case FreeRDP_FrameAcknowledge:
settings->FrameAcknowledge = val;
break;
@@ -2033,6 +2045,10 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val)
settings->TcpKeepAliveRetries = val;
break;
case FreeRDP_ThreadingFlags:
settings->ThreadingFlags = val;
break;
case FreeRDP_TlsSecLevel:
settings->TlsSecLevel = val;
break;
@@ -2164,6 +2180,9 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id)
case FreeRDP_AcceptedCert:
return settings->AcceptedCert;
case FreeRDP_ActionScript:
return settings->ActionScript;
case FreeRDP_AllowedTlsCiphers:
return settings->AllowedTlsCiphers;
@@ -2368,7 +2387,8 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id)
}
}
BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char* val, BOOL cleanup)
BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char* val, size_t len,
BOOL cleanup)
{
if (!settings)
return FALSE;
@@ -2378,403 +2398,409 @@ BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char*
case FreeRDP_AcceptedCert:
if (cleanup)
free(settings->AcceptedCert);
settings->AcceptedCert = (val ? _strdup(val) : NULL);
settings->AcceptedCert = (val ? strndup(val, len) : NULL);
return (!val || settings->AcceptedCert != NULL);
case FreeRDP_ActionScript:
if (cleanup)
free(settings->ActionScript);
settings->ActionScript = (val ? strndup(val, len) : NULL);
return (!val || settings->ActionScript != NULL);
case FreeRDP_AllowedTlsCiphers:
if (cleanup)
free(settings->AllowedTlsCiphers);
settings->AllowedTlsCiphers = (val ? _strdup(val) : NULL);
settings->AllowedTlsCiphers = (val ? strndup(val, len) : NULL);
return (!val || settings->AllowedTlsCiphers != NULL);
case FreeRDP_AlternateShell:
if (cleanup)
free(settings->AlternateShell);
settings->AlternateShell = (val ? _strdup(val) : NULL);
settings->AlternateShell = (val ? strndup(val, len) : NULL);
return (!val || settings->AlternateShell != NULL);
case FreeRDP_AssistanceFile:
if (cleanup)
free(settings->AssistanceFile);
settings->AssistanceFile = (val ? _strdup(val) : NULL);
settings->AssistanceFile = (val ? strndup(val, len) : NULL);
return (!val || settings->AssistanceFile != NULL);
case FreeRDP_AuthenticationServiceClass:
if (cleanup)
free(settings->AuthenticationServiceClass);
settings->AuthenticationServiceClass = (val ? _strdup(val) : NULL);
settings->AuthenticationServiceClass = (val ? strndup(val, len) : NULL);
return (!val || settings->AuthenticationServiceClass != NULL);
case FreeRDP_CertificateAcceptedFingerprints:
if (cleanup)
free(settings->CertificateAcceptedFingerprints);
settings->CertificateAcceptedFingerprints = (val ? _strdup(val) : NULL);
settings->CertificateAcceptedFingerprints = (val ? strndup(val, len) : NULL);
return (!val || settings->CertificateAcceptedFingerprints != NULL);
case FreeRDP_CertificateContent:
if (cleanup)
free(settings->CertificateContent);
settings->CertificateContent = (val ? _strdup(val) : NULL);
settings->CertificateContent = (val ? strndup(val, len) : NULL);
return (!val || settings->CertificateContent != NULL);
case FreeRDP_CertificateFile:
if (cleanup)
free(settings->CertificateFile);
settings->CertificateFile = (val ? _strdup(val) : NULL);
settings->CertificateFile = (val ? strndup(val, len) : NULL);
return (!val || settings->CertificateFile != NULL);
case FreeRDP_CertificateName:
if (cleanup)
free(settings->CertificateName);
settings->CertificateName = (val ? _strdup(val) : NULL);
settings->CertificateName = (val ? strndup(val, len) : NULL);
return (!val || settings->CertificateName != NULL);
case FreeRDP_ClientAddress:
if (cleanup)
free(settings->ClientAddress);
settings->ClientAddress = (val ? _strdup(val) : NULL);
settings->ClientAddress = (val ? strndup(val, len) : NULL);
return (!val || settings->ClientAddress != NULL);
case FreeRDP_ClientDir:
if (cleanup)
free(settings->ClientDir);
settings->ClientDir = (val ? _strdup(val) : NULL);
settings->ClientDir = (val ? strndup(val, len) : NULL);
return (!val || settings->ClientDir != NULL);
case FreeRDP_ClientHostname:
if (cleanup)
free(settings->ClientHostname);
settings->ClientHostname = (val ? _strdup(val) : NULL);
settings->ClientHostname = (val ? strndup(val, len) : NULL);
return (!val || settings->ClientHostname != NULL);
case FreeRDP_ClientProductId:
if (cleanup)
free(settings->ClientProductId);
settings->ClientProductId = (val ? _strdup(val) : NULL);
settings->ClientProductId = (val ? strndup(val, len) : NULL);
return (!val || settings->ClientProductId != NULL);
case FreeRDP_ComputerName:
if (cleanup)
free(settings->ComputerName);
settings->ComputerName = (val ? _strdup(val) : NULL);
settings->ComputerName = (val ? strndup(val, len) : NULL);
return (!val || settings->ComputerName != NULL);
case FreeRDP_ConfigPath:
if (cleanup)
free(settings->ConfigPath);
settings->ConfigPath = (val ? _strdup(val) : NULL);
settings->ConfigPath = (val ? strndup(val, len) : NULL);
return (!val || settings->ConfigPath != NULL);
case FreeRDP_ConnectionFile:
if (cleanup)
free(settings->ConnectionFile);
settings->ConnectionFile = (val ? _strdup(val) : NULL);
settings->ConnectionFile = (val ? strndup(val, len) : NULL);
return (!val || settings->ConnectionFile != NULL);
case FreeRDP_CurrentPath:
if (cleanup)
free(settings->CurrentPath);
settings->CurrentPath = (val ? _strdup(val) : NULL);
settings->CurrentPath = (val ? strndup(val, len) : NULL);
return (!val || settings->CurrentPath != NULL);
case FreeRDP_Domain:
if (cleanup)
free(settings->Domain);
settings->Domain = (val ? _strdup(val) : NULL);
settings->Domain = (val ? strndup(val, len) : NULL);
return (!val || settings->Domain != NULL);
case FreeRDP_DrivesToRedirect:
if (cleanup)
free(settings->DrivesToRedirect);
settings->DrivesToRedirect = (val ? _strdup(val) : NULL);
settings->DrivesToRedirect = (val ? strndup(val, len) : NULL);
return (!val || settings->DrivesToRedirect != NULL);
case FreeRDP_DumpRemoteFxFile:
if (cleanup)
free(settings->DumpRemoteFxFile);
settings->DumpRemoteFxFile = (val ? _strdup(val) : NULL);
settings->DumpRemoteFxFile = (val ? strndup(val, len) : NULL);
return (!val || settings->DumpRemoteFxFile != NULL);
case FreeRDP_DynamicDSTTimeZoneKeyName:
if (cleanup)
free(settings->DynamicDSTTimeZoneKeyName);
settings->DynamicDSTTimeZoneKeyName = (val ? _strdup(val) : NULL);
settings->DynamicDSTTimeZoneKeyName = (val ? strndup(val, len) : NULL);
return (!val || settings->DynamicDSTTimeZoneKeyName != NULL);
case FreeRDP_GatewayAcceptedCert:
if (cleanup)
free(settings->GatewayAcceptedCert);
settings->GatewayAcceptedCert = (val ? _strdup(val) : NULL);
settings->GatewayAcceptedCert = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayAcceptedCert != NULL);
case FreeRDP_GatewayAccessToken:
if (cleanup)
free(settings->GatewayAccessToken);
settings->GatewayAccessToken = (val ? _strdup(val) : NULL);
settings->GatewayAccessToken = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayAccessToken != NULL);
case FreeRDP_GatewayDomain:
if (cleanup)
free(settings->GatewayDomain);
settings->GatewayDomain = (val ? _strdup(val) : NULL);
settings->GatewayDomain = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayDomain != NULL);
case FreeRDP_GatewayHostname:
if (cleanup)
free(settings->GatewayHostname);
settings->GatewayHostname = (val ? _strdup(val) : NULL);
settings->GatewayHostname = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayHostname != NULL);
case FreeRDP_GatewayPassword:
if (cleanup)
free(settings->GatewayPassword);
settings->GatewayPassword = (val ? _strdup(val) : NULL);
settings->GatewayPassword = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayPassword != NULL);
case FreeRDP_GatewayUsername:
if (cleanup)
free(settings->GatewayUsername);
settings->GatewayUsername = (val ? _strdup(val) : NULL);
settings->GatewayUsername = (val ? strndup(val, len) : NULL);
return (!val || settings->GatewayUsername != NULL);
case FreeRDP_HomePath:
if (cleanup)
free(settings->HomePath);
settings->HomePath = (val ? _strdup(val) : NULL);
settings->HomePath = (val ? strndup(val, len) : NULL);
return (!val || settings->HomePath != NULL);
case FreeRDP_ImeFileName:
if (cleanup)
free(settings->ImeFileName);
settings->ImeFileName = (val ? _strdup(val) : NULL);
settings->ImeFileName = (val ? strndup(val, len) : NULL);
return (!val || settings->ImeFileName != NULL);
case FreeRDP_KerberosKdc:
if (cleanup)
free(settings->KerberosKdc);
settings->KerberosKdc = (val ? _strdup(val) : NULL);
settings->KerberosKdc = (val ? strndup(val, len) : NULL);
return (!val || settings->KerberosKdc != NULL);
case FreeRDP_KerberosRealm:
if (cleanup)
free(settings->KerberosRealm);
settings->KerberosRealm = (val ? _strdup(val) : NULL);
settings->KerberosRealm = (val ? strndup(val, len) : NULL);
return (!val || settings->KerberosRealm != NULL);
case FreeRDP_KeyboardRemappingList:
if (cleanup)
free(settings->KeyboardRemappingList);
settings->KeyboardRemappingList = (val ? _strdup(val) : NULL);
settings->KeyboardRemappingList = (val ? strndup(val, len) : NULL);
return (!val || settings->KeyboardRemappingList != NULL);
case FreeRDP_NtlmSamFile:
if (cleanup)
free(settings->NtlmSamFile);
settings->NtlmSamFile = (val ? _strdup(val) : NULL);
settings->NtlmSamFile = (val ? strndup(val, len) : NULL);
return (!val || settings->NtlmSamFile != NULL);
case FreeRDP_Password:
if (cleanup)
free(settings->Password);
settings->Password = (val ? _strdup(val) : NULL);
settings->Password = (val ? strndup(val, len) : NULL);
return (!val || settings->Password != NULL);
case FreeRDP_PasswordHash:
if (cleanup)
free(settings->PasswordHash);
settings->PasswordHash = (val ? _strdup(val) : NULL);
settings->PasswordHash = (val ? strndup(val, len) : NULL);
return (!val || settings->PasswordHash != NULL);
case FreeRDP_PlayRemoteFxFile:
if (cleanup)
free(settings->PlayRemoteFxFile);
settings->PlayRemoteFxFile = (val ? _strdup(val) : NULL);
settings->PlayRemoteFxFile = (val ? strndup(val, len) : NULL);
return (!val || settings->PlayRemoteFxFile != NULL);
case FreeRDP_PreconnectionBlob:
if (cleanup)
free(settings->PreconnectionBlob);
settings->PreconnectionBlob = (val ? _strdup(val) : NULL);
settings->PreconnectionBlob = (val ? strndup(val, len) : NULL);
return (!val || settings->PreconnectionBlob != NULL);
case FreeRDP_PrivateKeyContent:
if (cleanup)
free(settings->PrivateKeyContent);
settings->PrivateKeyContent = (val ? _strdup(val) : NULL);
settings->PrivateKeyContent = (val ? strndup(val, len) : NULL);
return (!val || settings->PrivateKeyContent != NULL);
case FreeRDP_PrivateKeyFile:
if (cleanup)
free(settings->PrivateKeyFile);
settings->PrivateKeyFile = (val ? _strdup(val) : NULL);
settings->PrivateKeyFile = (val ? strndup(val, len) : NULL);
return (!val || settings->PrivateKeyFile != NULL);
case FreeRDP_ProxyHostname:
if (cleanup)
free(settings->ProxyHostname);
settings->ProxyHostname = (val ? _strdup(val) : NULL);
settings->ProxyHostname = (val ? strndup(val, len) : NULL);
return (!val || settings->ProxyHostname != NULL);
case FreeRDP_ProxyPassword:
if (cleanup)
free(settings->ProxyPassword);
settings->ProxyPassword = (val ? _strdup(val) : NULL);
settings->ProxyPassword = (val ? strndup(val, len) : NULL);
return (!val || settings->ProxyPassword != NULL);
case FreeRDP_ProxyUsername:
if (cleanup)
free(settings->ProxyUsername);
settings->ProxyUsername = (val ? _strdup(val) : NULL);
settings->ProxyUsername = (val ? strndup(val, len) : NULL);
return (!val || settings->ProxyUsername != NULL);
case FreeRDP_RDP2TCPArgs:
if (cleanup)
free(settings->RDP2TCPArgs);
settings->RDP2TCPArgs = (val ? _strdup(val) : NULL);
settings->RDP2TCPArgs = (val ? strndup(val, len) : NULL);
return (!val || settings->RDP2TCPArgs != NULL);
case FreeRDP_RdpKeyContent:
if (cleanup)
free(settings->RdpKeyContent);
settings->RdpKeyContent = (val ? _strdup(val) : NULL);
settings->RdpKeyContent = (val ? strndup(val, len) : NULL);
return (!val || settings->RdpKeyContent != NULL);
case FreeRDP_RdpKeyFile:
if (cleanup)
free(settings->RdpKeyFile);
settings->RdpKeyFile = (val ? _strdup(val) : NULL);
settings->RdpKeyFile = (val ? strndup(val, len) : NULL);
return (!val || settings->RdpKeyFile != NULL);
case FreeRDP_RedirectionAcceptedCert:
if (cleanup)
free(settings->RedirectionAcceptedCert);
settings->RedirectionAcceptedCert = (val ? _strdup(val) : NULL);
settings->RedirectionAcceptedCert = (val ? strndup(val, len) : NULL);
return (!val || settings->RedirectionAcceptedCert != NULL);
case FreeRDP_RedirectionDomain:
if (cleanup)
free(settings->RedirectionDomain);
settings->RedirectionDomain = (val ? _strdup(val) : NULL);
settings->RedirectionDomain = (val ? strndup(val, len) : NULL);
return (!val || settings->RedirectionDomain != NULL);
case FreeRDP_RedirectionTargetFQDN:
if (cleanup)
free(settings->RedirectionTargetFQDN);
settings->RedirectionTargetFQDN = (val ? _strdup(val) : NULL);
settings->RedirectionTargetFQDN = (val ? strndup(val, len) : NULL);
return (!val || settings->RedirectionTargetFQDN != NULL);
case FreeRDP_RedirectionTargetNetBiosName:
if (cleanup)
free(settings->RedirectionTargetNetBiosName);
settings->RedirectionTargetNetBiosName = (val ? _strdup(val) : NULL);
settings->RedirectionTargetNetBiosName = (val ? strndup(val, len) : NULL);
return (!val || settings->RedirectionTargetNetBiosName != NULL);
case FreeRDP_RedirectionUsername:
if (cleanup)
free(settings->RedirectionUsername);
settings->RedirectionUsername = (val ? _strdup(val) : NULL);
settings->RedirectionUsername = (val ? strndup(val, len) : NULL);
return (!val || settings->RedirectionUsername != NULL);
case FreeRDP_RemoteApplicationCmdLine:
if (cleanup)
free(settings->RemoteApplicationCmdLine);
settings->RemoteApplicationCmdLine = (val ? _strdup(val) : NULL);
settings->RemoteApplicationCmdLine = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationCmdLine != NULL);
case FreeRDP_RemoteApplicationFile:
if (cleanup)
free(settings->RemoteApplicationFile);
settings->RemoteApplicationFile = (val ? _strdup(val) : NULL);
settings->RemoteApplicationFile = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationFile != NULL);
case FreeRDP_RemoteApplicationGuid:
if (cleanup)
free(settings->RemoteApplicationGuid);
settings->RemoteApplicationGuid = (val ? _strdup(val) : NULL);
settings->RemoteApplicationGuid = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationGuid != NULL);
case FreeRDP_RemoteApplicationIcon:
if (cleanup)
free(settings->RemoteApplicationIcon);
settings->RemoteApplicationIcon = (val ? _strdup(val) : NULL);
settings->RemoteApplicationIcon = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationIcon != NULL);
case FreeRDP_RemoteApplicationName:
if (cleanup)
free(settings->RemoteApplicationName);
settings->RemoteApplicationName = (val ? _strdup(val) : NULL);
settings->RemoteApplicationName = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationName != NULL);
case FreeRDP_RemoteApplicationProgram:
if (cleanup)
free(settings->RemoteApplicationProgram);
settings->RemoteApplicationProgram = (val ? _strdup(val) : NULL);
settings->RemoteApplicationProgram = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationProgram != NULL);
case FreeRDP_RemoteApplicationWorkingDir:
if (cleanup)
free(settings->RemoteApplicationWorkingDir);
settings->RemoteApplicationWorkingDir = (val ? _strdup(val) : NULL);
settings->RemoteApplicationWorkingDir = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteApplicationWorkingDir != NULL);
case FreeRDP_RemoteAssistancePassStub:
if (cleanup)
free(settings->RemoteAssistancePassStub);
settings->RemoteAssistancePassStub = (val ? _strdup(val) : NULL);
settings->RemoteAssistancePassStub = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteAssistancePassStub != NULL);
case FreeRDP_RemoteAssistancePassword:
if (cleanup)
free(settings->RemoteAssistancePassword);
settings->RemoteAssistancePassword = (val ? _strdup(val) : NULL);
settings->RemoteAssistancePassword = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteAssistancePassword != NULL);
case FreeRDP_RemoteAssistanceRCTicket:
if (cleanup)
free(settings->RemoteAssistanceRCTicket);
settings->RemoteAssistanceRCTicket = (val ? _strdup(val) : NULL);
settings->RemoteAssistanceRCTicket = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteAssistanceRCTicket != NULL);
case FreeRDP_RemoteAssistanceSessionId:
if (cleanup)
free(settings->RemoteAssistanceSessionId);
settings->RemoteAssistanceSessionId = (val ? _strdup(val) : NULL);
settings->RemoteAssistanceSessionId = (val ? strndup(val, len) : NULL);
return (!val || settings->RemoteAssistanceSessionId != NULL);
case FreeRDP_ServerHostname:
if (cleanup)
free(settings->ServerHostname);
settings->ServerHostname = (val ? _strdup(val) : NULL);
settings->ServerHostname = (val ? strndup(val, len) : NULL);
return (!val || settings->ServerHostname != NULL);
case FreeRDP_ShellWorkingDirectory:
if (cleanup)
free(settings->ShellWorkingDirectory);
settings->ShellWorkingDirectory = (val ? _strdup(val) : NULL);
settings->ShellWorkingDirectory = (val ? strndup(val, len) : NULL);
return (!val || settings->ShellWorkingDirectory != NULL);
case FreeRDP_TargetNetAddress:
if (cleanup)
free(settings->TargetNetAddress);
settings->TargetNetAddress = (val ? _strdup(val) : NULL);
settings->TargetNetAddress = (val ? strndup(val, len) : NULL);
return (!val || settings->TargetNetAddress != NULL);
case FreeRDP_Username:
if (cleanup)
free(settings->Username);
settings->Username = (val ? _strdup(val) : NULL);
settings->Username = (val ? strndup(val, len) : NULL);
return (!val || settings->Username != NULL);
case FreeRDP_WindowTitle:
if (cleanup)
free(settings->WindowTitle);
settings->WindowTitle = (val ? _strdup(val) : NULL);
settings->WindowTitle = (val ? strndup(val, len) : NULL);
return (!val || settings->WindowTitle != NULL);
case FreeRDP_WmClass:
if (cleanup)
free(settings->WmClass);
settings->WmClass = (val ? _strdup(val) : NULL);
settings->WmClass = (val ? strndup(val, len) : NULL);
return (!val || settings->WmClass != NULL);
default:
@@ -2784,12 +2810,20 @@ BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char*
return TRUE;
}
BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id, const char* val)
BOOL freerdp_settings_set_string_len(rdpSettings* settings, size_t id, const char* val, size_t len)
{
return freerdp_settings_set_string_(settings, id, val, TRUE);
return freerdp_settings_set_string_(settings, id, val, len, TRUE);
}
const void* freerdp_settings_get_pointer(const rdpSettings* settings, size_t id)
BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id, const char* val)
{
size_t len = 0;
if (val)
len = strlen(val);
return freerdp_settings_set_string_(settings, id, val, len, TRUE);
}
void* freerdp_settings_get_pointer_writable(const rdpSettings* settings, size_t id)
{
if (!settings)
return FALSE;

View File

@@ -215,6 +215,7 @@ static const struct settings_str_entry settings_map[] = {
{ FreeRDP_EncryptionLevel, 3, "FreeRDP_EncryptionLevel" },
{ FreeRDP_EncryptionMethods, 3, "FreeRDP_EncryptionMethods" },
{ FreeRDP_ExtEncryptionMethods, 3, "FreeRDP_ExtEncryptionMethods" },
{ FreeRDP_Floatbar, 3, "FreeRDP_Floatbar" },
{ FreeRDP_FrameAcknowledge, 3, "FreeRDP_FrameAcknowledge" },
{ FreeRDP_GatewayAcceptedCertLength, 3, "FreeRDP_GatewayAcceptedCertLength" },
{ FreeRDP_GatewayCredentialsSource, 3, "FreeRDP_GatewayCredentialsSource" },
@@ -288,6 +289,7 @@ static const struct settings_str_entry settings_map[] = {
{ FreeRDP_TcpKeepAliveDelay, 3, "FreeRDP_TcpKeepAliveDelay" },
{ FreeRDP_TcpKeepAliveInterval, 3, "FreeRDP_TcpKeepAliveInterval" },
{ FreeRDP_TcpKeepAliveRetries, 3, "FreeRDP_TcpKeepAliveRetries" },
{ FreeRDP_ThreadingFlags, 3, "FreeRDP_ThreadingFlags" },
{ FreeRDP_TlsSecLevel, 3, "FreeRDP_TlsSecLevel" },
{ FreeRDP_VirtualChannelChunkSize, 3, "FreeRDP_VirtualChannelChunkSize" },
{ FreeRDP_VirtualChannelCompressionFlags, 3, "FreeRDP_VirtualChannelCompressionFlags" },
@@ -295,6 +297,7 @@ static const struct settings_str_entry settings_map[] = {
{ FreeRDP_YPan, 4, "FreeRDP_YPan" },
{ FreeRDP_ParentWindowId, 5, "FreeRDP_ParentWindowId" },
{ FreeRDP_AcceptedCert, 7, "FreeRDP_AcceptedCert" },
{ FreeRDP_ActionScript, 7, "FreeRDP_ActionScript" },
{ FreeRDP_AllowedTlsCiphers, 7, "FreeRDP_AllowedTlsCiphers" },
{ FreeRDP_AlternateShell, 7, "FreeRDP_AlternateShell" },
{ FreeRDP_AssistanceFile, 7, "FreeRDP_AssistanceFile" },
@@ -449,7 +452,10 @@ BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src)
case 7: /* strings */
{
const char* sval = freerdp_settings_get_string(src, cur->id);
if (!freerdp_settings_set_string_(dst, cur->id, sval, FALSE))
size_t len = 0;
if (sval)
len = strlen(sval);
if (!freerdp_settings_set_string_(dst, cur->id, sval, len, FALSE))
return FALSE;
}
break;
@@ -540,10 +546,10 @@ void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup)
switch (cur->type)
{
case 7: /* strings */
freerdp_settings_set_string_(dst, cur->id, NULL, cleanup);
freerdp_settings_set_string_(dst, cur->id, NULL, 0, cleanup);
break;
case 8: /* pointer */
freerdp_settings_set_pointer(dst, cur->id, NULL);
freerdp_settings_set_pointer_len(dst, cur->id, NULL, 0);
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,15 +21,30 @@
#ifndef FREERDP_LIB_CORE_SETTINGS_H
#define FREERDP_LIB_CORE_SETTINGS_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <freerdp/types.h>
#include <freerdp/settings.h>
#include <freerdp/api.h>
#include <string.h>
#if !defined(HAVE_STRNDUP)
static INLINE char* strndup(const char* src, size_t len)
{
char* dst = calloc(len + 1, sizeof(char));
if (dst)
strncpy(dst, src, len);
return dst;
}
#endif
FREERDP_LOCAL BOOL freerdp_settings_set_default_order_support(rdpSettings* settings);
FREERDP_LOCAL BOOL freerdp_settings_set_pointer(rdpSettings* dst, size_t index, const void* ptr);
FREERDP_LOCAL BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src);
FREERDP_LOCAL void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup);
FREERDP_LOCAL BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char* val,
BOOL cleanup);
size_t len, BOOL cleanup);
#endif /* FREERDP_LIB_CORE_SETTINGS_H */

View File

@@ -212,6 +212,7 @@ static const size_t uint32_list_indices[] = {
FreeRDP_EncryptionLevel,
FreeRDP_EncryptionMethods,
FreeRDP_ExtEncryptionMethods,
FreeRDP_Floatbar,
FreeRDP_FrameAcknowledge,
FreeRDP_GatewayAcceptedCertLength,
FreeRDP_GatewayCredentialsSource,
@@ -285,6 +286,7 @@ static const size_t uint32_list_indices[] = {
FreeRDP_TcpKeepAliveDelay,
FreeRDP_TcpKeepAliveInterval,
FreeRDP_TcpKeepAliveRetries,
FreeRDP_ThreadingFlags,
FreeRDP_TlsSecLevel,
FreeRDP_VirtualChannelChunkSize,
FreeRDP_VirtualChannelCompressionFlags,
@@ -304,6 +306,7 @@ static const size_t uint64_list_indices[] = {
#define have_string_list_indices
static const size_t string_list_indices[] = {
FreeRDP_AcceptedCert,
FreeRDP_ActionScript,
FreeRDP_AllowedTlsCiphers,
FreeRDP_AlternateShell,
FreeRDP_AssistanceFile,

View File

@@ -110,7 +110,9 @@ def write_str(f, entry_dict):
f.write('\t\t\tcase 7: /* strings */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tconst char* sval = freerdp_settings_get_string(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_string_(dst, cur->id, sval, FALSE))\n')
f.write('\t\t\t\t\tsize_t len = 0;\n')
f.write('\t\t\t\t\tif (sval) len = strlen(sval);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_string_(dst, cur->id, sval, len, FALSE))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
@@ -204,10 +206,10 @@ def write_str(f, entry_dict):
f.write('\t\tswitch(cur->type)\n')
f.write('\t\t{\n')
f.write('\t\t\tcase 7: /* strings */\n')
f.write('\t\t\t\tfreerdp_settings_set_string_(dst, cur->id, NULL, cleanup);\n')
f.write('\t\t\t\tfreerdp_settings_set_string_(dst, cur->id, NULL, 0, cleanup);\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 8: /* pointer */\n')
f.write('\t\t\t\tfreerdp_settings_set_pointer(dst, cur->id, NULL);\n')
f.write('\t\t\t\tfreerdp_settings_set_pointer_len(dst, cur->id, NULL, 0);\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t}\n')
f.write('\t}\n')
@@ -273,12 +275,15 @@ def write_getter(f, entry_dict, entry_type, entry_name):
values = get_values(entry_dict, entry_type)
if isPointer:
f.write('const void*')
f.write('void*')
elif isString:
f.write('const ' + entry_type)
else:
f.write(entry_type)
f.write(' freerdp_settings_get_' + entry_name.lower() + '(const rdpSettings* settings, size_t id)\n')
if isPointer:
f.write(' freerdp_settings_get_pointer_writable(const rdpSettings* settings, size_t id)\n')
else:
f.write(' freerdp_settings_get_' + entry_name.lower() + '(const rdpSettings* settings, size_t id)\n')
f.write('{\n')
f.write('\tif (!settings)\n')
f.write('\t\treturn FALSE;\n\n')
@@ -304,7 +309,7 @@ def write_setter_case(f, val, isString, isPointer):
else:
f.write('\t\t\tif (cleanup)\n')
f.write('\t\t\t\tfree(settings->' + val + ');\n')
f.write('\t\t\tsettings->' + val + ' = (val ? _strdup(val) : NULL);\n')
f.write('\t\t\tsettings->' + val + ' = (val ? strndup(val, len) : NULL);\n')
f.write('\t\t\treturn (!val || settings->' + val + ' != NULL);\n\n')
def write_setter(f, entry_dict, entry_type, entry_name):
@@ -323,7 +328,7 @@ def write_setter(f, entry_dict, entry_type, entry_name):
else:
f.write('void* val')
if isString:
f.write(', BOOL cleanup)\n')
f.write(', size_t len, BOOL cleanup)\n')
else:
f.write(')\n')
f.write('{\n')
@@ -342,16 +347,17 @@ def write_setter(f, entry_dict, entry_type, entry_name):
f.write('}\n\n')
f.write('\n')
if isString:
f.write('BOOL freerdp_settings_set_' + entry_name.lower() + '(rdpSettings* settings, size_t id, ')
if isString or isPointer:
f.write('const ')
if not isPointer:
f.write(entry_type + ' val')
else:
f.write('void* val')
f.write(')\n')
f.write('BOOL freerdp_settings_set_string_len(rdpSettings* settings, size_t id, const char* val, size_t len)\n')
f.write('{\n')
f.write('\treturn freerdp_settings_set_' + entry_name.lower() + '_(settings, id, val, TRUE);\n')
f.write('\treturn freerdp_settings_set_string_(settings, id, val, len, TRUE);\n')
f.write('}\n')
f.write('\n')
f.write('BOOL freerdp_settings_set_string(rdpSettings* settings, size_t id, const char* val)\n')
f.write('{\n')
f.write('\tsize_t len = 0;\n')
f.write('\tif (val) len = strlen(val);\n')
f.write('\treturn freerdp_settings_set_string_(settings, id, val, len, TRUE);\n')
f.write('}\n')
f.write('\n')
@@ -399,6 +405,7 @@ try:
f.write('/* Generated by ' + '' + ' */\n\n')
f.write('#include <freerdp/settings.h>\n')
f.write('#include <freerdp/log.h>\n\n')
f.write('#include "../core/settings.h"\n\n')
f.write('#define TAG FREERDP_TAG("common.settings")\n\n')
getter_list = dict(type_list)