|
|
@ -101,33 +101,70 @@ SetGUILanguage(LANGID langId) |
|
|
|
gui_language = langId; |
|
|
|
gui_language = langId; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
static int |
|
|
|
LocalizedTime(const time_t t, LPTSTR buf, size_t size) |
|
|
|
LocalizedSystemTime(const SYSTEMTIME *st, wchar_t *buf, size_t size) |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* Convert Unix timestamp to Win32 SYSTEMTIME */ |
|
|
|
|
|
|
|
FILETIME lft; |
|
|
|
|
|
|
|
SYSTEMTIME st; |
|
|
|
|
|
|
|
LONGLONG tmp = Int32x32To64(t, 10000000) + 116444736000000000; |
|
|
|
|
|
|
|
FILETIME ft = { .dwLowDateTime = (DWORD) tmp, .dwHighDateTime = tmp >> 32}; |
|
|
|
|
|
|
|
FileTimeToLocalFileTime(&ft, &lft); |
|
|
|
|
|
|
|
FileTimeToSystemTime(&lft, &st); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int date_size = 0, time_size = 0; |
|
|
|
int date_size = 0, time_size = 0; |
|
|
|
LCID locale = MAKELCID(GetGUILanguage(), SORT_DEFAULT); |
|
|
|
LCID locale = MAKELCID(GetGUILanguage(), SORT_DEFAULT); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (size == 0 || buf == NULL) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
date_size = GetDateFormat(locale, DATE_SHORTDATE, st, NULL, NULL, 0); |
|
|
|
|
|
|
|
time_size = GetTimeFormat(locale, TIME_NOSECONDS, st, NULL, NULL, 0); |
|
|
|
|
|
|
|
return date_size + time_size; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (size > 0) { |
|
|
|
if (size > 0) { |
|
|
|
date_size = GetDateFormat(locale, DATE_SHORTDATE, &st, NULL, |
|
|
|
date_size = GetDateFormat(locale, DATE_SHORTDATE, st, NULL, |
|
|
|
buf, size); |
|
|
|
buf, size); |
|
|
|
if (date_size) |
|
|
|
if (date_size) |
|
|
|
buf[date_size - 1] = ' '; |
|
|
|
buf[date_size - 1] = ' '; |
|
|
|
} |
|
|
|
} |
|
|
|
if (size - date_size > 0) { |
|
|
|
if (size - date_size > 0) { |
|
|
|
time_size = GetTimeFormat(locale, TIME_NOSECONDS, &st, NULL, |
|
|
|
time_size = GetTimeFormat(locale, TIME_NOSECONDS, st, NULL, |
|
|
|
buf + date_size, size - date_size); |
|
|
|
buf + date_size, size - date_size); |
|
|
|
} |
|
|
|
} |
|
|
|
return date_size + time_size; |
|
|
|
return date_size + time_size; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Convert filetime to a wide character string -- caller must free the |
|
|
|
|
|
|
|
* result after use. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
wchar_t * |
|
|
|
|
|
|
|
LocalizedFileTime(const FILETIME *ft) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
FILETIME lft; |
|
|
|
|
|
|
|
SYSTEMTIME st; |
|
|
|
|
|
|
|
FileTimeToLocalFileTime(ft, &lft); |
|
|
|
|
|
|
|
FileTimeToSystemTime(&lft, &st); |
|
|
|
|
|
|
|
wchar_t *buf = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int size = LocalizedSystemTime(&st, NULL, 0); |
|
|
|
|
|
|
|
if (size > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
buf = calloc(1, size*sizeof(wchar_t)); |
|
|
|
|
|
|
|
if (buf) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LocalizedSystemTime(&st, buf, size); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return buf; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
LocalizedTime(const time_t t, LPTSTR buf, size_t size) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
/* Convert Unix timestamp to Win32 SYSTEMTIME */ |
|
|
|
|
|
|
|
FILETIME lft; |
|
|
|
|
|
|
|
SYSTEMTIME st; |
|
|
|
|
|
|
|
LONGLONG tmp = Int32x32To64(t, 10000000) + 116444736000000000; |
|
|
|
|
|
|
|
FILETIME ft = { .dwLowDateTime = (DWORD) tmp, .dwHighDateTime = tmp >> 32}; |
|
|
|
|
|
|
|
FileTimeToLocalFileTime(&ft, &lft); |
|
|
|
|
|
|
|
FileTimeToSystemTime(&lft, &st); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return LocalizedSystemTime(&st, buf, size); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int |
|
|
|
static int |
|
|
|
LoadStringLang(UINT stringId, LANGID langId, PTSTR buffer, int bufferSize, va_list args) |
|
|
|
LoadStringLang(UINT stringId, LANGID langId, PTSTR buffer, int bufferSize, va_list args) |
|
|
|