xfreerdp: refactor simplified client API to offer a single entry point

This commit is contained in:
Marc-André Moreau 2013-06-13 20:25:50 -04:00
parent 8eaa32ac8f
commit 3f25a5dea3
6 changed files with 106 additions and 64 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -34,8 +34,6 @@
#include <winpr/synch.h>
#include <winpr/thread.h>
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

View File

@ -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"

View File

@ -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

View File

@ -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);