__all__ = [
'TimeZoneDefinition',
]
from typing import List, Optional
from ..constants import st
from ._helpers import BytesReader
from .tz_rule import TZRule
class TimeZoneDefinition:
"""
Structure for PidLidAppointmentTimeZoneDefinitionRecur from [MS-OXOCAL].
"""
def __init__(self, data: Optional[bytes] = None):
if not data:
self.__majorVersion = 2
self.__minorVersion = 1
self.__keyName = ''
self.__rules = [TZRule()]
return
reader = BytesReader(data)
self.__majorVersion = reader.readUnsignedByte()
self.__minorVersion = reader.readUnsignedByte()
cbHeader = reader.readUnsignedShort()
reader.assertRead(b'\x02\x00')
cchKeyName = reader.readUnsignedShort()
self.__keyName = reader.read(2 * cchKeyName).decode('utf-16-le')
cRules = reader.readUnsignedShort()
if cRules < 1 or cRules > 1024:
raise ValueError('Value for cRules was out of range.')
self.__rules = [reader.readClass(TZRule) for _ in range(cRules)]
def __bytes__(self) -> bytes:
return self.toBytes()
def toBytes(self) -> bytes:
# Validate some of the data.
if len(self.__rules) < 1:
raise ValueError('Cannot pack a TimeZoneDefinition with no rules.')
if len(self.__rules) > 1024:
raise ValueError('TimeZoneDefintion can only have up to 1024 rules.')
ret = bytes((self.__majorVersion, self.__minorVersion))
ret += st.ST_LE_UI16.pack(6 + 2 * len(self.__keyName))
ret += b'\x02\x00'
ret += st.ST_LE_UI16.pack(2* len(self.__keyName))
ret += st.ST_LE_UI16.pack(len(self.__rules))
ret += b''.join(bytes(x) for x in self.__rules)
return ret
@property
def keyName(self) -> str:
"""
The name of the associated time zone.
Not localized but instead set to the unique name of the desired time
zone.
"""
return self.__keyName
@keyName.setter
def keyName(self, value: str) -> None:
value = str(value)
if len(value) > 260:
raise ValueError('Key name must be a string less than 261 characters.')
self.__keyName = value
@property
def majorVersion(self) -> int:
"""
The major version.
"""
return self.__majorVersion
@majorVersion.setter
def majorVersion(self, value: int) -> None:
if value > 255:
raise ValueError('Major version cannot be greater than 255')
if value < 0:
raise ValueError('Major version must be positive.')
self.__minorVersion = value
@property
def minorVersion(self) -> int:
"""
The minor version.
"""
return self.__minorVersion
@minorVersion.setter
def minorVersion(self, value: int) -> None:
if value > 255:
raise ValueError('Minor version cannot be greater than 255')
if value < 0:
raise ValueError('Minor version must be positive.')
self.__minorVersion = value
@property
def rules(self) -> List[TZRule]:
"""
A tuple of TZRule structures that specifies a time zone.
"""
return self.__rules