From b70ecbbf62610e42016cc7e10797c152982de938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sat, 12 Oct 2013 18:20:25 -0400 Subject: [PATCH] libfreerdp-core: decouple initialization of rdpSettings from freerdp* instance --- client/common/client.c | 1 + include/freerdp/client.h | 2 ++ include/freerdp/freerdp.h | 4 +++- include/freerdp/settings.h | 7 ++++++- libfreerdp/core/freerdp.c | 3 +++ libfreerdp/core/peer.c | 2 ++ libfreerdp/core/rdp.c | 13 +++++++++++-- libfreerdp/core/settings.c | 11 +++-------- winpr/libwinpr/sspi/test/TestSchannel.c | 2 -- 9 files changed, 31 insertions(+), 14 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index d43375a10..d560fa310 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -50,6 +50,7 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) pEntryPoints->GlobalInit(); instance = freerdp_new(); + instance->settings = pEntryPoints->settings; instance->ContextSize = pEntryPoints->ContextSize; instance->ContextNew = freerdp_client_common_new; instance->ContextFree = freerdp_client_common_free; diff --git a/include/freerdp/client.h b/include/freerdp/client.h index ddca7169c..721ab935c 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -45,6 +45,8 @@ struct rdp_client_entry_points_v1 DWORD Size; DWORD Version; + rdpSettings* settings; + pRdpGlobalInit GlobalInit; pRdpGlobalUninit GlobalUninit; diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 881c92fbc..a7a4182f0 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -82,7 +82,9 @@ struct rdp_context Pointer to the client peer. This is set by a call to freerdp_peer_context_new() during peer initialization. This field is used only on the server side. */ - UINT64 paddingA[16 - 2]; /* 2 */ + ALIGN64 BOOL ServerMode; /**< (offset 2) true when context is in server mode */ + + UINT64 paddingA[16 - 3]; /* 3 */ ALIGN64 int argc; /**< (offset 16) Number of arguments given to the program at launch time. diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 6f5507050..19772bf73 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -1299,7 +1299,12 @@ typedef struct rdp_settings rdpSettings; extern "C" { #endif -FREERDP_API rdpSettings* freerdp_settings_new(void* instance); +/** + * rdpSettings creation flags + */ +#define FREERDP_SETTINGS_SERVER_MODE 0x00000001 + +FREERDP_API rdpSettings* freerdp_settings_new(DWORD flags); FREERDP_API void freerdp_settings_free(rdpSettings* settings); FREERDP_API int freerdp_addin_set_argument(ADDIN_ARGV* args, char* argument); diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index b0b865180..c416c51b9 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -385,6 +385,9 @@ int freerdp_context_new(freerdp* instance) context = instance->context; context->instance = instance; + context->ServerMode = FALSE; + context->settings = instance->settings; + context->pubSub = PubSub_New(TRUE); PubSub_AddEventTypes(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEventType)); diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index 64a54ff4b..d0c05af6b 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -406,6 +406,8 @@ void freerdp_peer_context_new(freerdp_peer* client) client->context = (rdpContext*) malloc(client->ContextSize); ZeroMemory(client->context, client->ContextSize); + client->context->ServerMode = TRUE; + rdp = rdp_new(client->context); client->input = rdp->input; diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 80089e2fb..e2198c69f 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -987,6 +987,7 @@ int rdp_check_fds(rdpRdp* rdp) rdpRdp* rdp_new(rdpContext* context) { rdpRdp* rdp; + DWORD flags; rdp = (rdpRdp*) malloc(sizeof(rdpRdp)); @@ -995,9 +996,17 @@ rdpRdp* rdp_new(rdpContext* context) ZeroMemory(rdp, sizeof(rdpRdp)); rdp->context = context; - rdp->instance = context->instance; - rdp->settings = freerdp_settings_new((void*) context->instance); + + flags = 0; + + if (context->ServerMode) + flags |= FREERDP_SETTINGS_SERVER_MODE; + + if (!rdp->settings) + rdp->settings = freerdp_settings_new(flags); + + rdp->settings->instance = context->instance; if (context->instance) context->instance->settings = rdp->settings; diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index ea719aae3..ae5351583 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -198,22 +198,17 @@ void settings_get_computer_name(rdpSettings* settings) GetComputerNameExA(ComputerNameNetBIOS, settings->ComputerName, &nSize); } -rdpSettings* freerdp_settings_new(void* instance) +rdpSettings* freerdp_settings_new(DWORD flags) { rdpSettings* settings; settings = (rdpSettings*) malloc(sizeof(rdpSettings)); - if (settings != NULL) + if (settings) { ZeroMemory(settings, sizeof(rdpSettings)); - settings->instance = instance; - - /* Server instances are NULL */ - - if (!settings->instance) - settings->ServerMode = TRUE; + settings->ServerMode = (flags & FREERDP_SETTINGS_SERVER_MODE) ? TRUE : FALSE; settings->DesktopWidth = 1024; settings->DesktopHeight = 768; diff --git a/winpr/libwinpr/sspi/test/TestSchannel.c b/winpr/libwinpr/sspi/test/TestSchannel.c index 836e0470f..c6835b6e2 100644 --- a/winpr/libwinpr/sspi/test/TestSchannel.c +++ b/winpr/libwinpr/sspi/test/TestSchannel.c @@ -575,8 +575,6 @@ static void* schannel_test_server_thread(void* arg) int dump_test_certificate_files() { FILE* fp; - int length; - char* filename; char* fullpath; /*