From dc1f5dfb2613864772791678184fa7b12aa20706 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 18 Aug 2005 04:36:34 +0000 Subject: ** See #312668. 2005-08-16 Not Zed ** See #312668. * mail-component.c (impl_setLineStatus): new offline interface. (setline_check, setline_done): and implementation. * mail-offline-handler.[ch]: destroyed, burnt, dissolved in acid. svn path=/trunk/; revision=30155 --- mail/mail-component.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 5 deletions(-) (limited to 'mail/mail-component.c') diff --git a/mail/mail-component.c b/mail/mail-component.c index e6a1c4fe69..15ddb760e2 100644 --- a/mail/mail-component.c +++ b/mail/mail-component.c @@ -59,7 +59,6 @@ #include "mail-tools.h" #include "mail-send-recv.h" #include "mail-session.h" -#include "mail-offline-handler.h" #include "message-list.h" #include "e-activity-handler.h" @@ -79,6 +78,8 @@ #include #include +#include +#include #include #include @@ -923,6 +924,73 @@ impl_upgradeFromVersion (PortableServer_Servant servant, const short major, cons camel_exception_clear (&ex); } +struct _setline_data { + GNOME_Evolution_Listener listener; + CORBA_boolean status; + int pending; +}; + +static void +setline_done(CamelStore *store, void *data) +{ + struct _setline_data *sd = data; + + g_assert(sd->pending > 0); + + sd->pending--; + if (sd->pending == 0) { + CORBA_Environment ev = { 0 }; + + GNOME_Evolution_Listener_complete(sd->listener, &ev); + CORBA_exception_free(&ev); + CORBA_Object_release(sd->listener, &ev); + CORBA_exception_free(&ev); + g_free(sd); + } +} + +static void +setline_check(void *key, void *value, void *data) +{ + CamelService *service = key; + struct _setline_data *sd = data; + + if (CAMEL_IS_DISCO_STORE(service) + || CAMEL_IS_OFFLINE_STORE(service)) { + sd->pending++; + mail_store_set_offline((CamelStore *)service, !sd->status, setline_done, sd); + } +} + +static void +impl_setLineStatus(PortableServer_Servant servant, CORBA_boolean status, GNOME_Evolution_Listener listener, CORBA_Environment *ev) +{ + struct _setline_data *sd; + + /* This will dis/enable further auto-mail-check action. */ + /* FIXME: If send/receive active, wait for it to finish? */ + camel_session_set_online(session, status); + + sd = g_malloc0(sizeof(*sd)); + sd->status = status; + sd->listener = CORBA_Object_duplicate(listener, ev); + if (ev->_major == CORBA_NO_EXCEPTION) + mail_component_stores_foreach(mail_component_peek(), setline_check, sd); + else + CORBA_exception_free(ev); + + if (sd->pending == 0) { + if (sd->listener) { + CORBA_Object_release(sd->listener, ev); + CORBA_exception_free(ev); + } + + g_free(sd); + + GNOME_Evolution_Listener_complete(listener, ev); + } +} + static void impl_mail_test(PortableServer_Servant servant, CORBA_Environment *ev) { @@ -951,6 +1019,7 @@ mail_component_class_init (MailComponentClass *class) epv->handleURI = impl_handleURI; epv->sendAndReceive = impl_sendAndReceive; epv->upgradeFromVersion = impl_upgradeFromVersion; + epv->setLineStatus = impl_setLineStatus; mepv->test = impl_mail_test; } @@ -959,7 +1028,6 @@ static void mail_component_init (MailComponent *component) { MailComponentPrivate *priv; - MailOfflineHandler *offline; priv = g_new0 (MailComponentPrivate, 1); component->priv = priv; @@ -980,9 +1048,6 @@ mail_component_init (MailComponent *component) priv->store_hash = g_hash_table_new (NULL, NULL); mail_autoreceive_init(); - - offline = mail_offline_handler_new(); - bonobo_object_add_interface((BonoboObject *)component, (BonoboObject *)offline); } /* Public API. */ -- cgit