| Index: third_party/recipe_engine/third_party/dateutil/tzwin.py
|
| diff --git a/third_party/recipe_engine/third_party/dateutil/tzwin.py b/third_party/recipe_engine/third_party/dateutil/tzwin.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..073e0ff68e3fb586af05908407982cfec34599b5
|
| --- /dev/null
|
| +++ b/third_party/recipe_engine/third_party/dateutil/tzwin.py
|
| @@ -0,0 +1,180 @@
|
| +# This code was originally contributed by Jeffrey Harris.
|
| +import datetime
|
| +import struct
|
| +import _winreg
|
| +
|
| +__author__ = "Jeffrey Harris & Gustavo Niemeyer <gustavo@niemeyer.net>"
|
| +
|
| +__all__ = ["tzwin", "tzwinlocal"]
|
| +
|
| +ONEWEEK = datetime.timedelta(7)
|
| +
|
| +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"
|
| +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones"
|
| +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
|
| +
|
| +def _settzkeyname():
|
| + global TZKEYNAME
|
| + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
|
| + try:
|
| + _winreg.OpenKey(handle, TZKEYNAMENT).Close()
|
| + TZKEYNAME = TZKEYNAMENT
|
| + except WindowsError:
|
| + TZKEYNAME = TZKEYNAME9X
|
| + handle.Close()
|
| +
|
| +_settzkeyname()
|
| +
|
| +class tzwinbase(datetime.tzinfo):
|
| + """tzinfo class based on win32's timezones available in the registry."""
|
| +
|
| + def utcoffset(self, dt):
|
| + if self._isdst(dt):
|
| + return datetime.timedelta(minutes=self._dstoffset)
|
| + else:
|
| + return datetime.timedelta(minutes=self._stdoffset)
|
| +
|
| + def dst(self, dt):
|
| + if self._isdst(dt):
|
| + minutes = self._dstoffset - self._stdoffset
|
| + return datetime.timedelta(minutes=minutes)
|
| + else:
|
| + return datetime.timedelta(0)
|
| +
|
| + def tzname(self, dt):
|
| + if self._isdst(dt):
|
| + return self._dstname
|
| + else:
|
| + return self._stdname
|
| +
|
| + def list():
|
| + """Return a list of all time zones known to the system."""
|
| + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
|
| + tzkey = _winreg.OpenKey(handle, TZKEYNAME)
|
| + result = [_winreg.EnumKey(tzkey, i)
|
| + for i in range(_winreg.QueryInfoKey(tzkey)[0])]
|
| + tzkey.Close()
|
| + handle.Close()
|
| + return result
|
| + list = staticmethod(list)
|
| +
|
| + def display(self):
|
| + return self._display
|
| +
|
| + def _isdst(self, dt):
|
| + dston = picknthweekday(dt.year, self._dstmonth, self._dstdayofweek,
|
| + self._dsthour, self._dstminute,
|
| + self._dstweeknumber)
|
| + dstoff = picknthweekday(dt.year, self._stdmonth, self._stddayofweek,
|
| + self._stdhour, self._stdminute,
|
| + self._stdweeknumber)
|
| + if dston < dstoff:
|
| + return dston <= dt.replace(tzinfo=None) < dstoff
|
| + else:
|
| + return not dstoff <= dt.replace(tzinfo=None) < dston
|
| +
|
| +
|
| +class tzwin(tzwinbase):
|
| +
|
| + def __init__(self, name):
|
| + self._name = name
|
| +
|
| + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
|
| + tzkey = _winreg.OpenKey(handle, "%s\%s" % (TZKEYNAME, name))
|
| + keydict = valuestodict(tzkey)
|
| + tzkey.Close()
|
| + handle.Close()
|
| +
|
| + self._stdname = keydict["Std"].encode("iso-8859-1")
|
| + self._dstname = keydict["Dlt"].encode("iso-8859-1")
|
| +
|
| + self._display = keydict["Display"]
|
| +
|
| + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm
|
| + tup = struct.unpack("=3l16h", keydict["TZI"])
|
| + self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1
|
| + self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1
|
| +
|
| + (self._stdmonth,
|
| + self._stddayofweek, # Sunday = 0
|
| + self._stdweeknumber, # Last = 5
|
| + self._stdhour,
|
| + self._stdminute) = tup[4:9]
|
| +
|
| + (self._dstmonth,
|
| + self._dstdayofweek, # Sunday = 0
|
| + self._dstweeknumber, # Last = 5
|
| + self._dsthour,
|
| + self._dstminute) = tup[12:17]
|
| +
|
| + def __repr__(self):
|
| + return "tzwin(%s)" % repr(self._name)
|
| +
|
| + def __reduce__(self):
|
| + return (self.__class__, (self._name,))
|
| +
|
| +
|
| +class tzwinlocal(tzwinbase):
|
| +
|
| + def __init__(self):
|
| +
|
| + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
|
| +
|
| + tzlocalkey = _winreg.OpenKey(handle, TZLOCALKEYNAME)
|
| + keydict = valuestodict(tzlocalkey)
|
| + tzlocalkey.Close()
|
| +
|
| + self._stdname = keydict["StandardName"].encode("iso-8859-1")
|
| + self._dstname = keydict["DaylightName"].encode("iso-8859-1")
|
| +
|
| + try:
|
| + tzkey = _winreg.OpenKey(handle, "%s\%s"%(TZKEYNAME, self._stdname))
|
| + _keydict = valuestodict(tzkey)
|
| + self._display = _keydict["Display"]
|
| + tzkey.Close()
|
| + except OSError:
|
| + self._display = None
|
| +
|
| + handle.Close()
|
| +
|
| + self._stdoffset = -keydict["Bias"]-keydict["StandardBias"]
|
| + self._dstoffset = self._stdoffset-keydict["DaylightBias"]
|
| +
|
| +
|
| + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm
|
| + tup = struct.unpack("=8h", keydict["StandardStart"])
|
| +
|
| + (self._stdmonth,
|
| + self._stddayofweek, # Sunday = 0
|
| + self._stdweeknumber, # Last = 5
|
| + self._stdhour,
|
| + self._stdminute) = tup[1:6]
|
| +
|
| + tup = struct.unpack("=8h", keydict["DaylightStart"])
|
| +
|
| + (self._dstmonth,
|
| + self._dstdayofweek, # Sunday = 0
|
| + self._dstweeknumber, # Last = 5
|
| + self._dsthour,
|
| + self._dstminute) = tup[1:6]
|
| +
|
| + def __reduce__(self):
|
| + return (self.__class__, ())
|
| +
|
| +def picknthweekday(year, month, dayofweek, hour, minute, whichweek):
|
| + """dayofweek == 0 means Sunday, whichweek 5 means last instance"""
|
| + first = datetime.datetime(year, month, 1, hour, minute)
|
| + weekdayone = first.replace(day=((dayofweek-first.isoweekday())%7+1))
|
| + for n in xrange(whichweek):
|
| + dt = weekdayone+(whichweek-n)*ONEWEEK
|
| + if dt.month == month:
|
| + return dt
|
| +
|
| +def valuestodict(key):
|
| + """Convert a registry key's values to a dictionary."""
|
| + dict = {}
|
| + size = _winreg.QueryInfoKey(key)[1]
|
| + for i in range(size):
|
| + data = _winreg.EnumValue(key, i)
|
| + dict[data[0]] = data[1]
|
| + return dict
|
|
|