Blame winpr/libwinpr/clipboard/synthetic.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Clipboard Functions
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <errno.h>
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/user.h>
Packit 1fb8d4
Packit 1fb8d4
#include "clipboard.h"
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Standard Clipboard Formats:
Packit 1fb8d4
 * http://msdn.microsoft.com/en-us/library/windows/desktop/ff729168/
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_TEXT":
Packit 1fb8d4
 *
Packit 1fb8d4
 * Null-terminated ANSI text with CR/LF line endings.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_text(wClipboard* clipboard, UINT32 formatId, const void* data,
Packit 1fb8d4
        UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	int size;
Packit 1fb8d4
	char* pDstData = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == CF_UNICODETEXT)
Packit 1fb8d4
	{
Packit 1fb8d4
		char* str = NULL;
Packit 1fb8d4
Packit 1fb8d4
		if (*pSize > INT32_MAX)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		size = (int) * pSize;
Packit 1fb8d4
		size = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) data,
Packit 1fb8d4
		                          size / 2, (CHAR**) &str, 0, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
		if (!str)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		pDstData = ConvertLineEndingToCRLF((const char*) str, &size);
Packit 1fb8d4
		free(str);
Packit 1fb8d4
		*pSize = size;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
	else if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "UTF8_STRING")) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "text/plain")) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "TEXT")) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "STRING")))
Packit 1fb8d4
	{
Packit 1fb8d4
		size = (INT64) * pSize;
Packit 1fb8d4
		pDstData = ConvertLineEndingToCRLF((const char*) data, &size);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		*pSize = size;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_OEMTEXT":
Packit 1fb8d4
 *
Packit 1fb8d4
 * Null-terminated OEM text with CR/LF line endings.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_oemtext(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	return clipboard_synthesize_cf_text(clipboard, formatId, data, pSize);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_LOCALE":
Packit 1fb8d4
 *
Packit 1fb8d4
 * System locale identifier associated with CF_TEXT
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_locale(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32* pDstData = NULL;
Packit 1fb8d4
	pDstData = (UINT32*) malloc(sizeof(UINT32));
Packit 1fb8d4
Packit 1fb8d4
	if (!pDstData)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	*pDstData = 0x0409; /* English - United States */
Packit 1fb8d4
	return (void*) pDstData;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_UNICODETEXT":
Packit 1fb8d4
 *
Packit 1fb8d4
 * Null-terminated UTF-16 text with CR/LF line endings.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_unicodetext(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	int size;
Packit 1fb8d4
	int status;
Packit 1fb8d4
	char* crlfStr = NULL;
Packit 1fb8d4
	WCHAR* pDstData = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
Packit 1fb8d4
	    (formatId == ClipboardGetFormatId(clipboard, "UTF8_STRING")) ||
Packit 1fb8d4
	    (formatId == ClipboardGetFormatId(clipboard, "text/plain")) ||
Packit 1fb8d4
	    (formatId == ClipboardGetFormatId(clipboard, "TEXT")) ||
Packit 1fb8d4
	    (formatId == ClipboardGetFormatId(clipboard, "STRING")))
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!pSize || (*pSize > INT32_MAX))
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		size = (int) * pSize;
Packit 1fb8d4
		crlfStr = ConvertLineEndingToCRLF((char*) data, &size);
Packit 1fb8d4
Packit 1fb8d4
		if (!crlfStr)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		status = ConvertToUnicode(CP_UTF8, 0, crlfStr, size, &pDstData, 0);
Packit 1fb8d4
		free(crlfStr);
Packit 1fb8d4
Packit 1fb8d4
		if (status <= 0)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		*pSize = status * 2;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return (void*) pDstData;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "UTF8_STRING":
Packit 1fb8d4
 *
Packit 1fb8d4
 * Null-terminated UTF-8 string with LF line endings.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_utf8_string(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	INT64 size;
Packit 1fb8d4
	char* pDstData = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == CF_UNICODETEXT)
Packit 1fb8d4
	{
Packit 1fb8d4
		size = (INT64) * pSize;
Packit 1fb8d4
		size = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) data,
Packit 1fb8d4
		                          size / 2, (CHAR**) &pDstData, 0, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		size = ConvertLineEndingToLF(pDstData, size);
Packit 1fb8d4
		*pSize = size;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
	else if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "text/plain")) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "TEXT")) ||
Packit 1fb8d4
	         (formatId == ClipboardGetFormatId(clipboard, "STRING")))
Packit 1fb8d4
	{
Packit 1fb8d4
		size = (INT64) * pSize;
Packit 1fb8d4
		pDstData = (char*) malloc(size);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(pDstData, data, size);
Packit 1fb8d4
		size = ConvertLineEndingToLF((char*) pDstData, size);
Packit 1fb8d4
		*pSize = size;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_DIB":
Packit 1fb8d4
 *
Packit 1fb8d4
 * BITMAPINFO structure followed by the bitmap bits.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_dib(wClipboard* clipboard, UINT32 formatId, const void* data,
Packit 1fb8d4
        UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 SrcSize;
Packit 1fb8d4
	UINT32 DstSize;
Packit 1fb8d4
	BYTE* pDstData;
Packit 1fb8d4
	SrcSize = *pSize;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == CF_DIBV5)
Packit 1fb8d4
	{
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (formatId == ClipboardGetFormatId(clipboard, "image/bmp"))
Packit 1fb8d4
	{
Packit 1fb8d4
		BITMAPFILEHEADER* pFileHeader;
Packit 1fb8d4
Packit 1fb8d4
		if (SrcSize < (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)))
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		pFileHeader = (BITMAPFILEHEADER*) data;
Packit 1fb8d4
Packit 1fb8d4
		if (pFileHeader->bfType != 0x4D42)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		DstSize = SrcSize - sizeof(BITMAPFILEHEADER);
Packit 1fb8d4
		pDstData = (BYTE*) malloc(DstSize);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		data = (void*) & ((BYTE*) data)[sizeof(BITMAPFILEHEADER)];
Packit 1fb8d4
		CopyMemory(pDstData, data, DstSize);
Packit 1fb8d4
		*pSize = DstSize;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "CF_DIBV5":
Packit 1fb8d4
 *
Packit 1fb8d4
 * BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_cf_dibv5(wClipboard* clipboard, UINT32 formatId, const void* data,
Packit 1fb8d4
        UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	if (formatId == CF_DIB)
Packit 1fb8d4
	{
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (formatId == ClipboardGetFormatId(clipboard, "image/bmp"))
Packit 1fb8d4
	{
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "image/bmp":
Packit 1fb8d4
 *
Packit 1fb8d4
 * Bitmap file format.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_image_bmp(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 SrcSize;
Packit 1fb8d4
	UINT32 DstSize;
Packit 1fb8d4
	BYTE* pDstData;
Packit 1fb8d4
	SrcSize = *pSize;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == CF_DIB)
Packit 1fb8d4
	{
Packit 1fb8d4
		BYTE* pDst;
Packit 1fb8d4
		BITMAPINFOHEADER* pInfoHeader;
Packit 1fb8d4
		BITMAPFILEHEADER* pFileHeader;
Packit 1fb8d4
Packit 1fb8d4
		if (SrcSize < sizeof(BITMAPINFOHEADER))
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		pInfoHeader = (BITMAPINFOHEADER*) data;
Packit 1fb8d4
Packit 1fb8d4
		if ((pInfoHeader->biBitCount < 1) || (pInfoHeader->biBitCount > 32))
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		DstSize = sizeof(BITMAPFILEHEADER) + SrcSize;
Packit 1fb8d4
		pDstData = (BYTE*) malloc(DstSize);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		pFileHeader = (BITMAPFILEHEADER*) pDstData;
Packit 1fb8d4
		pFileHeader->bfType = 0x4D42;
Packit 1fb8d4
		pFileHeader->bfSize = DstSize;
Packit 1fb8d4
		pFileHeader->bfReserved1 = 0;
Packit 1fb8d4
		pFileHeader->bfReserved2 = 0;
Packit 1fb8d4
		pFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
Packit 1fb8d4
		pDst = &pDstData[sizeof(BITMAPFILEHEADER)];
Packit 1fb8d4
		CopyMemory(pDst, data, SrcSize);
Packit 1fb8d4
		*pSize = DstSize;
Packit 1fb8d4
		return pDstData;
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (formatId == CF_DIBV5)
Packit 1fb8d4
	{
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "HTML Format":
Packit 1fb8d4
 *
Packit 1fb8d4
 * HTML clipboard format: msdn.microsoft.com/en-us/library/windows/desktop/ms649015/
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_html_format(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	char* pSrcData = NULL;
Packit 1fb8d4
	char* pDstData = NULL;
Packit 1fb8d4
	INT64 SrcSize = (INT64) * pSize;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == ClipboardGetFormatId(clipboard, "text/html"))
Packit 1fb8d4
	{
Packit 1fb8d4
		char* body;
Packit 1fb8d4
		BYTE bom[2];
Packit 1fb8d4
		char num[20];
Packit 1fb8d4
		WCHAR* wstr;
Packit 1fb8d4
Packit 1fb8d4
		if (SrcSize > 2)
Packit 1fb8d4
		{
Packit 1fb8d4
			CopyMemory(bom, data, 2);
Packit 1fb8d4
Packit 1fb8d4
			if ((bom[0] == 0xFE) && (bom[1] == 0xFF))
Packit 1fb8d4
			{
Packit 1fb8d4
				ByteSwapUnicode((WCHAR*) data, SrcSize / 2);
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			if ((bom[0] == 0xFF) && (bom[1] == 0xFE))
Packit 1fb8d4
			{
Packit 1fb8d4
				wstr = (WCHAR*) & ((BYTE*) data)[2];
Packit 1fb8d4
				ConvertFromUnicode(CP_UTF8, 0, wstr,
Packit 1fb8d4
				                   (SrcSize - 2) / 2, &pSrcData, 0, NULL, NULL);
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (!pSrcData)
Packit 1fb8d4
		{
Packit 1fb8d4
			pSrcData = (char*) calloc(1, SrcSize + 1);
Packit 1fb8d4
Packit 1fb8d4
			if (!pSrcData)
Packit 1fb8d4
				return NULL;
Packit 1fb8d4
Packit 1fb8d4
			CopyMemory(pSrcData, data, SrcSize);
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		pDstData = (char*) calloc(1, SrcSize + 200);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
		{
Packit 1fb8d4
			free(pSrcData);
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		sprintf_s(pDstData, SrcSize + 200,
Packit 1fb8d4
		          "Version:0.9\r\n"
Packit 1fb8d4
		          "StartHTML:0000000000\r\n"
Packit 1fb8d4
		          "EndHTML:0000000000\r\n"
Packit 1fb8d4
		          "StartFragment:0000000000\r\n"
Packit 1fb8d4
		          "EndFragment:0000000000\r\n");
Packit 1fb8d4
		body = strstr(pSrcData, "
Packit 1fb8d4
Packit 1fb8d4
		if (!body)
Packit 1fb8d4
			body = strstr(pSrcData, "
Packit 1fb8d4
Packit 1fb8d4
		/* StartHTML */
Packit 1fb8d4
		sprintf_s(num, sizeof(num), "%010"PRIuz"", strlen(pDstData));
Packit 1fb8d4
		CopyMemory(&pDstData[23], num, 10);
Packit 1fb8d4
Packit 1fb8d4
		if (!body)
Packit 1fb8d4
			strcat(pDstData, "<HTML><BODY>");
Packit 1fb8d4
Packit 1fb8d4
		strcat(pDstData, "");
Packit 1fb8d4
		/* StartFragment */
Packit 1fb8d4
		sprintf_s(num, sizeof(num), "%010"PRIuz"", strlen(pDstData));
Packit 1fb8d4
		CopyMemory(&pDstData[69], num, 10);
Packit 1fb8d4
		strcat(pDstData, pSrcData);
Packit 1fb8d4
		/* EndFragment */
Packit 1fb8d4
		sprintf_s(num, sizeof(num), "%010"PRIuz"", strlen(pDstData));
Packit 1fb8d4
		CopyMemory(&pDstData[93], num, 10);
Packit 1fb8d4
		strcat(pDstData, "");
Packit 1fb8d4
Packit 1fb8d4
		if (!body)
Packit 1fb8d4
			strcat(pDstData, "</BODY></HTML>");
Packit 1fb8d4
Packit 1fb8d4
		/* EndHTML */
Packit 1fb8d4
		sprintf_s(num, sizeof(num), "%010"PRIuz"", strlen(pDstData));
Packit 1fb8d4
		CopyMemory(&pDstData[43], num, 10);
Packit 1fb8d4
		*pSize = (UINT32) strlen(pDstData) + 1;
Packit 1fb8d4
		free(pSrcData);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return pDstData;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * "text/html":
Packit 1fb8d4
 *
Packit 1fb8d4
 * HTML text format.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static void* clipboard_synthesize_text_html(wClipboard* clipboard, UINT32 formatId,
Packit 1fb8d4
        const void* data, UINT32* pSize)
Packit 1fb8d4
{
Packit 1fb8d4
	long beg;
Packit 1fb8d4
	long end;
Packit 1fb8d4
	char* str;
Packit 1fb8d4
	char* begStr;
Packit 1fb8d4
	char* endStr;
Packit 1fb8d4
	INT64 SrcSize;
Packit 1fb8d4
	long DstSize = -1;
Packit 1fb8d4
	BYTE* pDstData = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (formatId == ClipboardGetFormatId(clipboard, "HTML Format"))
Packit 1fb8d4
	{
Packit 1fb8d4
		str = (char*) data;
Packit 1fb8d4
		SrcSize = (INT64) * pSize;
Packit 1fb8d4
		begStr = strstr(str, "StartHTML:");
Packit 1fb8d4
		endStr = strstr(str, "EndHTML:");
Packit 1fb8d4
Packit 1fb8d4
		if (!begStr || !endStr)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		errno = 0;
Packit 1fb8d4
		beg = strtol(&begStr[10], NULL, 10);
Packit 1fb8d4
Packit 1fb8d4
		if (errno != 0)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		end = strtol(&endStr[8], NULL, 10);
Packit 1fb8d4
Packit 1fb8d4
		if (beg < 0 || end < 0 || (beg > SrcSize) || (end > SrcSize) || (beg >= end) || (errno != 0))
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		DstSize = end - beg;
Packit 1fb8d4
		pDstData = (BYTE*) malloc(SrcSize - beg + 1);
Packit 1fb8d4
Packit 1fb8d4
		if (!pDstData)
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(pDstData, &str[beg], DstSize);
Packit 1fb8d4
		DstSize = ConvertLineEndingToLF((char*) pDstData, DstSize);
Packit 1fb8d4
		*pSize = (UINT32) DstSize;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return (void*) pDstData;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 formatId;
Packit 1fb8d4
	UINT32 altFormatId;
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * CF_TEXT
Packit 1fb8d4
	 */
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_OEMTEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_UNICODETEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_LOCALE,
Packit 1fb8d4
	                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	altFormatId = ClipboardRegisterFormat(clipboard, "UTF8_STRING");
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_TEXT, altFormatId,
Packit 1fb8d4
	                             clipboard_synthesize_utf8_string);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * CF_OEMTEXT
Packit 1fb8d4
	 */
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_TEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_text);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_UNICODETEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_LOCALE,
Packit 1fb8d4
	                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	altFormatId = ClipboardRegisterFormat(clipboard, "UTF8_STRING");
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, altFormatId,
Packit 1fb8d4
	                             clipboard_synthesize_utf8_string);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * CF_UNICODETEXT
Packit 1fb8d4
	 */
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_TEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_text);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_OEMTEXT,
Packit 1fb8d4
	                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_LOCALE,
Packit 1fb8d4
	                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	altFormatId = ClipboardRegisterFormat(clipboard, "UTF8_STRING");
Packit 1fb8d4
	ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, altFormatId,
Packit 1fb8d4
	                             clipboard_synthesize_utf8_string);
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * UTF8_STRING
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "UTF8_STRING");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_text);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
Packit 1fb8d4
		                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * text/plain
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "text/plain");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_text);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
Packit 1fb8d4
		                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * TEXT
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "TEXT");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_text);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
Packit 1fb8d4
		                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * STRING
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "STRING");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_text);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_oemtext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
Packit 1fb8d4
		                             clipboard_synthesize_cf_unicodetext);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
Packit 1fb8d4
		                             clipboard_synthesize_cf_locale);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * CF_DIB
Packit 1fb8d4
	 */
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, CF_DIB, CF_DIBV5,
Packit 1fb8d4
		                             clipboard_synthesize_cf_dibv5);
Packit 1fb8d4
		altFormatId = ClipboardRegisterFormat(clipboard, "image/bmp");
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
Packit 1fb8d4
		                             clipboard_synthesize_image_bmp);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * CF_DIBV5
Packit 1fb8d4
	 */
Packit 1fb8d4
Packit 1fb8d4
	if (formatId && 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, CF_DIB,
Packit 1fb8d4
		                             clipboard_synthesize_cf_dib);
Packit 1fb8d4
		altFormatId = ClipboardRegisterFormat(clipboard, "image/bmp");
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
Packit 1fb8d4
		                             clipboard_synthesize_image_bmp);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * image/bmp
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "image/bmp");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_DIB,
Packit 1fb8d4
		                             clipboard_synthesize_cf_dib);
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, CF_DIBV5,
Packit 1fb8d4
		                             clipboard_synthesize_cf_dibv5);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * HTML Format
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "HTML Format");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		altFormatId = ClipboardRegisterFormat(clipboard, "text/html");
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, altFormatId,
Packit 1fb8d4
		                             clipboard_synthesize_text_html);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * text/html
Packit 1fb8d4
	 */
Packit 1fb8d4
	formatId = ClipboardRegisterFormat(clipboard, "text/html");
Packit 1fb8d4
Packit 1fb8d4
	if (formatId)
Packit 1fb8d4
	{
Packit 1fb8d4
		altFormatId = ClipboardRegisterFormat(clipboard, "HTML Format");
Packit 1fb8d4
		ClipboardRegisterSynthesizer(clipboard, formatId, altFormatId,
Packit 1fb8d4
		                             clipboard_synthesize_html_format);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}