X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ftime%2Ftimezone.cpp;h=76c3fb242463fe3f5f504c37e3f0a95a616d223c;hp=7c837484c705239f06537e2781209b396c1ef4ba;hb=be8ea216d23bf36bdfb2d3e302638782575fc136;hpb=8e77a1c6747dddf585d653c34e9806e976d2c73a diff --git a/source/time/timezone.cpp b/source/time/timezone.cpp index 7c83748..76c3fb2 100644 --- a/source/time/timezone.cpp +++ b/source/time/timezone.cpp @@ -1,114 +1,9 @@ -/* $Id$ - -This file is part of libmspcore -Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include -#ifdef WIN32 -#include -#else -#include -#endif -#include #include -#include "timestamp.h" #include "timezone.h" -#include "units.h" -#include "utils.h" using namespace std; -namespace { - -using Msp::Time::TimeZone; - -#ifndef WIN32 -long get_long(char *&ptr) -{ - long result = 0; - for(unsigned i=0; i<4; ++i) - result = (result<<8)+static_cast(*ptr++); - return result; -} -#endif - -TimeZone get_local_timezone() -{ -#ifdef WIN32 - TIME_ZONE_INFORMATION tzinfo; - DWORD dst = GetTimeZoneInformation(&tzinfo); - if(dst==TIME_ZONE_ID_INVALID) - throw Msp::system_error("GetTimeZoneInformation"); - - int offset = tzinfo.Bias; - if(dst==TIME_ZONE_ID_STANDARD) - offset += tzinfo.StandardBias; - else if(dst==TIME_ZONE_ID_DAYLIGHT) - offset += tzinfo.DaylightBias; - - return TimeZone(offset); -#else - int fd = open("/etc/localtime", O_RDONLY); - if(fd!=-1) - { - char hdr[44]; - int len = read(fd, hdr, sizeof(hdr)); - long gmtoff = -1; - string name; - if(len==44 && hdr[0]=='T' && hdr[1]=='Z' && hdr[2]=='i' && hdr[3]=='f') - { - char *ptr = hdr+20; - long isgmtcnt = get_long(ptr); - long isstdcnt = get_long(ptr); - long leapcnt = get_long(ptr); - long timecnt = get_long(ptr); - long typecnt = get_long(ptr); - long charcnt = get_long(ptr); - int size = timecnt*5+typecnt*6+isgmtcnt+isstdcnt+leapcnt*8+charcnt; - char buf[size]; - len = read(fd, buf, size); - if(len==size) - { - ptr = buf; - int index = -1; - time_t cur_time = Msp::Time::now().to_unixtime(); - for(int i=0; i0) - index = ptr[index]; - ptr += timecnt; - - int abbrind = 0; - for(int i=0; i=0 && i==index) || (index<0 && !ptr[4] && gmtoff==-1)) - { - gmtoff = get_long(ptr); - ++ptr; - abbrind = *ptr++; - } - else - ptr += 6; - } - - name = ptr+abbrind; - } - } - close(fd); - - if(gmtoff!=-1) - return TimeZone(gmtoff/60, name); - } - return TimeZone(); -#endif -} - -} - namespace Msp { namespace Time { @@ -143,7 +38,7 @@ const TimeZone &TimeZone::utc() const TimeZone &TimeZone::local() { - static TimeZone tz = get_local_timezone(); + static TimeZone tz = platform_get_local_timezone(); return tz; }