int WINAPI GetCalendarInfoA(LCID lcid, CALID Calendar, CALTYPE CalType,
LPSTR lpCalData, int cchData, LPDWORD lpValue)
{
- int ret;
+ int ret, cchDataW = cchData;
LPWSTR lpCalDataW = NULL;
if (NLS_IsUnicodeOnlyLcid(lcid))
return 0;
}
- if (cchData &&
- !(lpCalDataW = HeapAlloc(GetProcessHeap(), 0, cchData*sizeof(WCHAR))))
- return 0;
+ if (!cchData && !(CalType & CAL_RETURN_NUMBER))
+ cchDataW = GetCalendarInfoW(lcid, Calendar, CalType, NULL, 0, NULL);
+ if (!(lpCalDataW = HeapAlloc(GetProcessHeap(), 0, cchDataW*sizeof(WCHAR))))
+ return 0;
- ret = GetCalendarInfoW(lcid, Calendar, CalType, lpCalDataW, cchData, lpValue);
+ ret = GetCalendarInfoW(lcid, Calendar, CalType, lpCalDataW, cchDataW, lpValue);
if(ret && lpCalDataW && lpCalData)
- WideCharToMultiByte(CP_ACP, 0, lpCalDataW, cchData, lpCalData, cchData, NULL, NULL);
+ ret = WideCharToMultiByte(CP_ACP, 0, lpCalDataW, -1, lpCalData, cchData, NULL, NULL);
else if (CalType & CAL_RETURN_NUMBER)
ret *= sizeof(WCHAR);
HeapFree(GetProcessHeap(), 0, lpCalDataW);
* for the CALTYPES not requiring GetLocaleInfoA */
switch (CalType & ~(CAL_NOUSEROVERRIDE|CAL_RETURN_NUMBER|CAL_USE_CP_ACP)) {
case CAL_ICALINTVALUE:
- FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
- return 0;
+ if (CalType & CAL_RETURN_NUMBER)
+ return GetLocaleInfoW(Locale, LOCALE_RETURN_NUMBER | LOCALE_ICALENDARTYPE,
+ (LPWSTR)lpValue, 2);
+ return GetLocaleInfoW(Locale, LOCALE_ICALENDARTYPE, lpCalData, cchData);
case CAL_SCALNAME:
FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
- return 0;
+ if (lpCalData) *lpCalData = 0;
+ return 1;
case CAL_IYEAROFFSETRANGE:
FIXME("Unimplemented caltype %d\n", CalType & 0xffff);
return 0;