diff options
Diffstat (limited to 'src/planner.c')
-rw-r--r-- | src/planner.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/src/planner.c b/src/planner.c new file mode 100644 index 0000000..f16a05a --- /dev/null +++ b/src/planner.c @@ -0,0 +1,232 @@ +/* + * Copyright 2013 Canonical Ltd. + * + * Authors: + * Charles Kerr <charles.kerr@canonical.com> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "planner.h" + +/** +*** Signals Boilerplate +**/ + +enum +{ + SIGNAL_APPTS_CHANGED, + SIGNAL_LAST +}; + +static guint signals[SIGNAL_LAST] = { 0 }; + +/** +*** Properties Boilerplate +**/ + +enum +{ + PROP_0, + PROP_TIMEZONE, + PROP_LAST +}; + +static GParamSpec * properties[PROP_LAST] = { 0 }; + +/** +*** GObject Boilerplate +**/ + +G_DEFINE_TYPE (IndicatorDatetimePlanner, + indicator_datetime_planner, + G_TYPE_OBJECT) + +struct _IndicatorDatetimePlannerPriv +{ + char * timezone; +}; + +/*** +**** GObjectClass virtual funcs +***/ + +static void +my_get_property (GObject * o, + guint property_id, + GValue * value, + GParamSpec * pspec) +{ + IndicatorDatetimePlanner * self = INDICATOR_DATETIME_PLANNER (o); + + switch (property_id) + { + case PROP_TIMEZONE: + g_value_set_string (value, self->priv->timezone); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (o, property_id, pspec); + } +} + +static void +my_set_property (GObject * o, + guint property_id, + const GValue * value, + GParamSpec * pspec) +{ + IndicatorDatetimePlanner * self = INDICATOR_DATETIME_PLANNER (o); + + switch (property_id) + { + case PROP_TIMEZONE: + indicator_datetime_planner_set_timezone (self, g_value_get_string (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (o, property_id, pspec); + } +} + +static void +my_finalize (GObject * o) +{ + IndicatorDatetimePlanner * self = INDICATOR_DATETIME_PLANNER(o); + + g_free (self->priv->timezone); + + G_OBJECT_CLASS (indicator_datetime_planner_parent_class)->dispose (o); +} + +/*** +**** Instantiation +***/ + +static void +indicator_datetime_planner_class_init (IndicatorDatetimePlannerClass * klass) +{ + GObjectClass * object_class; + const GParamFlags flags = G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS; + + g_type_class_add_private (klass, sizeof (IndicatorDatetimePlannerPriv)); + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = my_finalize; + object_class->get_property = my_get_property; + object_class->set_property = my_set_property; + + klass->get_appointments = NULL; + + signals[SIGNAL_APPTS_CHANGED] = g_signal_new ("appointments-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (IndicatorDatetimePlannerClass, appointments_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /* install properties */ + + properties[PROP_0] = NULL; + + properties[PROP_TIMEZONE] = g_param_spec_string ("timezone", + "Timezone", + "Default timezone for the EDS appointments", + "", + flags); + + g_object_class_install_properties (object_class, PROP_LAST, properties); +} + +static void +indicator_datetime_planner_init (IndicatorDatetimePlanner * self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + INDICATOR_TYPE_DATETIME_PLANNER, + IndicatorDatetimePlannerPriv); +} + +/*** +**** Public API +***/ + +void +indicator_datetime_planner_emit_appointments_changed (IndicatorDatetimePlanner * self) +{ + g_return_if_fail (INDICATOR_IS_DATETIME_PLANNER (self)); + + g_signal_emit (self, signals[SIGNAL_APPTS_CHANGED], 0, NULL); +} + +static gint +compare_appointments_by_start_time (gconstpointer ga, gconstpointer gb) +{ + const struct IndicatorDatetimeAppt * a = ga; + const struct IndicatorDatetimeAppt * b = gb; + + return g_date_time_compare (a->begin, b->begin); +} + +GSList * +indicator_datetime_planner_get_appointments (IndicatorDatetimePlanner * self, GDateTime * begin, GDateTime * end) +{ + GSList * appointments; + + g_return_val_if_fail (INDICATOR_IS_DATETIME_PLANNER (self), NULL); + + appointments = INDICATOR_DATETIME_PLANNER_GET_CLASS (self)->get_appointments (self, begin, end); + return g_slist_sort (appointments, compare_appointments_by_start_time); +} + +gboolean +indicator_datetime_planner_is_configured (IndicatorDatetimePlanner * self) +{ + g_return_val_if_fail (INDICATOR_IS_DATETIME_PLANNER (self), FALSE); + + return INDICATOR_DATETIME_PLANNER_GET_CLASS (self)->is_configured (self); +} + +void +indicator_datetime_planner_activate (IndicatorDatetimePlanner * self) +{ + g_return_if_fail (INDICATOR_IS_DATETIME_PLANNER (self)); + + INDICATOR_DATETIME_PLANNER_GET_CLASS (self)->activate (self); +} + +void +indicator_datetime_planner_activate_time (IndicatorDatetimePlanner * self, GDateTime * time) +{ + g_return_if_fail (INDICATOR_IS_DATETIME_PLANNER (self)); + + INDICATOR_DATETIME_PLANNER_GET_CLASS (self)->activate_time (self, time); +} + +void +indicator_datetime_planner_set_timezone (IndicatorDatetimePlanner * self, const char * timezone) +{ + g_return_if_fail (INDICATOR_IS_DATETIME_PLANNER (self)); + + g_free (self->priv->timezone); + self->priv->timezone = g_strdup (timezone); + g_object_notify_by_pspec (G_OBJECT(self), properties[PROP_TIMEZONE]); +} + +const char * +indicator_datetime_planner_get_timezone (IndicatorDatetimePlanner * self) +{ + g_return_val_if_fail (INDICATOR_IS_DATETIME_PLANNER (self), NULL); + + return self->priv->timezone; +} |