diff --git a/data/ui/menus.ui b/data/ui/menus.ui index f85deee7..8beb1b58 100644 --- a/data/ui/menus.ui +++ b/data/ui/menus.ui @@ -32,6 +32,11 @@ _New Event app.new + + _Synchronize + app.sync + F5 + diff --git a/src/gcal-application.c b/src/gcal-application.c index a0d2d49b..4d388f98 100644 --- a/src/gcal-application.c +++ b/src/gcal-application.c @@ -64,6 +64,10 @@ static void gcal_application_show_about (GSimpleAction * GVariant *parameter, gpointer user_data); +static void gcal_application_sync (GSimpleAction *sync, + GVariant *parameter, + gpointer app); + static void gcal_application_quit (GSimpleAction *simple, GVariant *parameter, gpointer user_data); @@ -83,6 +87,7 @@ static GOptionEntry gcal_application_goptions[] = { static const GActionEntry gcal_app_entries[] = { { "new", gcal_application_create_new_event }, + { "sync", gcal_application_sync }, { "search", gcal_application_launch_search }, { "about", gcal_application_show_about }, { "quit", gcal_application_quit }, @@ -264,6 +269,18 @@ gcal_application_create_new_event (GSimpleAction *new_event, gcal_window_new_event (GCAL_WINDOW (priv->window)); } +static void +gcal_application_sync (GSimpleAction *sync, + GVariant *parameter, + gpointer app) +{ + GcalApplicationPrivate *priv; + + priv = gcal_application_get_instance_private (GCAL_APPLICATION (app)); + + gcal_manager_refresh (priv->manager); +} + static void gcal_application_launch_search (GSimpleAction *search, GVariant *parameter, diff --git a/src/gcal-manager.c b/src/gcal-manager.c index 13ecbd65..2795e400 100644 --- a/src/gcal-manager.c +++ b/src/gcal-manager.c @@ -90,6 +90,10 @@ static void on_client_connected (GObject *sour GAsyncResult *result, gpointer user_data); +static void on_client_refreshed (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + static void on_event_updated (GObject *source_object, GAsyncResult *result, gpointer user_data); @@ -282,6 +286,27 @@ on_client_connected (GObject *source_object, } } + +static void +on_client_refreshed (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error; + + error = NULL; + if (e_client_refresh_finish (E_CLIENT (source_object), result, &error)) + { + /* FIXME: add notification to UI */ + ; + } + else + { + /* FIXME: do something when there was some error */ + g_warning ("Error synchronizing client"); + } +} + /** * on_component_updated: * @source_object: {@link ECalClient} source @@ -600,6 +625,35 @@ gcal_manager_get_default_source (GcalManager *manager) return source_uid; } +void +gcal_manager_refresh (GcalManager *manager) +{ + GcalManagerPrivate *priv; + GList *clients; + GList *l; + + priv = gcal_manager_get_instance_private (manager); + clients = g_hash_table_get_values (priv->clients); + + /* refresh clients */ + for (l = clients; l != NULL; l = l->next) + { + GcalManagerUnit *unit; + + unit = (GcalManagerUnit*) l->data; + + if (! e_client_check_refresh_supported (E_CLIENT (unit->client))) + continue; + + e_client_refresh (E_CLIENT (unit->client), + NULL, + on_client_refreshed, + manager); + } + + g_list_free (clients); +} + gboolean gcal_manager_is_client_writable (GcalManager *manager, ESource *source) diff --git a/src/gcal-manager.h b/src/gcal-manager.h index 51375137..030755c5 100644 --- a/src/gcal-manager.h +++ b/src/gcal-manager.h @@ -81,6 +81,8 @@ gchar* gcal_manager_add_source (GcalManager *manager gchar* gcal_manager_get_default_source (GcalManager *manager); +void gcal_manager_refresh (GcalManager *manager); + gboolean gcal_manager_is_client_writable (GcalManager *manager, ESource *source);