Callback function handling

Added possibility for the client to register for callback from FreeRDP.

Currently supported callback events:
- setting value changed
- connected
- disconnected
This commit is contained in:
Benoit LeBlanc 2013-04-19 10:06:26 -04:00
parent 315f3705b2
commit 3549e97abb
2 changed files with 60 additions and 29 deletions

View File

@ -416,6 +416,12 @@ BOOL wf_post_connect(freerdp* instance)
wf_cliprdr_init(wfi, instance->context->channels);
// Callback
if (wfi->callback_func != NULL)
{
wfi->callback_func(wfi, CALLBACK_TYPE_CONNECTED, 0, 0);
}
return TRUE;
}
@ -670,6 +676,13 @@ DWORD WINAPI wf_thread(LPVOID lpParam)
freerdp_channels_close(channels, instance);
freerdp_disconnect(instance);
// Callback
if (((wfContext*) instance->context)->wfi->callback_func != NULL)
{
((wfContext*) instance->context)->wfi->callback_func(((wfContext*) instance->context)->wfi, CALLBACK_TYPE_DISCONNECTED, 12, 34);
}
return 0;
}
@ -780,11 +793,6 @@ wfInfo* freerdp_client_new(int argc, char** argv)
return wfi;
}
rdpSettings* freerdp_client_get_settings(wfInfo* wfi)
{
return wfi->instance->settings;
}
int freerdp_client_start(wfInfo* wfi)
{
HWND hWndParent;
@ -873,6 +881,35 @@ int freerdp_client_free(wfInfo* wfi)
return 0;
}
void wf_on_param_change(wfInfo* cfi, int id)
{
RECT rect;
// specific processing here
switch(id)
{
case FreeRDP_SmartSizing:
fprintf(stderr, "SmartSizing changed.\n");
GetWindowRect(cfi->hwnd, &rect);
InvalidateRect(cfi->hwnd, &rect, TRUE);
break;
case FreeRDP_ConnectionType:
fprintf(stderr, "ConnectionType changed.\n");
freerdp_set_connection_type(cfi->instance->settings, cfi->instance->settings->ConnectionType);
break;
}
// trigger callback to client
if (cfi->callback_func != NULL)
{
fprintf(stderr, "Notifying client...");
cfi->callback_func(cfi, CALLBACK_TYPE_PARAM_CHANGE, id, 0);
}
}
BOOL freerdp_client_get_param_bool(wfInfo* cfi, int id)
{
return freerdp_get_param_bool(cfi->instance->settings, id);
@ -884,7 +921,7 @@ int freerdp_client_set_param_bool(wfInfo* cfi, int id, BOOL param)
rc = freerdp_set_param_bool(cfi->instance->settings, id, param);
// Process callbacks here
wf_on_param_change(cfi, id);
return rc;
}
@ -900,7 +937,7 @@ int freerdp_client_set_param_uint32(wfInfo* cfi, int id, UINT32 param)
rc = freerdp_set_param_uint32(cfi->instance->settings, id, param);
// Process callbacks here
wf_on_param_change(cfi, id);
return rc;
}
@ -916,7 +953,7 @@ int freerdp_client_set_param_uint64(wfInfo* cfi, int id, UINT64 param)
rc = freerdp_set_param_uint64(cfi->instance->settings, id, param);
// Process callbacks here
wf_on_param_change(cfi, id);
return rc;
}
@ -926,25 +963,6 @@ char* freerdp_client_get_param_string(wfInfo* cfi, int id)
return freerdp_get_param_string(cfi->instance->settings, id);
}
void wf_on_param_change(wfInfo* cfi, int id)
{
RECT rect;
// specific processing here
switch(id)
{
case FreeRDP_SmartSizing:
fprintf(stderr, "SmartSizing changed.\n");
GetWindowRect(cfi->hwnd, &rect);
InvalidateRect(cfi->hwnd, &rect, TRUE);
break;
}
// trigger callback to client
}
int freerdp_client_set_param_string(wfInfo* cfi, int id, char* param)
{
int rc;
@ -953,4 +971,10 @@ int freerdp_client_set_param_string(wfInfo* cfi, int id, char* param)
wf_on_param_change(cfi, id);
return rc;
}
int freerdp_client_set_callback_function(wfInfo* cfi, callbackFunc callbackFunc)
{
cfi->callback_func = callbackFunc;
return 0;
}

View File

@ -42,6 +42,11 @@
extern "C" {
#endif
// Callback type codes. Move elsewhere?
#define CALLBACK_TYPE_PARAM_CHANGE 0x01
#define CALLBACK_TYPE_CONNECTED 0x02
#define CALLBACK_TYPE_DISCONNECTED 0x03
struct wf_bitmap
{
rdpBitmap _bitmap;
@ -69,6 +74,8 @@ struct wf_context
};
typedef struct wf_context wfContext;
typedef void (CALLBACK * callbackFunc)(wfInfo* wfi, int callback_type, DWORD param1, DWORD param2);
struct wf_info
{
rdpClient* client;
@ -116,6 +123,7 @@ struct wf_info
NSC_CONTEXT* nsc_context;
BOOL sw_gdi;
callbackFunc callback_func;
};
/**
@ -133,8 +141,6 @@ FREERDP_API int freerdp_client_stop(wfInfo* cfi);
FREERDP_API int freerdp_client_focus_in(wfInfo* cfi);
FREERDP_API int freerdp_client_focus_out(wfInfo* cfi);
FREERDP_API rdpSettings* freerdp_client_get_settings(wfInfo* wfi);
FREERDP_API int freerdp_client_set_window_size(wfInfo* cfi, int width, int height);
FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv);
@ -152,6 +158,7 @@ FREERDP_API int freerdp_client_set_param_uint64(wfInfo* cfi, int id, UINT64 para
FREERDP_API char* freerdp_client_get_param_string(wfInfo* cfi, int id);
FREERDP_API int freerdp_client_set_param_string(wfInfo* cfi, int id, char* param);
FREERDP_API int freerdp_client_set_callback_function(wfInfo* cfi, callbackFunc callbackFunc);
#ifdef __cplusplus
}