/** * Retrieves active alarms from all applications and stores them in the * backend. * * The applications will only be called once in the configured time span, * by default 5 minutes. * * @param string $user Retrieve alarms for this user, or for all users * if null. * @param boolean $preload Preload alarms that go off within the next * ttl time span? */ public function load($user = null, $preload = true) { global $registry, $session; if ($this->_ttl && $session->exists('horde', 'alarm_loaded') && time() - $session->get('horde', 'alarm_loaded') < $this->_ttl) { return; } /* Cache alarm handler application method existence. */ $cache = $session->get('horde', 'factory_alarm'); if (is_null($cache)) { $save = array(); $changed = $registry->getAuth() !== false; try { $apps = $registry->listApps(null, false, Horde_Perms::READ); } catch (Horde_Exception $e) { $apps = array(); } } else { $apps = $cache; $changed = false; } foreach ($apps as $app) { if ($changed) { if (!$registry->hasFeature('alarmHandler')) { continue; } $save[] = $app; } /* Preload alarms that happen in the next ttl seconds. */ $time = $preload ? time() + $this->_ttl : time(); try { foreach ($registry->callAppMethod($app, 'listAlarms', array('args' => array($time, $user), 'noperms' => true)) as $alarm) { $this->_alarm->set($alarm, true); } } catch (Horde_Exception $e) { } } if ($changed) { $session->set('horde', 'factory_alarm', $save); } $session->set('horde', 'alarm_loaded', time()); }