aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/pas/pas-backend-ldap.c
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@helixcode.com>2000-05-01 12:19:47 +0800
committerFederico Mena Quintero <federico@src.gnome.org>2000-05-01 12:19:47 +0800
commitd936a5c38a6125548ec44eac981a26d42ce72413 (patch)
tree3b8b7793b3d25ab602d8e2d5c78b6a9dd68cb70b /addressbook/backend/pas/pas-backend-ldap.c
parenteb5dc08dc91a593357a6c1b1db98fac8cdb1662e (diff)
downloadgsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar.gz
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar.bz2
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar.lz
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar.xz
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.tar.zst
gsoc2013-evolution-d936a5c38a6125548ec44eac981a26d42ce72413.zip
Added new status values for the IDL stuff.
2000-04-30 Federico Mena Quintero <federico@helixcode.com> * backend/ebook/e-book-types.h (EBookStatus): Added new status values for the IDL stuff. * backend/pas/pas-book-factory.h (PASBookFactoryClass): New "last_book_gone" signal. * backend/pas/pas-book-factory.c (pas_book_factory_launch_backend): Better error handling. (pas_book_factory_process_queue): Let pas_book_factory_process_request() free the request. (pas_book_factory_process_request): Free the request here. Perform better error handling. (free_active_server_map_entry): Free an active server map entry; free the URI key and unref the backend value. This function was renamed; the old one was trying to CORBA_Object_unref() a GTK+ object! (remove_backends_entry): Free a backend table entry; free the URI key. (backend_last_client_gone_cb): Remove the backend from the active server map and emit the "last_book_gone" signal if appropriate. (pas_book_factory_get_n_backends): New function to query the number of running backends in an addressbook factory. * backend/idl/addressbook.idl (BookListener::CallStatus): Added a ProtocolNotSupported code. This is for when the addressbook factory cannot find a provider for the requested URI. * backend/pas/pas-backend.h (PASBackendClass): New "last_client_gone" signal. (PASBackendClass): New get_uri virtual method. * backend/pas/pas-backend.c (pas_backend_load_uri): Return a gboolean success code. (pas_backend_add_client): Return a gboolean success code. (pas_backend_last_client_gone): New function used by backend implementations to notify upwards when the backend's last client is destroyed. (pas_backend_get_uri): New function to get the URI of a backend. * backend/pas/pas-backend-file.c (pas_backend_file_add_client): Pass the backend as the closure data to the "destroy" handler of the book. We cannot call pas_book_get_backend() in the callback since the book's private data has already been destroyed when the callback is invoked. Alternatively, we could move the private data destruction step to the book's ::finalize() method. (pas_backend_file_book_destroy_cb): Get the backend from the callback's data, not from the book. (pas_backend_file_remove_client): Remove the book from the list of clients. When all clients go away, call pas_backend_last_client_gone(). (PASBackendFilePrivate): Added an uri field. (pas_backend_file_get_uri): Implement the get_uri method. (pas_backend_file_load_uri): Return a gboolean success code. Also, store the URI in the private structure. (pas_backend_file_add_client): Return a gboolean success code. Also, call pas_backend_last_client_gone() if appropriate. (pas_backend_file_destroy): Free the bf->priv->uri. * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): Pass the backend as the closure data to the "destroy" handler of the book. See above for rationale. (pas_backend_ldap_book_destroy_cb): Get the backend from the callback's data. (pas_backend_ldap_remove_client): Remove the book from the list of clients. When all clients go away, call pas_backend_last_client_gone(). (pas_backend_ldap_load_uri): Return a gboolean success code. (pas_backend_ldap_add_client): Return a gboolean success code. Also, call pas_backend_last_client_gone() if appropriate. (PASBackendLDAPPrivate): New uri field. (pas_backend_ldap_get_uri): Implement the get_uri method. (pas_backend_ldap_load_uri): Store the uri in the private structure. (pas_backend_ldap_destroy): Free the bl->priv->uri. svn path=/trunk/; revision=2705
Diffstat (limited to 'addressbook/backend/pas/pas-backend-ldap.c')
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c91
1 files changed, 77 insertions, 14 deletions
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
index 82694510ba..f1fa1ea92b 100644
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ b/addressbook/backend/pas/pas-backend-ldap.c
@@ -29,6 +29,7 @@ typedef struct _PASBackendLDAPCursorPrivate PASBackendLDAPCursorPrivate;
typedef struct _PASBackendLDAPBookView PASBackendLDAPBookView;
struct _PASBackendLDAPPrivate {
+ char *uri;
gboolean connected;
GList *clients;
LDAP *ldap;
@@ -842,11 +843,11 @@ pas_backend_ldap_process_client_requests (PASBook *book)
}
static void
-pas_backend_ldap_book_destroy_cb (PASBook *book)
+pas_backend_ldap_book_destroy_cb (PASBook *book, gpointer data)
{
PASBackendLDAP *backend;
- backend = PAS_BACKEND_LDAP (pas_book_get_backend (book));
+ backend = PAS_BACKEND_LDAP (data);
pas_backend_remove_client (PAS_BACKEND (backend), book);
}
@@ -863,7 +864,7 @@ pas_backend_ldap_get_vcard (PASBook *book, const char *id)
/* XXX use ldap_search */
- if (LDAP_SUCCESS == ldap_error) {
+ if (ldap_error == LDAP_SUCCESS) {
/* success */
return g_strdup ("");
}
@@ -872,7 +873,7 @@ pas_backend_ldap_get_vcard (PASBook *book, const char *id)
}
}
-static void
+static gboolean
pas_backend_ldap_load_uri (PASBackend *backend,
const char *uri)
{
@@ -883,7 +884,8 @@ pas_backend_ldap_load_uri (PASBackend *backend,
g_assert (bl->priv->connected == FALSE);
ldap_error = ldap_url_parse ((char*)uri, &lud);
- if (LDAP_SUCCESS == ldap_error) {
+ if (ldap_error == LDAP_SUCCESS) {
+ bl->priv->uri = g_strdup (uri);
bl->priv->ldap_host = g_strdup(lud->lud_host);
bl->priv->ldap_port = lud->lud_port;
bl->priv->ldap_rootdn = g_strdup(lud->lud_dn);
@@ -891,14 +893,32 @@ pas_backend_ldap_load_uri (PASBackend *backend,
ldap_free_urldesc(lud);
pas_backend_ldap_ensure_connected(bl);
- }
- else {
- g_warning ("pas_backend_ldap_load_uri failed for '%s' (error %s)\n",
- uri, ldap_err2string(ldap_error));
+ return TRUE;
+ } else {
+ GList *l;
+
+ for (l = bl->priv->clients; l; l = l->next) {
+ PASBook *book;
+
+ book = PAS_BOOK (l->data);
+ pas_book_respond_open (book, Evolution_BookListener_OtherError);
+ }
+
+ return FALSE;
}
}
-static void
+/* Get_uri handler for the addressbook LDAP backend */
+static const char *
+pas_backend_ldap_get_uri (PASBackend *backend)
+{
+ PASBackendLDAP *bl;
+
+ bl = PAS_BACKEND_LDAP (backend);
+ return bl->priv->uri;
+}
+
+static gboolean
pas_backend_ldap_add_client (PASBackend *backend,
Evolution_BookListener listener)
{
@@ -914,10 +934,15 @@ pas_backend_ldap_add_client (PASBackend *backend,
backend, listener,
pas_backend_ldap_get_vcard);
- g_assert (book != NULL);
+ if (!book) {
+ if (!bl->priv->clients)
+ pas_backend_last_client_gone (backend);
+
+ return FALSE;
+ }
gtk_signal_connect (GTK_OBJECT (book), "destroy",
- pas_backend_ldap_book_destroy_cb, NULL);
+ pas_backend_ldap_book_destroy_cb, backend);
gtk_signal_connect (GTK_OBJECT (book), "requests_queued",
pas_backend_ldap_process_client_requests, NULL);
@@ -933,18 +958,46 @@ pas_backend_ldap_add_client (PASBackend *backend,
pas_book_respond_open (
book, Evolution_BookListener_Success);
}
+
+ return TRUE;
}
static void
pas_backend_ldap_remove_client (PASBackend *backend,
PASBook *book)
{
+ PASBackendLDAP *bl;
+ GList *l;
+ PASBook *lbook;
+
g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND (backend));
+ g_return_if_fail (PAS_IS_BACKEND_LDAP (backend));
g_return_if_fail (book != NULL);
g_return_if_fail (PAS_IS_BOOK (book));
- g_warning ("pas_backend_ldap_remove_client: Unimplemented!\n");
+ bl = PAS_BACKEND_LDAP (backend);
+
+ /* Find the book in the list of clients */
+
+ for (l = bl->priv->clients, l; l = l->next) {
+ lbook = PAS_BOOK (l->data);
+
+ if (lbook == book)
+ break;
+ }
+
+ g_assert (l != NULL);
+
+ /* Disconnect */
+
+ bl->priv->clients = g_list_remove_link (bl->priv->clients, l);
+ g_list_free_1 (l);
+
+ /* When all clients go away, notify the parent factory about it so that
+ * it may decide whether to kill the backend or not.
+ */
+ if (!bl->priv->clients)
+ pas_backend_last_client_gone (backend);
}
static gboolean
@@ -983,6 +1036,15 @@ pas_backend_ldap_new (void)
static void
pas_backend_ldap_destroy (GtkObject *object)
{
+ PASBackendLDAP *bl;
+
+ bl = PAS_BACKEND_LDAP (object);
+
+ if (bl->priv->uri) {
+ g_free (bl->priv->uri);
+ bl->priv->uri = NULL;
+ }
+
GTK_OBJECT_CLASS (pas_backend_ldap_parent_class)->destroy (object);
}
@@ -998,6 +1060,7 @@ pas_backend_ldap_class_init (PASBackendLDAPClass *klass)
/* Set the virtual methods. */
parent_class->load_uri = pas_backend_ldap_load_uri;
+ parent_class->get_uri = pas_backend_ldap_get_uri;
parent_class->add_client = pas_backend_ldap_add_client;
parent_class->remove_client = pas_backend_ldap_remove_client;