mirror of https://github.com/FreeRDP/FreeRDP
Refactored ClipboardSetData.
This commit is contained in:
parent
2db04736ac
commit
8f1adf64ee
|
@ -420,14 +420,9 @@ static UINT android_cliprdr_server_format_data_response(
|
|||
formatId = format->formatId;
|
||||
|
||||
size = formatDataResponse->dataLen;
|
||||
data = (BYTE*) malloc(size);
|
||||
|
||||
if (!data)
|
||||
return ERROR_INTERNAL_ERROR;
|
||||
|
||||
CopyMemory(data, formatDataResponse->requestedFormatData, size);
|
||||
|
||||
if (!ClipboardSetData(afc->clipboard, formatId, data, size))
|
||||
if (!ClipboardSetData(afc->clipboard, formatId,
|
||||
formatDataResponse->requestedFormatData, size))
|
||||
return ERROR_INTERNAL_ERROR;
|
||||
|
||||
SetEvent(afc->clipboardRequestEvent);
|
||||
|
|
|
@ -28,30 +28,30 @@
|
|||
#include "android_freerdp.h"
|
||||
#include "android_cliprdr.h"
|
||||
|
||||
BOOL android_push_event(freerdp * inst, ANDROID_EVENT* event)
|
||||
BOOL android_push_event(freerdp* inst, ANDROID_EVENT* event)
|
||||
{
|
||||
|
||||
androidContext* aCtx = (androidContext*)inst->context;
|
||||
|
||||
if (aCtx->event_queue->count >= aCtx->event_queue->size)
|
||||
{
|
||||
int new_size;
|
||||
void* new_events;
|
||||
|
||||
new_size = aCtx->event_queue->size * 2;
|
||||
new_events = realloc((void*) aCtx->event_queue->events,
|
||||
sizeof(ANDROID_EVENT*) * new_size);
|
||||
sizeof(ANDROID_EVENT*) * new_size);
|
||||
|
||||
if (!new_events)
|
||||
return FALSE;
|
||||
|
||||
aCtx->event_queue->events = new_events;
|
||||
aCtx->event_queue->size = new_size;
|
||||
}
|
||||
|
||||
aCtx->event_queue->events[(aCtx->event_queue->count)++] = event;
|
||||
|
||||
return SetEvent(aCtx->event_queue->isSet);
|
||||
}
|
||||
|
||||
static ANDROID_EVENT* android_peek_event(ANDROID_EVENT_QUEUE * queue)
|
||||
static ANDROID_EVENT* android_peek_event(ANDROID_EVENT_QUEUE* queue)
|
||||
{
|
||||
ANDROID_EVENT* event;
|
||||
|
||||
|
@ -59,11 +59,10 @@ static ANDROID_EVENT* android_peek_event(ANDROID_EVENT_QUEUE * queue)
|
|||
return NULL;
|
||||
|
||||
event = queue->events[0];
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
static ANDROID_EVENT* android_pop_event(ANDROID_EVENT_QUEUE * queue)
|
||||
static ANDROID_EVENT* android_pop_event(ANDROID_EVENT_QUEUE* queue)
|
||||
{
|
||||
int i;
|
||||
ANDROID_EVENT* event;
|
||||
|
@ -101,44 +100,31 @@ static BOOL android_process_event(ANDROID_EVENT_QUEUE* queue, freerdp* inst)
|
|||
else if (event->type == EVENT_TYPE_KEY_UNICODE)
|
||||
{
|
||||
ANDROID_EVENT_KEY* key_event = (ANDROID_EVENT_KEY*) event;
|
||||
inst->input->UnicodeKeyboardEvent(inst->input, key_event->flags, key_event->scancode);
|
||||
inst->input->UnicodeKeyboardEvent(inst->input, key_event->flags,
|
||||
key_event->scancode);
|
||||
android_event_free((ANDROID_EVENT*)key_event);
|
||||
}
|
||||
else if (event->type == EVENT_TYPE_CURSOR)
|
||||
{
|
||||
ANDROID_EVENT_CURSOR* cursor_event = (ANDROID_EVENT_CURSOR*) event;
|
||||
inst->input->MouseEvent(inst->input, cursor_event->flags, cursor_event->x, cursor_event->y);
|
||||
inst->input->MouseEvent(inst->input, cursor_event->flags, cursor_event->x,
|
||||
cursor_event->y);
|
||||
android_event_free((ANDROID_EVENT*)cursor_event);
|
||||
}
|
||||
else if (event->type == EVENT_TYPE_CLIPBOARD)
|
||||
{
|
||||
BYTE* data;
|
||||
UINT32 size;
|
||||
UINT32 formatId;
|
||||
ANDROID_EVENT_CLIPBOARD* clipboard_event = (ANDROID_EVENT_CLIPBOARD*) event;
|
||||
|
||||
formatId = ClipboardRegisterFormat(afc->clipboard, "UTF8_STRING");
|
||||
|
||||
size = clipboard_event->data_length;
|
||||
|
||||
if (size)
|
||||
{
|
||||
data = (BYTE*) malloc(size);
|
||||
|
||||
if (!data)
|
||||
return -1;
|
||||
|
||||
CopyMemory(data, clipboard_event->data, size);
|
||||
|
||||
ClipboardSetData(afc->clipboard, formatId, (void*) data, size);
|
||||
}
|
||||
ClipboardSetData(afc->clipboard, formatId, clipboard_event->data, size);
|
||||
else
|
||||
{
|
||||
ClipboardEmpty(afc->clipboard);
|
||||
}
|
||||
|
||||
android_cliprdr_send_client_format_list(afc->cliprdr);
|
||||
|
||||
android_event_free((ANDROID_EVENT*)clipboard_event);
|
||||
}
|
||||
else if (event->type == EVENT_TYPE_DISCONNECT)
|
||||
|
@ -151,7 +137,7 @@ static BOOL android_process_event(ANDROID_EVENT_QUEUE* queue, freerdp* inst)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
HANDLE android_get_handle(freerdp *inst)
|
||||
HANDLE android_get_handle(freerdp* inst)
|
||||
{
|
||||
androidContext* aCtx;
|
||||
|
||||
|
@ -159,13 +145,14 @@ HANDLE android_get_handle(freerdp *inst)
|
|||
return NULL;
|
||||
|
||||
aCtx = (androidContext*)inst->context;
|
||||
|
||||
if (!aCtx->event_queue || !aCtx->event_queue->isSet)
|
||||
return NULL;
|
||||
|
||||
return aCtx->event_queue->isSet;
|
||||
}
|
||||
|
||||
BOOL android_check_handle(freerdp * inst)
|
||||
BOOL android_check_handle(freerdp* inst)
|
||||
{
|
||||
androidContext* aCtx;
|
||||
|
||||
|
@ -173,6 +160,7 @@ BOOL android_check_handle(freerdp * inst)
|
|||
return FALSE;
|
||||
|
||||
aCtx = (androidContext*)inst->context;
|
||||
|
||||
if (!aCtx->event_queue || !aCtx->event_queue->isSet)
|
||||
return FALSE;
|
||||
|
||||
|
@ -180,7 +168,8 @@ BOOL android_check_handle(freerdp * inst)
|
|||
{
|
||||
if (!ResetEvent(aCtx->event_queue->isSet))
|
||||
return FALSE;
|
||||
if(!android_process_event(aCtx->event_queue, inst))
|
||||
|
||||
if (!android_process_event(aCtx->event_queue, inst))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -190,15 +179,14 @@ BOOL android_check_handle(freerdp * inst)
|
|||
ANDROID_EVENT_KEY* android_event_key_new(int flags, UINT16 scancode)
|
||||
{
|
||||
ANDROID_EVENT_KEY* event;
|
||||
|
||||
event = (ANDROID_EVENT_KEY*) calloc(1, sizeof(ANDROID_EVENT_KEY));
|
||||
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
event->type = EVENT_TYPE_KEY;
|
||||
event->flags = flags;
|
||||
event->scancode = scancode;
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
|
@ -210,14 +198,13 @@ static void android_event_key_free(ANDROID_EVENT_KEY* event)
|
|||
ANDROID_EVENT_KEY* android_event_unicodekey_new(UINT16 key)
|
||||
{
|
||||
ANDROID_EVENT_KEY* event;
|
||||
|
||||
event = (ANDROID_EVENT_KEY*) calloc(1, sizeof(ANDROID_EVENT_KEY));
|
||||
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
event->type = EVENT_TYPE_KEY_UNICODE;
|
||||
event->scancode = key;
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
|
@ -229,8 +216,8 @@ static void android_event_unicodekey_free(ANDROID_EVENT_KEY* event)
|
|||
ANDROID_EVENT_CURSOR* android_event_cursor_new(UINT16 flags, UINT16 x, UINT16 y)
|
||||
{
|
||||
ANDROID_EVENT_CURSOR* event;
|
||||
|
||||
event = (ANDROID_EVENT_CURSOR*) calloc(1, sizeof(ANDROID_EVENT_CURSOR));
|
||||
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
|
@ -238,7 +225,6 @@ ANDROID_EVENT_CURSOR* android_event_cursor_new(UINT16 flags, UINT16 x, UINT16 y)
|
|||
event->x = x;
|
||||
event->y = y;
|
||||
event->flags = flags;
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
|
@ -250,8 +236,8 @@ static void android_event_cursor_free(ANDROID_EVENT_CURSOR* event)
|
|||
ANDROID_EVENT* android_event_disconnect_new()
|
||||
{
|
||||
ANDROID_EVENT* event;
|
||||
|
||||
event = (ANDROID_EVENT*) calloc(1, sizeof(ANDROID_EVENT));
|
||||
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
|
@ -264,23 +250,27 @@ static void android_event_disconnect_free(ANDROID_EVENT* event)
|
|||
free(event);
|
||||
}
|
||||
|
||||
ANDROID_EVENT_CLIPBOARD* android_event_clipboard_new(void* data, int data_length)
|
||||
ANDROID_EVENT_CLIPBOARD* android_event_clipboard_new(void* data,
|
||||
int data_length)
|
||||
{
|
||||
ANDROID_EVENT_CLIPBOARD* event;
|
||||
|
||||
event = (ANDROID_EVENT_CLIPBOARD*) calloc(1, sizeof(ANDROID_EVENT_CLIPBOARD));
|
||||
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
event->type = EVENT_TYPE_CLIPBOARD;
|
||||
|
||||
if (data)
|
||||
{
|
||||
event->data = malloc(data_length);
|
||||
|
||||
if (!event->data)
|
||||
{
|
||||
free(event);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(event->data, data, data_length);
|
||||
event->data_length = data_length;
|
||||
}
|
||||
|
@ -297,12 +287,12 @@ static void android_event_clipboard_free(ANDROID_EVENT_CLIPBOARD* event)
|
|||
}
|
||||
}
|
||||
|
||||
BOOL android_event_queue_init(freerdp * inst)
|
||||
BOOL android_event_queue_init(freerdp* inst)
|
||||
{
|
||||
androidContext* aCtx = (androidContext*)inst->context;
|
||||
ANDROID_EVENT_QUEUE* queue;
|
||||
|
||||
queue = (ANDROID_EVENT_QUEUE*) calloc(1, sizeof(ANDROID_EVENT_QUEUE));
|
||||
|
||||
if (!queue)
|
||||
{
|
||||
WLog_ERR(TAG, "android_event_queue_init: memory allocation failed");
|
||||
|
@ -311,15 +301,16 @@ BOOL android_event_queue_init(freerdp * inst)
|
|||
|
||||
queue->size = 16;
|
||||
queue->count = 0;
|
||||
|
||||
queue->isSet = CreateEventA(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
if (!queue->isSet)
|
||||
{
|
||||
free (queue);
|
||||
free(queue);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
queue->events = (ANDROID_EVENT**) calloc(sizeof(ANDROID_EVENT*), queue->size);
|
||||
|
||||
if (!queue->events)
|
||||
{
|
||||
WLog_ERR(TAG, "android_event_queue_init: memory allocation failed");
|
||||
|
@ -327,12 +318,12 @@ BOOL android_event_queue_init(freerdp * inst)
|
|||
free(queue);
|
||||
return FALSE;
|
||||
}
|
||||
aCtx->event_queue = queue;
|
||||
|
||||
aCtx->event_queue = queue;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void android_event_queue_uninit(freerdp * inst)
|
||||
void android_event_queue_uninit(freerdp* inst)
|
||||
{
|
||||
androidContext* aCtx;
|
||||
ANDROID_EVENT_QUEUE* queue;
|
||||
|
@ -350,13 +341,15 @@ void android_event_queue_uninit(freerdp * inst)
|
|||
CloseHandle(queue->isSet);
|
||||
queue->isSet = NULL;
|
||||
}
|
||||
|
||||
if (queue->events)
|
||||
{
|
||||
free (queue->events);
|
||||
free(queue->events);
|
||||
queue->events = NULL;
|
||||
queue->size = 0;
|
||||
queue->count = 0;
|
||||
}
|
||||
|
||||
free(queue);
|
||||
}
|
||||
}
|
||||
|
@ -366,23 +359,29 @@ void android_event_free(ANDROID_EVENT* event)
|
|||
if (!event)
|
||||
return;
|
||||
|
||||
switch(event->type) {
|
||||
case EVENT_TYPE_KEY:
|
||||
android_event_key_free((ANDROID_EVENT_KEY*)event);
|
||||
break;
|
||||
case EVENT_TYPE_KEY_UNICODE:
|
||||
android_event_unicodekey_free((ANDROID_EVENT_KEY*)event);
|
||||
break;
|
||||
case EVENT_TYPE_CURSOR:
|
||||
android_event_cursor_free((ANDROID_EVENT_CURSOR*)event);
|
||||
break;
|
||||
case EVENT_TYPE_DISCONNECT:
|
||||
android_event_disconnect_free((ANDROID_EVENT*)event);
|
||||
break;
|
||||
case EVENT_TYPE_CLIPBOARD:
|
||||
android_event_clipboard_free((ANDROID_EVENT_CLIPBOARD*)event);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
switch (event->type)
|
||||
{
|
||||
case EVENT_TYPE_KEY:
|
||||
android_event_key_free((ANDROID_EVENT_KEY*)event);
|
||||
break;
|
||||
|
||||
case EVENT_TYPE_KEY_UNICODE:
|
||||
android_event_unicodekey_free((ANDROID_EVENT_KEY*)event);
|
||||
break;
|
||||
|
||||
case EVENT_TYPE_CURSOR:
|
||||
android_event_cursor_free((ANDROID_EVENT_CURSOR*)event);
|
||||
break;
|
||||
|
||||
case EVENT_TYPE_DISCONNECT:
|
||||
android_event_disconnect_free((ANDROID_EVENT*)event);
|
||||
break;
|
||||
|
||||
case EVENT_TYPE_CLIPBOARD:
|
||||
android_event_clipboard_free((ANDROID_EVENT_CLIPBOARD*)event);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -338,17 +338,8 @@ UINT mac_cliprdr_server_format_data_response(CliprdrClientContext* cliprdr, CLIP
|
|||
formatId = format->formatId;
|
||||
|
||||
size = formatDataResponse->dataLen;
|
||||
data = (BYTE*) malloc(size);
|
||||
|
||||
if (!data)
|
||||
{
|
||||
SetEvent(mfc->clipboardRequestEvent);
|
||||
return CHANNEL_RC_NO_MEMORY;
|
||||
}
|
||||
|
||||
CopyMemory(data, formatDataResponse->requestedFormatData, size);
|
||||
|
||||
ClipboardSetData(mfc->clipboard, formatId, data, size);
|
||||
ClipboardSetData(mfc->clipboard, formatId, formatDataResponse->requestedFormatData, size);
|
||||
|
||||
SetEvent(mfc->clipboardRequestEvent);
|
||||
|
||||
|
|
|
@ -771,12 +771,9 @@ DWORD fixKeyCode(DWORD keyCode, unichar keyChar, enum APPLE_KEYBOARD_TYPE type)
|
|||
formatData = [item dataForType:type];
|
||||
formatId = ClipboardRegisterFormat(mfc->clipboard, "UTF8_STRING");
|
||||
/* length does not include null terminator */
|
||||
size = (UINT32) [formatData length];
|
||||
data = (BYTE*) malloc(size + 1);
|
||||
[formatData getBytes:data length:size];
|
||||
data[size] = '\0';
|
||||
size++;
|
||||
ClipboardSetData(mfc->clipboard, formatId, (void*) data, size);
|
||||
size = (UINT32) [formatData length] + 1;
|
||||
data = [formatData bytes];
|
||||
ClipboardSetData(mfc->clipboard, formatId, data, size);
|
||||
formatMatch = TRUE;
|
||||
break;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -58,14 +58,15 @@ const char* CF_STANDARD_STRINGS[CF_MAX] =
|
|||
"CF_DIBV5" /* 17 */
|
||||
};
|
||||
|
||||
wClipboardFormat* ClipboardFindFormat(wClipboard* clipboard, UINT32 formatId, const char* name)
|
||||
wClipboardFormat* ClipboardFindFormat(wClipboard* clipboard, UINT32 formatId,
|
||||
const char* name)
|
||||
{
|
||||
UINT32 index;
|
||||
wClipboardFormat* format = NULL;
|
||||
|
||||
if (!clipboard)
|
||||
return NULL;
|
||||
|
||||
|
||||
if (formatId)
|
||||
{
|
||||
for (index = 0; index < clipboard->numFormats; index++)
|
||||
|
@ -91,7 +92,6 @@ wClipboardFormat* ClipboardFindFormat(wClipboard* clipboard, UINT32 formatId, co
|
|||
else
|
||||
{
|
||||
/* special "CF_RAW" case */
|
||||
|
||||
if (clipboard->numFormats > 0)
|
||||
{
|
||||
format = &clipboard->formats[0];
|
||||
|
@ -99,7 +99,8 @@ wClipboardFormat* ClipboardFindFormat(wClipboard* clipboard, UINT32 formatId, co
|
|||
if (format->formatId)
|
||||
return NULL;
|
||||
|
||||
if (!format->formatName || (strcmp(format->formatName, CF_STANDARD_STRINGS[0]) == 0))
|
||||
if (!format->formatName
|
||||
|| (strcmp(format->formatName, CF_STANDARD_STRINGS[0]) == 0))
|
||||
return format;
|
||||
}
|
||||
}
|
||||
|
@ -107,7 +108,8 @@ wClipboardFormat* ClipboardFindFormat(wClipboard* clipboard, UINT32 formatId, co
|
|||
return format;
|
||||
}
|
||||
|
||||
wClipboardSynthesizer* ClipboardFindSynthesizer(wClipboardFormat* format, UINT32 formatId)
|
||||
wClipboardSynthesizer* ClipboardFindSynthesizer(wClipboardFormat* format,
|
||||
UINT32 formatId)
|
||||
{
|
||||
UINT32 index;
|
||||
wClipboardSynthesizer* synthesizer;
|
||||
|
@ -133,7 +135,7 @@ void ClipboardLock(wClipboard* clipboard)
|
|||
{
|
||||
if (!clipboard)
|
||||
return;
|
||||
|
||||
|
||||
EnterCriticalSection(&(clipboard->lock));
|
||||
}
|
||||
|
||||
|
@ -141,7 +143,7 @@ void ClipboardUnlock(wClipboard* clipboard)
|
|||
{
|
||||
if (!clipboard)
|
||||
return;
|
||||
|
||||
|
||||
LeaveCriticalSection(&(clipboard->lock));
|
||||
}
|
||||
|
||||
|
@ -149,7 +151,7 @@ BOOL ClipboardEmpty(wClipboard* clipboard)
|
|||
{
|
||||
if (!clipboard)
|
||||
return FALSE;
|
||||
|
||||
|
||||
if (clipboard->data)
|
||||
{
|
||||
free((void*) clipboard->data);
|
||||
|
@ -157,10 +159,8 @@ BOOL ClipboardEmpty(wClipboard* clipboard)
|
|||
}
|
||||
|
||||
clipboard->size = 0;
|
||||
|
||||
clipboard->formatId = 0;
|
||||
clipboard->sequenceNumber++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -168,16 +168,17 @@ UINT32 ClipboardCountRegisteredFormats(wClipboard* clipboard)
|
|||
{
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
||||
return clipboard->numFormats;
|
||||
}
|
||||
|
||||
UINT32 ClipboardGetRegisteredFormatIds(wClipboard* clipboard, UINT32** ppFormatIds)
|
||||
UINT32 ClipboardGetRegisteredFormatIds(wClipboard* clipboard,
|
||||
UINT32** ppFormatIds)
|
||||
{
|
||||
UINT32 index;
|
||||
UINT32* pFormatIds;
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
@ -208,7 +209,7 @@ UINT32 ClipboardGetRegisteredFormatIds(wClipboard* clipboard, UINT32** ppFormatI
|
|||
UINT32 ClipboardRegisterFormat(wClipboard* clipboard, const char* name)
|
||||
{
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
@ -220,10 +221,9 @@ UINT32 ClipboardRegisterFormat(wClipboard* clipboard, const char* name)
|
|||
if ((clipboard->numFormats + 1) >= clipboard->maxFormats)
|
||||
{
|
||||
UINT32 numFormats = clipboard->maxFormats * 2;
|
||||
wClipboardFormat *tmpFormat;
|
||||
|
||||
wClipboardFormat* tmpFormat;
|
||||
tmpFormat = (wClipboardFormat*) realloc(clipboard->formats,
|
||||
numFormats * sizeof(wClipboardFormat));
|
||||
numFormats * sizeof(wClipboardFormat));
|
||||
|
||||
if (!tmpFormat)
|
||||
return 0;
|
||||
|
@ -245,17 +245,16 @@ UINT32 ClipboardRegisterFormat(wClipboard* clipboard, const char* name)
|
|||
|
||||
format->formatId = clipboard->nextFormatId++;
|
||||
clipboard->numFormats++;
|
||||
|
||||
return format->formatId;
|
||||
}
|
||||
|
||||
BOOL ClipboardRegisterSynthesizer(wClipboard* clipboard, UINT32 formatId,
|
||||
UINT32 syntheticId, CLIPBOARD_SYNTHESIZE_FN pfnSynthesize)
|
||||
UINT32 syntheticId, CLIPBOARD_SYNTHESIZE_FN pfnSynthesize)
|
||||
{
|
||||
UINT32 index;
|
||||
wClipboardFormat* format;
|
||||
wClipboardSynthesizer* synthesizer;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return FALSE;
|
||||
|
||||
|
@ -271,11 +270,10 @@ BOOL ClipboardRegisterSynthesizer(wClipboard* clipboard, UINT32 formatId,
|
|||
|
||||
if (!synthesizer)
|
||||
{
|
||||
wClipboardSynthesizer *tmpSynthesizer;
|
||||
wClipboardSynthesizer* tmpSynthesizer;
|
||||
UINT32 numSynthesizers = format->numSynthesizers + 1;
|
||||
|
||||
tmpSynthesizer = (wClipboardSynthesizer*) realloc(format->synthesizers,
|
||||
numSynthesizers * sizeof(wClipboardSynthesizer));
|
||||
numSynthesizers * sizeof(wClipboardSynthesizer));
|
||||
|
||||
if (!tmpSynthesizer)
|
||||
return FALSE;
|
||||
|
@ -287,10 +285,8 @@ BOOL ClipboardRegisterSynthesizer(wClipboard* clipboard, UINT32 formatId,
|
|||
}
|
||||
|
||||
ZeroMemory(synthesizer, sizeof(wClipboardSynthesizer));
|
||||
|
||||
synthesizer->syntheticId = syntheticId;
|
||||
synthesizer->pfnSynthesize = pfnSynthesize;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -298,7 +294,7 @@ UINT32 ClipboardCountFormats(wClipboard* clipboard)
|
|||
{
|
||||
UINT32 count;
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
@ -308,7 +304,6 @@ UINT32 ClipboardCountFormats(wClipboard* clipboard)
|
|||
return 0;
|
||||
|
||||
count = 1 + format->numSynthesizers;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -319,7 +314,7 @@ UINT32 ClipboardGetFormatIds(wClipboard* clipboard, UINT32** ppFormatIds)
|
|||
UINT32* pFormatIds;
|
||||
wClipboardFormat* format;
|
||||
wClipboardSynthesizer* synthesizer;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
@ -360,7 +355,7 @@ BOOL ClipboardInitFormats(wClipboard* clipboard)
|
|||
{
|
||||
UINT32 formatId = 0;
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return FALSE;
|
||||
|
||||
|
@ -368,24 +363,24 @@ BOOL ClipboardInitFormats(wClipboard* clipboard)
|
|||
{
|
||||
format = &(clipboard->formats[clipboard->numFormats]);
|
||||
ZeroMemory(format, sizeof(wClipboardFormat));
|
||||
|
||||
format->formatId = formatId;
|
||||
format->formatName = _strdup(CF_STANDARD_STRINGS[formatId]);
|
||||
|
||||
if (!format->formatName)
|
||||
{
|
||||
int i;
|
||||
for (i = formatId-1; i >= 0; --i)
|
||||
|
||||
for (i = formatId - 1; i >= 0; --i)
|
||||
{
|
||||
format = &(clipboard->formats[--clipboard->numFormats]);
|
||||
free((void *)format->formatName);
|
||||
free((void*)format->formatName);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
ClipboardInitSynthesizers(clipboard);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -395,7 +390,7 @@ UINT32 ClipboardGetFormatId(wClipboard* clipboard, const char* name)
|
|||
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
||||
format = ClipboardFindFormat(clipboard, 0, name);
|
||||
|
||||
if (!format)
|
||||
|
@ -407,7 +402,7 @@ UINT32 ClipboardGetFormatId(wClipboard* clipboard, const char* name)
|
|||
const char* ClipboardGetFormatName(wClipboard* clipboard, UINT32 formatId)
|
||||
{
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return NULL;
|
||||
|
||||
|
@ -427,7 +422,7 @@ void* ClipboardGetData(wClipboard* clipboard, UINT32 formatId, UINT32* pSize)
|
|||
void* pDstData = NULL;
|
||||
wClipboardFormat* format;
|
||||
wClipboardSynthesizer* synthesizer;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return NULL;
|
||||
|
||||
|
@ -445,7 +440,6 @@ void* ClipboardGetData(wClipboard* clipboard, UINT32 formatId, UINT32* pSize)
|
|||
if (formatId == format->formatId)
|
||||
{
|
||||
DstSize = SrcSize;
|
||||
|
||||
pDstData = malloc(DstSize);
|
||||
|
||||
if (!pDstData)
|
||||
|
@ -462,18 +456,19 @@ void* ClipboardGetData(wClipboard* clipboard, UINT32 formatId, UINT32* pSize)
|
|||
return NULL;
|
||||
|
||||
DstSize = SrcSize;
|
||||
pDstData = synthesizer->pfnSynthesize(clipboard, format->formatId, pSrcData, &DstSize);
|
||||
|
||||
pDstData = synthesizer->pfnSynthesize(clipboard, format->formatId, pSrcData,
|
||||
&DstSize);
|
||||
*pSize = DstSize;
|
||||
}
|
||||
|
||||
return pDstData;
|
||||
}
|
||||
|
||||
BOOL ClipboardSetData(wClipboard* clipboard, UINT32 formatId, const void* data, UINT32 size)
|
||||
BOOL ClipboardSetData(wClipboard* clipboard, UINT32 formatId, const void* data,
|
||||
UINT32 size)
|
||||
{
|
||||
wClipboardFormat* format;
|
||||
|
||||
|
||||
if (!clipboard)
|
||||
return FALSE;
|
||||
|
||||
|
@ -483,12 +478,15 @@ BOOL ClipboardSetData(wClipboard* clipboard, UINT32 formatId, const void* data,
|
|||
return FALSE;
|
||||
|
||||
free((void*) clipboard->data);
|
||||
clipboard->data = data;
|
||||
clipboard->size = size;
|
||||
clipboard->data = malloc(size);
|
||||
|
||||
if (!clipboard->data)
|
||||
return FALSE;
|
||||
|
||||
memcpy(clipboard->data, data, size);
|
||||
clipboard->size = size;
|
||||
clipboard->formatId = formatId;
|
||||
clipboard->sequenceNumber++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -496,7 +494,7 @@ UINT64 ClipboardGetOwner(wClipboard* clipboard)
|
|||
{
|
||||
if (!clipboard)
|
||||
return 0;
|
||||
|
||||
|
||||
return clipboard->ownerId;
|
||||
}
|
||||
|
||||
|
@ -504,14 +502,13 @@ void ClipboardSetOwner(wClipboard* clipboard, UINT64 ownerId)
|
|||
{
|
||||
if (!clipboard)
|
||||
return;
|
||||
|
||||
|
||||
clipboard->ownerId = ownerId;
|
||||
}
|
||||
|
||||
wClipboard* ClipboardCreate()
|
||||
{
|
||||
wClipboard* clipboard;
|
||||
|
||||
clipboard = (wClipboard*) calloc(1, sizeof(wClipboard));
|
||||
|
||||
if (clipboard)
|
||||
|
@ -527,7 +524,8 @@ wClipboard* ClipboardCreate()
|
|||
|
||||
clipboard->numFormats = 0;
|
||||
clipboard->maxFormats = 64;
|
||||
clipboard->formats = (wClipboardFormat*) malloc(clipboard->maxFormats * sizeof(wClipboardFormat));
|
||||
clipboard->formats = (wClipboardFormat*) malloc(clipboard->maxFormats * sizeof(
|
||||
wClipboardFormat));
|
||||
|
||||
if (!clipboard->formats)
|
||||
{
|
||||
|
@ -536,7 +534,7 @@ wClipboard* ClipboardCreate()
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if(!ClipboardInitFormats(clipboard))
|
||||
if (!ClipboardInitFormats(clipboard))
|
||||
{
|
||||
DeleteCriticalSection(&(clipboard->lock));
|
||||
free(clipboard);
|
||||
|
@ -571,11 +569,8 @@ void ClipboardDestroy(wClipboard* clipboard)
|
|||
free((void*) clipboard->data);
|
||||
clipboard->data = NULL;
|
||||
clipboard->size = 0;
|
||||
|
||||
clipboard->numFormats = 0;
|
||||
free(clipboard->formats);
|
||||
|
||||
DeleteCriticalSection(&(clipboard->lock));
|
||||
|
||||
free(clipboard);
|
||||
}
|
||||
|
|
|
@ -34,9 +34,8 @@ int TestClipboardFormats(int argc, char* argv[])
|
|||
BOOL bSuccess;
|
||||
UINT32 SrcSize;
|
||||
UINT32 DstSize;
|
||||
char* pSrcData;
|
||||
const char* pSrcData = "this is a test string";
|
||||
char* pDstData;
|
||||
pSrcData = _strdup("this is a test string");
|
||||
|
||||
if (!pSrcData)
|
||||
{
|
||||
|
@ -45,12 +44,8 @@ int TestClipboardFormats(int argc, char* argv[])
|
|||
}
|
||||
|
||||
SrcSize = (UINT32)(strlen(pSrcData) + 1);
|
||||
bSuccess = ClipboardSetData(clipboard, utf8StringFormatId, (void*) pSrcData,
|
||||
bSuccess = ClipboardSetData(clipboard, utf8StringFormatId, pSrcData,
|
||||
SrcSize);
|
||||
|
||||
if (!bSuccess)
|
||||
free(pSrcData);
|
||||
|
||||
fprintf(stderr, "ClipboardSetData: %d\n", bSuccess);
|
||||
DstSize = 0;
|
||||
pDstData = (char*) ClipboardGetData(clipboard, utf8StringFormatId, &DstSize);
|
||||
|
|
Loading…
Reference in New Issue