[evolution-ews] Separate out the virtual functions related to accessing properties for 3.2 compatibility.
- From: Chenthill Palanisamy <pchen src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Separate out the virtual functions related to accessing properties for 3.2 compatibility.
- Date: Thu, 29 Sep 2011 08:33:52 +0000 (UTC)
commit 5d494374c3659c4a1d017006bddf2bfe2d959869
Author: Chenthill Palanisamy <pchenthill novell com>
Date: Thu Sep 29 12:57:42 2011 +0530
Separate out the virtual functions related to accessing properties for
3.2 compatibility.
src/addressbook/e-book-backend-ews.c | 381 +++++++++++++++++++++++++---------
1 files changed, 280 insertions(+), 101 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c
index 5d57d9c..049e506 100644
--- a/src/addressbook/e-book-backend-ews.c
+++ b/src/addressbook/e-book-backend-ews.c
@@ -35,6 +35,7 @@
#include <glib/gstdio.h>
#include <glib/gi18n-lib.h>
+#include <libedataserver/eds-version.h>
#include "libedataserver/e-sexp.h"
#include "libedataserver/e-data-server-util.h"
#include "libedataserver/e-flag.h"
@@ -95,6 +96,17 @@ struct _EBookBackendEwsPrivate {
GStaticRecMutex rec_mutex;
GThread *dthread;
SyncDelta *dlock;
+
+#if EDS_CHECK_VERSION (3,1,0)
+ ECredentials *credentials;
+#endif
+};
+
+/* using this for backward compatibility with E_DATA_BOOK_MODE */
+enum {
+ MODE_LOCAL,
+ MODE_REMOTE,
+ MODE_ANY
};
#define EWS_MAX_FETCH_COUNT 500
@@ -738,7 +750,7 @@ e_book_backend_ews_create_contact (EBookBackend *backend,
priv = ebews->priv;
switch (ebews->priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL :
+ case MODE_LOCAL :
if (!priv->is_writable) {
e_data_book_respond_modify (book, opid, EDB_ERROR (PERMISSION_DENIED), NULL);
return;
@@ -747,7 +759,7 @@ e_book_backend_ews_create_contact (EBookBackend *backend,
e_data_book_respond_create (book, opid, EDB_ERROR (REPOSITORY_OFFLINE), NULL);
return;
- case E_DATA_BOOK_MODE_REMOTE :
+ case MODE_REMOTE :
if (ebews->priv->cnc == NULL) {
e_data_book_respond_create (book, opid, EDB_ERROR (AUTHENTICATION_REQUIRED), NULL);
@@ -853,7 +865,7 @@ e_book_backend_ews_remove_contacts (EBookBackend *backend,
priv = ebews->priv;
switch (ebews->priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL :
+ case MODE_LOCAL :
if (!priv->is_writable) {
e_data_book_respond_modify (book, opid, EDB_ERROR (PERMISSION_DENIED), NULL);
return;
@@ -862,7 +874,7 @@ e_book_backend_ews_remove_contacts (EBookBackend *backend,
e_data_book_respond_remove_contacts (book, opid, EDB_ERROR (REPOSITORY_OFFLINE), NULL);
return;
- case E_DATA_BOOK_MODE_REMOTE :
+ case MODE_REMOTE :
if (ebews->priv->cnc == NULL) {
e_data_book_respond_remove_contacts (book, opid, EDB_ERROR (AUTHENTICATION_REQUIRED), NULL);
return;
@@ -1014,7 +1026,7 @@ e_book_backend_ews_modify_contact (EBookBackend *backend,
switch (priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL :
+ case MODE_LOCAL :
if (!priv->is_writable) {
e_data_book_respond_modify (book, opid, EDB_ERROR (PERMISSION_DENIED), NULL);
return;
@@ -1022,7 +1034,7 @@ e_book_backend_ews_modify_contact (EBookBackend *backend,
e_data_book_respond_modify (book, opid, EDB_ERROR (REPOSITORY_OFFLINE), NULL);
return;
- case E_DATA_BOOK_MODE_REMOTE :
+ case MODE_REMOTE :
if (priv->cnc == NULL) {
e_data_book_respond_modify (book, opid, EDB_ERROR (AUTHENTICATION_REQUIRED), NULL);
@@ -1087,11 +1099,11 @@ e_book_backend_ews_get_contact (EBookBackend *backend,
switch (gwb->priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL :
+ case MODE_LOCAL :
e_data_book_respond_get_contact (book, opid, EDB_ERROR (CONTACT_NOT_FOUND), "");
return;
- case E_DATA_BOOK_MODE_REMOTE :
+ case MODE_REMOTE :
if (gwb->priv->cnc == NULL) {
e_data_book_respond_get_contact (book, opid, e_data_book_create_error_fmt (E_DATA_BOOK_STATUS_OTHER_ERROR, "Not connected"), NULL);
return;
@@ -1117,12 +1129,12 @@ e_book_backend_ews_get_contact_list (EBookBackend *backend,
switch (egwb->priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL :
+ case MODE_LOCAL :
e_data_book_respond_get_contact_list (book, opid, EDB_ERROR (SUCCESS), vcard_list);
return;
- case E_DATA_BOOK_MODE_REMOTE:
+ case MODE_REMOTE:
if (egwb->priv->cnc == NULL) {
e_data_book_respond_get_contact_list (book, opid, EDB_ERROR (AUTHENTICATION_REQUIRED), NULL);
@@ -1951,7 +1963,7 @@ ebews_start_refreshing (EBookBackendEws *ebews)
PRIV_LOCK (priv);
- if (priv->mode == E_DATA_BOOK_MODE_REMOTE &&
+ if (priv->mode == MODE_REMOTE &&
priv->cnc && priv->marked_for_offline)
fetch_deltas (ebews);
@@ -2013,7 +2025,7 @@ e_book_backend_ews_start_book_view (EBookBackend *backend,
e_data_book_view_notify_status_message (book_view, _("Searching..."));
switch (priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL:
+ case MODE_LOCAL:
if (e_book_backend_sqlitedb_get_is_populated (priv->ebsdb, priv->folder_id, NULL)) {
fetch_from_offline (ebews, book_view, query, error);
return;
@@ -2023,7 +2035,7 @@ e_book_backend_ews_start_book_view (EBookBackend *backend,
e_data_book_view_notify_complete (book_view, error);
g_error_free (error);
return;
- case E_DATA_BOOK_MODE_REMOTE:
+ case MODE_REMOTE:
if (!priv->cnc) {
error = EDB_ERROR (AUTHENTICATION_REQUIRED);
e_book_backend_notify_auth_required (backend);
@@ -2119,13 +2131,78 @@ e_book_backend_ews_stop_book_view (EBookBackend *backend,
}
static void
-e_book_backend_ews_get_changes (EBookBackend *backend,
- EDataBook *book,
- guint32 opid,
- const gchar *change_id)
+e_book_backend_ews_load_source (EBookBackend *backend,
+ ESource *source,
+ gboolean only_if_exists,
+ GError **perror)
+{
+ EBookBackendEws *cbews;
+ EBookBackendEwsPrivate *priv;
+ const gchar *cache_dir, *email;
+ const gchar *folder_name;
+ const gchar *offline, *is_gal;
+ GError *err = NULL;
+
+ cbews = E_BOOK_BACKEND_EWS (backend);
+ priv = cbews->priv;
+
+ cache_dir = e_book_backend_get_cache_dir (backend);
+ email = e_source_get_property (source, "email");
+ is_gal = e_source_get_property (source, "gal");
+
+ if (is_gal && !strcmp (is_gal, "1"))
+ priv->is_gal = TRUE;
+
+ if (!priv->is_gal) {
+ priv->folder_id = e_source_get_duped_property (source, "folder-id");
+ folder_name = e_source_peek_name (source);
+
+ priv->ebsdb = e_book_backend_sqlitedb_new (cache_dir, email, priv->folder_id, folder_name, TRUE, &err);
+ if (err) {
+ g_propagate_error (perror, err);
+ return;
+ }
+
+ offline = e_source_get_property (source, "offline_sync");
+ if (offline && g_str_equal (offline, "1"))
+ priv->marked_for_offline = TRUE;
+ } else {
+ priv->folder_id = e_source_get_duped_property (source, "oal_id");
+
+ /* If folder_id is present it means the GAL is marked for offline usage, we do not check for offline_sync property */
+ if (priv->folder_id) {
+ priv->folder_name = g_strdup (e_source_peek_name (source));
+ priv->oab_url = e_source_get_duped_property (source, "oab_url");
+
+ /* setup stagging dir, remove any old files from there */
+ priv->attachment_dir = g_build_filename (cache_dir, "attachments", NULL);
+ g_mkdir_with_parents (priv->attachment_dir, 0777);
+
+ priv->ebsdb = e_book_backend_sqlitedb_new (cache_dir, email, priv->folder_id, priv->folder_name, TRUE, &err);
+ if (err) {
+ g_propagate_error (perror, err);
+ return;
+ }
+ priv->marked_for_offline = TRUE;
+ priv->is_writable = FALSE;
+ }
+ }
+
+ e_book_backend_set_is_loaded (backend, TRUE);
+ if (priv->mode == MODE_REMOTE)
+ e_book_backend_notify_connection_status (backend, TRUE);
+}
+
+static void
+e_book_backend_ews_remove (EBookBackend *backend,
+ EDataBook *book,
+ guint32 opid)
{
+ e_data_book_respond_remove (book, opid, EDB_ERROR (SUCCESS));
}
+#if ! EDS_CHECK_VERSION (3,1,0)
+
static void
e_book_backend_ews_authenticate_user (EBookBackend *backend,
EDataBook *book,
@@ -2145,11 +2222,11 @@ e_book_backend_ews_authenticate_user (EBookBackend *backend,
priv = ebgw->priv;
switch (ebgw->priv->mode) {
- case E_DATA_BOOK_MODE_LOCAL:
+ case MODE_LOCAL:
e_data_book_respond_authenticate_user (book, opid, EDB_ERROR (SUCCESS));
return;
- case E_DATA_BOOK_MODE_REMOTE:
+ case MODE_REMOTE:
if (priv->cnc) {
e_data_book_respond_authenticate_user (book, opid, EDB_ERROR (SUCCESS));
return;
@@ -2181,6 +2258,21 @@ e_book_backend_ews_authenticate_user (EBookBackend *backend,
}
static void
+e_book_backend_ews_cancel_operation (EBookBackend *backend, EDataBook *book, GError **perror)
+{
+
+}
+
+static void
+e_book_backend_ews_get_changes (EBookBackend *backend,
+ EDataBook *book,
+ guint32 opid,
+ const gchar *change_id)
+{
+}
+
+
+static void
e_book_backend_ews_get_required_fields (EBookBackend *backend,
EDataBook *book,
guint32 opid)
@@ -2226,82 +2318,6 @@ e_book_backend_ews_get_supported_fields (EBookBackend *backend,
g_list_free (fields);
}
-static void
-e_book_backend_ews_cancel_operation (EBookBackend *backend, EDataBook *book, GError **perror)
-{
-
-}
-
-static void
-e_book_backend_ews_load_source (EBookBackend *backend,
- ESource *source,
- gboolean only_if_exists,
- GError **perror)
-{
- EBookBackendEws *cbews;
- EBookBackendEwsPrivate *priv;
- const gchar *cache_dir, *email;
- const gchar *folder_name;
- const gchar *offline, *is_gal;
- GError *err = NULL;
-
- cbews = E_BOOK_BACKEND_EWS (backend);
- priv = cbews->priv;
-
- cache_dir = e_book_backend_get_cache_dir (backend);
- email = e_source_get_property (source, "email");
- is_gal = e_source_get_property (source, "gal");
-
- if (is_gal && !strcmp (is_gal, "1"))
- priv->is_gal = TRUE;
-
- if (!priv->is_gal) {
- priv->folder_id = e_source_get_duped_property (source, "folder-id");
- folder_name = e_source_peek_name (source);
-
- priv->ebsdb = e_book_backend_sqlitedb_new (cache_dir, email, priv->folder_id, folder_name, TRUE, &err);
- if (err) {
- g_propagate_error (perror, err);
- return;
- }
-
- offline = e_source_get_property (source, "offline_sync");
- if (offline && g_str_equal (offline, "1"))
- priv->marked_for_offline = TRUE;
- } else {
- priv->folder_id = e_source_get_duped_property (source, "oal_id");
-
- /* If folder_id is present it means the GAL is marked for offline usage, we do not check for offline_sync property */
- if (priv->folder_id) {
- priv->folder_name = g_strdup (e_source_peek_name (source));
- priv->oab_url = e_source_get_duped_property (source, "oab_url");
-
- /* setup stagging dir, remove any old files from there */
- priv->attachment_dir = g_build_filename (cache_dir, "attachments", NULL);
- g_mkdir_with_parents (priv->attachment_dir, 0777);
-
- priv->ebsdb = e_book_backend_sqlitedb_new (cache_dir, email, priv->folder_id, priv->folder_name, TRUE, &err);
- if (err) {
- g_propagate_error (perror, err);
- return;
- }
- priv->marked_for_offline = TRUE;
- priv->is_writable = FALSE;
- }
- }
-
- e_book_backend_set_is_loaded (backend, TRUE);
- if (priv->mode == E_DATA_BOOK_MODE_REMOTE)
- e_book_backend_notify_connection_status (backend, TRUE);
-}
-
-static void
-e_book_backend_ews_remove (EBookBackend *backend,
- EDataBook *book,
- guint32 opid)
-{
- e_data_book_respond_remove (book, opid, EDB_ERROR (SUCCESS));
-}
static gchar *
e_book_backend_ews_get_static_capabilities (EBookBackend *backend)
@@ -2341,7 +2357,7 @@ e_book_backend_ews_set_mode (EBookBackend *backend,
priv->mode = mode;
if (e_book_backend_is_loaded (backend)) {
- if (mode == E_DATA_BOOK_MODE_LOCAL) {
+ if (mode == MODE_LOCAL) {
e_book_backend_notify_writable (backend, FALSE);
e_book_backend_notify_connection_status (backend, FALSE);
@@ -2358,7 +2374,7 @@ e_book_backend_ews_set_mode (EBookBackend *backend,
priv->cnc=NULL;
}
}
- else if (mode == E_DATA_BOOK_MODE_REMOTE) {
+ else if (mode == MODE_REMOTE) {
e_book_backend_notify_writable (backend, ebews->priv->is_writable);
e_book_backend_notify_connection_status (backend, TRUE);
e_book_backend_notify_auth_required (backend);
@@ -2366,6 +2382,160 @@ e_book_backend_ews_set_mode (EBookBackend *backend,
}
}
+
+#else
+
+static void
+e_book_backend_ews_authenticate_user (EBookBackend *backend,
+ GCancellable *cancellable,
+ ECredentials *credentials)
+{
+ EBookBackendEws *ebgw;
+ EBookBackendEwsPrivate *priv;
+ ESource *esource;
+ GError *error = NULL;
+ const gchar *host_url;
+ const gchar *read_only;
+
+ ebgw = E_BOOK_BACKEND_EWS (backend);
+ priv = ebgw->priv;
+
+ switch (ebgw->priv->mode) {
+ case MODE_LOCAL:
+ e_book_backend_notify_opened (backend, EDB_ERROR (SUCCESS));
+ return;
+
+ case MODE_REMOTE:
+ if (priv->cnc) {
+ e_book_backend_notify_opened (backend, EDB_ERROR (SUCCESS));
+ return;
+ }
+
+ esource = e_book_backend_get_source (backend);
+ host_url = e_source_get_property (esource, "hosturl");
+ read_only = e_source_get_property (esource, "read_only");
+
+ priv->cnc = e_ews_connection_new (host_url, e_credentials_peek (credentials, E_CREDENTIALS_KEY_USERNAME),
+ e_credentials_peek (credentials, E_CREDENTIALS_KEY_PASSWORD),
+ NULL, NULL, &error);
+
+ if ((read_only && !strcmp (read_only, "true")) || priv->is_gal) {
+ priv->is_writable = FALSE;
+ } else
+ priv->is_writable = TRUE;
+
+ priv->username = e_source_get_duped_property (esource, "username");
+ priv->password = g_strdup (e_credentials_peek (credentials, E_CREDENTIALS_KEY_PASSWORD));
+
+ /* FIXME: Do some dummy request to ensure that the password is actually
+ correct; don't just blindly return success */
+ e_book_backend_notify_opened (backend, EDB_ERROR (SUCCESS));
+ e_book_backend_notify_readonly (backend, !priv->is_writable);
+ return;
+ default :
+ break;
+ }
+}
+
+static void
+e_book_backend_ews_set_online (EBookBackend *backend,
+ gboolean is_online)
+{
+ EBookBackendEws *ebews;
+
+ ebews = E_BOOK_BACKEND_EWS (backend);
+
+ if (is_online)
+ ebews->priv->mode = MODE_REMOTE;
+ else
+ ebews->priv->mode = MODE_LOCAL;
+ if (e_book_backend_is_opened (backend)) {
+ if (!is_online) {
+ e_book_backend_notify_readonly (backend, TRUE);
+ e_book_backend_notify_online (backend, FALSE);
+ if (ebews->priv->cnc) {
+ g_object_unref (ebews->priv->cnc);
+ ebews->priv->cnc = NULL;
+ }
+ } else {
+ e_book_backend_notify_readonly (backend, !ebews->priv->is_writable);
+ e_book_backend_notify_online (backend, TRUE);
+ e_book_backend_notify_auth_required (backend, TRUE, NULL);
+ }
+ }
+}
+
+static void
+e_book_backend_ews_get_backend_property (EBookBackend *backend,
+ EDataBook *book,
+ guint32 opid,
+ GCancellable *cancellable,
+ const gchar *prop_name)
+{
+ g_return_if_fail (prop_name != NULL);
+
+ if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_CAPABILITIES)) {
+ /* do-initialy-query is enabled for system address book also, so that we get the
+ * book_view, which is needed for displaying cache update progress.
+ * and null query is handled for system address book.
+ */
+ e_data_book_respond_get_backend_property (book, opid, NULL, "net,bulk-removes,do-initial-query,contact-lists");
+ } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS)) {
+ e_data_book_respond_get_backend_property (book, opid, NULL, e_contact_field_name (E_CONTACT_FILE_AS));
+ } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_SUPPORTED_FIELDS)) {
+ gchar *fields_str;
+ GSList *fields = NULL;
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (mappings); i++)
+ if (mappings [i].element_type == ELEMENT_TYPE_SIMPLE)
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (mappings[i].field_id)));
+
+ for (i = 0; i < G_N_ELEMENTS (phone_field_map); i++)
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (phone_field_map[i].field)));
+
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_FULL_NAME)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_NICKNAME)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_FAMILY_NAME)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_EMAIL_1)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_EMAIL_2)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_EMAIL_3)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_ADDRESS_WORK)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_ADDRESS_HOME)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_ADDRESS_OTHER)));
+ fields = g_slist_append (fields, g_strdup (e_contact_field_name (E_CONTACT_BIRTH_DATE)));
+
+ fields_str = e_data_book_string_slist_to_comma_string (fields);
+
+ e_data_book_respond_get_backend_property (book, opid, NULL, fields_str);
+
+ g_slist_free (fields);
+ g_free (fields_str);
+ } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_SUPPORTED_AUTH_METHODS)) {
+ e_data_book_respond_get_backend_property (book, opid, NULL, "plain/password");
+ } else {
+ E_BOOK_BACKEND_CLASS (e_book_backend_ews_parent_class)->get_backend_property (backend, book, opid, cancellable, prop_name);
+ }
+}
+
+static void
+e_book_backend_ews_open (EBookBackend *backend,
+ EDataBook *book,
+ guint opid,
+ GCancellable *cancellable,
+ gboolean only_if_exists)
+{
+ GError *error = NULL;
+ ESource *source;
+
+ source = e_book_backend_get_source (backend);
+ e_book_backend_ews_load_source (backend, source, only_if_exists, &error);
+ e_data_book_respond_open (book, opid, error);
+}
+
+#endif
+
+
/**
* e_book_backend_ews_new:
*/
@@ -2444,6 +2614,10 @@ e_book_backend_ews_dispose (GObject *object)
priv->ebsdb = NULL;
}
+#if EDS_CHECK_VERSION (3,1,0)
+ e_credentials_free (priv->credentials);
+ priv->credentials = NULL;
+#endif
g_static_rec_mutex_free (&priv->rec_mutex);
g_free (priv);
@@ -2462,20 +2636,26 @@ e_book_backend_ews_class_init (EBookBackendEwsClass *klass)
parent_class = E_BOOK_BACKEND_CLASS (klass);
/* Set the virtual methods. */
+#if ! EDS_CHECK_VERSION (3,1,0)
parent_class->load_source = e_book_backend_ews_load_source;
parent_class->get_static_capabilities = e_book_backend_ews_get_static_capabilities;
- parent_class->remove = e_book_backend_ews_remove;
parent_class->set_mode = e_book_backend_ews_set_mode;
parent_class->get_required_fields = e_book_backend_ews_get_required_fields;
parent_class->get_supported_fields = e_book_backend_ews_get_supported_fields;
parent_class->get_supported_auth_methods = e_book_backend_ews_get_supported_auth_methods;
-
+ parent_class->cancel_operation = e_book_backend_ews_cancel_operation;
+ parent_class->get_changes = e_book_backend_ews_get_changes;
+#else
+ parent_class->open = e_book_backend_ews_open;
+ parent_class->get_backend_property = e_book_backend_ews_get_backend_property;
+ parent_class->set_online = e_book_backend_ews_set_online;
+#endif
+ parent_class->remove = e_book_backend_ews_remove;
parent_class->authenticate_user = e_book_backend_ews_authenticate_user;
parent_class->start_book_view = e_book_backend_ews_start_book_view;
parent_class->stop_book_view = e_book_backend_ews_stop_book_view;
- parent_class->cancel_operation = e_book_backend_ews_cancel_operation;
parent_class->create_contact = e_book_backend_ews_create_contact;
parent_class->remove_contacts = e_book_backend_ews_remove_contacts;
@@ -2483,7 +2663,6 @@ e_book_backend_ews_class_init (EBookBackendEwsClass *klass)
parent_class->get_contact = e_book_backend_ews_get_contact;
parent_class->get_contact_list = e_book_backend_ews_get_contact_list;
- parent_class->get_changes = e_book_backend_ews_get_changes;
object_class->dispose = e_book_backend_ews_dispose;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]