[evolution-data-server/account-mgmt: 19/28] Add an ESource extension for the contacts backend.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/account-mgmt: 19/28] Add an ESource extension for the contacts backend.
- Date: Wed, 2 Mar 2011 03:46:37 +0000 (UTC)
commit 0031604027411be351133259b96d45bef919ae95
Author: Matthew Barnes <mbarnes redhat com>
Date: Tue Nov 23 08:35:40 2010 -0500
Add an ESource extension for the contacts backend.
calendar/backends/contacts/Makefile.am | 4 +-
.../contacts/e-cal-backend-contacts-factory.c | 84 +++----
.../backends/contacts/e-cal-backend-contacts.c | 302 +++++++-------------
calendar/backends/contacts/e-source-contacts.c | 139 +++++++++
calendar/backends/contacts/e-source-contacts.h | 70 +++++
5 files changed, 345 insertions(+), 254 deletions(-)
---
diff --git a/calendar/backends/contacts/Makefile.am b/calendar/backends/contacts/Makefile.am
index f386ed7..3e96250 100644
--- a/calendar/backends/contacts/Makefile.am
+++ b/calendar/backends/contacts/Makefile.am
@@ -15,7 +15,9 @@ libecalbackendcontacts_la_SOURCES = \
e-cal-backend-contacts-factory.c \
e-cal-backend-contacts-factory.h \
e-cal-backend-contacts.c \
- e-cal-backend-contacts.h
+ e-cal-backend-contacts.h \
+ e-source-contacts.c \
+ e-source-contacts.h
libecalbackendcontacts_la_LIBADD = \
$(top_builddir)/calendar/libecal/libecal-1.2.la \
diff --git a/calendar/backends/contacts/e-cal-backend-contacts-factory.c b/calendar/backends/contacts/e-cal-backend-contacts-factory.c
index 6c75b53..9bbcef3 100644
--- a/calendar/backends/contacts/e-cal-backend-contacts-factory.c
+++ b/calendar/backends/contacts/e-cal-backend-contacts-factory.c
@@ -15,19 +15,18 @@
#include "e-cal-backend-contacts-factory.h"
#include "e-cal-backend-contacts.h"
+#include "e-source-contacts.h"
-typedef struct {
- ECalBackendFactory parent_object;
-} ECalBackendContactsFactory;
+typedef ECalBackendFactory ECalBackendContactsEventsFactory;
+typedef ECalBackendFactoryClass ECalBackendContactsEventsFactoryClass;
-typedef struct {
- ECalBackendFactoryClass parent_class;
-} ECalBackendContactsFactoryClass;
+/* Forward Declarations */
+GType e_cal_backend_contacts_events_factory_get_type (void);
-static void
-e_cal_backend_contacts_factory_instance_init (ECalBackendContactsFactory *factory)
-{
-}
+G_DEFINE_DYNAMIC_TYPE (
+ ECalBackendContactsEventsFactory,
+ e_cal_backend_contacts_events_factory,
+ E_TYPE_CAL_BACKEND_FACTORY)
static const gchar *
_get_protocol (ECalBackendFactory *factory)
@@ -35,13 +34,14 @@ _get_protocol (ECalBackendFactory *factory)
return "contacts";
}
-static ECalBackend*
-_events_new_backend (ECalBackendFactory *factory, ESource *source)
+static ECalBackend *
+_events_new_backend (ECalBackendFactory *factory,
+ ESource *source)
{
- return g_object_new (e_cal_backend_contacts_get_type (),
- "source", source,
- "kind", ICAL_VEVENT_COMPONENT,
- NULL);
+ return g_object_new (
+ e_cal_backend_contacts_get_type (),
+ "kind", ICAL_VEVENT_COMPONENT,
+ "source", source, NULL);
}
static icalcomponent_kind
@@ -51,56 +51,42 @@ _events_get_kind (ECalBackendFactory *factory)
}
static void
-events_backend_factory_class_init (ECalBackendContactsFactoryClass *klass)
+e_cal_backend_contacts_events_factory_class_init (ECalBackendFactoryClass *class)
{
- E_CAL_BACKEND_FACTORY_CLASS (klass)->get_protocol = _get_protocol;
- E_CAL_BACKEND_FACTORY_CLASS (klass)->get_kind = _events_get_kind;
- E_CAL_BACKEND_FACTORY_CLASS (klass)->new_backend = _events_new_backend;
+ class->get_protocol = _get_protocol;
+ class->get_kind = _events_get_kind;
+ class->new_backend = _events_new_backend;
}
-static GType
-events_backend_factory_get_type (GTypeModule *module)
+static void
+e_cal_backend_contacts_events_factory_class_finalize (ECalBackendFactoryClass *class)
{
- GType type;
-
- GTypeInfo info = {
- sizeof (ECalBackendContactsFactoryClass),
- NULL, /* base_class_init */
- NULL, /* base_class_finalize */
- (GClassInitFunc) events_backend_factory_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ECalBackend),
- 0, /* n_preallocs */
- (GInstanceInitFunc) e_cal_backend_contacts_factory_instance_init
- };
-
- type = g_type_module_register_type (module,
- E_TYPE_CAL_BACKEND_FACTORY,
- "ECalBackendContactsEventsFactory",
- &info, 0);
-
- return type;
}
-
-
-static GType contacts_types[1];
+static void
+e_cal_backend_contacts_events_factory_init (ECalBackendFactory *factory)
+{
+}
void
-eds_module_initialize (GTypeModule *module)
+eds_module_initialize (GTypeModule *type_module)
{
- contacts_types[0] = events_backend_factory_get_type (module);
+ e_source_contacts_type_register (type_module);
+ e_cal_backend_contacts_events_factory_register_type (type_module);
}
void
-eds_module_shutdown (void)
+eds_module_shutdown (void)
{
}
void
eds_module_list_types (const GType **types, gint *num_types)
{
+ static GType contacts_types[1];
+
+ contacts_types[0] = e_cal_backend_contacts_events_factory_get_type ();
+
*types = contacts_types;
- *num_types = 1;
+ *num_types = G_N_ELEMENTS (contacts_types);
}
diff --git a/calendar/backends/contacts/e-cal-backend-contacts.c b/calendar/backends/contacts/e-cal-backend-contacts.c
index e8cf1cb..082e971 100644
--- a/calendar/backends/contacts/e-cal-backend-contacts.c
+++ b/calendar/backends/contacts/e-cal-backend-contacts.c
@@ -32,16 +32,17 @@
#include <glib/gi18n-lib.h>
#include <gconf/gconf-client.h>
-#include "libedataserver/e-xml-hash-utils.h"
-#include "libedataserver/e-flag.h"
+#include <libedataserver/e-xml-hash-utils.h>
+#include <libedataserver/e-source-registry.h>
+#include <libedataserver/e-flag.h>
#include <libecal/e-cal-recur.h>
#include <libecal/e-cal-util.h>
#include <libedata-cal/e-cal-backend-util.h>
#include <libedata-cal/e-cal-backend-sexp.h>
-
#include <libebook/e-book.h>
+#include <libebook/e-source-address-book.h>
-#include "libedataserver/e-source-list.h"
+#include "e-source-contacts.h"
#define EDC_ERROR(_code) e_data_cal_create_error (_code, NULL)
@@ -58,19 +59,16 @@ typedef enum
/* Private part of the ECalBackendContacts structure */
struct _ECalBackendContactsPrivate {
- ESourceList *addressbook_sources;
- GHashTable *addressbooks; /* UID -> BookRecord */
- gboolean addressbook_loaded;
+ GHashTable *addressbooks; /* UID -> BookRecord */
+ gboolean addressbook_loaded;
- EBookView *book_view;
- GHashTable *tracked_contacts; /* UID -> ContactRecord */
+ EBookView *book_view;
+ GHashTable *tracked_contacts; /* UID -> ContactRecord */
GHashTable *zones;
icaltimezone *default_zone;
- EFlag *init_done_flag; /* is set, when the init thread gone */
-
/* properties related to track alarm settings for this backend */
GConfClient *conf_client;
guint notifyid1;
@@ -84,15 +82,15 @@ struct _ECalBackendContactsPrivate {
typedef struct _BookRecord {
ECalBackendContacts *cbc;
- EBook *book;
- EBookView *book_view;
+ EBook *book;
+ EBookView *book_view;
} BookRecord;
typedef struct _ContactRecord {
- ECalBackendContacts *cbc;
- EBook *book; /* where it comes from */
- EContact *contact;
- ECalComponent *comp_birthday, *comp_anniversary;
+ ECalBackendContacts *cbc;
+ EBook *book; /* where it comes from */
+ EContact *contact;
+ ECalComponent *comp_birthday, *comp_anniversary;
} ContactRecord;
#define d(x)
@@ -122,22 +120,23 @@ book_record_new (ECalBackendContacts *cbc, ESource *source)
book = e_book_new (source, &error);
if (!book || !e_book_open (book, TRUE, &error) || error) {
- g_warning ("%s: Failed to open book '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error");
if (book)
g_object_unref (book);
- if (error)
+ if (error) {
+ g_warning ("%s: Failed to open book, error: %s", G_STRFUNC, error->message);
g_error_free (error);
+ }
return NULL;
}
- /* Create book view */
+ /* Create book view */
fields = g_list_append (fields, (gchar *)e_contact_field_name (E_CONTACT_FILE_AS));
fields = g_list_append (fields, (gchar *)e_contact_field_name (E_CONTACT_BIRTH_DATE));
fields = g_list_append (fields, (gchar *)e_contact_field_name (E_CONTACT_ANNIVERSARY));
- query = e_book_query_any_field_contains ("");
+ query = e_book_query_any_field_contains ("");
- if (!e_book_get_book_view (book, query, fields, -1, &book_view, &error)) {
- g_warning ("%s: Failed to get book view on '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error");
+ if (!e_book_get_book_view (book, query, fields, -1, &book_view, NULL)) {
+ g_warning ("%s: Failed to get book view on '%s': %s", G_STRFUNC, e_source_get_display_name (source), error ? error->message : "Unknown error");
e_book_query_unref (query);
g_object_unref (book);
@@ -151,9 +150,9 @@ book_record_new (ECalBackendContacts *cbc, ESource *source)
e_book_query_unref (query);
g_list_free (fields);
- g_signal_connect (book_view, "contacts_added", G_CALLBACK (contacts_added_cb), cbc);
- g_signal_connect (book_view, "contacts_removed", G_CALLBACK (contacts_removed_cb), cbc);
- g_signal_connect (book_view, "contacts_changed", G_CALLBACK (contacts_changed_cb), cbc);
+ g_signal_connect (book_view, "contacts_added", G_CALLBACK (contacts_added_cb), cbc);
+ g_signal_connect (book_view, "contacts_removed", G_CALLBACK (contacts_removed_cb), cbc);
+ g_signal_connect (book_view, "contacts_changed", G_CALLBACK (contacts_changed_cb), cbc);
e_book_view_start (book_view);
@@ -256,9 +255,9 @@ contact_record_free (ContactRecord *cr)
/* ContactRecordCB methods */
typedef struct _ContactRecordCB {
- ECalBackendContacts *cbc;
- ECalBackendSExp *sexp;
- GList *result;
+ ECalBackendContacts *cbc;
+ ECalBackendSExp *sexp;
+ GList *result;
} ContactRecordCB;
static ContactRecordCB *
@@ -299,127 +298,44 @@ contact_record_cb (gpointer key, gpointer value, gpointer user_data)
}
}
-static gboolean
-is_source_usable (ESource *source, ESourceGroup *group)
+static void
+source_added_cb (ESourceRegistry *registry,
+ ESource *source,
+ ECalBackendContacts *cbc)
{
- const gchar *base_uri;
- const gchar *prop;
+ ESourceContacts *extension;
+ const gchar *extension_name;
+ BookRecord *br;
+ const gchar *uid;
- base_uri = e_source_group_peek_base_uri (group);
- if (!base_uri)
- return FALSE;
+ extension_name = E_SOURCE_EXTENSION_CONTACTS_BACKEND;
+ extension = e_source_get_extension (source, extension_name);
- prop = e_source_get_property (source, "use-in-contacts-calendar");
+ if (extension == NULL)
+ return;
- /* the later check is for backward compatibility */
- return (prop && g_str_equal (prop, "1")) || (!prop && g_str_has_prefix (base_uri, "file://")) || (!prop && g_str_has_prefix (base_uri, "local:"));
-}
+ if (!e_source_contacts_get_include_me (extension))
+ return;
-/* SourceList callbacks */
-static void
-add_source (ECalBackendContacts *cbc, ESource *source)
-{
- BookRecord *br = book_record_new (cbc, source);
- const gchar *uid = e_source_peek_uid (source);
+ uid = e_source_get_uid (source);
+ br = book_record_new (cbc, source);
- if (!br)
+ if (br == NULL)
return;
g_hash_table_insert (cbc->priv->addressbooks, g_strdup (uid), br);
}
static void
-source_added_cb (ESourceGroup *group, ESource *source, gpointer user_data)
+source_removed_cb (ESourceRegistry *registry,
+ ESource *source,
+ ECalBackendContacts *cbc)
{
- ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
-
- g_return_if_fail (cbc);
-
- if (is_source_usable (source, group))
- add_source (cbc, source);
-}
-
-static void
-source_removed_cb (ESourceGroup *group, ESource *source, gpointer user_data)
-{
- ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
- const gchar *uid = e_source_peek_uid (source);
-
- g_return_if_fail (cbc);
+ const gchar *uid = e_source_get_uid (source);
g_hash_table_remove (cbc->priv->addressbooks, uid);
}
-static void
-source_list_changed_cb (ESourceList *source_list, gpointer user_data)
-{
- ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
- GSList *g, *s;
-
- g_return_if_fail (cbc);
-
- for (g = e_source_list_peek_groups (source_list); g; g = g->next) {
- ESourceGroup *group = E_SOURCE_GROUP (g->data);
-
- if (!group)
- continue;
-
- for (s = e_source_group_peek_sources (group); s; s = s->next) {
- ESource *source = E_SOURCE (s->data);
- const gchar *uid;
-
- if (!source)
- continue;
-
- uid = e_source_peek_uid (source);
- if (!uid)
- continue;
-
- if (is_source_usable (source, group)) {
- if (!g_hash_table_lookup (cbc->priv->addressbooks, uid))
- source_added_cb (group, source, cbc);
- } else if (g_hash_table_lookup (cbc->priv->addressbooks, uid)) {
- source_removed_cb (group, source, cbc);
- }
- }
- }
-}
-
-static void
-source_group_added_cb (ESourceList *source_list, ESourceGroup *group, gpointer user_data)
-{
- ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
- GSList *i;
-
- g_return_if_fail (cbc);
-
- for (i = e_source_group_peek_sources (group); i; i = i->next) {
- ESource *source = E_SOURCE (i->data);
- source_added_cb (group, source, cbc);
- }
-
- /* Watch for future changes */
- g_signal_connect (group, "source_added", G_CALLBACK (source_added_cb), cbc);
- g_signal_connect (group, "source_removed", G_CALLBACK (source_removed_cb), cbc);
-}
-
-static void
-source_group_removed_cb (ESourceList *source_list, ESourceGroup *group, gpointer user_data)
-{
- ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
- GSList *i = NULL;
-
- g_return_if_fail (cbc);
-
- /* Unload all address books from this group */
- for (i = e_source_group_peek_sources (group); i; i = i->next) {
- ESource *source = E_SOURCE (i->data);
- const gchar *uid = e_source_peek_uid (source);
-
- g_hash_table_remove (cbc->priv->addressbooks, uid);
- }
-}
-
/************************************************************************************/
static void
@@ -434,7 +350,7 @@ contacts_changed_cb (EBookView *book_view, const GList *contacts, gpointer user_
const gchar *uid = e_contact_get_const (contact, E_CONTACT_UID);
EContactDate *birthday, *anniversary;
- /* Because this is a change of contact, then always remove old tracked data
+ /* Because this is a change of contact, then always remove old tracked data
and if possible, add with (possibly) new values.
*/
g_hash_table_remove (cbc->priv->tracked_contacts, (gchar *)uid);
@@ -459,7 +375,7 @@ contacts_added_cb (EBookView *book_view, const GList *contacts, gpointer user_da
EBook *book = e_book_view_get_book (book_view);
const GList *i;
- /* See if any new contacts have BIRTHDAY or ANNIVERSARY fields */
+ /* See if any new contacts have BIRTHDAY or ANNIVERSARY fields */
for (i = contacts; i; i = i->next)
{
EContact *contact = E_CONTACT (i->data);
@@ -486,7 +402,7 @@ contacts_removed_cb (EBookView *book_view, const GList *contact_ids, gpointer us
ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data);
const GList *i;
- /* Stop tracking these */
+ /* Stop tracking these */
for (i = contact_ids; i; i = i->next)
g_hash_table_remove (cbc->priv->tracked_contacts, i->data);
}
@@ -669,10 +585,10 @@ setup_alarm (ECalBackendContacts *cbc, ECalComponent *comp)
static ECalComponent *
create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdate, const gchar *summary)
{
- ECalComponent *cal_comp;
- ECalComponentText comp_summary;
- icalcomponent *ical_comp;
- struct icaltimetype itt;
+ ECalComponent *cal_comp;
+ ECalComponentText comp_summary;
+ icalcomponent *ical_comp;
+ struct icaltimetype itt;
ECalComponentDateTime dt;
struct icalrecurrencetype r;
GSList recur_list;
@@ -684,7 +600,7 @@ create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdat
ical_comp = icalcomponent_new (ICAL_VEVENT_COMPONENT);
- /* Create the event object */
+ /* Create the event object */
cal_comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (cal_comp, ical_comp);
@@ -692,7 +608,7 @@ create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdat
d(g_message ("Creating UID: %s", uid));
e_cal_component_set_uid (cal_comp, uid);
- /* Set all-day event's date from contact data */
+ /* Set all-day event's date from contact data */
itt = cdate_to_icaltime (cdate);
dt.value = &itt;
dt.tzid = NULL;
@@ -705,7 +621,7 @@ create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdat
/* We have to add 1 day to DTEND, as it is not inclusive. */
e_cal_component_set_dtend (cal_comp, &dt);
- /* Create yearly recurrence */
+ /* Create yearly recurrence */
icalrecurrencetype_clear (&r);
r.freq = ICAL_YEARLY_RECURRENCE;
r.interval = 1;
@@ -713,7 +629,7 @@ create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdat
recur_list.next = NULL;
e_cal_component_set_rrule_list (cal_comp, &recur_list);
- /* Create summary */
+ /* Create summary */
comp_summary.value = summary;
comp_summary.altrep = NULL;
e_cal_component_set_summary (cal_comp, &comp_summary);
@@ -732,7 +648,7 @@ create_component (ECalBackendContacts *cbc, const gchar *uid, EContactDate *cdat
/* setup alarms if required */
setup_alarm (cbc, cal_comp);
- /* Don't forget to call commit()! */
+ /* Don't forget to call commit()! */
e_cal_component_commit_sequence (cal_comp);
return cal_comp;
@@ -743,7 +659,7 @@ create_birthday (ECalBackendContacts *cbc, EContact *contact)
{
EContactDate *cdate;
ECalComponent *cal_comp;
- gchar *summary;
+ gchar *summary;
const gchar *name;
gchar *uid;
@@ -751,7 +667,7 @@ create_birthday (ECalBackendContacts *cbc, EContact *contact)
name = e_contact_get_const (contact, E_CONTACT_FILE_AS);
uid = g_strdup_printf ("%s%s", (gchar *) e_contact_get_const (contact, E_CONTACT_UID), BIRTHDAY_UID_EXT);
- summary = g_strdup_printf (_("Birthday: %s"), name);
+ summary = g_strdup_printf (_("Birthday: %s"), name);
cal_comp = create_component (cbc, uid, cdate, summary);
@@ -767,7 +683,7 @@ create_anniversary (ECalBackendContacts *cbc, EContact *contact)
{
EContactDate *cdate;
ECalComponent *cal_comp;
- gchar *summary;
+ gchar *summary;
const gchar *name;
gchar *uid;
@@ -775,7 +691,7 @@ create_anniversary (ECalBackendContacts *cbc, EContact *contact)
name = e_contact_get_const (contact, E_CONTACT_FILE_AS);
uid = g_strdup_printf ("%s%s", (gchar *) e_contact_get_const (contact, E_CONTACT_UID), ANNIVERSARY_UID_EXT);
- summary = g_strdup_printf (_("Anniversary: %s"), name);
+ summary = g_strdup_printf (_("Anniversary: %s"), name);
cal_comp = create_component (cbc, uid, cdate, summary);
@@ -825,11 +741,14 @@ e_cal_backend_contacts_get_static_capabilities (ECalBackendSync *backend, EDataC
*capabilities = NULL;
}
-static void
-e_cal_backend_contacts_remove (ECalBackendSync *backend, EDataCal *cal, GError **perror)
+static gboolean
+e_cal_backend_contacts_remove (ECalBackend *backend,
+ GError **error)
{
/* WRITE ME */
- g_propagate_error (perror, EDC_ERROR (PermissionDenied));
+ g_propagate_error (error, EDC_ERROR (PermissionDenied));
+
+ return FALSE;
}
static void
@@ -870,14 +789,14 @@ e_cal_backend_contacts_get_object (ECalBackendSync *backend, EDataCal *cal,
}
if (record->comp_birthday && g_str_has_suffix (uid, BIRTHDAY_UID_EXT)) {
- *object = e_cal_component_get_as_string (record->comp_birthday);
+ *object = e_cal_component_get_as_string (record->comp_birthday);
d(g_message ("Return birthday: %s", *object));
return;
}
if (record->comp_anniversary && g_str_has_suffix (uid, ANNIVERSARY_UID_EXT)) {
- *object = e_cal_component_get_as_string (record->comp_anniversary);
+ *object = e_cal_component_get_as_string (record->comp_anniversary);
d(g_message ("Return anniversary: %s", *object));
return;
@@ -976,33 +895,6 @@ e_cal_backend_contacts_is_read_only (ECalBackendSync *backend, EDataCal *cal,
*read_only = TRUE;
}
-static gpointer
-init_sources_cb (ECalBackendContacts *cbc)
-{
- ECalBackendContactsPrivate *priv;
- GSList *i;
-
- g_return_val_if_fail (cbc != NULL, NULL);
-
- priv = cbc->priv;
-
- /* Create address books for existing sources */
- for (i = e_source_list_peek_groups (priv->addressbook_sources); i; i = i->next) {
- ESourceGroup *source_group = E_SOURCE_GROUP (i->data);
-
- source_group_added_cb (priv->addressbook_sources, source_group, cbc);
- }
-
- /* Listen for source list changes */
- g_signal_connect (priv->addressbook_sources, "changed", G_CALLBACK (source_list_changed_cb), cbc);
- g_signal_connect (priv->addressbook_sources, "group_added", G_CALLBACK (source_group_added_cb), cbc);
- g_signal_connect (priv->addressbook_sources, "group_removed", G_CALLBACK (source_group_removed_cb), cbc);
-
- e_flag_set (priv->init_done_flag);
-
- return NULL;
-}
-
static void
e_cal_backend_contacts_open (ECalBackendSync *backend, EDataCal *cal,
gboolean only_if_exists,
@@ -1010,7 +902,6 @@ e_cal_backend_contacts_open (ECalBackendSync *backend, EDataCal *cal,
{
ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (backend);
ECalBackendContactsPrivate *priv = cbc->priv;
- GError *error = NULL;
if (priv->addressbook_loaded)
return;
@@ -1024,17 +915,6 @@ e_cal_backend_contacts_open (ECalBackendSync *backend, EDataCal *cal,
g_hash_table_insert (priv->zones, g_strdup (icaltimezone_get_tzid (zone)), zone);
}
- /* initialize addressbook sources in new thread to make this function quick as much as possible */
- if (!g_thread_create ((GThreadFunc)init_sources_cb, cbc, FALSE, &error)) {
- e_flag_set (priv->init_done_flag);
- g_warning ("%s: Cannot create thread to initialize sources! (%s)", G_STRFUNC, error ? error->message : "Unknown error");
- if (error)
- g_error_free (error);
-
- g_propagate_error (perror, EDC_ERROR (OtherError));
- return;
- }
-
priv->addressbook_loaded = TRUE;
}
@@ -1204,12 +1084,6 @@ e_cal_backend_contacts_finalize (GObject *object)
cbc = E_CAL_BACKEND_CONTACTS (object);
priv = cbc->priv;
- if (priv->init_done_flag) {
- e_flag_wait (priv->init_done_flag);
- e_flag_free (priv->init_done_flag);
- priv->init_done_flag = NULL;
- }
-
if (priv->update_alarms_id) {
g_source_remove (priv->update_alarms_id);
priv->update_alarms_id = 0;
@@ -1220,7 +1094,6 @@ e_cal_backend_contacts_finalize (GObject *object)
}
priv->default_zone = NULL;
- g_object_unref (priv->addressbook_sources);
g_hash_table_destroy (priv->addressbooks);
g_hash_table_destroy (priv->tracked_contacts);
g_hash_table_destroy (priv->zones);
@@ -1245,11 +1118,12 @@ static void
e_cal_backend_contacts_init (ECalBackendContacts *cbc)
{
ECalBackendContactsPrivate *priv;
+ ESourceRegistry *registry;
+ GList *sources, *iter;
+ const gchar *extension_name;
priv = g_new0 (ECalBackendContactsPrivate, 1);
- e_book_get_addressbooks (&priv->addressbook_sources, NULL);
-
priv->addressbooks = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify) book_record_free);
priv->tracked_contacts = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -1257,7 +1131,6 @@ e_cal_backend_contacts_init (ECalBackendContacts *cbc)
priv->zones = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_zone);
priv->default_zone = icaltimezone_get_utc_timezone ();
- priv->init_done_flag = e_flag_new ();
priv->conf_client = gconf_client_get_default ();
priv->notifyid1 = 0;
priv->notifyid2 = 0;
@@ -1270,6 +1143,23 @@ e_cal_backend_contacts_init (ECalBackendContacts *cbc)
cbc->priv = priv;
e_cal_backend_sync_set_lock (E_CAL_BACKEND_SYNC (cbc), TRUE);
+
+ /* Query all address book sources from the registry. */
+
+ registry = e_source_registry_get_default ();
+ extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK;
+ sources = e_source_registry_list_sources (registry, extension_name);
+ for (iter = sources; iter != NULL; iter = g_list_next (iter))
+ source_added_cb (registry, E_SOURCE (iter->data), cbc);
+ g_list_free (sources);
+
+ g_signal_connect (
+ registry, "source-added",
+ G_CALLBACK (source_added_cb), cbc);
+
+ g_signal_connect (
+ registry, "source-removed",
+ G_CALLBACK (source_removed_cb), cbc);
}
static void
@@ -1300,7 +1190,6 @@ e_cal_backend_contacts_class_init (ECalBackendContactsClass *class)
sync_class->get_ldap_attribute_sync = e_cal_backend_contacts_get_ldap_attribute;
sync_class->get_static_capabilities_sync = e_cal_backend_contacts_get_static_capabilities;
sync_class->open_sync = e_cal_backend_contacts_open;
- sync_class->remove_sync = e_cal_backend_contacts_remove;
sync_class->create_object_sync = e_cal_backend_contacts_create_object;
sync_class->discard_alarm_sync = e_cal_backend_contacts_discard_alarm;
sync_class->receive_objects_sync = e_cal_backend_contacts_receive_objects;
@@ -1312,11 +1201,16 @@ e_cal_backend_contacts_class_init (ECalBackendContactsClass *class)
sync_class->set_default_zone_sync = e_cal_backend_contacts_set_default_zone;
sync_class->get_freebusy_sync = e_cal_backend_contacts_get_free_busy;
sync_class->get_changes_sync = e_cal_backend_contacts_get_changes;
+
backend_class->is_loaded = e_cal_backend_contacts_is_loaded;
+ backend_class->remove = e_cal_backend_contacts_remove;
backend_class->start_query = e_cal_backend_contacts_start_query;
backend_class->get_mode = e_cal_backend_contacts_get_mode;
backend_class->set_mode = e_cal_backend_contacts_set_mode;
backend_class->internal_get_default_timezone = e_cal_backend_contacts_internal_get_default_timezone;
backend_class->internal_get_timezone = e_cal_backend_contacts_internal_get_timezone;
+
+ /* Register our ESource extension. */
+ E_TYPE_SOURCE_CONTACTS;
}
diff --git a/calendar/backends/contacts/e-source-contacts.c b/calendar/backends/contacts/e-source-contacts.c
new file mode 100644
index 0000000..32ba589
--- /dev/null
+++ b/calendar/backends/contacts/e-source-contacts.c
@@ -0,0 +1,139 @@
+/*
+ * e-source-contacts.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <webcal://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-source-contacts.h"
+
+#define E_SOURCE_CONTACTS_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_SOURCE_CONTACTS, ESourceContactsPrivate))
+
+struct _ESourceContactsPrivate {
+ gboolean include_me;
+};
+
+enum {
+ PROP_0,
+ PROP_INCLUDE_ME
+};
+
+G_DEFINE_DYNAMIC_TYPE (
+ ESourceContacts,
+ e_source_contacts,
+ E_TYPE_SOURCE_EXTENSION)
+
+static void
+source_contacts_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_INCLUDE_ME:
+ e_source_contacts_set_include_me (
+ E_SOURCE_CONTACTS (object),
+ g_value_get_boolean (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+source_contacts_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_INCLUDE_ME:
+ g_value_set_boolean (
+ value,
+ e_source_contacts_get_include_me (
+ E_SOURCE_CONTACTS (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+e_source_contacts_class_init (ESourceContactsClass *class)
+{
+ GObjectClass *object_class;
+ ESourceExtensionClass *extension_class;
+
+ g_type_class_add_private (class, sizeof (ESourceContactsPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = source_contacts_set_property;
+ object_class->get_property = source_contacts_get_property;
+
+ extension_class = E_SOURCE_EXTENSION_CLASS (class);
+ extension_class->name = E_SOURCE_EXTENSION_CONTACTS_BACKEND;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_INCLUDE_ME,
+ g_param_spec_boolean (
+ "include-me",
+ "Include Me",
+ "Include this address book in the contacts calendar",
+ TRUE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ E_SOURCE_PARAM_SETTING));
+}
+
+static void
+e_source_contacts_class_finalize (ESourceContactsClass *class)
+{
+}
+
+static void
+e_source_contacts_init (ESourceContacts *extension)
+{
+ extension->priv = E_SOURCE_CONTACTS_GET_PRIVATE (extension);
+}
+
+void
+e_source_contacts_type_register (GTypeModule *type_module)
+{
+ /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+ * function, so we have to wrap it with a public function in
+ * order to register types from a separate compilation unit. */
+ e_source_contacts_register_type (type_module);
+}
+
+gboolean
+e_source_contacts_get_include_me (ESourceContacts *extension)
+{
+ g_return_val_if_fail (E_IS_SOURCE_CONTACTS (extension), FALSE);
+
+ return extension->priv->include_me;
+}
+
+void
+e_source_contacts_set_include_me (ESourceContacts *extension,
+ gboolean include_me)
+{
+ g_return_if_fail (E_IS_SOURCE_CONTACTS (extension));
+
+ extension->priv->include_me = include_me;
+
+ g_object_notify (G_OBJECT (extension), "include-me");
+}
diff --git a/calendar/backends/contacts/e-source-contacts.h b/calendar/backends/contacts/e-source-contacts.h
new file mode 100644
index 0000000..95d9b83
--- /dev/null
+++ b/calendar/backends/contacts/e-source-contacts.h
@@ -0,0 +1,70 @@
+/*
+ * e-source-contacts.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <webcal://www.gnu.org/licenses/>
+ *
+ */
+
+#ifndef E_SOURCE_CONTACTS_H
+#define E_SOURCE_CONTACTS_H
+
+#include <libedataserver/e-source-extension.h>
+
+/* Standard GObject macros */
+#define E_TYPE_SOURCE_CONTACTS \
+ (e_source_contacts_get_type ())
+#define E_SOURCE_CONTACTS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_SOURCE_CONTACTS, ESourceContacts))
+#define E_SOURCE_CONTACTS_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_SOURCE_CONTACTS, ESourceContactsClass))
+#define E_IS_SOURCE_CONTACTS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_SOURCE_CONTACTS))
+#define E_IS_SOURCE_CONTACTS_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_SOURCE_CONTACTS))
+#define E_SOURCE_CONTACTS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_SOURCE_CONTACTS, ESourceContactsClass))
+
+#define E_SOURCE_EXTENSION_CONTACTS_BACKEND "Contacts Backend"
+
+G_BEGIN_DECLS
+
+typedef struct _ESourceContacts ESourceContacts;
+typedef struct _ESourceContactsClass ESourceContactsClass;
+typedef struct _ESourceContactsPrivate ESourceContactsPrivate;
+
+struct _ESourceContacts {
+ ESourceExtension parent;
+ ESourceContactsPrivate *priv;
+};
+
+struct _ESourceContactsClass {
+ ESourceExtensionClass parent_class;
+};
+
+GType e_source_contacts_get_type (void);
+void e_source_contacts_type_register (GTypeModule *type_module);
+gboolean e_source_contacts_get_include_me
+ (ESourceContacts *extension);
+void e_source_contacts_set_include_me
+ (ESourceContacts *extension,
+ gboolean include_me);
+
+G_END_DECLS
+
+#endif /* E_SOURCE_CONTACTS_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]