From 3f25a5dea3489bfb4c10852ae648702ad079f481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 13 Jun 2013 20:25:50 -0400 Subject: [PATCH] xfreerdp: refactor simplified client API to offer a single entry point --- client/X11/cli/xfreerdp.c | 45 ++++++++++++++++----- client/X11/xf_interface.c | 78 ++++++++++++++++-------------------- client/X11/xf_interface.h | 4 +- client/X11/xfreerdp.h | 2 + client/common/CMakeLists.txt | 1 + include/freerdp/client.h | 40 ++++++++++++++---- 6 files changed, 106 insertions(+), 64 deletions(-) diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index 8619fbad2..e71e1d588 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -32,32 +32,57 @@ #include "xfreerdp.h" +void client_context_new(freerdp* instance, rdpContext* context) +{ + context->channels = freerdp_channels_new(); +} + +void client_context_free(freerdp* instance, rdpContext* context) +{ + +} + int main(int argc, char* argv[]) { xfContext* xfc; DWORD dwExitCode; freerdp* instance; + rdpContext* context; + RDP_CLIENT_ENTRY_POINTS clientEntryPoints; - freerdp_client_global_init(); + ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); + clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; - xfc = freerdp_client_new(argc, argv); + RdpClientEntry(&clientEntryPoints); - if (xfc == NULL) - { - return 1; - } + clientEntryPoints.GlobalInit(); - instance = xfc->instance; + instance = freerdp_new(); + instance->context_size = clientEntryPoints.ContextSize; + instance->ContextNew = client_context_new; + instance->ContextFree = client_context_free; + freerdp_context_new(instance); - freerdp_client_start(xfc); + context = instance->context; + xfc = (xfContext*) context; + + context->argc = argc; + context->argv = argv; + + clientEntryPoints.ClientNew(context); + + clientEntryPoints.ClientStart(context); WaitForSingleObject(xfc->thread, INFINITE); GetExitCodeThread(xfc->thread, &dwExitCode); - freerdp_client_free(xfc); + clientEntryPoints.ClientStop(context); - freerdp_client_global_uninit(); + clientEntryPoints.ClientFree(context); + + clientEntryPoints.GlobalUninit(); return xf_exit_code_from_disconnect_reason(dwExitCode); } diff --git a/client/X11/xf_interface.c b/client/X11/xf_interface.c index 6f0720b46..5538269ac 100644 --- a/client/X11/xf_interface.c +++ b/client/X11/xf_interface.c @@ -123,7 +123,7 @@ void xf_draw_screen_scaled(xfContext* xfc) void xf_context_new(freerdp* instance, rdpContext* context) { - context->channels = freerdp_channels_new(); + } void xf_context_free(freerdp* instance, rdpContext* context) @@ -1270,6 +1270,7 @@ void* xf_thread(void* param) exit_code = XF_EXIT_CONN_FAILED; ExitThread(exit_code); } + channels = instance->context->channels; settings = instance->context->settings; @@ -1494,20 +1495,16 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason) * Client Interface */ -int freerdp_client_global_init() +void freerdp_client_global_init() { setlocale(LC_ALL, ""); freerdp_handle_signals(); freerdp_channels_global_init(); - - return 0; } -int freerdp_client_global_uninit() +void freerdp_client_global_uninit() { freerdp_channels_global_uninit(); - - return 0; } int freerdp_client_start(rdpContext* context) @@ -1522,7 +1519,7 @@ int freerdp_client_start(rdpContext* context) return -1; } - xfc->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, (void*) xfc->instance, 0, NULL); + xfc->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, context->instance, 0, NULL); return 0; } @@ -1531,7 +1528,7 @@ int freerdp_client_stop(rdpContext* context) { xfContext* xfc = (xfContext*) context; - if (context->instance->settings->AsyncInput) + if (context->settings->AsyncInput) { wMessageQueue* queue; queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE); @@ -1577,16 +1574,16 @@ void freerdp_client_reset_scale(rdpContext* context) xf_draw_screen_scaled(xfc); } -rdpContext* freerdp_client_new(int argc, char** argv) +int freerdp_client_new(rdpContext* context) { - int index; int status; xfContext* xfc; - rdpFile* file; freerdp* instance; rdpSettings* settings; - instance = freerdp_new(); + instance = context->instance; + xfc = (xfContext*) instance->context; + instance->PreConnect = xf_pre_connect; instance->PostConnect = xf_post_connect; instance->Authenticate = xf_authenticate; @@ -1594,40 +1591,24 @@ rdpContext* freerdp_client_new(int argc, char** argv) instance->LogonErrorInfo = xf_logon_error_info; instance->ReceiveChannelData = xf_receive_channel_data; - instance->context_size = sizeof(xfContext); - instance->ContextNew = (pContextNew) xf_context_new; - instance->ContextFree = (pContextFree) xf_context_free; - freerdp_context_new(instance); - - instance->context->argc = argc; - instance->context->argv = (char**) malloc(sizeof(char*) * argc); - - for (index = 0; index < argc; index++) - instance->context->argv[index] = _strdup(argv[index]); - - xfc = (xfContext*) instance->context; - - xfc->instance = instance; settings = instance->settings; xfc->client = instance->context->client; xfc->settings = instance->context->settings; - status = freerdp_client_parse_command_line_arguments(instance->context->argc, - instance->context->argv, settings); + status = freerdp_client_parse_command_line_arguments(context->argc, context->argv, settings); + if (status < 0) { freerdp_context_free(xfc->instance); freerdp_free(xfc->instance); free(xfc); - return NULL; + return -1; } if (settings->ConnectionFile) { - file = freerdp_client_rdp_file_new(); - + rdpFile* file = freerdp_client_rdp_file_new(); fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); - freerdp_client_parse_rdp_file(file, settings->ConnectionFile); freerdp_client_populate_settings_from_rdp_file(file, settings); } @@ -1648,19 +1629,15 @@ rdpContext* freerdp_client_new(int argc, char** argv) settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; settings->OrderSupport[NEG_MEMBLT_INDEX] = settings->BitmapCacheEnabled; - settings->OrderSupport[NEG_MEM3BLT_INDEX] = (settings->SoftwareGdi) ? TRUE : FALSE; - settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = settings->BitmapCacheEnabled; settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE; settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE; settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE; settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = TRUE; - settings->OrderSupport[NEG_POLYGON_SC_INDEX] = (settings->SoftwareGdi) ? FALSE : TRUE; settings->OrderSupport[NEG_POLYGON_CB_INDEX] = (settings->SoftwareGdi) ? FALSE : TRUE; - settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; @@ -1669,12 +1646,11 @@ rdpContext* freerdp_client_new(int argc, char** argv) xf_list_monitors(xfc); } - return (rdpContext*) xfc; + return 0; } void freerdp_client_free(rdpContext* context) { - int index; freerdp* instance; xfContext* xfc = (xfContext*) context; @@ -1688,12 +1664,26 @@ void freerdp_client_free(rdpContext* context) XCloseDisplay(xfc->display); - for (index = 0; index < context->argc; index++) - free(context->argv[index]); - - free(context->argv); - freerdp_context_free(instance); freerdp_free(instance); } } + +int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + pEntryPoints->Version = 1; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); + + pEntryPoints->ContextSize = sizeof(xfContext); + + pEntryPoints->GlobalInit = freerdp_client_global_init; + pEntryPoints->GlobalUninit = freerdp_client_global_uninit; + + pEntryPoints->ClientNew = freerdp_client_new; + pEntryPoints->ClientFree = freerdp_client_free; + + pEntryPoints->ClientStart = freerdp_client_start; + pEntryPoints->ClientStop = freerdp_client_stop; + + return 0; +} diff --git a/client/X11/xf_interface.h b/client/X11/xf_interface.h index bfabc114e..6710ca37b 100644 --- a/client/X11/xf_interface.h +++ b/client/X11/xf_interface.h @@ -34,8 +34,6 @@ #include #include -typedef struct xf_context xfContext; - #ifdef __cplusplus extern "C" { #endif @@ -44,6 +42,8 @@ extern "C" { * Client Interface */ +FREERDP_API int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); + #ifdef __cplusplus } #endif diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index e9bf35144..54bd5dbab 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -20,6 +20,8 @@ #ifndef __XFREERDP_H #define __XFREERDP_H +typedef struct xf_context xfContext; + #include "xf_window.h" #include "xf_monitor.h" #include "xf_channels.h" diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 36961e214..e249cd0db 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -19,6 +19,7 @@ set(MODULE_NAME "freerdp-client") set(MODULE_PREFIX "FREERDP_CLIENT") set(${MODULE_PREFIX}_SRCS + client.c cmdline.c compatibility.c compatibility.h diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 23b041bdc..6dd7dd996 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -52,13 +52,40 @@ struct rdp_client * Generic Client Interface */ -// Public API functions +typedef void (*pRdpGlobalInit)(void); +typedef void (*pRdpGlobalUninit)(void); -FREERDP_API int freerdp_client_global_init(); -FREERDP_API int freerdp_client_global_uninit(); +typedef int (*pRdpClientNew)(rdpContext* context); +typedef void (*pRdpClientFree)(rdpContext* context); -FREERDP_API int freerdp_client_start(rdpContext* context); -FREERDP_API int freerdp_client_stop(rdpContext* context); +typedef int (*pRdpClientStart)(rdpContext* context); +typedef int (*pRdpClientStop)(rdpContext* context); + +struct rdp_client_entry_points_v1 +{ + DWORD Size; + DWORD Version; + + DWORD ContextSize; + + pRdpGlobalInit GlobalInit; + pRdpGlobalUninit GlobalUninit; + + pRdpClientNew ClientNew; + pRdpClientFree ClientFree; + + pRdpClientStart ClientStart; + pRdpClientStop ClientStop; +}; +typedef struct rdp_client_entry_points_v1 RDP_CLIENT_ENTRY_POINTS_V1; + +#define RDP_CLIENT_INTERFACE_VERSION 1 +#define RDP_CLIENT_ENTRY_POINT_NAME "RdpClientEntry" +typedef RDP_CLIENT_ENTRY_POINTS_V1 RDP_CLIENT_ENTRY_POINTS; + +typedef int (*pRdpClientEntry)(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); + +/* Common client functions */ FREERDP_API freerdp* freerdp_client_get_instance(rdpContext* context); FREERDP_API HANDLE freerdp_client_get_thread(rdpContext* context); @@ -66,9 +93,6 @@ FREERDP_API rdpClient* freerdp_client_get_interface(rdpContext* context); FREERDP_API double freerdp_client_get_scale(rdpContext* context); FREERDP_API void freerdp_client_reset_scale(rdpContext* context); -FREERDP_API rdpContext* freerdp_client_new(int argc, char** argv); -FREERDP_API void freerdp_client_free(rdpContext* cfc); - FREERDP_API BOOL freerdp_client_get_param_bool(rdpContext* context, int id); FREERDP_API int freerdp_client_set_param_bool(rdpContext* context, int id, BOOL param);