static void cal_search_get_object_list_cb (GObject *source, GAsyncResult *result, gpointer user_data) { ECalClient *client = E_CAL_CLIENT (source); ECalShellView *cal_shell_view = user_data; GSList *icalcomps = NULL; GError *error = NULL; g_return_if_fail (client != NULL); g_return_if_fail (result != NULL); g_return_if_fail (cal_shell_view != NULL); e_cal_client_get_object_list_finish ( client, result, &icalcomps, &error); if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_warn_if_fail (icalcomps == NULL); g_error_free (error); } else if (error != NULL || !icalcomps) { g_warn_if_fail (icalcomps == NULL); g_clear_error (&error); cal_shell_view->priv->search_pending_count--; if (!cal_shell_view->priv->search_pending_count) { cal_iterate_searching (cal_shell_view); } } else if (cal_shell_view->priv->searching_activity) { GSList *iter; GCancellable *cancellable; time_t start, end; cancellable = e_activity_get_cancellable (cal_shell_view->priv->searching_activity); start = time_add_day (cal_shell_view->priv->search_time, (-1) * cal_shell_view->priv->search_direction); end = cal_shell_view->priv->search_time; if (start > end) { time_t tmp = start; start = end; end = tmp; } for (iter = icalcomps; iter; iter = iter->next) { icalcomponent *icalcomp = iter->data; struct GenerateInstancesData *gid; gid = g_new0 (struct GenerateInstancesData, 1); gid->client = client; gid->cal_shell_view = cal_shell_view; gid->cancellable = g_object_ref (cancellable); e_cal_client_generate_instances_for_object ( client, icalcomp, start, end, cancellable, cal_searching_got_instance_cb, gid, cal_searching_instances_done_cb); } e_cal_client_free_icalcomp_slist (icalcomps); } else {
static void do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, EClientCache *client_cache, gchar *dest_uri) { ESource *primary_source; EClient *source_client; GError *error = NULL; GSList *objects = NULL; icalcomponent *top_level = NULL; if (!dest_uri) return; /* open source client */ primary_source = e_source_selector_ref_primary_selection (selector); source_client = e_client_cache_get_client_sync (client_cache, primary_source, e_source_selector_get_extension_name (selector), 30, NULL, &error); g_object_unref (primary_source); /* Sanity check. */ g_return_if_fail ( ((source_client != NULL) && (error == NULL)) || ((source_client == NULL) && (error != NULL))); if (error != NULL) { display_error_message ( gtk_widget_get_toplevel (GTK_WIDGET (selector)), error->message); g_error_free (error); return; } /* create destination file */ top_level = e_cal_util_new_top_level (); e_cal_client_get_object_list_sync ( E_CAL_CLIENT (source_client), "#t", &objects, NULL, &error); if (objects != NULL) { CompTzData tdata; GOutputStream *stream; GSList *iter; tdata.zones = g_hash_table_new (g_str_hash, g_str_equal); tdata.client = E_CAL_CLIENT (source_client); for (iter = objects; iter; iter = iter->next) { icalcomponent *icalcomp = icalcomponent_new_clone (iter->data); icalcomponent_foreach_tzid (icalcomp, insert_tz_comps, &tdata); icalcomponent_add_component (top_level, icalcomp); } g_hash_table_foreach (tdata.zones, (GHFunc) append_tz_to_comp, top_level); g_hash_table_destroy (tdata.zones); tdata.zones = NULL; /* save the file */ stream = open_for_writing (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (selector))), dest_uri, &error); if (stream) { gchar *ical_str = icalcomponent_as_ical_string_r (top_level); g_output_stream_write_all (stream, ical_str, strlen (ical_str), NULL, NULL, &error); g_output_stream_close (stream, NULL, NULL); g_object_unref (stream); g_free (ical_str); } e_cal_client_free_icalcomp_slist (objects); } if (error != NULL) { display_error_message ( gtk_widget_get_toplevel (GTK_WIDGET (selector)), error->message); g_error_free (error); } /* terminate */ g_object_unref (source_client); icalcomponent_free (top_level); }
static void app_load_events (App *app) { GList *clients; GList *l; GList *ll; gchar *since_iso8601; gchar *until_iso8601; /* out with the old */ g_hash_table_remove_all (app->appointments); /* nuke existing views */ for (ll = app->live_views; ll != NULL; ll = ll->next) { ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data); g_signal_handlers_disconnect_by_func (view, on_objects_added, app); g_signal_handlers_disconnect_by_func (view, on_objects_modified, app); g_signal_handlers_disconnect_by_func (view, on_objects_removed, app); e_cal_client_view_stop (view, NULL); g_object_unref (view); } g_list_free (app->live_views); app->live_views = NULL; /* timezone could have changed */ app_update_timezone (app); since_iso8601 = isodate_from_time_t (app->since); until_iso8601 = isodate_from_time_t (app->until); print_debug ("Loading events since %s until %s", since_iso8601, until_iso8601); clients = calendar_sources_get_appointment_clients (app->sources); for (l = clients; l != NULL; l = l->next) { ECalClient *cal = E_CAL_CLIENT (l->data); GError *error; gchar *query; GSList *objects, *j; ECalClientView *view; e_cal_client_set_default_timezone (cal, app->zone); error = NULL; if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error)) { ESource *source = e_client_get_source (E_CLIENT (cal)); g_warning ("Error opening calendar %s: %s\n", e_source_get_uid (source), error->message); g_error_free (error); continue; } query = g_strdup_printf ("occur-in-time-range? (make-time \"%s\") " "(make-time \"%s\")", since_iso8601, until_iso8601); error = NULL; objects = NULL; if (!e_cal_client_get_object_list_sync (cal, query, &objects, NULL, /* cancellable */ &error)) { ESource *source = e_client_get_source (E_CLIENT (cal)); g_warning ("Error querying calendar %s: %s\n", e_source_get_uid (source), error->message); g_error_free (error); g_free (query); continue; } for (j = objects; j != NULL; j = j->next) { icalcomponent *ical = j->data; CalendarAppointment *appointment; appointment = calendar_appointment_new (ical, cal, app->zone); if (appointment == NULL) continue; calendar_appointment_generate_occurrences (appointment, ical, cal, app->since, app->until, app->zone); g_hash_table_insert (app->appointments, g_strdup (appointment->uid), appointment); } e_cal_client_free_icalcomp_slist (objects); error = NULL; if (!e_cal_client_get_view_sync (cal, query, &view, NULL, /* cancellable */ &error)) { g_warning ("Error setting up live-query on calendar: %s\n", error->message); g_error_free (error); } else { g_signal_connect (view, "objects-added", G_CALLBACK (on_objects_added), app); g_signal_connect (view, "objects-modified", G_CALLBACK (on_objects_modified), app); g_signal_connect (view, "objects-removed", G_CALLBACK (on_objects_removed), app); e_cal_client_view_start (view, NULL); app->live_views = g_list_prepend (app->live_views, view); } g_free (query); } g_list_free (clients); g_free (since_iso8601); g_free (until_iso8601); app->cache_invalid = FALSE; }
void e_task_shell_view_delete_completed (ETaskShellView *task_shell_view) { ETaskShellContent *task_shell_content; ECalModel *model; GList *list, *link; const gchar *sexp; g_return_if_fail (E_IS_TASK_SHELL_VIEW (task_shell_view)); sexp = "(is-completed?)"; task_shell_content = task_shell_view->priv->task_shell_content; model = e_task_shell_content_get_task_model (task_shell_content); e_task_shell_view_set_status_message ( task_shell_view, _("Expunging"), -1.0); list = e_cal_model_list_clients (model); for (link = list; link != NULL; link = g_list_next (link)) { ECalClient *client = E_CAL_CLIENT (link->data); GSList *objects, *obj; GError *error = NULL; if (e_client_is_readonly (E_CLIENT (client))) continue; e_cal_client_get_object_list_sync ( client, sexp, &objects, NULL, &error); if (error != NULL) { g_warning ( "%s: Failed to get object list: %s", G_STRFUNC, error->message); g_clear_error (&error); continue; } for (obj = objects; obj != NULL; obj = obj->next) { icalcomponent *component = obj->data; const gchar *uid; uid = icalcomponent_get_uid (component); e_cal_client_remove_object_sync ( client, uid, NULL, CALOBJ_MOD_THIS, NULL, &error); if (error != NULL) { g_warning ( "%s: Failed to remove object: %s", G_STRFUNC, error->message); g_clear_error (&error); } } e_cal_client_free_icalcomp_slist (objects); } g_list_free_full (list, (GDestroyNotify) g_object_unref); e_task_shell_view_set_status_message (task_shell_view, NULL, -1.0); }