Skip to content

Commit

Permalink
Add a DATE_TYPE_LOCAL.
Browse files Browse the repository at this point in the history
As usual, MS docs are not clear on how to set these values. They state
that they are DateTime values (and must be sent as UTC), but then
they have a "local" vs "UTC" property for these task dates. To
complicate things, different clients interpret the date values
differently.

We are going to go with what Outlook is sending/expecting to simplify
things. That is, the utcstartdate/utcduedate is the "normal" date field that
is the local date converted to UTC. The startdate (which is described
in the docs as the "local date"). Is the local time, but it is sent
as a datetime string that looks like a UTC time (with the Z) at the end.

*sigh*
  • Loading branch information
mrubinsk committed Jun 28, 2016
1 parent 806608d commit aefbd77
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
17 changes: 13 additions & 4 deletions framework/ActiveSync/lib/Horde/ActiveSync/Message/Base.php
Expand Up @@ -49,6 +49,7 @@ class Horde_ActiveSync_Message_Base
const TYPE_DATE_DASHES = 3;
const TYPE_MAPI_STREAM = 4;
const TYPE_MAPI_GOID = 5;
const TYPE_DATE_LOCAL = 6;

const PROPERTY_NO_CONTAINER = 7;

Expand Down Expand Up @@ -555,7 +556,8 @@ public function encodeStream(Horde_ActiveSync_Wbxml_Encoder &$encoder)
}

$encoder->startTag($tag);
if (isset($map[self::KEY_TYPE]) && ($map[self::KEY_TYPE] == self::TYPE_DATE || $map[self::KEY_TYPE] == self::TYPE_DATE_DASHES)) {
if (isset($map[self::KEY_TYPE]) &&
(in_array($map[self::KEY_TYPE], array(self::TYPE_DATE, self::TYPE_DATE_DASHES, self::TYPE_DATE_LOCAL)))) {
if (!empty($this->{$map[self::KEY_ATTRIBUTE]})) { // don't output 1-1-1970
$encoder->content($this->_formatDate($this->{$map[self::KEY_ATTRIBUTE]}, $map[self::KEY_TYPE]));
}
Expand Down Expand Up @@ -653,16 +655,23 @@ public function isEmpty()
*
* @param Horde_Date $dt The Horde_Date object to format
* (should normally be in local tz).
* @param integer $type The type to format as (TYPE_DATE or TYPE_DATE_DASHES)
* @param integer $type The type to format as: One of
* TYPE_DATE or TYPE_DATE_DASHES, TYPE_DATE_LOCAL
*
* @return string The formatted date
* @throws InvalidArgumentException
*/
protected function _formatDate(Horde_Date $dt, $type)
{
if ($type == Horde_ActiveSync_Message_Base::TYPE_DATE) {
switch ($type) {
case self::TYPE_DATE:
return $dt->setTimezone('UTC')->format('Ymd\THis\Z');
} elseif ($type == Horde_ActiveSync_Message_Base::TYPE_DATE_DASHES) {
case self::TYPE_DATE_DASHES:
return $dt->setTimezone('UTC')->format('Y-m-d\TH:i:s\.000\Z');
case self::TYPE_DATE_LOCAL:
return $dt->format('Y-m-d\TH:i:s\.000\Z');
default:
throw new InvalidArgumentException('Unidentified DATE_TYPE');
}
}

Expand Down
4 changes: 2 additions & 2 deletions framework/ActiveSync/lib/Horde/ActiveSync/Message/Task.php
Expand Up @@ -124,14 +124,14 @@ class Horde_ActiveSync_Message_Task extends Horde_ActiveSync_Message_Base
protected $_mapping = array (
self::POOMTASKS_COMPLETE => array (self::KEY_ATTRIBUTE => 'complete'),
self::POOMTASKS_DATECOMPLETED => array (self::KEY_ATTRIBUTE => 'datecompleted', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_DUEDATE => array (self::KEY_ATTRIBUTE => 'duedate', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_DUEDATE => array (self::KEY_ATTRIBUTE => 'duedate', self::KEY_TYPE => self::TYPE_DATE_LOCAL),
self::POOMTASKS_UTCDUEDATE => array (self::KEY_ATTRIBUTE => 'utcduedate', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_IMPORTANCE => array (self::KEY_ATTRIBUTE => 'importance'),
self::POOMTASKS_RECURRENCE => array (self::KEY_ATTRIBUTE => 'recurrence', self::KEY_TYPE => 'Horde_ActiveSync_Message_TaskRecurrence'),
self::POOMTASKS_REMINDERSET => array (self::KEY_ATTRIBUTE => 'reminderset'),
self::POOMTASKS_REMINDERTIME => array (self::KEY_ATTRIBUTE => 'remindertime', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_SENSITIVITY => array (self::KEY_ATTRIBUTE => 'sensitiviy'),
self::POOMTASKS_STARTDATE => array (self::KEY_ATTRIBUTE => 'startdate', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_STARTDATE => array (self::KEY_ATTRIBUTE => 'startdate', self::KEY_TYPE => self::TYPE_DATE_LOCAL),
self::POOMTASKS_UTCSTARTDATE => array (self::KEY_ATTRIBUTE => 'utcstartdate', self::KEY_TYPE => self::TYPE_DATE_DASHES),
self::POOMTASKS_SUBJECT => array (self::KEY_ATTRIBUTE => 'subject'),
self::POOMTASKS_CATEGORIES => array (self::KEY_ATTRIBUTE => 'categories', self::KEY_VALUES => self::POOMTASKS_CATEGORY),
Expand Down

0 comments on commit aefbd77

Please sign in to comment.