aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/datetime-service.c176
1 files changed, 84 insertions, 92 deletions
diff --git a/src/datetime-service.c b/src/datetime-service.c
index 0219cfb..86c677a 100644
--- a/src/datetime-service.c
+++ b/src/datetime-service.c
@@ -40,11 +40,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <geoclue/geoclue-master-client.h>
#include <time.h>
-#include <libecal/e-cal.h>
+#include <libecal/libecal.h>
#include <libical/ical.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserver/e-source.h>
-#include <libedataserverui/e-passwords.h>
+#include <libedataserver/libedataserver.h>
// Other users of ecal seem to also include these, not sure why they should be included by the above
#include <libical/icaltime.h>
#include <cairo/cairo.h>
@@ -600,27 +598,6 @@ check_for_calendar (gpointer user_data)
return FALSE;
}
-// Authentication function
-static gchar *
-auth_func (ECal *ecal,
- const gchar *prompt,
- const gchar *key,
- gpointer user_data)
-{
- ESource *source = e_cal_get_source (ecal);
- gchar *auth_domain = e_source_get_duped_property (source, "auth-domain");
-
- const gchar *component_name;
- if (auth_domain) component_name = auth_domain;
- else component_name = "Calendar";
-
- gchar *password = e_passwords_get_password (component_name, key);
-
- g_free (auth_domain);
-
- return password;
-}
-
static gint
compare_comp_instances (gconstpointer ga, gconstpointer gb)
{
@@ -655,23 +632,53 @@ comp_instance_free (struct comp_instance* ci)
}
static gboolean
-populate_appointment_instances (ECalComponent * comp,
+populate_appointment_instances (ECalClient * client,
time_t start,
time_t end,
gpointer data)
{
- g_debug("Appending item %p", comp);
-
- ECalComponentVType vtype = e_cal_component_get_vtype (comp);
- if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return FALSE;
-
- icalproperty_status status;
- e_cal_component_get_status (comp, &status);
- if (status == ICAL_STATUS_COMPLETED || status == ICAL_STATUS_CANCELLED) return FALSE;
+ GSList *ecalcomps, *comp_item;
- struct comp_instance *ci = comp_instance_new (comp, start, end, E_SOURCE(data));
- comp_instances = g_list_append (comp_instances, ci);
- return TRUE;
+ if (e_cal_client_get_object_list_as_comps_sync (client,
+ NULL,
+ &ecalcomps,
+ NULL, NULL)) {
+
+ for (comp_item = ecalcomps; comp_item; comp_item = g_slist_next(comp_item)) {
+ ECalComponent *comp = comp_item->data;
+
+ g_debug("Appending item %p", e_cal_component_get_as_string(comp));
+
+ ECalComponentVType vtype = e_cal_component_get_vtype (comp);
+ if (vtype != E_CAL_COMPONENT_EVENT && vtype != E_CAL_COMPONENT_TODO) return FALSE;
+
+ icalproperty_status status;
+ e_cal_component_get_status (comp, &status);
+ if (status == ICAL_STATUS_COMPLETED || status == ICAL_STATUS_CANCELLED) return FALSE;
+
+ g_object_ref(comp);
+
+ ECalComponentDateTime datetime;
+ icaltimezone *appointment_zone = NULL;
+ icaltimezone *current_zone = NULL;
+
+ if (vtype == E_CAL_COMPONENT_EVENT)
+ e_cal_component_get_dtstart (comp, &datetime);
+ else
+ e_cal_component_get_due (comp, &datetime);
+
+ appointment_zone = icaltimezone_get_builtin_timezone_from_tzid(datetime.tzid);
+ current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone);
+ if (!appointment_zone || datetime.value->is_date) { // If it's today put in the current timezone?
+ appointment_zone = current_zone;
+ }
+
+ struct comp_instance *ci = comp_instance_new (comp, start, end, E_SOURCE(data));
+ comp_instances = g_list_append (comp_instances, ci);
+ }
+ return TRUE;
+ }
+ return FALSE;
}
/* Populate the menu with todays, next 5 appointments.
@@ -691,12 +698,12 @@ update_appointment_menu_items (gpointer user_data)
updating_appointments = TRUE;
time_t curtime = 0, t1 = 0, t2 = 0;
- GList *l;
- GSList *g;
+ GList *l, *s;
GError *gerror = NULL;
gint i;
gint width = 0, height = 0;
- ESourceList * sources = NULL;
+ ESourceRegistry * src_registry = NULL;
+ GList * sources = NULL;
// Get today & work out query times
time(&curtime);
@@ -736,67 +743,52 @@ update_appointment_menu_items (gpointer user_data)
highlightdays = highlightdays + 7; // Minimum of 7 days ahead
t2 = t1 + (time_t) (highlightdays * 24 * 60 * 60);
- if (!e_cal_get_sources(&sources, E_CAL_SOURCE_TYPE_EVENT, &gerror)) {
- g_debug("Failed to get ecal sources\n");
- g_clear_error (&gerror);
- return FALSE;
- }
-
// clear any previous comp_instances
g_list_free_full (comp_instances, (GDestroyNotify)comp_instance_free);
comp_instances = NULL;
- GSList *cal_list = gconf_client_get_list(gconf, "/apps/evolution/calendar/display/selected_calendars", GCONF_VALUE_STRING, &gerror);
- if (gerror) {
- g_debug("Failed to get evolution preference for enabled calendars");
- g_clear_error (&gerror);
- cal_list = NULL;
- }
-
+ src_registry = e_source_registry_new_sync (NULL, &gerror);
+ if (!src_registry) {
+ g_debug("Failed to get access to source registry: %s\n", gerror->message);
+ return FALSE;
+ }
+
+ sources = e_source_registry_list_sources(src_registry, E_SOURCE_EXTENSION_CALENDAR);
+
// Generate instances for all sources
- for (g = e_source_list_peek_groups (sources); g; g = g->next) {
- ESourceGroup *group = E_SOURCE_GROUP (g->data);
- GSList *s;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- g_signal_connect (G_OBJECT(source), "changed", G_CALLBACK (update_appointment_menu_items), NULL);
- ECal *ecal = e_cal_new(source, E_CAL_SOURCE_TYPE_EVENT);
- e_cal_set_auth_func (ecal, (ECalAuthFunc) auth_func, NULL);
-
- icaltimezone* current_zone = icaltimezone_get_builtin_timezone(current_timezone);
- if (!current_zone) {
- // current_timezone may be a TZID?
- current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone);
- }
- if (current_zone && !e_cal_set_default_timezone(ecal, current_zone, &gerror)) {
- g_debug("Failed to set ecal default timezone %s", gerror->message);
- g_clear_error (&gerror);
- g_object_unref(ecal);
- continue;
- }
-
- if (!e_cal_open(ecal, FALSE, &gerror)) {
- g_debug("Failed to get ecal sources %s", gerror->message);
- g_clear_error (&gerror);
- g_object_unref(ecal);
- continue;
- }
+ for (s = g_list_first (sources); s; s = g_list_next (s)) {
+
+ ESource *source = E_SOURCE (s->data);
+ g_signal_connect (G_OBJECT(source), "changed", G_CALLBACK (update_appointment_menu_items), NULL);
+ ECalClient *ecal = e_cal_client_new(source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &gerror);
+
+ icaltimezone* current_zone = icaltimezone_get_builtin_timezone(current_timezone);
+ if (!current_zone) {
+ // current_timezone may be a TZID?
+ current_zone = icaltimezone_get_builtin_timezone_from_tzid(current_timezone);
+ }
- const gchar *ecal_uid = e_source_peek_uid(source);
- g_debug("Checking ecal_uid is enabled: %s", ecal_uid);
- const gboolean in_list = g_slist_find_custom (cal_list, ecal_uid, (GCompareFunc)g_strcmp0) != NULL;
- if (!in_list) {
+ e_cal_client_set_default_timezone (ecal, current_zone);
+
+ g_debug("Checking if source %s is enabled", e_source_get_uid(source));
+ if (e_source_get_enabled (source)) {
+ g_debug("source is enabled, generating instances");
+
+ if (!e_client_open_sync (E_CLIENT (ecal), TRUE, NULL, &gerror)) {
+ g_debug("Failed to open source: %s", gerror->message);
+ g_clear_error (&gerror);
g_object_unref(ecal);
continue;
}
- g_debug("ecal_uid is enabled, generating instances");
- e_cal_generate_instances (ecal, t1, t2, (ECalRecurInstanceFn) populate_appointment_instances, source);
- g_object_unref(ecal);
- }
- }
- g_slist_free_full (cal_list, g_free);
+ e_cal_client_generate_instances (ecal, t1, t2, NULL,
+ (ECalRecurInstanceFn) populate_appointment_instances,
+ (gpointer) source,
+ NULL);
+ }
+ g_object_unref(ecal);
+ }
+ g_list_free_full (sources, g_object_unref);
g_debug("Number of ECalComponents returned: %d", g_list_length(comp_instances));
GList *sorted_comp_instances = g_list_sort(comp_instances, compare_comp_instances);
@@ -948,7 +940,7 @@ update_appointment_menu_items (gpointer user_data)
G_CALLBACK(activate_cb), cmd, (GClosureNotify)g_free, 0);
g_free (ad);
- const gchar *color_spec = e_source_peek_color_spec(ci->source);
+ const gchar *color_spec = e_source_selectable_get_color (e_source_get_extension (ci->source, E_SOURCE_EXTENSION_CALENDAR));
g_debug("Colour to use: %s", color_spec);
// Draw the correct icon for the appointment type and then tint it using mask fill.