[evolution-data-server] Add e_source_list_peek_default_source().



commit fb81a9f23c3eb6a3dc4943edd3c1741ba9195e41
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Aug 18 10:31:36 2010 -0400

    Add e_source_list_peek_default_source().
    
    New convenience function searches the ESourceList for an ESource
    with a property named "default", or else an ESource with a property
    named "system".  If no such ESource exists it returns NULL.
    
    Adapt EBook and ECal to use this where appropriate.

 addressbook/libebook/e-book.c                      |   47 ++++--------
 calendar/libecal/e-cal.c                           |   79 ++++++-------------
 .../libedataserver/libedataserver-sections.txt     |    1 +
 .../libedataserver/tmpl/e-source-list.sgml         |    9 ++
 libedataserver/e-source-list.c                     |   51 +++++++++++++
 libedataserver/e-source-list.h                     |    1 +
 6 files changed, 101 insertions(+), 87 deletions(-)
---
diff --git a/addressbook/libebook/e-book.c b/addressbook/libebook/e-book.c
index 251655e..1f76705 100644
--- a/addressbook/libebook/e-book.c
+++ b/addressbook/libebook/e-book.c
@@ -3240,51 +3240,32 @@ e_book_new_system_addressbook (GError **error)
 	return book;
 }
 
-static gboolean
-check_default (ESource *source, gpointer data)
-{
-	g_return_val_if_fail (source != NULL, FALSE);
-
-	return e_source_get_property (source, "default") != NULL;
-}
-
 /**
  * e_book_new_default_addressbook:
- * @error: A #GError pointer
+ * @error: return location for a #GError, or %NULL
  *
  * Creates a new #EBook corresponding to the user's default
- * addressbook.  See the documentation for e_book_new for further
- * information.
+ * address book.  See the documentation for e_book_new() for
+ * further information.
  *
- * Returns: a new but unopened #EBook.
+ * Returns: a new but unopened #EBook
  */
-EBook*
-e_book_new_default_addressbook   (GError **error)
+EBook *
+e_book_new_default_addressbook (GError **error)
 {
-	GError *err = NULL;
-	ESourceList *sources = NULL;
-	ESource *default_source = NULL;
+	ESourceList *source_list;
+	ESource *source;
 	EBook *book;
 
-	default_source = search_known_sources (check_default, NULL, &sources, &err);
-	if (err) {
-		g_propagate_error (error, err);
-		if (sources)
-			g_object_unref (sources);
+	if (!e_book_get_addressbooks (&source_list, error))
 		return NULL;
-	}
 
-	if (default_source) {
-		book = e_book_new (default_source, &err);
-		g_object_unref (default_source);
-	} else {
-		book = e_book_new_system_addressbook (&err);
-	}
+	source = e_source_list_peek_default_source (source_list);
+	g_return_val_if_fail (source != NULL, NULL);
 
-	if (sources)
-		g_object_unref (sources);
-	if (err)
-		g_propagate_error (error, err);
+	book = e_book_new (source, error);
+
+	g_object_unref (source_list);
 
 	return book;
 }
diff --git a/calendar/libecal/e-cal.c b/calendar/libecal/e-cal.c
index b367a82..ba02bbd 100644
--- a/calendar/libecal/e-cal.c
+++ b/calendar/libecal/e-cal.c
@@ -3973,14 +3973,6 @@ e_cal_get_error_message (ECalendarStatus status)
 	return NULL;
 }
 
-static gboolean
-check_default (ESource *source, gpointer data)
-{
-	g_return_val_if_fail (source != NULL, FALSE);
-
-	return e_source_get_property (source, "default") != NULL;
-}
-
 /**
  * e_cal_open_default:
  * @ecal: A calendar client.
@@ -3994,63 +3986,42 @@ check_default (ESource *source, gpointer data)
  * Returns: TRUE if it opened correctly, FALSE otherwise.
  */
 gboolean
-e_cal_open_default (ECal **ecal, ECalSourceType type, ECalAuthFunc func, gpointer data, GError **error)
+e_cal_open_default (ECal **ecal,
+                    ECalSourceType type,
+                    ECalAuthFunc func,
+                    gpointer data,
+                    GError **error)
 {
-	ESourceList *sources = NULL;
-	GError *err = NULL;
-	ESource *default_source;
-	gboolean res = TRUE;
+	ESourceList *source_list;
+	ESource *source;
+	ECal *client;
 
-	e_return_error_if_fail (ecal != NULL, E_CALENDAR_STATUS_INVALID_ARG);
-	*ecal = NULL;
+	g_return_val_if_fail (ecal != NULL, FALSE);
 
-	default_source = search_known_sources (type, check_default, NULL, &sources, &err);
+	/* In case something goes wrong... */
+	*ecal = NULL;
 
-	if (err) {
-		if (sources)
-			g_object_unref (sources);
-		g_propagate_error (error, err);
+	if (!e_cal_get_sources (&source_list, type, error))
 		return FALSE;
-	}
 
-	if (default_source) {
-		*ecal = e_cal_new (default_source, type);
-	} else {
-		switch (type) {
-		case E_CAL_SOURCE_TYPE_EVENT:
-			*ecal = e_cal_new_system_calendar ();
-			break;
-		case E_CAL_SOURCE_TYPE_TODO:
-			*ecal = e_cal_new_system_tasks ();
-			break;
-		case E_CAL_SOURCE_TYPE_JOURNAL:
-			*ecal = e_cal_new_system_memos ();
-			break;
-		default:
-			break;
-		}
-	}
+	source = e_source_list_peek_default_source (source_list);
+	g_return_val_if_fail (source != NULL, FALSE);
 
-	if (!*ecal) {
-		g_propagate_error (error, err);
-		res = FALSE;
-	} else {
-		e_cal_set_auth_func (*ecal, func, data);
-		if (!e_cal_open (*ecal, TRUE, &err)) {
-			g_propagate_error (error, err);
-			res = FALSE;
-		}
-	}
+	/* XXX This can fail but doesn't take a GError!? */
+	client = e_cal_new (source, type);
+	g_return_val_if_fail (client != NULL, FALSE);
 
-	if (!res && *ecal) {
-		g_object_unref (*ecal);
-		*ecal = NULL;
+	e_cal_set_auth_func (client, func, data);
+	if (!e_cal_open (client, TRUE, error)) {
+		g_object_unref (client);
+		return FALSE;
 	}
 
-	if (sources)
-		g_object_unref (sources);
+	*ecal = client;
 
-	return res;
+	g_object_unref (source_list);
+
+	return TRUE;
 }
 
 /**
diff --git a/docs/reference/libedataserver/libedataserver-sections.txt b/docs/reference/libedataserver/libedataserver-sections.txt
index 50fdcc4..425f1ea 100644
--- a/docs/reference/libedataserver/libedataserver-sections.txt
+++ b/docs/reference/libedataserver/libedataserver-sections.txt
@@ -219,6 +219,7 @@ e_source_list_peek_group_by_base_uri
 e_source_list_peek_group_by_properties
 e_source_list_peek_source_by_uid
 e_source_list_peek_source_any
+e_source_list_peek_default_source
 e_source_list_add_group
 e_source_list_remove_group
 e_source_list_remove_group_by_uid
diff --git a/docs/reference/libedataserver/tmpl/e-source-list.sgml b/docs/reference/libedataserver/tmpl/e-source-list.sgml
index 4c7ca11..116b098 100644
--- a/docs/reference/libedataserver/tmpl/e-source-list.sgml
+++ b/docs/reference/libedataserver/tmpl/e-source-list.sgml
@@ -136,6 +136,15 @@ ESourceList
 @Returns: 
 
 
+<!-- ##### FUNCTION e_source_list_peek_default_source ##### -->
+<para>
+
+</para>
+
+ list: 
+ Returns: 
+
+
 <!-- ##### FUNCTION e_source_list_add_group ##### -->
 <para>
 
diff --git a/libedataserver/e-source-list.c b/libedataserver/e-source-list.c
index e3a147f..62f75b0 100644
--- a/libedataserver/e-source-list.c
+++ b/libedataserver/e-source-list.c
@@ -562,6 +562,57 @@ e_source_list_peek_source_any (ESourceList *list)
 	return NULL;
 }
 
+/**
+ * e_source_list_peek_default_source:
+ * @source_list: an #ESourceList
+ *
+ * Attempts to find a default #ESource in @source_list by looking for
+ * a source with a property named "default", or else a source with a
+ * property named "system".  If no such #ESource exists, the function
+ * returns %NULL.
+ *
+ * Returns: the default #ESource in @source_list, or %NULL
+ *
+ * Since: 2.32
+ **/
+ESource *
+e_source_list_peek_default_source (ESourceList *source_list)
+{
+	ESource *system_source = NULL;
+	GSList *groups;
+	GSList *iter1;
+
+	g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL);
+
+	groups = e_source_list_peek_groups (source_list);
+
+	for (iter1 = groups; iter1 != NULL; iter1 = iter1->next) {
+		ESourceGroup *source_group;
+		GSList *sources;
+		GSList *iter2;
+
+		source_group = E_SOURCE_GROUP (iter1->data);
+		sources = e_source_group_peek_sources (source_group);
+
+		for (iter2 = sources; iter2 != NULL; iter2 = iter2->next) {
+			ESource *source;
+
+			source = E_SOURCE (iter2->data);
+
+			/* If we find the default source, we're done. */
+			if (e_source_get_property (source, "default"))
+				return source;
+
+			/* Make a note of the system source.  If we fail
+			 * to find a default source we fall back to this. */
+			if (e_source_get_property (source, "system"))
+				system_source = source;
+		}
+	}
+
+	return system_source;
+}
+
 gboolean
 e_source_list_add_group (ESourceList *list,
 			 ESourceGroup *group,
diff --git a/libedataserver/e-source-list.h b/libedataserver/e-source-list.h
index d613927..719a788 100644
--- a/libedataserver/e-source-list.h
+++ b/libedataserver/e-source-list.h
@@ -73,6 +73,7 @@ ESourceGroup *e_source_list_peek_group_by_properties (ESourceList *list, const g
 ESource      *e_source_list_peek_source_by_uid  (ESourceList *list,
 						 const gchar  *uid);
 ESource      *e_source_list_peek_source_any     (ESourceList *list);
+ESource      *e_source_list_peek_default_source (ESourceList *list);
 
 gboolean  e_source_list_add_group             (ESourceList  *list,
 					       ESourceGroup *group,



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