#include <config.h>
#include <platform.h>
#include <gcj/cni.h>
#include <jvm.h>
#include <java/util/TimeZone.h>
#include <java/lang/Character.h>
#include <java/lang/Integer.h>
#include <stdio.h>
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#include <string.h>
static jstring
getSystemTimeZone (void)
{
struct tm *tim;
time_t current_time;
long tzoffset;
const char *tz1, *tz2;
char *tzid;
current_time = time(0);
mktime(tim = localtime(¤t_time));
#ifdef STRUCT_TM_HAS_GMTOFF
tzoffset = -(tim->tm_gmtoff) + tim->tm_isdst * 3600L;
#elif HAVE_UNDERSCORE_TIMEZONE
tzoffset = _timezone;
#elif HAVE_TIMEZONE
tzoffset = timezone;
#else
tzoffset = 0L;
#endif
#ifdef HAVE_TM_ZONE
tz1 = tim->tm_zone;
tz2 = "";
#elif defined (HAVE_TZNAME)
tz1 = tzname[0];
tz2 = strcmp (tzname[0], tzname[1]) ? tzname[1] : "";
#else
tz1 = "???";
tz2 = tz1;
#endif
if ((tzoffset % 3600) == 0)
tzoffset = tzoffset / 3600;
tzid = (char*) _Jv_Malloc (strlen(tz1) + strlen(tz2) + 6);
sprintf(tzid, "%s%ld%s", tz1, tzoffset, tz2);
jstring retval = JvNewStringUTF (tzid);
_Jv_Free (tzid);
return retval;
}
jstring
java::util::TimeZone::getDefaultTimeZoneId ()
{
jstring sysTimeZoneId = getSystemTimeZone ();
using namespace java::lang;
TimeZone *tz = TimeZone::getTimeZone (sysTimeZoneId);
if (tz->getID ()->equals (sysTimeZoneId))
return sysTimeZoneId;
int startGMToffset = 0;
int sysTimeZoneIdLength = sysTimeZoneId->length();
for (int i = 0; i < sysTimeZoneIdLength && startGMToffset == 0; i++)
{
if (Character::isDigit (sysTimeZoneId->charAt (i)))
startGMToffset = i;
}
int startDaylightZoneName = 0;
jboolean usesDaylight = false;
for (int i = sysTimeZoneIdLength - 1;
i >= 0 && !Character::isDigit (sysTimeZoneId->charAt (i)); --i)
{
startDaylightZoneName = i;
}
if (startDaylightZoneName > 0)
usesDaylight = true;
int GMToffset
= Integer::parseInt (startDaylightZoneName == 0 ?
sysTimeZoneId->substring (startGMToffset) :
sysTimeZoneId->substring (startGMToffset,
startDaylightZoneName));
if (GMToffset < 24)
GMToffset *= 60 * 60;
GMToffset *= -1000;
jstring tzBasename = sysTimeZoneId->substring (0, startGMToffset);
tz = TimeZone::getTimeZone (tzBasename);
if (tz->getID ()->equals (tzBasename) && tz->getRawOffset () == GMToffset)
{
jboolean tzUsesDaylight = tz->useDaylightTime ();
if (usesDaylight && tzUsesDaylight || !usesDaylight && !tzUsesDaylight)
return tzBasename;
}
jstringArray IDs = TimeZone::getAvailableIDs (GMToffset);
jstring *elts = elements (IDs);
for (int i = 0; i < IDs->length; ++i)
{
jboolean IDusesDaylight =
TimeZone::getTimeZone (elts[i])->useDaylightTime ();
if (usesDaylight && IDusesDaylight || !usesDaylight && !IDusesDaylight)
return elts[i];
}
return NULL;
}