Changed to call WinAPI for date time format.

This commit is contained in:
nhotta%netscape.com 1999-01-28 00:24:18 +00:00
Родитель aaac0e1d88
Коммит 1814320b35
2 изменённых файлов: 107 добавлений и 20 удалений

Просмотреть файл

@ -18,6 +18,9 @@
#include "nsDateTimeFormatWin.h"
#define NSDATETIMEFORMAT_BUFFER_LEN 80
NS_DEFINE_IID(kIDateTimeFormatIID, NS_IDATETIMEFORMAT_IID);
NS_IMPL_ISUPPORTS(nsDateTimeFormatWin, kIDateTimeFormatIID);
@ -29,20 +32,7 @@ nsresult nsDateTimeFormatWin::FormatTime(const nsString& locale,
PRUnichar *stringOut,
PRUint32 *outLen)
{
// Temporary implementation, real implementation to be done by FE.
//
struct tm *today;
char *str;
today = localtime( &timetTime );
str = asctime(today);
nsString aString(str);
*outLen = aString.Length();
memcpy((void *) stringOut, (void *) aString.GetUnicode(), aString.Length() * sizeof(PRUnichar));
return NS_OK;
return FormatTMTime(locale, dateFormatSelector, timeFormatSelector, localtime( &timetTime ), stringOut, outLen);
}
// performs a locale sensitive date formatting operation on the struct tm parameter
@ -54,14 +44,110 @@ nsresult nsDateTimeFormatWin::FormatTMTime(const nsString& locale,
PRUnichar *stringOut,
PRUint32 *outLen)
{
// Temporary implementation, real implementation to be done by FE.
//
SYSTEMTIME system_time;
DWORD dwFlags_Date = 0, dwFlags_Time = 0;
int dateLen, timeLen;
PRUnichar dateBuffer[NSDATETIMEFORMAT_BUFFER_LEN], timeBuffer[NSDATETIMEFORMAT_BUFFER_LEN];
char *str = asctime(tmTime);
// Map tm to SYSTEMTIME
system_time.wYear = 1900 + tmTime->tm_year;
system_time.wMonth = tmTime->tm_mon + 1;
system_time.wDayOfWeek = tmTime->tm_wday;
system_time.wDay = tmTime->tm_mday;
system_time.wHour = tmTime->tm_hour;
system_time.wMinute = tmTime->tm_min;
system_time.wSecond = tmTime->tm_sec;
system_time.wMilliseconds = 0;
nsString aString(str);
*outLen = aString.Length();
memcpy((void *) stringOut, (void *) aString.GetUnicode(), aString.Length() * sizeof(PRUnichar));
// Map to WinAPI date format
switch (dateFormatSelector) {
case kDateFormatLong:
dwFlags_Date = DATE_LONGDATE;
break;
case kDateFormatShort:
dwFlags_Date = DATE_SHORTDATE;
break;
case kDateFormatWeekday:
dwFlags_Date = 0;
break;
case kDateFormatYearMonth:
dwFlags_Date = 0; // TODO:only availabe NT5
break;
}
// Map to WinAPI time format
switch (timeFormatSelector) {
case kTimeFormatSeconds:
dwFlags_Time = 0;
break;
case kTimeFormatNoSeconds:
dwFlags_Time = TIME_NOSECONDS;
break;
case kTimeFormatSecondsForce24Hour:
dwFlags_Time = TIME_FORCE24HOURFORMAT;
break;
case kTimeFormatNoSecondsForce24Hour:
dwFlags_Time = TIME_NOSECONDS + TIME_FORCE24HOURFORMAT;
break;
}
// Call GetDateFormatW
if (dateFormatSelector == kDateFormatNone) {
dateLen = 0;
}
else {
if (dateFormatSelector == kDateFormatYearMonth) {
dateLen = GetDateFormatW(GetUserDefaultLCID(), 0, &system_time, L"yy/MM",
dateBuffer, NSDATETIMEFORMAT_BUFFER_LEN);
}
else if (dateFormatSelector == kDateFormatWeekday) {
dateLen = GetDateFormatW(GetUserDefaultLCID(), 0, &system_time, L"ddd",
dateBuffer, NSDATETIMEFORMAT_BUFFER_LEN);
}
else {
dateLen = GetDateFormatW(GetUserDefaultLCID(), dwFlags_Date, &system_time, NULL,
dateBuffer, NSDATETIMEFORMAT_BUFFER_LEN);
}
if (dateLen != 0) {
dateLen--; // Since the count includes the terminating null.
}
}
// Call GetTimeFormatW
if (timeFormatSelector == kTimeFormatNone) {
timeLen = 0;
}
else {
timeLen = GetTimeFormatW(GetUserDefaultLCID(), dwFlags_Time, &system_time, NULL,
timeBuffer, NSDATETIMEFORMAT_BUFFER_LEN);
if (timeLen != 0) {
timeLen--; // Since the count includes the terminating null.
}
}
NS_ASSERTION(NSDATETIMEFORMAT_BUFFER_LEN >= (PRUint32) (dateLen + 1), "internal date buffer is not large enough");
NS_ASSERTION(NSDATETIMEFORMAT_BUFFER_LEN >= (PRUint32) (timeLen + 1), "internal time buffer is not large enough");
NS_ASSERTION(*outLen >= (PRUint32) (dateLen + timeLen + 1 + 1), "input buffer is not large enough");
// Copy the result
stringOut[0] = 0;
if (dateLen != 0 && timeLen != 0) {
(void) wcscpy((wchar_t *) stringOut, (const wchar_t *) dateBuffer);
(void) wcscat((wchar_t *) stringOut, (const wchar_t *) L" ");
(void) wcscat((wchar_t *) stringOut, (const wchar_t *) timeBuffer);
*outLen = dateLen + timeLen + 1;
}
else if (timeLen == 0) {
(void) wcscpy((wchar_t *) stringOut, (const wchar_t *) dateBuffer);
*outLen = dateLen;
}
else if (dateLen == 0) {
(void) wcscpy((wchar_t *) stringOut, (const wchar_t *) timeBuffer);
*outLen = timeLen;
}
else {
*outLen = 0;
}
return NS_OK;
}

Просмотреть файл

@ -21,6 +21,7 @@
#include "nsIDateTimeFormat.h"
#include <windows.h>
class nsDateTimeFormatWin : public nsIDateTimeFormat {