Author: tretiakov
Date: Sat Feb 17 18:46:25 2007
New Revision: 25831
URL:
http://svn.reactos.org/svn/reactos?rev=25831&view=rev
Log:
Patch by Alexey Zavyalov (Generex).
Implement SetLocaleInfoA, SetLocaleInfoW.
Modified:
trunk/reactos/dll/win32/kernel32/misc/lang.c
Modified: trunk/reactos/dll/win32/kernel32/misc/lang.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/la…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lang.c (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lang.c Sat Feb 17 18:46:25 2007
@@ -1394,8 +1394,23 @@
}
-/*
- * @unimplemented
+/**********************************************************************
+ * @implemented
+ * RIPPED FROM WINE's dlls\kernel\locale.c ver 0.9.29
+ *
+ * SetLocaleInfoA (KERNEL32.@)
+ *
+ * Set the current locale info.
+ *
+ * PARAMS
+ * Locale [I] LCID of the locale
+ * LCType [I] LCTYPE_ flags from "winnls.h"
+ * lpLCData [I] Information to set
+ *
+ * RETURNS
+ * Success: TRUE. The information given will be returned by GetLocaleInfoA()
+ * whenever it is called without LOCALE_NOUSEROVERRIDE.
+ * Failure: FALSE. Use GetLastError() to determine the cause.
*/
BOOL
STDCALL
@@ -1405,13 +1420,39 @@
LPCSTR lpLCData
)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-
-/*
- * @unimplemented
+ UINT codepage = CP_ACP;
+ WCHAR *strW;
+ DWORD len;
+ BOOL ret;
+
+ if (!(LCType & LOCALE_USE_CP_ACP)) codepage = get_lcid_codepage( Locale );
+
+ if (!lpLCData)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ len = MultiByteToWideChar( codepage, 0, lpLCData, -1, NULL, 0 );
+ if (!(strW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+ {
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ return FALSE;
+ }
+ MultiByteToWideChar( codepage, 0, lpLCData, -1, strW, len );
+ ret = SetLocaleInfoW( Locale, LCType, strW );
+ HeapFree( GetProcessHeap(), 0, strW );
+ return ret;
+}
+
+
+/**********************************************************************
+ * @implemented
+ * RIPPED FROM WINE's dlls\kernel\locale.c ver 0.9.29
+ *
+ * SetLocaleInfoW (KERNEL32.@)
+ *
+ * See SetLocaleInfoA.
+ *
*/
BOOL
STDCALL
@@ -1421,8 +1462,69 @@
LPCWSTR lpLCData
)
{
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ const WCHAR *value;
+ UNICODE_STRING valueW;
+ NTSTATUS status;
+ HANDLE hkey;
+
+ LCType &= 0xffff;
+ value = RosGetLocaleValueName( LCType );
+
+ if (!lpLCData || !value)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ if (LCType == LOCALE_IDATE || LCType == LOCALE_ILDATE)
+ {
+ SetLastError( ERROR_INVALID_FLAGS );
+ return FALSE;
+ }
+
+ if (!(hkey = RosCreateRegistryKey())) return FALSE;
+ RtlInitUnicodeString( &valueW, value );
+ status = NtSetValueKey( hkey, &valueW, 0, REG_SZ, (PVOID)lpLCData,
(lstrlenW(lpLCData)+1)*sizeof(WCHAR) );
+
+ if (LCType == LOCALE_SSHORTDATE || LCType == LOCALE_SLONGDATE)
+ {
+ /* Set I-value from S value */
+ WCHAR *lpD, *lpM, *lpY;
+ WCHAR szBuff[2];
+
+ lpD = wcschr(lpLCData, 'd');
+ lpM = wcschr(lpLCData, 'M');
+ lpY = wcschr(lpLCData, 'y');
+
+ if (lpD <= lpM)
+ {
+ szBuff[0] = '1'; /* D-M-Y */
+ }
+ else
+ {
+ if (lpY <= lpM)
+ szBuff[0] = '2'; /* Y-M-D */
+ else
+ szBuff[0] = '0'; /* M-D-Y */
+ }
+
+ szBuff[1] = '\0';
+
+ if (LCType == LOCALE_SSHORTDATE)
+ LCType = LOCALE_IDATE;
+ else
+ LCType = LOCALE_ILDATE;
+
+ value = RosGetLocaleValueName( LCType );
+
+ RtlInitUnicodeString( &valueW, value );
+ status = NtSetValueKey( hkey, &valueW, 0, REG_SZ, szBuff, sizeof(szBuff) );
+ }
+
+ NtClose( hkey );
+
+ if (status) SetLastError( RtlNtStatusToDosError(status) );
+ return !status;
}