X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ftime%2Ftimezone.cpp;h=76c3fb242463fe3f5f504c37e3f0a95a616d223c;hp=9c146249208da8206ae6c1c937526afcde56fe21;hb=be8ea216d23bf36bdfb2d3e302638782575fc136;hpb=b56eb5ec1da675da0c66abc53c1e4f6c4e4cccbd diff --git a/source/time/timezone.cpp b/source/time/timezone.cpp index 9c14624..76c3fb2 100644 --- a/source/time/timezone.cpp +++ b/source/time/timezone.cpp @@ -1,115 +1,9 @@ -/* $Id$ - -This file is part of libmspcore -Copyright © 2008-2009 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include -#include -#include -#ifdef WIN32 -#include -#else -#include -#endif -#include "../core/except.h" -#include "timestamp.h" +#include #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::SystemError("Failed to get time zone information", GetLastError()); - - 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 { @@ -117,25 +11,23 @@ TimeZone::TimeZone(): name("UTC") { } -TimeZone::TimeZone(int minutes_west): - offset(minutes_west*min) +TimeZone::TimeZone(int minutes): + offset(minutes*min) { - if(minutes_west) + if(minutes) { - ostringstream ss; - ss.fill('0'); - int m = abs(minutes_west); - ss<<"UTC"<<(minutes_west<0 ? '-' : '+')<