/**
* Get all server changes for the specified collection
*
* @param string $collection The collection type (a Horde interface name -
* calendar, contacts, tasks)
* @param integer $from_ts Starting timestamp or modification sequence.
* @param integer $to_ts Ending timestamp or modification sequence.
* @param string $server_id The server id of the collection. If null, uses
* multiplexed.
*
* @return array A hash of add, modify, and delete uids
* @throws InvalidArgumentException, Horde_Exception
*/
public function getChanges($collection, $from_ts, $to_ts, $server_id)
{
if (!in_array($collection, array('calendar', 'contacts', 'tasks', 'notes'))) {
throw new InvalidArgumentException('collection must be one of calendar, contacts, tasks or notes');
}
$app = $this->_registry->hasInterface($collection);
if (!$app || $this->_registry->isInactive($app)) {
throw new Horde_Exception(sprintf('The %s interface is not active in Horde.', $collection));
}
// We can use modification sequences.
if ($this->hasFeature('modseq', $collection)) {
$this->_logger->info(sprintf('[%s] Fetching changes for %s using MODSEQ.', getmypid(), $collection));
try {
return $this->_registry->{$collection}->getChangesByModSeq($from_ts, $to_ts, $server_id);
} catch (Exception $e) {
return array('add' => array(), 'modify' => array(), 'delete' => array());
}
}
// Older API, use timestamps.
$this->_logger->info(sprintf('[%s] Fetching changes for %s using TIMESTAMPS.', getmypid(), $collection));
try {
return $this->_registry->{$collection}->getChanges($from_ts, $to_ts, false, $server_id);
} catch (Exception $e) {
return array('add' => array(), 'modify' => array(), 'delete' => array());
}
}