[evolution-data-server] Bug 670435: Added e_cal_client_view_set_flags()



commit 32384d60d209c4f93ec9bd09ab93a636ec33621a
Author: Christophe Dumez <christophe dumez intel com>
Date:   Mon Feb 20 11:27:11 2012 +0200

    Bug 670435: Added e_cal_client_view_set_flags()
    
    This commit adds a ECalClientViewFlags to ECalClientView with
    an initial flag value E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL
    to control whether the initial object notifications are sent.
    The default is to send notifications, if the flag is unset then
    only future notifications are issued.

 calendar/libecal/e-cal-client-view.c    |   34 +++++++++++++++
 calendar/libecal/e-cal-client-view.h    |   19 ++++++++
 calendar/libedata-cal/e-data-cal-view.c |   69 ++++++++++++++++++++++++++----
 calendar/libedata-cal/e-data-cal-view.h |    2 +
 calendar/libegdbus/e-gdbus-cal-view.c   |   31 ++++++++++++++
 calendar/libegdbus/e-gdbus-cal-view.h   |    6 +++
 6 files changed, 151 insertions(+), 10 deletions(-)
---
diff --git a/calendar/libecal/e-cal-client-view.c b/calendar/libecal/e-cal-client-view.c
index 36e5769..e16baa7 100644
--- a/calendar/libecal/e-cal-client-view.c
+++ b/calendar/libecal/e-cal-client-view.c
@@ -573,3 +573,37 @@ e_cal_client_view_set_fields_of_interest (ECalClientView *view,
 		g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR, "Cannot set fields of interest, D-Bus proxy gone");
 	}
 }
+
+/**
+ * e_cal_client_view_set_flags:
+ * @view: an #ECalClientView
+ * @flags: the #ECalClientViewFlags for @view.
+ * @error: a return location for a #GError, or %NULL.
+ *
+ * Sets the @flags which control the behaviour of @view.
+ *
+ * Since: 3.6
+ */
+void
+e_cal_client_view_set_flags (ECalClientView      *view,
+                             ECalClientViewFlags  flags,
+                             GError              **error)
+{
+	ECalClientViewPrivate *priv;
+
+	g_return_if_fail (view != NULL);
+	g_return_if_fail (E_IS_CAL_CLIENT_VIEW (view));
+
+	priv = view->priv;
+
+	if (priv->gdbus_calview) {
+		GError *local_error = NULL;
+
+		e_gdbus_cal_view_call_set_flags_sync (priv->gdbus_calview, flags, NULL, &local_error);
+
+		e_client_unwrap_dbus_error (E_CLIENT (priv->client), local_error, error);
+	} else {
+		/* do not translate this string, it should ideally never happen */
+		g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR, "Cannot set fields of interest, D-Bus proxy gone");
+	}
+}
diff --git a/calendar/libecal/e-cal-client-view.h b/calendar/libecal/e-cal-client-view.h
index 019550b..05f4e3c 100644
--- a/calendar/libecal/e-cal-client-view.h
+++ b/calendar/libecal/e-cal-client-view.h
@@ -38,6 +38,24 @@ typedef struct _ECalClientViewPrivate	ECalClientViewPrivate;
 struct _ECalClient;
 
 /**
+ * ECalClientViewFlags:
+ * @E_CAL_CLIENT_VIEW_FLAGS_NONE:
+ *   Symbolic value for no flags
+ * @E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL:
+ *   If this flag is set then all objects matching the view's query will
+ *   be sent as notifications when starting the view, otherwise only future
+ *   changes will be reported.  The default for a #ECalClientView is %TRUE.
+ *
+ * Flags that control the behaviour of an #ECalClientView.
+ *
+ * Since: 3.6
+ */
+typedef enum {
+	E_CAL_CLIENT_VIEW_FLAGS_NONE           = 0,
+	E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL = (1 << 0)
+} ECalClientViewFlags;
+
+/**
  * ECalClientView:
  *
  * Contains only private data that should be read and manipulated using the
@@ -70,6 +88,7 @@ gboolean		e_cal_client_view_is_running		(ECalClientView *view);
 void			e_cal_client_view_set_fields_of_interest (ECalClientView *view, const GSList *fields_of_interest, GError **error);
 void			e_cal_client_view_start			(ECalClientView *view, GError **error);
 void			e_cal_client_view_stop			(ECalClientView *view, GError **error);
+void			e_cal_client_view_set_flags		(ECalClientView *view, ECalClientViewFlags flags, GError **error);
 
 G_END_DECLS
 
diff --git a/calendar/libedata-cal/e-data-cal-view.c b/calendar/libedata-cal/e-data-cal-view.c
index 6f85259..c046fac 100644
--- a/calendar/libedata-cal/e-data-cal-view.c
+++ b/calendar/libedata-cal/e-data-cal-view.c
@@ -64,6 +64,9 @@ struct _EDataCalViewPrivate {
 	GMutex *pending_mutex;
 	guint flush_id;
 
+	/* view flags */
+	ECalClientViewFlags flags;
+
 	/* which fields is listener interested in */
 	GHashTable *fields_of_interest;
 };
@@ -278,22 +281,27 @@ notify_add (EDataCalView *view,
 {
 	EDataCalViewPrivate *priv = view->priv;
 	ECalComponent *comp;
+	ECalClientViewFlags flags;
 
 	send_pending_changes (view);
 	send_pending_removes (view);
 
-	if (priv->adds->len == THRESHOLD_ITEMS) {
-		send_pending_adds (view);
+	/* Do not send object add notifications during initial stage */
+	flags = e_data_cal_view_get_flags (view);
+	if (priv->complete || (flags & E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL) != 0) {
+		if (priv->adds->len == THRESHOLD_ITEMS) {
+			send_pending_adds (view);
+		}
+		g_array_append_val (priv->adds, obj);
+
+		ensure_pending_flush_timeout (view);
 	}
-	g_array_append_val (priv->adds, obj);
 
 	comp = e_cal_component_new_from_string (obj);
 	g_hash_table_insert (priv->ids,
 			     e_cal_component_get_id (comp),
 			     GUINT_TO_POINTER (1));
 	g_object_unref (comp);
-
-	ensure_pending_flush_timeout (view);
 }
 
 static void
@@ -302,22 +310,27 @@ notify_add_component (EDataCalView *view,
 {
 	EDataCalViewPrivate *priv = view->priv;
 	gchar               *obj;
+	ECalClientViewFlags flags;
 
 	obj = e_data_cal_view_get_component_string (view, comp);
 
 	send_pending_changes (view);
 	send_pending_removes (view);
 
-	if (priv->adds->len == THRESHOLD_ITEMS) {
-		send_pending_adds (view);
+	/* Do not send component add notifications during initial stage */
+	flags = e_data_cal_view_get_flags (view);
+	if (priv->complete || (flags & E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL) != 0) {
+		if (priv->adds->len == THRESHOLD_ITEMS) {
+			send_pending_adds (view);
+		}
+		g_array_append_val (priv->adds, obj);
+
+		ensure_pending_flush_timeout (view);
 	}
-	g_array_append_val (priv->adds, obj);
 
 	g_hash_table_insert (priv->ids,
 			     e_cal_component_get_id (comp),
 			     GUINT_TO_POINTER (1));
-
-	ensure_pending_flush_timeout (view);
 }
 
 static void
@@ -458,6 +471,19 @@ impl_DataCalView_stop (EGdbusCalView *object,
 }
 
 static gboolean
+impl_DataCalView_setFlags (EGdbusCalView         *object,
+                           GDBusMethodInvocation *invocation,
+                           ECalClientViewFlags    flags,
+                           EDataCalView          *view)
+{
+	view->priv->flags = flags;
+
+	e_gdbus_cal_view_complete_set_flags (object, invocation, NULL);
+
+	return TRUE;
+}
+
+static gboolean
 impl_DataCalView_dispose (EGdbusCalView *object,
                           GDBusMethodInvocation *invocation,
                           EDataCalView *view)
@@ -562,6 +588,8 @@ e_data_cal_view_init (EDataCalView *view)
 {
 	view->priv = E_DATA_CAL_VIEW_GET_PRIVATE (view);
 
+	view->priv->flags = E_CAL_CLIENT_VIEW_FLAGS_NOTIFY_INITIAL;
+
 	view->priv->gdbus_object = e_gdbus_cal_view_stub_new ();
 	g_signal_connect (
 		view->priv->gdbus_object, "handle-start",
@@ -570,6 +598,9 @@ e_data_cal_view_init (EDataCalView *view)
 		view->priv->gdbus_object, "handle-stop",
 		G_CALLBACK (impl_DataCalView_stop), view);
 	g_signal_connect (
+		view->priv->gdbus_object, "handle-set-flags",
+		G_CALLBACK (impl_DataCalView_setFlags), view);
+	g_signal_connect (
 		view->priv->gdbus_object, "handle-dispose",
 		G_CALLBACK (impl_DataCalView_dispose), view);
 	g_signal_connect (
@@ -826,6 +857,24 @@ e_data_cal_view_get_fields_of_interest (EDataCalView *view)
 	return view->priv->fields_of_interest;
 }
 
+/**
+ * e_data_cal_view_get_flags:
+ * @view: A view object.
+ *
+ * Gets the #ECalClientViewFlags that control the behaviour of @view.
+ *
+ * Returns: the flags for @view.
+ *
+ * Since: 3.6
+ **/
+ECalClientViewFlags
+e_data_cal_view_get_flags (EDataCalView *view)
+{
+	g_return_val_if_fail (E_IS_DATA_CAL_VIEW (view), 0);
+
+	return view->priv->flags;
+}
+
 static gboolean
 filter_component (icalcomponent *icomponent,
                   GHashTable *fields_of_interest,
diff --git a/calendar/libedata-cal/e-data-cal-view.h b/calendar/libedata-cal/e-data-cal-view.h
index 4ec6c0a..2224ea8 100644
--- a/calendar/libedata-cal/e-data-cal-view.h
+++ b/calendar/libedata-cal/e-data-cal-view.h
@@ -22,6 +22,7 @@
 #define E_DATA_CAL_VIEW_H
 
 #include <gio/gio.h>
+#include <libecal/e-cal-client-view.h>
 #include <libedata-cal/e-data-cal-common.h>
 #include <libedata-cal/e-cal-backend-sexp.h>
 #include <libedata-cal/e-data-cal-types.h>
@@ -57,6 +58,7 @@ gboolean		e_data_cal_view_is_started			(EDataCalView *view);
 gboolean		e_data_cal_view_is_completed			(EDataCalView *view);
 gboolean		e_data_cal_view_is_stopped			(EDataCalView *view);
 GHashTable *		e_data_cal_view_get_fields_of_interest		(EDataCalView *view);
+ECalClientViewFlags    e_data_cal_view_get_flags			(EDataCalView *view);
 
 gchar *			e_data_cal_view_get_component_string		(EDataCalView *view, /* const */ ECalComponent *component);
 
diff --git a/calendar/libegdbus/e-gdbus-cal-view.c b/calendar/libegdbus/e-gdbus-cal-view.c
index d7e0405..535fa21 100644
--- a/calendar/libegdbus/e-gdbus-cal-view.c
+++ b/calendar/libegdbus/e-gdbus-cal-view.c
@@ -42,6 +42,7 @@ enum
 	__COMPLETE_SIGNAL,
 	__START_METHOD,
 	__STOP_METHOD,
+	__SET_FLAGS_METHOD,
 	__DISPOSE_METHOD,
 	__SET_FIELDS_OF_INTEREST_METHOD,
 	__LAST_SIGNAL
@@ -114,6 +115,7 @@ e_gdbus_cal_view_default_init (EGdbusCalViewIface *iface)
 	/* GObject signals definitions for D-Bus methods: */
 	E_INIT_GDBUS_METHOD_VOID	(EGdbusCalViewIface, "start",			start, __START_METHOD)
 	E_INIT_GDBUS_METHOD_VOID	(EGdbusCalViewIface, "stop",			stop, __STOP_METHOD)
+	E_INIT_GDBUS_METHOD_UINT	(EGdbusCalViewIface, "set_flags",		set_flags, __SET_FLAGS_METHOD)
 	E_INIT_GDBUS_METHOD_VOID	(EGdbusCalViewIface, "dispose",			dispose, __DISPOSE_METHOD)
 	E_INIT_GDBUS_METHOD_STRV	(EGdbusCalViewIface, "set_fields_of_interest",	set_fields_of_interest, __SET_FIELDS_OF_INTEREST_METHOD)
 }
@@ -169,6 +171,33 @@ e_gdbus_cal_view_call_stop_sync (GDBusProxy *proxy,
 }
 
 void
+e_gdbus_cal_view_call_set_flags (GDBusProxy *proxy,
+                                 guint in_flags,
+                                 GCancellable *cancellable,
+                                 GAsyncReadyCallback callback,
+                                 gpointer user_data)
+{
+	e_gdbus_proxy_method_call_uint ("set_flags", proxy, in_flags, cancellable, callback, user_data);
+}
+
+gboolean
+e_gdbus_cal_view_call_set_flags_finish (GDBusProxy *proxy,
+                                        GAsyncResult *result,
+                                        GError **error)
+{
+	return e_gdbus_proxy_method_call_finish_void (proxy, result, error);
+}
+
+gboolean
+e_gdbus_cal_view_call_set_flags_sync (GDBusProxy *proxy,
+                                      guint in_flags,
+                                      GCancellable *cancellable,
+                                      GError **error)
+{
+	return e_gdbus_proxy_method_call_sync_uint__void ("set_flags", proxy, in_flags, cancellable, error);
+}
+
+void
 e_gdbus_cal_view_call_dispose (GDBusProxy *proxy,
                                GCancellable *cancellable,
                                GAsyncReadyCallback callback,
@@ -268,12 +297,14 @@ E_DECLARE_GDBUS_SYNC_METHOD_0 (cal_view,
                                stop)
 E_DECLARE_GDBUS_SYNC_METHOD_0 (cal_view,
                                dispose)
+E_DECLARE_GDBUS_SYNC_METHOD_1	(cal_view, set_flags, flags, "u")
 E_DECLARE_GDBUS_SYNC_METHOD_1	(cal_view, set_fields_of_interest, fields_of_interest, "as")
 
 static const GDBusMethodInfo * const e_gdbus_cal_view_method_info_pointers[] =
 {
 	&E_DECLARED_GDBUS_METHOD_INFO_NAME (cal_view, start),
 	&E_DECLARED_GDBUS_METHOD_INFO_NAME (cal_view, stop),
+	&E_DECLARED_GDBUS_METHOD_INFO_NAME (cal_view, set_flags),
 	&E_DECLARED_GDBUS_METHOD_INFO_NAME (cal_view, dispose),
 	&E_DECLARED_GDBUS_METHOD_INFO_NAME (cal_view, set_fields_of_interest),
 	NULL
diff --git a/calendar/libegdbus/e-gdbus-cal-view.h b/calendar/libegdbus/e-gdbus-cal-view.h
index c2a5345..8692b04 100644
--- a/calendar/libegdbus/e-gdbus-cal-view.h
+++ b/calendar/libegdbus/e-gdbus-cal-view.h
@@ -107,6 +107,7 @@ struct _EGdbusCalViewIface
 	/* Signal handlers for handling D-Bus method calls: */
 	gboolean (*handle_start)		(EGdbusCalView *object, GDBusMethodInvocation *invocation);
 	gboolean (*handle_stop)			(EGdbusCalView *object, GDBusMethodInvocation *invocation);
+	gboolean (*handle_set_flags)		(EGdbusCalView *object, GDBusMethodInvocation *invocation, guint in_flags);
 	gboolean (*handle_dispose)		(EGdbusCalView *object, GDBusMethodInvocation *invocation);
 	gboolean (*handle_set_fields_of_interest)(EGdbusCalView *object, GDBusMethodInvocation *invocation, const gchar * const *in_only_fields);
 };
@@ -120,6 +121,10 @@ void		e_gdbus_cal_view_call_stop		(GDBusProxy *proxy, GCancellable *cancellable,
 gboolean	e_gdbus_cal_view_call_stop_finish	(GDBusProxy *proxy, GAsyncResult *result, GError **error);
 gboolean	e_gdbus_cal_view_call_stop_sync		(GDBusProxy *proxy, GCancellable *cancellable, GError **error);
 
+void		e_gdbus_cal_view_call_set_flags		(GDBusProxy *proxy, guint in_flags, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
+gboolean	e_gdbus_cal_view_call_set_flags_finish	(GDBusProxy *proxy, GAsyncResult *res, GError **error);
+gboolean	e_gdbus_cal_view_call_set_flags_sync	(GDBusProxy *proxy, guint in_flags, GCancellable *cancellable, GError **error);
+
 void		e_gdbus_cal_view_call_dispose		(GDBusProxy *proxy, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
 gboolean	e_gdbus_cal_view_call_dispose_finish	(GDBusProxy *proxy, GAsyncResult *result, GError **error);
 gboolean	e_gdbus_cal_view_call_dispose_sync	(GDBusProxy *proxy, GCancellable *cancellable, GError **error);
@@ -131,6 +136,7 @@ gboolean	e_gdbus_cal_view_call_set_fields_of_interest_sync	(GDBusProxy *proxy, c
 /* D-Bus Methods Completion Helpers */
 #define e_gdbus_cal_view_complete_start				e_gdbus_complete_sync_method_void
 #define e_gdbus_cal_view_complete_stop				e_gdbus_complete_sync_method_void
+#define e_gdbus_cal_view_complete_set_flags			e_gdbus_complete_sync_method_void
 #define e_gdbus_cal_view_complete_dispose			e_gdbus_complete_sync_method_void
 #define e_gdbus_cal_view_complete_set_fields_of_interest	e_gdbus_complete_sync_method_void
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]