summaryrefslogtreecommitdiff
path: root/addressbook/backends/google/e-book-backend-google.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backends/google/e-book-backend-google.c')
-rw-r--r--addressbook/backends/google/e-book-backend-google.c68
1 files changed, 57 insertions, 11 deletions
diff --git a/addressbook/backends/google/e-book-backend-google.c b/addressbook/backends/google/e-book-backend-google.c
index fc0ff618c..3a2b962f1 100644
--- a/addressbook/backends/google/e-book-backend-google.c
+++ b/addressbook/backends/google/e-book-backend-google.c
@@ -1,6 +1,7 @@
/* e-book-backend-google.c - Google contact backendy.
*
* Copyright (C) 2008 Joergen Scheibengruber
+ * Copyright (C) 2009 Philip Withnall
*
* 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
@@ -27,6 +28,7 @@
#include <libedata-book/e-data-book.h>
#include <libedata-book/e-data-book-view.h>
#include <libedata-book/e-book-backend-sexp.h>
+#include <gdata/gdata-service.h>
#include "e-book-backend-google.h"
#include "google-book.h"
@@ -48,7 +50,7 @@ struct _EBookBackendGooglePrivate
gboolean __e_book_backend_google_debug__;
-static EBookBackendSyncStatus e_book_backend_status_from_google_book_error (GoogleBookError error_code);
+static EBookBackendSyncStatus e_book_backend_status_from_google_book_error (GError *error);
static EBookBackendSyncStatus
e_book_backend_google_create_contact (EBookBackendSync *backend,
@@ -76,7 +78,7 @@ e_book_backend_google_create_contact (EBookBackendSync *backend,
google_book_add_contact (priv->book, contact, out_contact, &error);
g_object_unref (contact);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Creating contact failed: %s", error->message);
g_clear_error (&error);
*out_contact = NULL;
@@ -114,7 +116,7 @@ e_book_backend_google_remove_contacts (EBookBackendSync *backend,
google_book_remove_contact (priv->book, uid, &error);
if (error) {
/* Only last error will be reported */
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Deleting contact %s failed: %s", uid, error->message);
g_clear_error (&error);
} else {
@@ -154,7 +156,7 @@ e_book_backend_google_modify_contact (EBookBackendSync *backend,
google_book_update_contact (priv->book, contact, out_contact, &error);
g_object_unref (contact);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Modifying contact failed: %s", error->message);
g_clear_error (&error);
*out_contact = NULL;
@@ -181,7 +183,7 @@ e_book_backend_google_get_contact (EBookBackendSync *backend,
contact = google_book_get_contact (priv->book, uid, &error);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Getting contact with uid %s failed: %s", uid, error->message);
g_clear_error (&error);
return status;
@@ -212,7 +214,7 @@ e_book_backend_google_get_contact_list (EBookBackendSync *backend,
all_contacts = google_book_get_all_contacts (priv->book, &error);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Getting all contacts failed: %s", error->message);
g_clear_error (&error);
return status;
@@ -283,9 +285,8 @@ on_google_book_sequence_complete (GoogleBook *book, GError *error, gpointer user
priv = GET_PRIVATE (user_data);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Book-view query failed: %s", error->message);
- status = e_book_backend_status_from_google_book_error (error->code);
g_clear_error (&error);
}
for (iter = priv->bookviews; iter; iter = iter->next) {
@@ -378,9 +379,8 @@ e_book_backend_google_authenticate_user (EBookBackendSync *backend,
google_book_connect_to_google (priv->book, password, &error);
if (error) {
- status = e_book_backend_status_from_google_book_error (error->code);
+ status = e_book_backend_status_from_google_book_error (error);
__debug__ ("Authentication failed: %s", error->message);
- status = e_book_backend_status_from_google_book_error (error->code);
g_clear_error (&error);
} else {
e_book_backend_notify_writable (E_BOOK_BACKEND (backend), TRUE);
@@ -686,8 +686,54 @@ e_book_backend_google_new (void)
}
static EBookBackendSyncStatus
-e_book_backend_status_from_google_book_error (GoogleBookError error_code)
+e_book_backend_status_from_google_book_error (GError *error)
{
+ if (!error)
+ return GNOME_Evolution_Addressbook_Success;
+
+ if (error->domain == GDATA_AUTHENTICATION_ERROR) {
+ /* Authentication errors */
+ switch (error->code) {
+ case GDATA_AUTHENTICATION_ERROR_BAD_AUTHENTICATION:
+ return GNOME_Evolution_Addressbook_AuthenticationFailed;
+ case GDATA_AUTHENTICATION_ERROR_NOT_VERIFIED:
+ case GDATA_AUTHENTICATION_ERROR_TERMS_NOT_AGREED:
+ case GDATA_AUTHENTICATION_ERROR_CAPTCHA_REQUIRED:
+ case GDATA_AUTHENTICATION_ERROR_ACCOUNT_DELETED:
+ case GDATA_AUTHENTICATION_ERROR_ACCOUNT_DISABLED:
+ return GNOME_Evolution_Addressbook_PermissionDenied;
+ case GDATA_AUTHENTICATION_ERROR_SERVICE_DISABLED:
+ return GNOME_Evolution_Addressbook_RepositoryOffline;
+ default:
+ return GNOME_Evolution_Addressbook_OtherError;
+ }
+ } else if (error->domain == GDATA_SERVICE_ERROR) {
+ /* General service errors */
+ switch (error->code) {
+ case GDATA_SERVICE_ERROR_UNAVAILABLE:
+ return GNOME_Evolution_Addressbook_RepositoryOffline;
+ case GDATA_SERVICE_ERROR_PROTOCOL_ERROR:
+ return GNOME_Evolution_Addressbook_InvalidQuery;
+ case GDATA_SERVICE_ERROR_ENTRY_ALREADY_INSERTED:
+ return GNOME_Evolution_Addressbook_ContactIdAlreadyExists;
+ case GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED:
+ return GNOME_Evolution_Addressbook_AuthenticationRequired;
+ case GDATA_SERVICE_ERROR_NOT_FOUND:
+ return GNOME_Evolution_Addressbook_ContactNotFound;
+ case GDATA_SERVICE_ERROR_CONFLICT:
+ return GNOME_Evolution_Addressbook_ContactIdAlreadyExists;
+ case GDATA_SERVICE_ERROR_FORBIDDEN:
+ return GNOME_Evolution_Addressbook_QueryRefused;
+ case GDATA_SERVICE_ERROR_WITH_QUERY:
+ case GDATA_SERVICE_ERROR_WITH_INSERTION:
+ case GDATA_SERVICE_ERROR_WITH_UPDATE:
+ case GDATA_SERVICE_ERROR_WITH_DELETION:
+ return GNOME_Evolution_Addressbook_InvalidQuery;
+ default:
+ return GNOME_Evolution_Addressbook_OtherError;
+ }
+ }
+
return GNOME_Evolution_Addressbook_OtherError;
}