diff options
Diffstat (limited to 'calendar/alarm-notify/config-data.c')
-rw-r--r-- | calendar/alarm-notify/config-data.c | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/calendar/alarm-notify/config-data.c b/calendar/alarm-notify/config-data.c new file mode 100644 index 0000000000..c8348f89fc --- /dev/null +++ b/calendar/alarm-notify/config-data.c @@ -0,0 +1,410 @@ +/* + * Evolution calendar - Configuration values for the alarm notification daemon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + * + * Authors: + * Federico Mena-Quintero <federico@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <libedataserver/e-source-list.h> +#include "config-data.h" + +/* Whether we have initied ourselves by reading + * the data from the configuration engine. */ +static gboolean inited = FALSE; +static GConfClient *conf_client = NULL; +static GSettings *calendar_settings = NULL; +static ESourceList *calendar_source_list = NULL, *tasks_source_list = NULL; + +/* Copied from ../calendar-config.c; returns whether the locale has 'am' and + * 'pm' strings defined. + */ +static gboolean +locale_supports_12_hour_format (void) +{ + gchar s[16]; + time_t t = 0; + + strftime (s, sizeof s, "%p", gmtime (&t)); + return s[0] != '\0'; +} + +static void +do_cleanup (void) +{ + if (calendar_source_list) { + g_object_unref (calendar_source_list); + calendar_source_list = NULL; + } + + if (tasks_source_list) { + g_object_unref (tasks_source_list); + tasks_source_list = NULL; + } + + g_object_unref (conf_client); + conf_client = NULL; + + g_object_unref (calendar_settings); + calendar_settings = FALSE; + + inited = FALSE; +} + +/* Ensures that the configuration values have been read */ +static void +ensure_inited (void) +{ + if (inited) + return; + + inited = TRUE; + + conf_client = gconf_client_get_default (); + if (!GCONF_IS_CLIENT (conf_client)) { + inited = FALSE; + return; + } + + calendar_settings = g_settings_new ("org.gnome.evolution.calendar"); + + g_atexit ((GVoidFunc) do_cleanup); + + /* load the sources for calendars and tasks */ + calendar_source_list = e_source_list_new_for_gconf (conf_client, + "/apps/evolution/calendar/sources"); + tasks_source_list = e_source_list_new_for_gconf (conf_client, + "/apps/evolution/tasks/sources"); + +} + +ESourceList * +config_data_get_calendars (const gchar *key) +{ + ESourceList *cal_sources; + gboolean state; + GSList *gconf_list; + + if (!inited) { + conf_client = gconf_client_get_default (); + calendar_settings = g_settings_new ("org.gnome.evolution.calendar"); + } + + gconf_list = gconf_client_get_list (conf_client, + key, + GCONF_VALUE_STRING, + NULL); + cal_sources = e_source_list_new_for_gconf (conf_client, key); + + if (cal_sources && g_slist_length (gconf_list)) { + g_slist_foreach (gconf_list, (GFunc) g_free, NULL); + g_slist_free (gconf_list); + return cal_sources; + } + + state = g_settings_get_boolean (calendar_settings, "notify-with-tray"); + if (!state) /* Should be old client */ { + GSList *source; + + g_settings_set_boolean (calendar_settings, "notify-with-tray", TRUE); + source = gconf_client_get_list (conf_client, + "/apps/evolution/calendar/sources", + GCONF_VALUE_STRING, + NULL); + gconf_client_set_list (conf_client, + key, + GCONF_VALUE_STRING, + source, + NULL); + cal_sources = e_source_list_new_for_gconf (conf_client, key); + + if (source) { + g_slist_foreach (source, (GFunc) g_free, NULL); + g_slist_free (source); + } + } + + if (gconf_list) { + g_slist_foreach (gconf_list, (GFunc) g_free, NULL); + g_slist_free (gconf_list); + } + + return cal_sources; + +} + +void +config_data_replace_string_list (const gchar *key, + const gchar *old, + const gchar *new) +{ + GSList *source, *tmp; + + if (!inited) + conf_client = gconf_client_get_default (); + + source = gconf_client_get_list (conf_client, + key, + GCONF_VALUE_STRING, + NULL); + + for (tmp = source; tmp; tmp = tmp->next) { + + if (strcmp (tmp->data, old) == 0) { + g_free (tmp->data); + tmp->data = g_strdup ((gchar *) new); + gconf_client_set_list (conf_client, + key, + GCONF_VALUE_STRING, + source, + NULL); + break; + } + } + + if (source) { + g_slist_foreach (source, (GFunc) g_free, NULL); + g_slist_free (source); + } +} + +icaltimezone * +config_data_get_timezone (void) +{ + gchar *location; + icaltimezone *local_timezone; + + ensure_inited (); + + if (g_settings_get_boolean (calendar_settings, "use-system-timezone")) + location = e_cal_util_get_system_timezone_location (); + else { + location = g_settings_get_string (calendar_settings, "timezone"); + } + + if (location && location[0]) + local_timezone = icaltimezone_get_builtin_timezone (location); + else + local_timezone = icaltimezone_get_utc_timezone (); + + g_free (location); + + return local_timezone; +} + +gboolean +config_data_get_24_hour_format (void) +{ + ensure_inited (); + + if (locale_supports_12_hour_format ()) { + return g_settings_get_boolean (calendar_settings, "use-24hour-format"); + } + + return TRUE; +} + +gboolean +config_data_get_notify_with_tray (void) +{ + ensure_inited (); + + return g_settings_get_boolean (calendar_settings, "notify-with-tray"); +} + +/** + * config_data_set_last_notification_time: + * @t: A time value. + * + * Saves the last notification time so that it can be fetched the next time the + * alarm daemon is run. This way the daemon can show alarms that should have + * triggered while it was not running. + **/ +void +config_data_set_last_notification_time (ECalClient *cal, + time_t t) +{ + time_t current_t, now = time (NULL); + + g_return_if_fail (t != -1); + + if (cal) { + ESource *source = e_client_get_source (E_CLIENT (cal)); + if (source) { + const gchar *prop_str; + GTimeVal curr_tv = {0}; + + prop_str = e_source_get_property (source, "last-notified"); + if (!prop_str || !g_time_val_from_iso8601 (prop_str, &curr_tv)) + curr_tv.tv_sec = 0; + + if (t > (time_t) curr_tv.tv_sec || (time_t) curr_tv.tv_sec > now) { + GTimeVal tmval = {0}; + gchar *as_text; + + tmval.tv_sec = (glong) t; + as_text = g_time_val_to_iso8601 (&tmval); + + if (as_text) { + e_source_set_property (source, "last-notified", as_text); + g_free (as_text); + /* pass through, thus the global last notification time is also changed */ + } + } + } + } + + /* we only store the new notification time if it is bigger + * than the already stored one */ + current_t = g_settings_get_int (calendar_settings, "last-notification-time"); + if (t > current_t || current_t > now) + g_settings_set_int (calendar_settings, "last-notification-time", t); +} + +/** + * config_data_get_last_notification_time: + * + * Queries the last saved value for alarm notification times. + * + * Return value: The last saved value, or -1 if no value had been saved before. + **/ +time_t +config_data_get_last_notification_time (ECalClient *cal) +{ + time_t value, now; + + if (cal) { + ESource *source = e_client_get_source (E_CLIENT (cal)); + if (source) { + const gchar *last_notified; + + GTimeVal tmval = {0}; + + last_notified = e_source_get_property ( + source, "last-notified"); + + if (last_notified && *last_notified && + g_time_val_from_iso8601 (last_notified, &tmval)) { + time_t now = time (NULL), value = (time_t) tmval.tv_sec; + + if (value > now) + value = now; + return value; + } + } + } + + value = g_settings_get_int (calendar_settings, "last-notification-time"); + now = time (NULL); + if (value > now) + value = now; + + return value; +} + +/** + * config_data_save_blessed_program: + * @program: a program name + * + * Saves a program name as "blessed" + **/ +void +config_data_save_blessed_program (const gchar *program) +{ + gchar **list; + gint i; + GPtrArray *array = g_ptr_array_new (); + + list = g_settings_get_strv (calendar_settings, "notify-programs"); + for (i = 0; i < g_strv_length (list); i++) + g_ptr_array_add (array, list[i]); + + g_ptr_array_add (array, (gpointer) program); + g_ptr_array_add (array, NULL); + g_settings_set_strv (calendar_settings, "notify-programs", (const gchar *const *) array->pdata); + + g_strfreev (list); + g_ptr_array_free (array, TRUE); +} + +/** + * config_data_is_blessed_program: + * @program: a program name + * + * Checks to see if a program is blessed + * + * Return value: TRUE if program is blessed, FALSE otherwise + **/ +gboolean +config_data_is_blessed_program (const gchar *program) +{ + gchar **list; + gint i = 0; + gboolean found = FALSE; + + list = g_settings_get_strv (calendar_settings, "notify-programs"); + if (!list) + return FALSE; + + while (list[i] != NULL) { + if (!found) + found = strcmp ((gchar *) list[i], program) == 0; + i++; + } + + g_strfreev (list); + + return found; +} + +static gboolean can_debug = FALSE; +static GStaticRecMutex rec_mutex = G_STATIC_REC_MUTEX_INIT; + +void +config_data_init_debugging (void) +{ + can_debug = g_getenv ("ALARMS_DEBUG") != NULL; +} + +/* returns whether started debugging; + * call config_data_stop_debugging() when started and you are done with it + */ +gboolean +config_data_start_debugging (void) +{ + g_static_rec_mutex_lock (&rec_mutex); + + if (can_debug) + return TRUE; + + g_static_rec_mutex_unlock (&rec_mutex); + + return FALSE; +} + +void +config_data_stop_debugging (void) +{ + g_static_rec_mutex_unlock (&rec_mutex); +} |