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