mirror of https://github.com/FreeRDP/FreeRDP
winpr: add new line ending, utf16 byte order swap functions
This commit is contained in:
parent
d668855be6
commit
f6b3b24c22
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue