mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 12:49:45 +00:00
Allow user overridden locale data to be retrieved as numbers.
This commit is contained in:
parent
98cda18644
commit
87ae5ba84e
@ -739,7 +739,7 @@ static const WCHAR *get_locale_value_name( DWORD lctype )
|
|||||||
* Retrieve user-modified locale info from the registry.
|
* Retrieve user-modified locale info from the registry.
|
||||||
* Return length, 0 on error, -1 if not found.
|
* Return length, 0 on error, -1 if not found.
|
||||||
*/
|
*/
|
||||||
static INT get_registry_locale_info( LPCWSTR value, LPWSTR buffer, INT len )
|
static INT get_registry_locale_info( UINT flags, LPCWSTR value, LPWSTR buffer, INT len )
|
||||||
{
|
{
|
||||||
DWORD size;
|
DWORD size;
|
||||||
INT ret;
|
INT ret;
|
||||||
@ -752,9 +752,9 @@ static INT get_registry_locale_info( LPCWSTR value, LPWSTR buffer, INT len )
|
|||||||
if (!(hkey = create_registry_key())) return -1;
|
if (!(hkey = create_registry_key())) return -1;
|
||||||
|
|
||||||
RtlInitUnicodeString( &nameW, value );
|
RtlInitUnicodeString( &nameW, value );
|
||||||
size = info_size + len * sizeof(WCHAR);
|
size = info_size + (flags & LOCALE_RETURN_NUMBER ? 16 : len) * sizeof(WCHAR);
|
||||||
|
|
||||||
if (!(info = HeapAlloc( GetProcessHeap(), 0, size )))
|
if (!(info = HeapAlloc( GetProcessHeap(), 0, size + sizeof(WCHAR))))
|
||||||
{
|
{
|
||||||
NtClose( hkey );
|
NtClose( hkey );
|
||||||
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
||||||
@ -767,20 +767,42 @@ static INT get_registry_locale_info( LPCWSTR value, LPWSTR buffer, INT len )
|
|||||||
if (!status)
|
if (!status)
|
||||||
{
|
{
|
||||||
ret = (size - info_size) / sizeof(WCHAR);
|
ret = (size - info_size) / sizeof(WCHAR);
|
||||||
/* append terminating null if needed */
|
/* append terminating nul if needed */
|
||||||
if (!ret || ((WCHAR *)info->Data)[ret-1])
|
if (!ret || ((WCHAR *)info->Data)[ret-1])
|
||||||
{
|
{
|
||||||
if (ret < len || !buffer) ret++;
|
if (ret < len || !buffer)
|
||||||
|
{
|
||||||
|
((WCHAR *)info->Data)[ret] = '\0';
|
||||||
|
ret++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret && buffer)
|
|
||||||
|
if (ret)
|
||||||
{
|
{
|
||||||
memcpy( buffer, info->Data, (ret-1) * sizeof(WCHAR) );
|
if (flags & LOCALE_RETURN_NUMBER)
|
||||||
buffer[ret-1] = 0;
|
{
|
||||||
|
UINT number;
|
||||||
|
WCHAR *end;
|
||||||
|
number = strtolW( (WCHAR *)info->Data, &end, 10 );
|
||||||
|
if (*end)
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_INVALID_FLAGS );
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (buffer)
|
||||||
|
memcpy( buffer, &number, sizeof(number) );
|
||||||
|
ret = sizeof(UINT)/sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (buffer)
|
||||||
|
memcpy( buffer, info->Data, ret * sizeof(WCHAR) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -883,6 +905,8 @@ INT WINAPI GetLocaleInfoW( LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len )
|
|||||||
const WCHAR *p;
|
const WCHAR *p;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
TRACE("(0x%08lx,0x%08lx,%p,%d)\n", lcid, lctype, buffer, len);
|
||||||
|
|
||||||
if (len < 0 || (len && !buffer))
|
if (len < 0 || (len && !buffer))
|
||||||
{
|
{
|
||||||
SetLastError( ERROR_INVALID_PARAMETER );
|
SetLastError( ERROR_INVALID_PARAMETER );
|
||||||
@ -901,7 +925,12 @@ INT WINAPI GetLocaleInfoW( LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len )
|
|||||||
{
|
{
|
||||||
const WCHAR *value = get_locale_value_name(lctype);
|
const WCHAR *value = get_locale_value_name(lctype);
|
||||||
|
|
||||||
if (value && ((ret = get_registry_locale_info( value, buffer, len )) != -1)) return ret;
|
if (value)
|
||||||
|
{
|
||||||
|
ret = get_registry_locale_info( lcflags & LOCALE_RETURN_NUMBER, value, buffer, len );
|
||||||
|
if (ret != -1)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now load it from kernel resources */
|
/* now load it from kernel resources */
|
||||||
|
Loading…
Reference in New Issue
Block a user