X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ftime%2Ftimezone.cpp;fp=source%2Ftime%2Ftimezone.cpp;h=76c3fb242463fe3f5f504c37e3f0a95a616d223c;hp=7baf4943bec4b436c479d06d4394c9004f91f2d3;hb=609c9a508cfdc7b42c46c4f21d17639204165a00;hpb=b4806214e905752617691f851717033fd3f266c2 diff --git a/source/time/timezone.cpp b/source/time/timezone.cpp index 7baf494..76c3fb2 100644 --- a/source/time/timezone.cpp +++ b/source/time/timezone.cpp @@ -1,108 +1,9 @@ #include -#ifdef WIN32 -#include -#else -#include -#include -#endif #include -#include -#include "timestamp.h" #include "timezone.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 = new char[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; - } - delete[] buf; - } - close(fd); - - if(gmtoff!=-1) - return TimeZone(gmtoff/60, name); - } - return TimeZone(); -#endif -} - -} - namespace Msp { namespace Time { @@ -137,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; }