From 4edc51bc5a73ceefea48445dcc8d17956fef5662 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Mon, 3 Nov 2008 11:27:17 +0000 Subject: [PATCH] - Implement GetCPInfoExA/W (not fully) - Move CODEPAGE_ENTRY struct to header file - Small fix HeapWalk svn path=/trunk/; revision=37164 --- reactos/dll/win32/kernel32/include/kernel32.h | 12 +++ reactos/dll/win32/kernel32/mem/heap.c | 7 +- reactos/dll/win32/kernel32/misc/lang.c | 85 ++++++++++++++++--- reactos/dll/win32/kernel32/misc/nls.c | 11 +-- 4 files changed, 89 insertions(+), 26 deletions(-) diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index d2ca65a40bb..87fdcbc8b53 100755 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -38,6 +38,15 @@ #define SetLastErrorByStatus(__S__) \ ((void)SetLastError(RtlNtStatusToDosError(__S__))) +typedef struct _CODEPAGE_ENTRY +{ + LIST_ENTRY Entry; + UINT CodePage; + HANDLE SectionHandle; + PBYTE SectionMapping; + CPTABLEINFO CodePageTable; +} CODEPAGE_ENTRY, *PCODEPAGE_ENTRY; + typedef DWORD (*WaitForInputIdleType)( @@ -171,5 +180,8 @@ BasepMapFile(IN LPCWSTR lpApplicationName, OUT PHANDLE hSection, IN PUNICODE_STRING ApplicationName); +PCODEPAGE_ENTRY FASTCALL +IntGetCodePageEntry(UINT CodePage); + #endif /* ndef _KERNEL32_INCLUDE_KERNEL32_H */ diff --git a/reactos/dll/win32/kernel32/mem/heap.c b/reactos/dll/win32/kernel32/mem/heap.c index 8da23d41a5f..9dc2948fb81 100644 --- a/reactos/dll/win32/kernel32/mem/heap.c +++ b/reactos/dll/win32/kernel32/mem/heap.c @@ -262,10 +262,13 @@ HeapWalk(HANDLE hHeap, Status = RtlWalkHeap(hHeap, lpEntry); - if (Status) + if (!NT_SUCCESS(Status)) + { SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } - return !Status; + return TRUE; } /* EOF */ diff --git a/reactos/dll/win32/kernel32/misc/lang.c b/reactos/dll/win32/kernel32/misc/lang.c index 92127aa7913..6c8e3611e3b 100644 --- a/reactos/dll/win32/kernel32/misc/lang.c +++ b/reactos/dll/win32/kernel32/misc/lang.c @@ -1267,32 +1267,89 @@ GetCPInfo ( /* - * @unimplemented + * @implemented */ BOOL STDCALL -GetCPInfoExW( - UINT CodePage, - DWORD dwFlags, - LPCPINFOEXW lpCPInfoEx) +GetCPInfoExW(UINT CodePage, + DWORD dwFlags, + LPCPINFOEXW lpCPInfoEx) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + if (!GetCPInfo(CodePage, (LPCPINFO) lpCPInfoEx)) + return FALSE; + + switch(CodePage) + { + case CP_UTF7: + { + static const WCHAR utf7[] = L"Unicode (UTF-7)\0"; + + lpCPInfoEx->CodePage = CP_UTF7; + lpCPInfoEx->UnicodeDefaultChar = 0x3f; + wcscpy(lpCPInfoEx->CodePageName, utf7); + } + break; + + case CP_UTF8: + { + static const WCHAR utf8[] = L"Unicode (UTF-8)\0"; + + lpCPInfoEx->CodePage = CP_UTF8; + lpCPInfoEx->UnicodeDefaultChar = 0x3f; + wcscpy(lpCPInfoEx->CodePageName, utf8); + } + + default: + { + PCODEPAGE_ENTRY CodePageEntry; + + CodePageEntry = IntGetCodePageEntry(CodePage); + if (CodePageEntry == NULL) + { + DPRINT1("Could not get CodePage Entry! CodePageEntry = 0\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + lpCPInfoEx->CodePage = CodePageEntry->CodePageTable.CodePage; + lpCPInfoEx->UnicodeDefaultChar = CodePageEntry->CodePageTable.UniDefaultChar; + /* FIXME: We need to get a codepage name */ + DPRINT1("FIXME: We need to get a codepage name!\n"); + wcscpy(lpCPInfoEx->CodePageName, L"Unknown\0"); + } + break; + } + + return TRUE; } /* - * @unimplemented + * @implemented */ BOOL STDCALL -GetCPInfoExA( - UINT CodePage, - DWORD dwFlags, - LPCPINFOEXA lpCPInfoEx) +GetCPInfoExA(UINT CodePage, + DWORD dwFlags, + LPCPINFOEXA lpCPInfoEx) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + CPINFOEXW CPInfo; + + if (!GetCPInfoExW(CodePage, dwFlags, &CPInfo)) + return FALSE; + + /* the layout is the same except for CodePageName */ + memcpy(lpCPInfoEx, &CPInfo, sizeof(CPINFOEXA)); + + WideCharToMultiByte(CP_ACP, + 0, + CPInfo.CodePageName, + -1, + lpCPInfoEx->CodePageName, + sizeof(lpCPInfoEx->CodePageName), + NULL, + NULL); + return TRUE; } static int diff --git a/reactos/dll/win32/kernel32/misc/nls.c b/reactos/dll/win32/kernel32/misc/nls.c index 2c0d48bd64a..f5b3aa4a681 100644 --- a/reactos/dll/win32/kernel32/misc/nls.c +++ b/reactos/dll/win32/kernel32/misc/nls.c @@ -20,15 +20,6 @@ /* GLOBAL VARIABLES ***********************************************************/ -typedef struct _CODEPAGE_ENTRY -{ - LIST_ENTRY Entry; - UINT CodePage; - HANDLE SectionHandle; - PBYTE SectionMapping; - CPTABLEINFO CodePageTable; -} CODEPAGE_ENTRY, *PCODEPAGE_ENTRY; - /* Sequence length based on the first character. */ static const char UTF8Length[128] = { @@ -185,7 +176,7 @@ IntGetLoadedCodePageEntry(UINT CodePage) * @return Code page entry. */ -static PCODEPAGE_ENTRY FASTCALL +PCODEPAGE_ENTRY FASTCALL IntGetCodePageEntry(UINT CodePage) { CHAR SectionName[40];