diff --git a/channels/client/channels.c b/channels/client/channels.c index 9a9510b7e..aaa98c030 100644 --- a/channels/client/channels.c +++ b/channels/client/channels.c @@ -985,6 +985,7 @@ int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings, v ep.pVirtualChannelOpen = MyVirtualChannelOpen; ep.pVirtualChannelClose = MyVirtualChannelClose; ep.pVirtualChannelWrite = MyVirtualChannelWrite; + ep.pExtendedData = data; ep.pVirtualChannelEventPush = MyVirtualChannelEventPush; @@ -1058,17 +1059,23 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) { lchannel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP; + strcpy(lchannel_def.name, "rdpdr"); + channels->can_call_init = 1; channels->settings = instance->settings; + WaitForSingleObject(g_mutex_init, INFINITE); + g_init_channels = channels; - MyVirtualChannelInit(&dummy, &lchannel_def, 1, - VIRTUAL_CHANNEL_VERSION_WIN2000, 0); + MyVirtualChannelInit(&dummy, &lchannel_def, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, 0); g_init_channels = NULL; + ReleaseMutex(g_mutex_init); + channels->can_call_init = 0; channels->settings = 0; + DEBUG_CHANNELS("registered fake rdpdr for rdpsnd."); } @@ -1103,7 +1110,7 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) for (index = 0; index < channels->num_libs_data; index++) { - llib = channels->libs_data + index; + llib = &channels->libs_data[index]; if (llib->init_event_proc != 0) llib->init_event_proc(llib->init_handle, CHANNEL_EVENT_CONNECTED, hostname, hostname_len); diff --git a/channels/cliprdr/client/cliprdr_main.c b/channels/cliprdr/client/cliprdr_main.c index ae6b8c217..c19479e85 100644 --- a/channels/cliprdr/client/cliprdr_main.c +++ b/channels/cliprdr/client/cliprdr_main.c @@ -270,12 +270,37 @@ static void cliprdr_process_terminate(rdpSvcPlugin* plugin) free(plugin); } +/** + * Callback Interface + */ + +int cliprdr_monitor_ready(CliprdrClientContext* context) +{ + return 0; +} + +int cliprdr_format_list(CliprdrClientContext* context) +{ + return 0; +} + +int cliprdr_data_request(CliprdrClientContext* context) +{ + return 0; +} + +int cliprdr_data_response(CliprdrClientContext* context) +{ + return 0; +} + /* cliprdr is always built-in */ #define VirtualChannelEntry cliprdr_VirtualChannelEntry int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { cliprdrPlugin* _p; + CliprdrClientContext* context; _p = (cliprdrPlugin*) malloc(sizeof(cliprdrPlugin)); ZeroMemory(_p, sizeof(cliprdrPlugin)); @@ -293,6 +318,15 @@ int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) _p->plugin.event_callback = cliprdr_process_event; _p->plugin.terminate_callback = cliprdr_process_terminate; + context = (CliprdrClientContext*) malloc(sizeof(CliprdrClientContext)); + + context->MonitorReady = cliprdr_monitor_ready; + context->FormatList = cliprdr_format_list; + context->DataRequest = cliprdr_data_request; + context->DataResponse = cliprdr_data_response; + + _p->plugin.channel_entry_points.pInterface = (void*) context; + svc_plugin_init((rdpSvcPlugin*) _p, pEntryPoints); return 1; diff --git a/channels/rdpsnd/server/rdpsnd.c b/channels/rdpsnd/server/rdpsnd.c index da8f85b5e..75e4af02a 100644 --- a/channels/rdpsnd/server/rdpsnd.c +++ b/channels/rdpsnd/server/rdpsnd.c @@ -29,9 +29,9 @@ #include #include #include +#include #include -#include #include #include diff --git a/client/DirectFB/dfreerdp.c b/client/DirectFB/dfreerdp.c index f6e6ff015..e2b88a786 100644 --- a/client/DirectFB/dfreerdp.c +++ b/client/DirectFB/dfreerdp.c @@ -291,7 +291,7 @@ static void df_process_channel_event(rdpChannels* channels, freerdp* instance) break; default: - fprintf(stderr, "df_process_channel_event: unknown event type %d\n", event->event_type); + fprintf(stderr, "df_process_channel_event: unknown event type %d\n", GetMessageType(event->id)); break; } diff --git a/include/freerdp/client/cliprdr.h b/include/freerdp/client/cliprdr.h index d7da7ec3c..ea0d1cf7a 100644 --- a/include/freerdp/client/cliprdr.h +++ b/include/freerdp/client/cliprdr.h @@ -21,9 +21,24 @@ #define FREERDP_CHANNEL_CLIENT_CLIPRDR_H /** - * Event Types + * Client Interface */ +typedef struct _cliprdr_client_context CliprdrClientContext; + +typedef int (*pcCliprdrMonitorReady)(CliprdrClientContext* context); +typedef int (*pcCliprdrFormatList)(CliprdrClientContext* context); +typedef int (*pcCliprdrDataRequest)(CliprdrClientContext* context); +typedef int (*pcCliprdrDataResponse)(CliprdrClientContext* context); + +struct _cliprdr_client_context +{ + pcCliprdrMonitorReady MonitorReady; + pcCliprdrFormatList FormatList; + pcCliprdrDataRequest DataRequest; + pcCliprdrDataResponse DataResponse; +}; + /** * Clipboard Formats */ diff --git a/include/freerdp/svc.h b/include/freerdp/svc.h index 2875974f5..c09307fd9 100644 --- a/include/freerdp/svc.h +++ b/include/freerdp/svc.h @@ -42,48 +42,43 @@ typedef struct _CHANNEL_DEF CHANNEL_DEF; typedef CHANNEL_DEF* PCHANNEL_DEF; typedef CHANNEL_DEF** PPCHANNEL_DEF; -typedef void (FREERDP_CC * PCHANNEL_INIT_EVENT_FN)(void* pInitHandle, - UINT32 event, void* pData, UINT32 dataLength); +typedef void (FREERDP_CC * PCHANNEL_INIT_EVENT_FN)(void* pInitHandle, UINT32 event, void* pData, UINT32 dataLength); +typedef void (FREERDP_CC * PCHANNEL_OPEN_EVENT_FN)(UINT32 openHandle, UINT32 event, + void* pData, UINT32 dataLength, UINT32 totalLength, UINT32 dataFlags); -typedef void (FREERDP_CC * PCHANNEL_OPEN_EVENT_FN)(UINT32 openHandle, - UINT32 event, void* pData, UINT32 dataLength, - UINT32 totalLength, UINT32 dataFlags); +#define CHANNEL_RC_OK 0 +#define CHANNEL_RC_ALREADY_INITIALIZED 1 +#define CHANNEL_RC_NOT_INITIALIZED 2 +#define CHANNEL_RC_ALREADY_CONNECTED 3 +#define CHANNEL_RC_NOT_CONNECTED 4 +#define CHANNEL_RC_TOO_MANY_CHANNELS 5 +#define CHANNEL_RC_BAD_CHANNEL 6 +#define CHANNEL_RC_BAD_CHANNEL_HANDLE 7 +#define CHANNEL_RC_NO_BUFFER 8 +#define CHANNEL_RC_BAD_INIT_HANDLE 9 +#define CHANNEL_RC_NOT_OPEN 10 +#define CHANNEL_RC_BAD_PROC 11 +#define CHANNEL_RC_NO_MEMORY 12 +#define CHANNEL_RC_UNKNOWN_CHANNEL_NAME 13 +#define CHANNEL_RC_ALREADY_OPEN 14 +#define CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY 15 +#define CHANNEL_RC_NULL_DATA 16 +#define CHANNEL_RC_ZERO_LENGTH 17 -#define CHANNEL_RC_OK 0 -#define CHANNEL_RC_ALREADY_INITIALIZED 1 -#define CHANNEL_RC_NOT_INITIALIZED 2 -#define CHANNEL_RC_ALREADY_CONNECTED 3 -#define CHANNEL_RC_NOT_CONNECTED 4 -#define CHANNEL_RC_TOO_MANY_CHANNELS 5 -#define CHANNEL_RC_BAD_CHANNEL 6 -#define CHANNEL_RC_BAD_CHANNEL_HANDLE 7 -#define CHANNEL_RC_NO_BUFFER 8 -#define CHANNEL_RC_BAD_INIT_HANDLE 9 -#define CHANNEL_RC_NOT_OPEN 10 -#define CHANNEL_RC_BAD_PROC 11 -#define CHANNEL_RC_NO_MEMORY 12 -#define CHANNEL_RC_UNKNOWN_CHANNEL_NAME 13 -#define CHANNEL_RC_ALREADY_OPEN 14 -#define CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY 15 -#define CHANNEL_RC_NULL_DATA 16 -#define CHANNEL_RC_ZERO_LENGTH 17 +#define VIRTUAL_CHANNEL_VERSION_WIN2000 1 -#define VIRTUAL_CHANNEL_VERSION_WIN2000 1 +typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELINIT)(void** ppInitHandle, PCHANNEL_DEF pChannel, + int channelCount, UINT32 versionRequested, PCHANNEL_INIT_EVENT_FN pChannelInitEventProc); + +typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELOPEN)(void* pInitHandle, UINT32* pOpenHandle, + char* pChannelName, PCHANNEL_OPEN_EVENT_FN pChannelOpenEventProc); -typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELINIT)(void** ppInitHandle, - PCHANNEL_DEF pChannel, int channelCount, UINT32 versionRequested, - PCHANNEL_INIT_EVENT_FN pChannelInitEventProc); -typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELOPEN)(void* pInitHandle, - UINT32* pOpenHandle, char* pChannelName, - PCHANNEL_OPEN_EVENT_FN pChannelOpenEventProc); typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELCLOSE)(UINT32 openHandle); -typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELWRITE)(UINT32 openHandle, - void* pData, UINT32 dataLength, void* pUserData); +typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELWRITE)(UINT32 openHandle, void* pData, UINT32 dataLength, void* pUserData); -typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELEVENTPUSH)(UINT32 openHandle, - wMessage* event); +typedef UINT32 (FREERDP_CC * PVIRTUALCHANNELEVENTPUSH)(UINT32 openHandle, wMessage* event); struct _CHANNEL_ENTRY_POINTS { @@ -107,7 +102,11 @@ struct _CHANNEL_ENTRY_POINTS_EX PVIRTUALCHANNELOPEN pVirtualChannelOpen; PVIRTUALCHANNELCLOSE pVirtualChannelClose; PVIRTUALCHANNELWRITE pVirtualChannelWrite; - void* pExtendedData; /* extended data field to pass initial parameters */ + + /* Extended Fields */ + + void* pExtendedData; /* extended initial data */ + void* pInterface; /* channel callback interface */ PVIRTUALCHANNELEVENTPUSH pVirtualChannelEventPush; }; typedef struct _CHANNEL_ENTRY_POINTS_EX CHANNEL_ENTRY_POINTS_EX;