[evolution-data-server] Bug #630358 - Google contacts doesn't sync birthday and URL
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #630358 - Google contacts doesn't sync birthday and URL
- Date: Wed, 13 Oct 2010 10:23:16 +0000 (UTC)
commit b1c896efc3d2d2abe4bff27a3afd353730375268
Author: Milan Crha <mcrha redhat com>
Date: Wed Oct 13 12:22:21 2010 +0200
Bug #630358 - Google contacts doesn't sync birthday and URL
.../backends/google/e-book-backend-google.c | 20 ++++-
addressbook/backends/google/util.c | 82 ++++++++++++++++++++
configure.ac | 8 +-
3 files changed, 105 insertions(+), 5 deletions(-)
---
diff --git a/addressbook/backends/google/e-book-backend-google.c b/addressbook/backends/google/e-book-backend-google.c
index 40d242d..1a0eab5 100644
--- a/addressbook/backends/google/e-book-backend-google.c
+++ b/addressbook/backends/google/e-book-backend-google.c
@@ -512,7 +512,11 @@ get_new_contacts_in_chunks (EBookBackend *backend, gint chunk_size, GError **err
GTimeVal updated;
g_assert (g_time_val_from_iso8601 (last_updated, &updated) == TRUE);
+ #ifdef HAVE_GDATA_07
+ gdata_query_set_updated_min (query, updated.tv_sec);
+ #else
gdata_query_set_updated_min (query, &updated);
+ #endif
gdata_contacts_query_set_show_deleted (GDATA_CONTACTS_QUERY (query), TRUE);
}
@@ -789,11 +793,18 @@ e_book_backend_google_modify_contact (EBookBackendSync *backend, EDataBook *book
g_free (xml);
/* Update the contact on the server */
+ #ifdef HAVE_GDATA_07
+ new_entry = gdata_service_update_entry (
+ GDATA_SERVICE (priv->service),
+ entry,
+ NULL, &error);
+ #else
new_entry = GDATA_ENTRY (
gdata_contacts_service_update_contact (
GDATA_CONTACTS_SERVICE (priv->service),
GDATA_CONTACTS_CONTACT (entry),
NULL, &error));
+ #endif
g_object_unref (entry);
if (!new_entry) {
@@ -1190,6 +1201,11 @@ e_book_backend_google_get_supported_fields (EBookBackendSync *backend, EDataBook
E_CONTACT_ORG_UNIT,
E_CONTACT_TITLE,
E_CONTACT_ROLE,
+ #ifdef HAVE_GDATA_07
+ E_CONTACT_HOMEPAGE_URL,
+ E_CONTACT_BLOG_URL,
+ E_CONTACT_BIRTH_DATE,
+ #endif
E_CONTACT_NOTE
};
@@ -1471,7 +1487,7 @@ data_book_error_from_gdata_error (GError **dest_err, GError *error)
g_propagate_error (dest_err, EDB_ERROR (REPOSITORY_OFFLINE));
return;
case GDATA_SERVICE_ERROR_PROTOCOL_ERROR:
- g_propagate_error (dest_err, EDB_ERROR (INVALID_QUERY));
+ g_propagate_error (dest_err, e_data_book_create_error (E_DATA_BOOK_STATUS_INVALID_QUERY, error->message));
return;
case GDATA_SERVICE_ERROR_ENTRY_ALREADY_INSERTED:
g_propagate_error (dest_err, EDB_ERROR (CONTACTID_ALREADY_EXISTS));
@@ -1489,7 +1505,7 @@ data_book_error_from_gdata_error (GError **dest_err, GError *error)
g_propagate_error (dest_err, EDB_ERROR (QUERY_REFUSED));
return;
case GDATA_SERVICE_ERROR_BAD_QUERY_PARAMETER:
- g_propagate_error (dest_err, EDB_ERROR (INVALID_QUERY));
+ g_propagate_error (dest_err, e_data_book_create_error (E_DATA_BOOK_STATUS_INVALID_QUERY, error->message));
return;
default:
break;
diff --git a/addressbook/backends/google/util.c b/addressbook/backends/google/util.c
index e3e7166..56c5367 100644
--- a/addressbook/backends/google/util.c
+++ b/addressbook/backends/google/util.c
@@ -20,6 +20,7 @@
* Author: Joergen Scheibengruber <joergen.scheibengruber AT googlemail.com>
*/
+#include <config.h>
#include <string.h>
#include <libsoup/soup.h>
#include <gdata/gdata.h>
@@ -69,6 +70,10 @@ _gdata_entry_update_from_e_contact (GDataEntry *entry, EContact *contact)
gboolean have_postal_primary = FALSE;
gboolean have_org_primary = FALSE;
const gchar *title, *role, *note;
+ #ifdef HAVE_GDATA_07
+ EContactDate *bdate;
+ const gchar *url;
+ #endif
attributes = e_vcard_get_attributes (E_VCARD (contact));
@@ -214,6 +219,40 @@ _gdata_entry_update_from_e_contact (GDataEntry *entry, EContact *contact)
gdata_gd_organization_set_job_description (org, role);
}
+ #ifdef HAVE_GDATA_07
+ gdata_contacts_contact_remove_all_websites (GDATA_CONTACTS_CONTACT (entry));
+
+ url = e_contact_get_const (contact, E_CONTACT_HOMEPAGE_URL);
+ if (url && *url) {
+ GDataGContactWebsite *website = gdata_gcontact_website_new (url, GDATA_GCONTACT_WEBSITE_HOME_PAGE, NULL, FALSE);
+ if (website) {
+ gdata_contacts_contact_add_website (GDATA_CONTACTS_CONTACT (entry), website);
+ g_object_unref (website);
+ }
+ }
+
+ url = e_contact_get_const (contact, E_CONTACT_BLOG_URL);
+ if (url && *url) {
+ GDataGContactWebsite *website = gdata_gcontact_website_new (url, GDATA_GCONTACT_WEBSITE_BLOG, NULL, FALSE);
+ if (website) {
+ gdata_contacts_contact_add_website (GDATA_CONTACTS_CONTACT (entry), website);
+ g_object_unref (website);
+ }
+ }
+
+ gdata_contacts_contact_set_birthday (GDATA_CONTACTS_CONTACT (entry), NULL, TRUE);
+ bdate = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
+ if (bdate) {
+ GDate *gdate = g_date_new_dmy (bdate->day, bdate->month, bdate->year);
+
+ if (gdate) {
+ gdata_contacts_contact_set_birthday (GDATA_CONTACTS_CONTACT (entry), gdate, TRUE);
+ g_date_free (gdate);
+ }
+ e_contact_date_free (bdate);
+ }
+ #endif
+
return TRUE;
}
@@ -241,6 +280,11 @@ _e_contact_new_from_gdata_entry (GDataEntry *entry)
GDataGDPostalAddress *postal_address;
GDataGDOrganization *org;
GHashTable *extended_props;
+ #ifdef HAVE_GDATA_07
+ GList *websites;
+ GDate bdate;
+ gboolean bdate_has_year;
+ #endif
uid = gdata_entry_get_id (entry);
if (NULL == uid)
@@ -352,6 +396,44 @@ _e_contact_new_from_gdata_entry (GDataEntry *entry)
extended_props = gdata_contacts_contact_get_extended_properties (GDATA_CONTACTS_CONTACT (entry));
g_hash_table_foreach (extended_props, (GHFunc) foreach_extended_props_cb, vcard);
+ #ifdef HAVE_GDATA_07
+ websites = gdata_contacts_contact_get_websites (GDATA_CONTACTS_CONTACT (entry));
+ for (itr = websites; itr != NULL; itr = itr->next) {
+ GDataGContactWebsite *website = itr->data;
+ const gchar *uri, *reltype;
+
+ if (!website)
+ continue;
+
+ uri = gdata_gcontact_website_get_uri (website);
+ reltype = gdata_gcontact_website_get_relation_type (website);
+
+ if (!uri || !*uri || !reltype)
+ continue;
+
+ if (g_str_equal (reltype, GDATA_GCONTACT_WEBSITE_HOME_PAGE))
+ e_contact_set (E_CONTACT (vcard), E_CONTACT_HOMEPAGE_URL, uri);
+ else if (g_str_equal (reltype, GDATA_GCONTACT_WEBSITE_BLOG))
+ e_contact_set (E_CONTACT (vcard), E_CONTACT_BLOG_URL, uri);
+ }
+
+ g_date_clear (&bdate, 1);
+ bdate_has_year = gdata_contacts_contact_get_birthday (GDATA_CONTACTS_CONTACT (entry), &bdate);
+ /* ignore birthdays without year */
+ if (g_date_valid (&bdate) && bdate_has_year) {
+ EContactDate *date = e_contact_date_new ();
+
+ if (date) {
+ date->day = g_date_get_day (&bdate);
+ date->month = g_date_get_month (&bdate);
+ date->year = g_date_get_year (&bdate);
+
+ e_contact_set (E_CONTACT (vcard), E_CONTACT_BIRTH_DATE, date);
+ e_contact_date_free (date);
+ }
+ }
+ #endif
+
return E_CONTACT (vcard);
}
diff --git a/configure.ac b/configure.ac
index 21d7aea..07b019f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -326,11 +326,13 @@ PKG_CHECK_MODULES(GNOME_PLATFORM,
libsoup-2.4 >= libsoup_minimum_version
libgdata >= libgdata_minimum_version])
-dnl libgdata 0.7 will break API. We don't want to deal with
-dnl that until 0.7 is released, so cap the supported version.
+ac_cv_have_gdata_07=no
+dnl libgdata 0.7 breaks API, thus deal with it.
if $PKG_CONFIG --atleast-version=0.7 libgdata; then
- AC_MSG_ERROR([libgdata 0.7 is not yet supported, use 0.6 instead])
+ ac_cv_have_gdata_07=yes
+ AC_DEFINE(HAVE_GDATA_07, 1, [libgdata is 0.7 or higher])
fi
+AC_MSG_RESULT([$ac_cv_have_gdata_07])
LIBICAL_REQUIRED=libical_minimum_version
AC_SUBST(LIBICAL_REQUIRED)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]