winpr: add new line ending, utf16 byte order swap functions

This commit is contained in:
Marc-André Moreau 2014-10-16 18:07:44 -04:00
parent d668855be6
commit f6b3b24c22
6 changed files with 111 additions and 87 deletions

View File

@ -93,79 +93,6 @@ struct xf_clipboard
int xf_cliprdr_send_client_format_list(xfClipboard* clipboard);
static BYTE* ConvertLineEndingToCRLF(BYTE* str, int* size)
{
BYTE c;
BYTE* outbuf;
BYTE* out;
BYTE* in_end;
BYTE* in;
int out_size;
out_size = (*size) * 2 + 1;
outbuf = (BYTE*) malloc(out_size);
out = outbuf;
in = str;
in_end = str + (*size);
while (in < in_end)
{
c = *in++;
if (c == '\n')
{
*out++ = '\r';
*out++ = '\n';
}
else
{
*out++ = c;
}
}
*out++ = 0;
*size = out - outbuf;
return outbuf;
}
static int ConvertLineEndingToLF(BYTE* str, int length)
{
BYTE c;
BYTE* out;
BYTE* in;
BYTE* in_end;
int status = -1;
out = str;
in = str;
in_end = &str[length];
while (in < in_end)
{
c = *in++;
if (c != '\r')
*out++ = c;
}
status = out - str;
return status;
}
static void ByteSwapUnicode(WCHAR* wstr, int length)
{
WCHAR* end = &wstr[length];
while (wstr < end)
{
*wstr = _byteswap_ushort(*wstr);
wstr++;
}
}
static BOOL xf_cliprdr_is_self_owned(xfClipboard* clipboard)
{
Atom type;
@ -327,7 +254,7 @@ static BYTE* xf_cliprdr_process_requested_unicodetext(BYTE* data, int* size)
WCHAR* outbuf = NULL;
int out_size;
inbuf = (char*) ConvertLineEndingToCRLF(data, size);
inbuf = ConvertLineEndingToCRLF((char*) data, size);
out_size = ConvertToUnicode(CP_UTF8, 0, inbuf, -1, &outbuf, 0);
free(inbuf);
@ -338,11 +265,11 @@ static BYTE* xf_cliprdr_process_requested_unicodetext(BYTE* data, int* size)
static BYTE* xf_cliprdr_process_requested_text(BYTE* data, int* size)
{
BYTE* outbuf;
char* outbuf;
outbuf = ConvertLineEndingToCRLF(data, size);
outbuf = ConvertLineEndingToCRLF((char*) data, size);
return outbuf;
return (BYTE*) outbuf;
}
static BYTE* xf_cliprdr_process_requested_dib(BYTE* data, int* size)
@ -632,9 +559,7 @@ static int xf_cliprdr_process_text(BYTE* pSrcData, int SrcSize, BYTE** ppDstData
pDstData = (BYTE*) malloc(SrcSize);
CopyMemory(pDstData, pSrcData, SrcSize);
DstSize = SrcSize;
DstSize = ConvertLineEndingToLF(pDstData, DstSize);
DstSize = ConvertLineEndingToLF((char*) pDstData, SrcSize);
*ppDstData = pDstData;
@ -649,7 +574,7 @@ static int xf_cliprdr_process_unicodetext(BYTE* pSrcData, int SrcSize, BYTE** pp
DstSize = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) pSrcData,
SrcSize / 2, (CHAR**) &pDstData, 0, NULL, NULL);
DstSize = ConvertLineEndingToLF(pDstData, DstSize);
DstSize = ConvertLineEndingToLF((char*) pDstData, DstSize);
*ppDstData = pDstData;
@ -720,10 +645,9 @@ static int xf_cliprdr_process_html(BYTE* pSrcData, int SrcSize, BYTE** ppDstData
return -1;
DstSize = end - start;
pDstData = (BYTE*) malloc(SrcSize - start + 1);
CopyMemory(pDstData, pSrcData + start, DstSize);
DstSize = ConvertLineEndingToLF(pDstData, DstSize);
CopyMemory(pDstData, &pSrcData[start], DstSize);
DstSize = ConvertLineEndingToLF((char*) pDstData, DstSize);
*ppDstData = pDstData;

View File

@ -181,6 +181,11 @@ WINPR_API int ConvertToUnicode(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteS
WINPR_API int ConvertFromUnicode(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);
WINPR_API void ByteSwapUnicode(WCHAR* wstr, int length);
WINPR_API int ConvertLineEndingToLF(char* str, int size);
WINPR_API char* ConvertLineEndingToCRLF(const char* str, int* size);
#ifdef __cplusplus
}
#endif

View File

@ -387,3 +387,81 @@ int lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
}
#endif
int ConvertLineEndingToLF(char* str, int size)
{
int status;
char* end;
char* pInput;
char* pOutput;
end = &str[size];
pInput = pOutput = str;
while (pInput < end)
{
if ((pInput[0] == '\r') && (pInput[1] == '\n'))
{
*pOutput++ = '\n';
pInput += 2;
}
else
{
*pOutput++ = *pInput++;
}
}
status = pOutput - str;
return status;
}
char* ConvertLineEndingToCRLF(const char* str, int* size)
{
int count;
char* newStr;
char* pOutput;
const char* end;
const char* pInput;
end = &str[*size];
count = 0;
pInput = str;
while (pInput < end)
{
if (*pInput == '\n')
count++;
pInput++;
}
newStr = (char*) malloc(*size + (count * 2) + 1);
if (!newStr)
return NULL;
pInput = str;
pOutput = newStr;
while (pInput < end)
{
if ((*pInput == '\n') && ((pInput > str) && (pInput[-1] != '\r')))
{
*pOutput++ = '\r';
*pOutput++ = '\n';
}
else
{
*pOutput++ = *pInput;
}
pInput++;
}
*size = pOutput - newStr;
return newStr;
}

View File

@ -376,3 +376,18 @@ int ConvertFromUnicode(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int
return status;
}
/**
* Swap Unicode byte order (UTF16LE <-> UTF16BE)
*/
void ByteSwapUnicode(WCHAR* wstr, int length)
{
WCHAR* end = &wstr[length];
while (wstr < end)
{
*wstr = _byteswap_ushort(*wstr);
wstr++;
}
}

View File

@ -278,7 +278,7 @@ BOOL CloseHandle(HANDLE hObject)
BOOL DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions)
{
*((ULONG_PTR*) lpTargetHandle) = hSourceHandle;
*((ULONG_PTR*) lpTargetHandle) = (ULONG_PTR) hSourceHandle;
return TRUE;
}

View File

@ -197,10 +197,12 @@ int WtsApi32_InitializeWtsApi(void)
WTSAPI32_LOAD_PROC(IsChildSessionsEnabled, WTS_IS_CHILD_SESSIONS_ENABLED_FN);
WTSAPI32_LOAD_PROC(GetChildSessionId, WTS_GET_CHILD_SESSION_ID_FN);
WTSAPI32_LOAD_PROC(GetActiveConsoleSessionId, WTS_GET_ACTIVE_CONSOLE_SESSION_ID_FN);
g_WtsApi = &WtsApi32_WtsApiFunctionTable;
Win32_InitializeWinSta(g_WtsApi);
Win32_InitializeWinSta(&WtsApi32_WtsApiFunctionTable);
#endif
g_WtsApi = &WtsApi32_WtsApiFunctionTable;
return 1;
}