mirror of https://github.com/FreeRDP/FreeRDP
cliprdr/server: split add Open/Close callbacks
This commit is contained in:
parent
724d9f95a1
commit
afce8061b3
|
@ -100,74 +100,46 @@ int cliprdr_server_packet_send(CliprdrServerPrivate* cliprdr, wStream* s)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cliprdr_server_send_capabilities(CliprdrServerContext* context)
|
static int cliprdr_server_capabilities(CliprdrServerContext* context, CLIPRDR_CAPABILITIES* capabilities)
|
||||||
{
|
{
|
||||||
wStream* s;
|
wStream* s;
|
||||||
BOOL status;
|
CLIPRDR_GENERAL_CAPABILITY_SET* generalCapabilitySet;
|
||||||
ULONG written;
|
|
||||||
UINT32 generalFlags;
|
|
||||||
CLIPRDR_HEADER header;
|
|
||||||
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
WLog_DBG(TAG, "CliprdrServerCapabilities");
|
capabilities->msgType = CB_CLIP_CAPS;
|
||||||
|
capabilities->msgFlags = 0;
|
||||||
|
|
||||||
header.msgType = CB_CLIP_CAPS;
|
s = cliprdr_server_packet_new(CB_CLIP_CAPS, 0, 4 + CB_CAPSTYPE_GENERAL_LEN);
|
||||||
header.msgFlags = 0;
|
|
||||||
header.dataLen = 16;
|
|
||||||
|
|
||||||
generalFlags = 0;
|
|
||||||
|
|
||||||
if (cliprdr->useLongFormatNames)
|
|
||||||
generalFlags |= CB_USE_LONG_FORMAT_NAMES;
|
|
||||||
|
|
||||||
s = Stream_New(NULL, header.dataLen + CLIPRDR_HEADER_LENGTH);
|
|
||||||
|
|
||||||
Stream_Write_UINT16(s, header.msgType); /* msgType (2 bytes) */
|
|
||||||
Stream_Write_UINT16(s, header.msgFlags); /* msgFlags (2 bytes) */
|
|
||||||
Stream_Write_UINT32(s, header.dataLen); /* dataLen (4 bytes) */
|
|
||||||
|
|
||||||
Stream_Write_UINT16(s, 1); /* cCapabilitiesSets (2 bytes) */
|
Stream_Write_UINT16(s, 1); /* cCapabilitiesSets (2 bytes) */
|
||||||
Stream_Write_UINT16(s, 0); /* pad1 (2 bytes) */
|
Stream_Write_UINT16(s, 0); /* pad1 (2 bytes) */
|
||||||
|
|
||||||
Stream_Write_UINT16(s, CB_CAPSTYPE_GENERAL); /* capabilitySetType (2 bytes) */
|
generalCapabilitySet = (CLIPRDR_GENERAL_CAPABILITY_SET*) capabilities->capabilitySets;
|
||||||
Stream_Write_UINT16(s, CB_CAPSTYPE_GENERAL_LEN); /* lengthCapability (2 bytes) */
|
Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetType); /* capabilitySetType (2 bytes) */
|
||||||
Stream_Write_UINT32(s, CB_CAPS_VERSION_2); /* version (4 bytes) */
|
Stream_Write_UINT16(s, generalCapabilitySet->capabilitySetLength); /* lengthCapability (2 bytes) */
|
||||||
Stream_Write_UINT32(s, generalFlags); /* generalFlags (4 bytes) */
|
Stream_Write_UINT32(s, generalCapabilitySet->version); /* version (4 bytes) */
|
||||||
|
Stream_Write_UINT32(s, generalCapabilitySet->generalFlags); /* generalFlags (4 bytes) */
|
||||||
|
|
||||||
Stream_SealLength(s);
|
WLog_DBG(TAG, "ServerCapabilities");
|
||||||
|
cliprdr_server_packet_send(cliprdr, s);
|
||||||
status = WTSVirtualChannelWrite(cliprdr->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_Length(s), &written);
|
|
||||||
|
|
||||||
Stream_Free(s, TRUE);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cliprdr_server_send_monitor_ready(CliprdrServerContext* context)
|
static int cliprdr_server_monitor_ready(CliprdrServerContext* context, CLIPRDR_MONITOR_READY* monitorReady)
|
||||||
{
|
{
|
||||||
wStream* s;
|
wStream* s;
|
||||||
BOOL status;
|
|
||||||
ULONG written;
|
|
||||||
CLIPRDR_HEADER header;
|
|
||||||
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
WLog_DBG(TAG, "CliprdrServerMonitorReady");
|
monitorReady->msgType = CB_MONITOR_READY;
|
||||||
|
monitorReady->msgFlags = 0;
|
||||||
|
monitorReady->dataLen = 0;
|
||||||
|
|
||||||
header.msgType = CB_MONITOR_READY;
|
s = cliprdr_server_packet_new(monitorReady->msgType,
|
||||||
header.msgFlags = 0;
|
monitorReady->msgFlags, monitorReady->dataLen);
|
||||||
header.dataLen = 0;
|
|
||||||
|
|
||||||
s = Stream_New(NULL, header.dataLen + CLIPRDR_HEADER_LENGTH);
|
WLog_DBG(TAG, "ServerMonitorReady");
|
||||||
|
cliprdr_server_packet_send(cliprdr, s);
|
||||||
Stream_Write_UINT16(s, header.msgType); /* msgType (2 bytes) */
|
|
||||||
Stream_Write_UINT16(s, header.msgFlags); /* msgFlags (2 bytes) */
|
|
||||||
Stream_Write_UINT32(s, header.dataLen); /* dataLen (4 bytes) */
|
|
||||||
|
|
||||||
Stream_SealLength(s);
|
|
||||||
|
|
||||||
status = WTSVirtualChannelWrite(cliprdr->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_Length(s), &written);
|
|
||||||
|
|
||||||
Stream_Free(s, TRUE);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -289,10 +261,10 @@ static int cliprdr_server_format_list_response(CliprdrServerContext* context, CL
|
||||||
s = cliprdr_server_packet_new(formatListResponse->msgType,
|
s = cliprdr_server_packet_new(formatListResponse->msgType,
|
||||||
formatListResponse->msgFlags, formatListResponse->dataLen);
|
formatListResponse->msgFlags, formatListResponse->dataLen);
|
||||||
|
|
||||||
WLog_DBG(TAG, "ClientFormatListResponse");
|
WLog_DBG(TAG, "ServerFormatListResponse");
|
||||||
cliprdr_server_packet_send(cliprdr, s);
|
cliprdr_server_packet_send(cliprdr, s);
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cliprdr_server_lock_clipboard_data(CliprdrServerContext* context, CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData)
|
static int cliprdr_server_lock_clipboard_data(CliprdrServerContext* context, CLIPRDR_LOCK_CLIPBOARD_DATA* lockClipboardData)
|
||||||
|
@ -873,6 +845,40 @@ static int cliprdr_server_receive_pdu(CliprdrServerContext* context, wStream* s,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cliprdr_server_init(CliprdrServerContext* context)
|
||||||
|
{
|
||||||
|
UINT32 generalFlags;
|
||||||
|
CLIPRDR_CAPABILITIES capabilities;
|
||||||
|
CLIPRDR_MONITOR_READY monitorReady;
|
||||||
|
CLIPRDR_GENERAL_CAPABILITY_SET generalCapabilitySet;
|
||||||
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
|
ZeroMemory(&capabilities, sizeof(capabilities));
|
||||||
|
ZeroMemory(&monitorReady, sizeof(monitorReady));
|
||||||
|
|
||||||
|
generalFlags = 0;
|
||||||
|
|
||||||
|
if (cliprdr->useLongFormatNames)
|
||||||
|
generalFlags |= CB_USE_LONG_FORMAT_NAMES;
|
||||||
|
|
||||||
|
capabilities.msgType = CB_CLIP_CAPS;
|
||||||
|
capabilities.msgFlags = 0;
|
||||||
|
capabilities.dataLen = 4 + CB_CAPSTYPE_GENERAL_LEN;
|
||||||
|
|
||||||
|
capabilities.cCapabilitiesSets = 1;
|
||||||
|
capabilities.capabilitySets = (CLIPRDR_CAPABILITY_SET*) &generalCapabilitySet;
|
||||||
|
|
||||||
|
generalCapabilitySet.capabilitySetType = CB_CAPSTYPE_GENERAL;
|
||||||
|
generalCapabilitySet.capabilitySetLength = CB_CAPSTYPE_GENERAL_LEN;
|
||||||
|
generalCapabilitySet.version = CB_CAPS_VERSION_2;
|
||||||
|
generalCapabilitySet.generalFlags = generalFlags;
|
||||||
|
|
||||||
|
context->ServerCapabilities(context, &capabilities);
|
||||||
|
context->MonitorReady(context, &monitorReady);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int cliprdr_server_read(CliprdrServerContext* context)
|
int cliprdr_server_read(CliprdrServerContext* context)
|
||||||
{
|
{
|
||||||
wStream* s;
|
wStream* s;
|
||||||
|
@ -979,31 +985,15 @@ static void* cliprdr_server_thread(void* arg)
|
||||||
{
|
{
|
||||||
DWORD status;
|
DWORD status;
|
||||||
DWORD nCount;
|
DWORD nCount;
|
||||||
void* buffer;
|
|
||||||
HANDLE events[8];
|
HANDLE events[8];
|
||||||
HANDLE ChannelEvent;
|
|
||||||
DWORD BytesReturned;
|
|
||||||
CliprdrServerContext* context = (CliprdrServerContext*) arg;
|
CliprdrServerContext* context = (CliprdrServerContext*) arg;
|
||||||
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
buffer = NULL;
|
|
||||||
BytesReturned = 0;
|
|
||||||
ChannelEvent = NULL;
|
|
||||||
|
|
||||||
if (WTSVirtualChannelQuery(cliprdr->ChannelHandle, WTSVirtualEventHandle, &buffer, &BytesReturned) == TRUE)
|
|
||||||
{
|
|
||||||
if (BytesReturned == sizeof(HANDLE))
|
|
||||||
CopyMemory(&ChannelEvent, buffer, sizeof(HANDLE));
|
|
||||||
|
|
||||||
WTSFreeMemory(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
nCount = 0;
|
nCount = 0;
|
||||||
events[nCount++] = ChannelEvent;
|
|
||||||
events[nCount++] = cliprdr->StopEvent;
|
events[nCount++] = cliprdr->StopEvent;
|
||||||
|
events[nCount++] = cliprdr->ChannelEvent;
|
||||||
|
|
||||||
cliprdr_server_send_capabilities(context);
|
cliprdr_server_init(context);
|
||||||
cliprdr_server_send_monitor_ready(context);
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -1023,8 +1013,10 @@ static void* cliprdr_server_thread(void* arg)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cliprdr_server_start(CliprdrServerContext* context)
|
static int cliprdr_server_open(CliprdrServerContext* context)
|
||||||
{
|
{
|
||||||
|
void* buffer = NULL;
|
||||||
|
DWORD BytesReturned = 0;
|
||||||
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
cliprdr->ChannelHandle = WTSVirtualChannelOpen(cliprdr->vcm, WTS_CURRENT_SESSION, "cliprdr");
|
cliprdr->ChannelHandle = WTSVirtualChannelOpen(cliprdr->vcm, WTS_CURRENT_SESSION, "cliprdr");
|
||||||
|
@ -1032,6 +1024,51 @@ static int cliprdr_server_start(CliprdrServerContext* context)
|
||||||
if (!cliprdr->ChannelHandle)
|
if (!cliprdr->ChannelHandle)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
cliprdr->ChannelEvent = NULL;
|
||||||
|
|
||||||
|
if (WTSVirtualChannelQuery(cliprdr->ChannelHandle, WTSVirtualEventHandle, &buffer, &BytesReturned))
|
||||||
|
{
|
||||||
|
if (BytesReturned == sizeof(HANDLE))
|
||||||
|
CopyMemory(&(cliprdr->ChannelEvent), buffer, sizeof(HANDLE));
|
||||||
|
|
||||||
|
WTSFreeMemory(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cliprdr->ChannelEvent)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cliprdr_server_close(CliprdrServerContext* context)
|
||||||
|
{
|
||||||
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
|
if (cliprdr->ChannelHandle)
|
||||||
|
{
|
||||||
|
WTSVirtualChannelClose(cliprdr->ChannelHandle);
|
||||||
|
cliprdr->ChannelHandle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cliprdr->ChannelEvent)
|
||||||
|
{
|
||||||
|
CloseHandle(cliprdr->ChannelEvent);
|
||||||
|
cliprdr->ChannelEvent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cliprdr_server_start(CliprdrServerContext* context)
|
||||||
|
{
|
||||||
|
CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle;
|
||||||
|
|
||||||
|
if (!cliprdr->ChannelHandle)
|
||||||
|
{
|
||||||
|
if (context->Open(context) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cliprdr->StopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
cliprdr->StopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
|
||||||
cliprdr->Thread = CreateThread(NULL, 0,
|
cliprdr->Thread = CreateThread(NULL, 0,
|
||||||
|
@ -1052,6 +1089,12 @@ static int cliprdr_server_stop(CliprdrServerContext* context)
|
||||||
CloseHandle(cliprdr->StopEvent);
|
CloseHandle(cliprdr->StopEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cliprdr->ChannelHandle)
|
||||||
|
{
|
||||||
|
if (context->Close(context) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,11 +1107,13 @@ CliprdrServerContext* cliprdr_server_context_new(HANDLE vcm)
|
||||||
|
|
||||||
if (context)
|
if (context)
|
||||||
{
|
{
|
||||||
|
context->Open = cliprdr_server_open;
|
||||||
|
context->Close = cliprdr_server_close;
|
||||||
context->Start = cliprdr_server_start;
|
context->Start = cliprdr_server_start;
|
||||||
context->Stop = cliprdr_server_stop;
|
context->Stop = cliprdr_server_stop;
|
||||||
|
|
||||||
//context->ServerCapabilities = cliprdr_server_capabilities;
|
context->ServerCapabilities = cliprdr_server_capabilities;
|
||||||
//context->MonitorReady = cliprdr_server_monitor_ready;
|
context->MonitorReady = cliprdr_server_monitor_ready;
|
||||||
context->ServerFormatList = cliprdr_server_format_list;
|
context->ServerFormatList = cliprdr_server_format_list;
|
||||||
context->ServerFormatListResponse = cliprdr_server_format_list_response;
|
context->ServerFormatListResponse = cliprdr_server_format_list_response;
|
||||||
context->ServerLockClipboardData = cliprdr_server_lock_clipboard_data;
|
context->ServerLockClipboardData = cliprdr_server_lock_clipboard_data;
|
||||||
|
|
|
@ -38,6 +38,7 @@ struct _cliprdr_server_private
|
||||||
HANDLE Thread;
|
HANDLE Thread;
|
||||||
HANDLE StopEvent;
|
HANDLE StopEvent;
|
||||||
void* ChannelHandle;
|
void* ChannelHandle;
|
||||||
|
HANDLE ChannelEvent;
|
||||||
|
|
||||||
BOOL useLongFormatNames;
|
BOOL useLongFormatNames;
|
||||||
BOOL streamFileClipEnabled;
|
BOOL streamFileClipEnabled;
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
|
|
||||||
typedef struct _cliprdr_server_context CliprdrServerContext;
|
typedef struct _cliprdr_server_context CliprdrServerContext;
|
||||||
|
|
||||||
|
typedef int (*psCliprdrOpen)(CliprdrServerContext* context);
|
||||||
|
typedef int (*psCliprdrClose)(CliprdrServerContext* context);
|
||||||
typedef int (*psCliprdrStart)(CliprdrServerContext* context);
|
typedef int (*psCliprdrStart)(CliprdrServerContext* context);
|
||||||
typedef int (*psCliprdrStop)(CliprdrServerContext* context);
|
typedef int (*psCliprdrStop)(CliprdrServerContext* context);
|
||||||
|
|
||||||
|
@ -62,6 +64,8 @@ struct _cliprdr_server_context
|
||||||
void* handle;
|
void* handle;
|
||||||
void* custom;
|
void* custom;
|
||||||
|
|
||||||
|
psCliprdrOpen Open;
|
||||||
|
psCliprdrClose Close;
|
||||||
psCliprdrStart Start;
|
psCliprdrStart Start;
|
||||||
psCliprdrStop Stop;
|
psCliprdrStop Stop;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue