blob: e26ccacf25de37057346d4df7a6c69cc1111d545 [file] [log] [blame]
/*
********************************************************************************
* *
* COPYRIGHT: *
* (C) Copyright Taligent, Inc., 1997 *
* (C) Copyright International Business Machines Corporation, 1997-1998 *
* Licensed Material - Program-Property of IBM - All Rights Reserved. *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
********************************************************************************
*
* File CALTZTST.H
*
* Modification History:
*
* Date Name Description
* 08/06/97 aliu Creation.
********************************************************************************
*/
#include "caltztst.h"
#include "smpdtfmt.h"
#include "mutex.h"
DateFormat* CalendarTimeZoneTest::fgDateFormat = 0;
Calendar* CalendarTimeZoneTest::fgCalendar = 0;
const char* CalendarTimeZoneTest::errorName(UErrorCode code)
{
switch (code)
{
case ZERO_ERROR: return "ZERO_ERROR";
case ILLEGAL_ARGUMENT_ERROR: return "ILLEGAL_ARGUMENT_ERROR";
case MISSING_RESOURCE_ERROR: return "MISSING_RESOURCE_ERROR";
case INVALID_FORMAT_ERROR: return "INVALID_FORMAT_ERROR";
case FILE_ACCESS_ERROR: return "FILE_ACCESS_ERROR";
case INTERNAL_PROGRAM_ERROR: return "INTERNAL_PROGRAM_ERROR";
case MESSAGE_PARSE_ERROR: return "MESSAGE_PARSE_ERROR";
case MEMORY_ALLOCATION_ERROR: return "MEMORY_ALLOCATION_ERROR";
case USING_FALLBACK_ERROR: return "USING_FALLBACK_ERROR";
case USING_DEFAULT_ERROR: return "USING_DEFAULT_ERROR";
default: return "[BOGUS UErrorCode]";
}
}
bool_t CalendarTimeZoneTest::failure(UErrorCode status, const char* msg)
{
if (FAILURE(status))
{
errln(UnicodeString("FAIL: ") + msg + " failed, error " + errorName(status));
return TRUE;
}
return FALSE;
}
DateFormat* CalendarTimeZoneTest::getDateFormat()
{
DateFormat *theFormat = 0;
if (fgDateFormat != 0) // if there's something in the cache
{
Mutex lock;
if (fgDateFormat != 0) // Someone might have grabbed it.
{
theFormat = fgDateFormat;
fgDateFormat = 0; // We have exclusive right to this formatter.
}
}
if(theFormat == 0) // If we weren't able to pull it out of the cache, then we have to create it.
{
UErrorCode status = ZERO_ERROR;
theFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", status);
if (FAILURE(status))
{
delete theFormat;
theFormat = 0;
errln("FAIL: Could not create SimpleDateFormat");
}
}
return theFormat;
}
void CalendarTimeZoneTest::releaseDateFormat(DateFormat *adopt)
{
if(fgDateFormat == 0) // If the cache is empty we must add it back.
{
Mutex lock;
if(fgDateFormat == 0)
{
fgDateFormat = adopt;
adopt = 0;
}
}
delete adopt;
}
Calendar* CalendarTimeZoneTest::getCalendar()
{
Calendar *theCalendar = 0;
if (fgCalendar != 0) // if there's something in the cache
{
Mutex lock;
if (fgCalendar != 0) // Someone might have grabbed it.
{
theCalendar = fgCalendar;
fgCalendar = 0; // We have exclusive right to this calendar.
}
}
if(theCalendar == 0) // If we weren't able to pull it out of the cache, then we have to create it.
{
UErrorCode status = ZERO_ERROR;
theCalendar = Calendar::createInstance(status);
if (FAILURE(status))
{
delete theCalendar;
theCalendar = 0;
errln("FAIL: Calendar::createInstance failed");
}
}
return theCalendar;
}
void CalendarTimeZoneTest::releaseCalendar(Calendar* adopt)
{
if(fgCalendar == 0) // If the cache is empty we must add it back.
{
Mutex lock;
if(fgCalendar == 0)
{
fgCalendar = adopt;
adopt = 0;
}
}
delete adopt;
}
// Utility method for formatting dates for printing; useful for Java->C++ conversion.
// Tries to mimic the Java Date.toString() format.
UnicodeString
CalendarTimeZoneTest::dateToString(UDate d)
{
UnicodeString str;
return dateToString(d, str);
}
UnicodeString&
CalendarTimeZoneTest::dateToString(UDate d, UnicodeString& str)
{
str.remove();
DateFormat* format = getDateFormat();
if (format == 0)
{
str += "DATE_FORMAT_FAILURE";
return str;
}
format->format(d, str);
releaseDateFormat(format);
return str;
}
// Utility methods to create a date. This is useful for converting Java constructs
// which create a Date object.
UDate
CalendarTimeZoneTest::date(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
{
Calendar* cal = getCalendar();
if (cal == 0) return 0.0;
cal->clear();
cal->set(1900 + y, m, d, hr, min, sec); // Add 1900 to follow java.util.Date protocol
UErrorCode status = ZERO_ERROR;
UDate dt = cal->getTime(status);
releaseCalendar(cal);
if (FAILURE(status))
{
errln("FAIL: Calendar::getTime failed");
return 0.0;
}
return dt;
}
// Utility methods to create a date. The returned Date is UTC rather than local.
/*Date
CalendarTimeZoneTest::utcDate(int32_t y, int32_t m, int32_t d, int32_t hr, int32_t min, int32_t sec)
{
Calendar* cal = getCalendar();
if (cal == 0) return 0.0;
UErrorCode status = ZERO_ERROR;
Date dt = date(y, m, d, hr, min, sec) +
cal->get(Calendar::ZONE_OFFSET, status) -
cal->get(Calendar::DST_OFFSET, status);
releaseCalendar(cal);
if (FAILURE(status))
{
errln("FAIL: Calendar::get failed");
return 0.0;
}
return dt;
}*/
// Mimics Date.getYear() etc.
void
CalendarTimeZoneTest::dateToFields(UDate date, int32_t& y, int32_t& m, int32_t& d, int32_t& hr, int32_t& min, int32_t& sec)
{
Calendar* cal = getCalendar();
if (cal == 0) return;
UErrorCode status = ZERO_ERROR;
cal->setTime(date, status);
y = cal->get(Calendar::YEAR, status) - 1900;
m = cal->get(Calendar::MONTH, status);
d = cal->get(Calendar::DATE, status);
hr = cal->get(Calendar::HOUR_OF_DAY, status);
min = cal->get(Calendar::MINUTE, status);
sec = cal->get(Calendar::SECOND, status);
releaseCalendar(cal);
}
//eof