diff options
author | Federico Mena Quintero <federico@helixcode.com> | 2000-05-01 12:19:47 +0800 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2000-05-01 12:19:47 +0800 |
commit | d936a5c38a6125548ec44eac981a26d42ce72413 (patch) | |
tree | 3b8b7793b3d25ab602d8e2d5c78b6a9dd68cb70b /addressbook/backend/pas/pas-backend-ldap.c | |
parent | eb5dc08dc91a593357a6c1b1db98fac8cdb1662e (diff) | |
download | gsoc2013-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.c | 91 |
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; |