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);