package.xml 0000664 0001750 0001750 00000051313 12654136252 011310 0 ustar jan jan
timeobjectspear.horde.orgHorde timeobjects applicationThe timeobjects application doesn't have an interface but provides streams of events to any applications that can consume them, notably the Horde calendar application. It contains drivers for facebook events and weather forecasts and can easily be extended by custom drivers.Michael J Rubinskymrubinskmrubinsk@horde.orgyesJan Schneiderjanjan@horde.orgyes2016-02-022.1.12.0.0stablestableBSD-2-Clause
* [jan] Use access rules compatible with both Apache 2.2 and 2.4.
* [jan] Add Italian translation (Massimo Balestrieri <nag@hidaba.com>).
5.3.06.0.0alpha16.0.0alpha11.7.0Horde_Corepear.horde.org2.0.03.0.0alpha13.0.0alpha1Horde_Datepear.horde.org2.0.03.0.0alpha13.0.0alpha1Horde_Exceptionpear.horde.org2.0.03.0.0alpha13.0.0alpha1Horde_Urlpear.horde.org2.0.03.0.0alpha13.0.0alpha1Horde_Utilpear.horde.org2.0.03.0.0alpha13.0.0alpha1gettextHorde_Service_Facebookpear.horde.org2.0.03.0.0alpha13.0.0alpha1Horde_Service_Weatherpear.horde.org2.0.03.0.0alpha13.0.0alpha11.0.0beta11.0.0betabeta2011-03-16BSD-2-Clause
* First beta release for Horde 4.
1.0.0RC11.0.0betabeta2011-03-23BSD-2-Clause
* First release candidate for Horde 4.
1.0.0RC21.0.0betabeta2011-03-30BSD-2-Clause
* Second release candidate for Horde 4.
1.0.01.0.0stablestable2011-04-06BSD-2-Clause
* First stable release for Horde 4.
1.0.11.0.0stablestable2011-05-09BSD-2-Clause
* [jan] Fix installation paths.
1.0.21.0.0stablestable2011-08-02BSD-2-Clause
* [jan] Export location, description, status, privacy, and URL of Facebook events.
* [jan] Fix timezone conversion of Facebook events (Bug #10341).
1.0.31.0.0stablestable2011-11-22BSD-2-Clause
* [mjr] Remove support for the now non-existent weatherdotcom API.
* [mjr] Add support for Horde_Service_Weather.
* [jan] Add Latvian translation (Jānis Eisaks <jancs@dv.lv>).
* [jan] Add Estonian translation (Alar Sing <alar.sing@err.ee>).
1.0.41.0.0stablestable2011-11-23BSD-2-Clause
* [jan] Fix retrieving driver list if Horde_Service_Weather is not installed.
1.0.51.0.0stablestable2011-12-13BSD-2-Clause
* [jan] Add Dutch translation (Arjen de Korte <arjen+horde@de-korte.org>).
* [jan] Update Japanese translation (Hiromi Kimura <hiromi@tac.tsukuba.ac.jp>).
1.0.61.0.0stablestable2012-02-28BSD-2-Clause
* [mjr] Always provide the longest forecast length available for weather forecast data.
* [mjr] No longer attempt to create a Horde_Service_Weather provider if we do not have one configured.
1.0.71.0.0stablestable2012-05-29BSD-2-Clause
* [jan] Add Swedish translation (Jakob Alvermark <jakob.alvermark@bsdlabs.com>).
* [jan] Add Hungarian translation (Zoltán Németh <nemeth.zoltan@etit.hu>).
1.0.81.0.0stablestable2012-05-29BSD-2-Clause
*
2012-08-292.0.0beta12.0.0beta1betabetaBSD-2-Clause
* First beta release for Horde 5.
2.0.02.0.0stablestable2012-10-30BSD-2-Clause
* [jan] Add Polish translation (Krzysztof Kozera <krzysztof113@o2.pl>).
2.0.12.0.0stablestable2012-11-27BSD-2-Clause
* [jan] Re-packaged 2.0.0 release.
2.0.22.0.0stablestable2013-01-10BSD-2-Clause
* [jan] Add Basque translation (Ibon Igartua <ibon.igartua@ehu.es>).
2.0.32.0.0stablestable2013-02-11BSD-2-Clause
* [jan] Add French translation (Paul De Vlieger <paul.de_vlieger@moniut.univ-bpclermont.fr>).
2.0.42.0.0stablestable2013-06-19BSD-2-Clause
* [jan] Fix timeobjects not showing up in the administration (Bug #12365).
* [jan] Add Spanish translation (Manuel P. Ayala <mayala@unex.es>).
2.1.02.0.0stablestable2014-05-05BSD-2-Clause
* [jan] Update to changed Facebook events API.
* [jan] Add Danish translation (Erling Preben Hansen <erling@eph.dk>).
* [jan] Fix returning Facebook event URLs.
* [mjr] Cache Facebook queries.
2.1.12.0.0stablestable2016-02-02BSD-2-Clause
* [jan] Use access rules compatible with both Apache 2.2 and 2.4.
* [jan] Add Italian translation (Massimo Balestrieri <nag@hidaba.com>).
timeobjects-2.1.1/config/.htaccess 0000664 0001750 0001750 00000000174 12654136251 015201 0 ustar jan jan
Require all denied
Deny from all
timeobjects-2.1.1/config/.keep 0000664 0001750 0001750 00000000000 12654136251 014314 0 ustar jan jan timeobjects-2.1.1/docs/CHANGES 0000600 0001750 0001750 00000004053 12654136251 014047 0 ustar jan jan ------
v2.1.1
------
[jan] Use access rules compatible with both Apache 2.2 and 2.4.
[jan] Add Italian translation (Massimo Balestrieri ).
------
v2.1.0
------
[jan] Update to changed Facebook events API.
[jan] Add Danish translation (Erling Preben Hansen ).
[jan] Fix returning Facebook event URLs.
[mjr] Cache Facebook queries.
------
v2.0.4
------
[jan] Fix timeobjects not showing up in the administration (Bug #12365).
[jan] Add Spanish translation (Manuel P. Ayala ).
------
v2.0.3
------
[jan] Add French translation (Paul De Vlieger
).
------
v2.0.2
------
[jan] Add Basque translation (Ibon Igartua ).
------
v2.0.1
------
[jan] Re-packaged 2.0.0 release.
------
v2.0.0
------
[jan] Add Polish translation (Krzysztof Kozera ).
------
v1.0.7
------
[jan] Add Swedish translation (Jakob Alvermark ).
[jan] Add Hungarian translation (Zoltán Németh ).
------
v1.0.6
------
[mjr] Always provide the longest forecast length available for weather
forecast data.
[mjr] No longer attempt to create a Horde_Service_Weather provider if we do not
have one configured.
------
v1.0.5
------
[jan] Add Dutch translation (Arjen de Korte ).
[jan] Update Japanese translation (Hiromi Kimura ).
------
v1.0.4
------
[jan] Fix retrieving driver list if Horde_Service packages are not installed.
------
v1.0.3
------
[mjr] Remove support for the now non-existent weatherdotcom API.
[mjr] Add support for Horde_Service_Weather.
[jan] Add Latvian translation (Jānis Eisaks ).
[jan] Add Estonian translation (Alar Sing ).
------
v1.0.2
------
[jan] Export location, description, status, privacy, and URL of Facebook events.
[jan] Fix timezone conversion of Facebook events (Bug #10341).
------
v1.0.1
------
[jan] Fix installation paths.
------
v1.0.0
------
Initial release.
timeobjects-2.1.1/docs/COPYING 0000664 0001750 0001750 00000002430 12654136251 014116 0 ustar jan jan Copyright 1999-2016 Horde LLC. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HORDE PROJECT
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
timeobjects-2.1.1/docs/RELEASE_NOTES 0000664 0001750 0001750 00000000065 12654136251 015040 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
abstract class TimeObjects_Driver_Base
{
protected $_params = array();
/**
* Constructor
*
* @param array $params The parameter array.
*/
public function __construct(array $params)
{
$this->_params = array_merge($this->_params, $params);
}
/**
* Get a list of TimeObjects.
*
* @param $start
* @param $end
*
* @return array The array of time objects.
*/
abstract public function listTimeObjects(Horde_Date $start = null, Horde_Date $end = null);
/**
* Ensure we have minimum requirements for concrete driver to run.
*
*/
abstract public function ensure();
/**
* Factory method
*
* @param $name
* @param $params
*
* @return TimeObjects_Driver
*/
public function factory($name, array $params = array())
{
$class = 'TimeObjects_Driver_' . basename($name);
if (class_exists($class)) {
return new $class($params);
} else {
throw new TimeObjects_Exception(sprintf('Unable to load the definition of %s'), $class);
}
}
} timeobjects-2.1.1/lib/Driver/FacebookEvents.php 0000664 0001750 0001750 00000007127 12654136251 017553 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
class TimeObjects_Driver_FacebookEvents extends TimeObjects_Driver_Base
{
private $_fb_session;
public function ensure()
{
if (!$GLOBALS['conf']['facebook']['enabled']) {
return false;
}
$fbp = unserialize($GLOBALS['prefs']->getValue('facebook'));
if (empty($fbp['uid']) || empty($fbp['sid'])) {
return false;
} else {
$this->_fb_session = $fbp;
}
return true;
}
/**
*
* @param mixed $start The start time of the period
* @param mixed $time The end time of the period
*
* @return array of listTimeObjects arrays.
*/
public function listTimeObjects(Horde_Date $start = null, Horde_Date $time = null)
{
try {
$fb = $this->_getFacebook();
$events = $fb->events->get();
} catch (Horde_Service_Facebook_Exception $e) {
throw new TimeObjects_Exception($e->getMessage());
}
$cache = $GLOBALS['injector']->getInstance('Horde_Cache');
$key = 'timeobjects.facebook|' . $GLOBALS['registry']->getAuth() . '|' . (string)$start . '|' . (string)$time;
if ($data = $cache->get($key, 3600)) {
return json_decode($data, true);
}
$objects = array();
foreach ($events as $event) {
$start = new Horde_Date($event['start_time']);
$end = $event['end_time']
? new Horde_Date($event['end_time'])
: clone $start;
$title = $event['name'];
if (isset($event['tagline']) && strlen($event['tagline'])) {
$title .= ' - ' . $event['tagline'];
}
$objects[] = array(
'id' => $event['eid'],
'title' => $title,
'start' => sprintf('%d-%02d-%02dT%02d:%02d:00',
$start->year,
$start->month,
$start->mday,
$start->hour,
$start->min),
'end' => sprintf('%d-%02d-%02dT%02d:%02d:00',
$end->year,
$end->month,
$end->mday,
$end->hour,
$end->min),
'recurrence' => Horde_Date_Recurrence::RECUR_NONE,
'location' => $event['location'],
'description' => $event['description'],
'url' => 'http://www.facebook.com/event.php?eid=' . $event['eid'],
'status' => (empty($event['rsvp_status']) ? 'free' : $event['rsvp_status']),
'private' => $event['privacy'] == 'SECRET',
'icon' => $event['pic_square'],
'params' => array()
);
}
$cache->set($key, json_encode($objects));
return $objects;
}
private function _getFacebook()
{
if ((empty($this->_fb_session['uid']) ||
empty($this->_fb_session['sid'])) &&
!$this->ensure()) {
throw new TimeObjects_Exception('Cannot load Facebook object.');
}
return $GLOBALS['injector']->getInstance('Horde_Service_Facebook');
}
} timeobjects-2.1.1/lib/Driver/Weather.php 0000664 0001750 0001750 00000020365 12654136251 016253 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
class TimeObjects_Driver_Weather extends TimeObjects_Driver_Base
{
protected $_forecastDays = Horde_Service_Weather::FORECAST_7DAY;
protected $_location;
public function __construct(array $params)
{
global $registry, $prefs;
// Assume if it's passed in, we know it's valid.
if (!empty($params['location'])) {
$this->_location = $params['location'];
} else {
$this->_findLocation();
}
parent::__construct($params);
}
/**
* Ensures that we meet all requirements to use this time object
*
* @return boolean
*/
public function ensure()
{
if (empty($GLOBALS['conf']['weather']['provider']) || empty($this->_location)) {
return false;
}
try {
$this->_create();
} catch (Exception $e) {
return false;
}
return true;
}
/**
*
* @param Horde_Date $start The start time of the period
* @param Horde_Date $end The end time of the period
*
* @return array of listTimeObjects arrays.
*/
public function listTimeObjects(Horde_Date $start = null, Horde_Date $end = null)
{
global $conf, $prefs;
// No need to continue if the forecast days are not in the current
// range.
$forecast_start = new Horde_Date(time());
$forecast_end = clone $forecast_start;
$forecast_end->mday += 7;
if ($end->before($forecast_start) || $start->after($forecast_end)) {
return array();
}
$weather = $this->_create();
$lengths = $weather->getSupportedForecastLengths();
try {
$units = $weather->getUnits($weather->units);
$forecast = $weather->getForecast($this->_location, max(array_keys($lengths)));
$current = $weather->getCurrentConditions($this->_location);
} catch (Horde_Service_Weather_Exception $e) {
throw new Timeobjects_Exception($e);
}
$objects = array();
foreach ($forecast as $data) {
$day = $data->date;
$day->hour = 0;
$day->min = 0;
$day->sec = 0;
$day_end = clone $day;
$day_end->mday++;
$title = sprintf(
'%s %d°%s/%d°%s',
$data->conditions,
$data->high,
$units['temp'],
$data->low,
$units['temp']
);
// Deterine what information we have to display.
$pop = $data->precipitation_percent === false ? _("N/A") : ($data->precipitation_percent . '%');
if ($forecast->detail == Horde_Service_Weather::FORECAST_TYPE_STANDARD) {
if ($data->humidity !== false && $data->wind_direction !== false) {
$description = sprintf(
_("Conditions: %s\nHigh temperature: %d%s\nPrecipitation: %s\nHumidity: %d%%\nWinds: From the %s at %d%s"),
_($data->conditions),
$data->high,
'°' . $units['temp'],
$pop,
$data->humidity,
$data->wind_direction,
$data->wind_speed,
$units['wind']
);
} else {
$description = sprintf(
_("Conditions: %s\nHigh temperature: %d%s\nPrecipitation: %s\n"),
_($data->conditions),
$data->high,
'°' . $units['temp'],
$pop
);
}
} elseif ($forecast->detail == Horde_Service_Weather::FORECAST_TYPE_DETAILED) {
// @TODO
// No drivers support this yet. AccuWeather will, and possibly
// wunderground if they accept my request.
}
$station = $weather->getStation();
$body = sprintf(
_("Location: %s"),
$weather->getStation()->name
);
if (!empty($weather->getStation()->sunrise)) {
$body .= sprintf(
_("Sunrise: %s\nSunset: %s\n"),
$weather->getStation()->sunrise,
$weather->getStation()->sunset
);
}
$body .= "\n" . $description;
$objects[] = array(
'id' => $day->timestamp(), //???
'title' => $title,
'description' => $body,
'start' => $day->strftime('%Y-%m-%dT00:00:00'),
'end' => $day_end->strftime('%Y-%m-%dT00:00:00'),
'recurrence' => Horde_Date_Recurrence::RECUR_NONE,
'params' => array(),
'link' => new Horde_Url('#'),
'icon' => (string)Horde_Themes::img('weather/23x23/' . $data->icon)
);
$day->mday++;
}
return $objects;
}
protected function _findLocation()
{
global $registry, $injector;
// First use the location pref, then turba's "own" contact, followed
// general IP location?
$identity = $injector
->getInstance('Horde_Core_Factory_Identity')
->create();
if (!($location = $identity->getValue('location')) &&
$registry->hasInterface('contacts')) {
try {
$contact = $GLOBALS['registry']->contacts->ownContact();
} catch (Exception $e) {
}
if (!empty($contact['homeCountry'])) {
$country = $contact['homeCountry'];
} elseif (!empty($contact['workCountry'])) {
$country = $contact['workCountry'];
}
if (!empty($contact['homeCity'])) {
$location = $contact['homeCity']
. (!empty($contact['homeProvince']) ? ', ' . $contact['homeProvince'] : '')
. (!empty($contact['homeCountry']) ? ', ' . $contact['homeCountry'] : '');
} elseif (!empty($contact['workCity'])) {
$location = $contact['workCity']
. (!empty($contact['workProvince']) ? ', ' . $contact['workProvince'] : '')
. (!empty($contact['workCountry']) ? ', ' . $contact['workCountry'] : '');
}
}
// Ensure we have a valid location code for the location.
try {
$driver = $this->_create();
} catch (Exception $e) {
return;
}
if (!empty($location)) {
try {
$location = $driver->searchLocations($location);
} catch (Horde_Service_Weather_Exception $e) {
Horde::log($e, 'ERR');
throw new Timeobjects_Exception($e);
}
} else {
try {
$location = $driver->searchLocations(
$GLOBALS['browser']->getIPAddress(),
Horde_Service_Weather::SEARCHTYPE_IP);
} catch (Horde_Service_Weather_Exception $e) {
return;
}
}
if (is_array($location) && count($location)) {
$location = $location[0];
}
if ($location) {
$this->_location = $location->code;
}
}
/**
* Private factory for weather driver.
*
* @return Horde_Service_Weather_Base
*/
protected function _create()
{
try {
$driver = $GLOBALS['injector']->getInstance('Horde_Weather');
} catch (Exception $e) {
throw new Timeobjects_Exception($e);
}
// Suggest units, but the driver may override this (like Google).
$country = substr($GLOBALS['language'], -2);
$driver->units = $country == 'US'
? Horde_Service_Weather::UNITS_STANDARD
: Horde_Service_Weather::UNITS_METRIC;
return $driver;
}
}
timeobjects-2.1.1/lib/Factory/Driver.php 0000664 0001750 0001750 00000002400 12654136251 016251 0 ustar jan jan
* @category Horde
* @license http://www.horde.org/licenses/bsd BSD
* @package Timeobjects
*/
class TimeObjects_Factory_Driver
{
/**
* Creates a concrete TimeObjects_Driver object.
*
* @param string $name The driver type to create.
* @param array $params Any driver parameters.
*
* @return TimeObjects_Driver
* @throws TimeObjects_Exception
*/
public function create($name, array $params = array())
{
$class = 'TimeObjects_Driver_' . basename($name);
switch ($class) {
case 'TimeObjects_Driver_Weather':
if (!class_exists('Horde_Service_Weather')) {
throw new TimeObjects_Exception('Horde_Services_Weather is not installed');
}
break;
case 'TimeObjects_Driver_FacebookEvents':
if (!class_exists('Horde_Service_Facebook')) {
throw new TimeObjects_Exception('Horde_Services_Facebook is not installed');
}
break;
default:
throw new TimeObjects_Exception(sprintf('Unable to load the definition of %s', $class));
}
return new $class($params);
}
} timeobjects-2.1.1/lib/.htaccess 0000664 0001750 0001750 00000000174 12654136251 014502 0 ustar jan jan
Require all denied
Deny from all
timeobjects-2.1.1/lib/Api.php 0000664 0001750 0001750 00000004365 12654136251 014134 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Timeobjects
*/
class Timeobjects_Api extends Horde_Registry_Api
{
/**
* Links.
*
* @var array
*/
protected $_links = array(
// @TODO: Probably implement a URL endpoint or something so we can
// link to the correct external site depending on what time object
// category we are referring to.
'show' => '#'
);
/**
* Returns the available categories.
*
* @return array An array of available time object categories.
*/
public function listTimeObjectCategories()
{
$factory = $GLOBALS['injector']
->getInstance('TimeObjects_Factory_Driver');
$tests = array('Weather' => _("Weather"),
'FacebookEvents' => _("Facebook Events"));
$drivers = array();
foreach ($tests as $driver => $description) {
try {
if ($factory->create($driver)->ensure()) {
$drivers[$driver] = array('title' => $description, 'type' => 'single');
}
} catch (Timeobjects_Exception $e) {
}
}
return $drivers;
}
/**
* Returns time objects for the requested category.
*
* @param array $time_categories An array of categories to list.
* @param mixed $start The start of the time period to list for.
* @param mixed $end The end of the time period to list for.
*
* @return array A list of time object hashes.
*/
public function listTimeObjects($time_categories, $start, $end)
{
$return = array();
foreach ($time_categories as $category) {
try {
$return = array_merge(
$return,
$GLOBALS['injector']
->getInstance('TimeObjects_Factory_Driver')
->create($category)
->listTimeObjects($start, $end));
} catch (TimeObjects_Exception $e) {
}
}
return $return;
}
}
timeobjects-2.1.1/lib/Application.php 0000664 0001750 0001750 00000002031 12654136251 015652 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
/* Determine the base directories. */
if (!defined('TIMEOBJECTS_BASE')) {
define('TIMEOBJECTS_BASE', realpath(__DIR__ . '/..'));
}
if (!defined('HORDE_BASE')) {
/* If Horde does not live directly under the app directory, the HORDE_BASE
* constant should be defined in config/horde.local.php. */
if (file_exists(TIMEOBJECTS_BASE . '/config/horde.local.php')) {
include TIMEOBJECTS_BASE . '/config/horde.local.php';
} else {
define('HORDE_BASE', realpath(TIMEOBJECTS_BASE . '/..'));
}
}
/* Load the Horde Framework core (needed to autoload
* Horde_Registry_Application::). */
require_once HORDE_BASE . '/lib/core.php';
class Timeobjects_Application extends Horde_Registry_Application
{
public $version = '2.1.1';
}
timeobjects-2.1.1/lib/Driver.php 0000664 0001750 0001750 00000002551 12654136251 014651 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
abstract class TimeObjects_Driver
{
protected $_params = array();
/**
* Constructor
*
* @param array $params The parameter array.
*/
public function __construct(array $params)
{
$this->_params = array_merge($this->_params, $params);
}
/**
* Get a list of TimeObjects.
*
* @param $start
* @param $end
*
* @return array The array of time objects.
*/
abstract public function listTimeObjects(Horde_Date $start = null, Horde_Date $end = null);
/**
* Ensure we have minimum requirements for concrete driver to run.
*
*/
abstract public function ensure();
/**
* Factory method
*
* @param $name
* @param $params
*
* @return TimeObjects_Driver
*/
public function factory($name, array $params = array())
{
$class = 'TimeObjects_Driver_' . basename($name);
if (class_exists($class)) {
return new $class($params);
} else {
throw new TimeObjects_Exception(sprintf('Unable to load the definition of %s'), $class);
}
}
} timeobjects-2.1.1/lib/Exception.php 0000664 0001750 0001750 00000000433 12654136251 015351 0 ustar jan jan
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package TimeObjects
*/
class TimeObjects_Exception extends Horde_Exception_Wrapped
{
} timeobjects-2.1.1/locale/da/LC_MESSAGES/timeobjects.mo 0000664 0001750 0001750 00000175652 12654136251 020431 0 ustar jan jan [ 5 G $ G ) G H &