Changeset View
Changeset View
Standalone View
Standalone View
lib/kolab_sync_timezone_converter.php
Show First 20 Lines • Show All 390 Lines • ▼ Show 20 Lines | class kolab_sync_timezone_converter | ||||
* @return array | * @return array | ||||
*/ | */ | ||||
protected function _unpackTimezoneInfo($_packedTimezoneInfo) | protected function _unpackTimezoneInfo($_packedTimezoneInfo) | ||||
{ | { | ||||
$timezoneUnpackString = 'lbias/a64standardName/vstandardYear/vstandardMonth/vstandardDayOfWeek/vstandardDay/vstandardHour/vstandardMinute/vstandardSecond/vstandardMilliseconds/lstandardBias/a64daylightName/vdaylightYear/vdaylightMonth/vdaylightDayOfWeek/vdaylightDay/vdaylightHour/vdaylightMinute/vdaylightSecond/vdaylightMilliseconds/ldaylightBias'; | $timezoneUnpackString = 'lbias/a64standardName/vstandardYear/vstandardMonth/vstandardDayOfWeek/vstandardDay/vstandardHour/vstandardMinute/vstandardSecond/vstandardMilliseconds/lstandardBias/a64daylightName/vdaylightYear/vdaylightMonth/vdaylightDayOfWeek/vdaylightDay/vdaylightHour/vdaylightMinute/vdaylightSecond/vdaylightMilliseconds/ldaylightBias'; | ||||
$timezoneInfo = unpack($timezoneUnpackString, base64_decode($_packedTimezoneInfo)); | $timezoneInfo = unpack($timezoneUnpackString, base64_decode($_packedTimezoneInfo)); | ||||
if ($timezoneInfo['standardHour'] == 23 && $timezoneInfo['standardMilliseconds'] == 999 | |||||
&& $timezoneInfo['standardMinute'] == 59 && $timezoneInfo['standardSecond'] == 59 | |||||
) { | |||||
$timezoneInfo['standardHour'] = 24; | |||||
$timezoneInfo['standardMinute'] = 0; | |||||
$timezoneInfo['standardSecond'] = 0; | |||||
$timezoneInfo['standardMilliseconds'] = 0; | |||||
} | |||||
return $timezoneInfo; | return $timezoneInfo; | ||||
} | } | ||||
/** | /** | ||||
* encode timezone info to activesync | * encode timezone info to activesync | ||||
* | * | ||||
* @param array $_timezoneInfo | * @param array $_timezoneInfo | ||||
* @return string | * @return string | ||||
*/ | */ | ||||
protected function _packTimezoneInfo($_timezoneInfo) | protected function _packTimezoneInfo($_timezoneInfo) | ||||
{ | { | ||||
if (!is_array($_timezoneInfo)) { | if (!is_array($_timezoneInfo)) { | ||||
return null; | return null; | ||||
} | } | ||||
// According to e.g. https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime, | |||||
// 24 is not allowed in the Hour field, and consequently Outlook can't deal with it. | |||||
// This is the same workaround that Outlook applies. | |||||
if ($_timezoneInfo['standardHour'] == 24) { | |||||
$_timezoneInfo['standardHour'] = 23; | |||||
$_timezoneInfo['standardMinute'] = 59; | |||||
$_timezoneInfo['standardSecond'] = 59; | |||||
$_timezoneInfo['standardMilliseconds'] = 999; | |||||
} | |||||
$packed = pack( | $packed = pack( | ||||
"la64vvvvvvvvla64vvvvvvvvl", | "la64vvvvvvvvla64vvvvvvvvl", | ||||
$_timezoneInfo['bias'], | $_timezoneInfo['bias'], | ||||
$_timezoneInfo['standardName'], | $_timezoneInfo['standardName'], | ||||
$_timezoneInfo['standardYear'], | $_timezoneInfo['standardYear'], | ||||
$_timezoneInfo['standardMonth'], | $_timezoneInfo['standardMonth'], | ||||
$_timezoneInfo['standardDayOfWeek'], | $_timezoneInfo['standardDayOfWeek'], | ||||
$_timezoneInfo['standardDay'], | $_timezoneInfo['standardDay'], | ||||
▲ Show 20 Lines • Show All 229 Lines • Show Last 20 Lines |