Fixed FIXME in EnumTimeFormats32W
Added support for FONTSIGNATURE in GetLocaleInfo32A and updated
GetLocaleInfo32W.
diff --git a/ole/nls/enu.nls b/ole/nls/enu.nls
index 65e317a..8bd3a91 100644
--- a/ole/nls/enu.nls
+++ b/ole/nls/enu.nls
@@ -107,6 +107,6 @@
LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
-/* LOCVAL(LOCALE_FONTSIGNATURE, "") */
+LOCVAL(LOCALE_FONTSIGNATURE,"\xaf\x00\x00\x80\xcb\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x80")
LOCVAL(LOCALE_SISO639LANGNAME,"en")
LOCVAL(LOCALE_SISO3166CTRYNAME,"US")
diff --git a/ole/ole2nls.c b/ole/ole2nls.c
index 4660a17..85c4a04 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -639,6 +639,10 @@
*
* NOTES
* LANG_NEUTRAL is equal to LOCALE_SYSTEM_DEFAULT
+ *
+ * MS online documentation states that the string returned is NULL terminated
+ * except for LOCALE_FONTSIGNATURE which "will return a non-NULL
+ * terminated string".
*/
INT32 WINAPI GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
{
@@ -713,16 +717,24 @@
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
- /* if len=0 return only the length, don't touch the buffer*/
- if (len)
- lstrcpyn32A(buf,retString,len);
-
- return strlen(retString)+1;
+ /* a FONTSIGNATURE is not a string, just 6 DWORDs */
+ if (LCType == LOCALE_FONTSIGNATURE) {
+ if (len)
+ memcpy(buf, retString, (len<=sizeof(FONTSIGNATURE))?len:sizeof(FONTSIGNATURE));
+ return sizeof(FONTSIGNATURE);
+ }
+ /* if len=0 return only the length, don't touch the buffer*/
+ if (len) lstrcpyn32A(buf,retString,len);
+ return strlen(retString)+1;
}
/******************************************************************************
* GetLocaleInfo32W [KERNEL32.343]
*
+ * NOTES
+ * MS documentation states that len "specifies the size, in bytes (ANSI version)
+ * or characters (Unicode version), of" wbuf. Thus the number returned is
+ * the same between GetLocaleInfo32W and GetLocaleInfo32A.
*/
INT32 WINAPI GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
{ WORD wlen;
@@ -734,10 +746,10 @@
}
abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
- wlen = 2 * GetLocaleInfo32A(lcid, LCType, abuf, len);
+ wlen = GetLocaleInfo32A(lcid, LCType, abuf, len);
if (wlen && len) /* if len=0 return only the length*/
- lstrcpynAtoW(wbuf,abuf,len/2);
+ lstrcpynAtoW(wbuf,abuf,len);
HeapFree(GetProcessHeap(),0,abuf);
return wlen;
@@ -2990,7 +3002,7 @@
BOOL32 WINAPI EnumTimeFormats32W(
TIMEFMT_ENUMPROC32W lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags)
{
- FIXME(ole, "(%p,%ld,%ld): stub", lpTimeFmtEnumProc, Locale, dwFlags);
+ FIXME(ole, "(%p,%ld,%ld): stub\n", lpTimeFmtEnumProc, Locale, dwFlags);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}