diff options
author | Not Zed <NotZed@Ximian.com> | 2005-05-20 21:12:05 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2005-05-20 21:12:05 +0800 |
commit | ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283 (patch) | |
tree | abfaabf3ea4b49215ea76c79f15e0788e6e07a27 /plugins/mail-remote/evolution-mail-session.c | |
parent | ef769539607b93774280c2111ba6d2f159e121c7 (diff) | |
download | gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar.gz gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar.bz2 gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar.lz gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar.xz gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.tar.zst gsoc2013-evolution-ca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283.zip |
Lots of work, filled out functions, cleaned up idl to make the data more
2005-05-20 Not Zed <NotZed@Ximian.com>
* Lots of work, filled out functions, cleaned up idl to make the
data more useful, added a listener interface, etc.
svn path=/trunk/; revision=29395
Diffstat (limited to 'plugins/mail-remote/evolution-mail-session.c')
-rw-r--r-- | plugins/mail-remote/evolution-mail-session.c | 181 |
1 files changed, 168 insertions, 13 deletions
diff --git a/plugins/mail-remote/evolution-mail-session.c b/plugins/mail-remote/evolution-mail-session.c index 90c989838d..7f1e854f1a 100644 --- a/plugins/mail-remote/evolution-mail-session.c +++ b/plugins/mail-remote/evolution-mail-session.c @@ -16,7 +16,7 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * - * Author: JP Rosevear <jpr@ximian.com> + * Author: Michael Zucchi <notzed@novell.com> */ #ifdef HAVE_CONFIG_H @@ -31,9 +31,10 @@ #include <bonobo/bonobo-exception.h> #include "evolution-mail-session.h" -#include <libedataserver/e-account-list.h> +#include <e-util/e-account-list.h> #include "evolution-mail-store.h" +#include "e-corba-utils.h" #include <camel/camel-session.h> @@ -49,8 +50,26 @@ static BonoboObjectClass *parent_class = NULL; struct _EvolutionMailSessionPrivate { EAccountList *accounts; GList *stores; + + /* FIXME: locking */ + GSList *listeners; + + guint account_added; + guint account_changed; + guint account_removed; }; +static int +is_storage(EAccount *ea) +{ + const char *uri; + CamelProvider *prov; + + return(uri = e_account_get_string(ea, E_ACCOUNT_SOURCE_URL)) + && (prov = camel_provider_get(uri, NULL)) + && (prov->flags & CAMEL_PROVIDER_IS_STORAGE); +} + /* GObject methods */ static void @@ -70,6 +89,8 @@ impl_dispose (GObject *object) static void impl_finalize (GObject *object) { + g_warning("EvolutionMailStore is finalised!\n"); + (* G_OBJECT_CLASS (parent_class)->finalize) (object); } @@ -88,18 +109,18 @@ impl_getProperties(PortableServer_Servant _servant, return CORBA_TRUE; } -static GNOME_Evolution_Mail_Stores * +static GNOME_Evolution_Mail_StoreInfos * impl_getStores(PortableServer_Servant _servant, const CORBA_char * pattern, CORBA_Environment * ev) { EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - GNOME_Evolution_Mail_Stores *seq; + GNOME_Evolution_Mail_StoreInfos *seq; int i, len; GList *l; - seq = GNOME_Evolution_Mail_Stores__alloc(); + seq = GNOME_Evolution_Mail_StoreInfos__alloc(); /* FIXME: pattern? */ @@ -107,20 +128,49 @@ impl_getStores(PortableServer_Servant _servant, seq->_length = len; seq->_maximum = len; - seq->_buffer = GNOME_Evolution_Mail_Stores_allocbuf(seq->_length); + seq->_buffer = GNOME_Evolution_Mail_StoreInfos_allocbuf(seq->_length); CORBA_sequence_set_release(seq, TRUE); l = p->stores; for (i=0;l && i<len;i++) { - seq->_buffer[i] = bonobo_object_corba_objref(l->data); - bonobo_object_ref(l->data); /* ?? */ + EvolutionMailStore *store = l->data; + + e_mail_storeinfo_set_store(&seq->_buffer[i], store); l = g_list_next(l); } return seq; } +static void +impl_addListener(PortableServer_Servant _servant, + const GNOME_Evolution_Mail_Listener listener, + CORBA_Environment * ev) +{ + EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + + printf("Adding listener to session\n"); + + p->listeners = g_slist_append(p->listeners, CORBA_Object_duplicate(listener, ev)); +} + +static void +impl_removeListener(PortableServer_Servant _servant, + const GNOME_Evolution_Mail_Listener listener, + CORBA_Environment * ev) +{ + EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + + printf("Removing listener from session\n"); + + /* FIXME: need to use proper comparison function & free stuff, this works with orbit though */ + p->listeners = g_slist_remove(p->listeners, listener); + CORBA_Object_release(listener, ev); +} + /* Initialization */ static void @@ -134,6 +184,9 @@ evolution_mail_session_class_init (EvolutionMailSessionClass *klass) epv->getProperties = impl_getProperties; epv->getStores = impl_getStores; + epv->addListener = impl_addListener; + epv->removeListener = impl_removeListener; + object_class->dispose = impl_dispose; object_class->finalize = impl_finalize; @@ -141,13 +194,110 @@ evolution_mail_session_class_init (EvolutionMailSessionClass *klass) } static void +ems_listener_event(EvolutionMailSession *ems, GNOME_Evolution_Mail_ChangeType how, EvolutionMailStore *store) +{ + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + GNOME_Evolution_Mail_SessionChange *change; + GSList *l; + + for (l=p->listeners;l;l=g_slist_next(l)) { + CORBA_Environment ev; + + change = GNOME_Evolution_Mail_SessionChange__alloc(); + change->type = how; + + change->stores._length = 1; + change->stores._maximum = 1; + change->stores._buffer = GNOME_Evolution_Mail_StoreInfos_allocbuf(change->stores._maximum); + CORBA_sequence_set_release(&change->stores, TRUE); + e_mail_storeinfo_set_store(&change->stores._buffer[0], store); + + GNOME_Evolution_Mail_Listener_sessionChanged(l->data, bonobo_object_corba_objref((BonoboObject *)ems), change, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + printf("listener.sessionChanged() failed: %s\n", ev._id); + /* TODO: if it fails, remove the listener? */ + CORBA_exception_free(&ev); + } else { + printf("listener.sessionChanged() successful\n"); + } + } +} + +static void +ems_account_added(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) +{ + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + + if (ea->enabled && is_storage(ea)) { + EvolutionMailStore *store; + + printf("Account added %s\n", ea->uid); + store = evolution_mail_store_new(ems, ea); + p->stores = g_list_append(p->stores, store); + ems_listener_event(ems, GNOME_Evolution_Mail_ADDED, store); + } +} + +static void +ems_account_changed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) +{ + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + EvolutionMailStore *store = NULL; + GList *l; + + for (l = p->stores;l;l=l->next) { + if (((EvolutionMailStore *)l->data)->account == ea) { + store = l->data; + break; + } + } + + if (store) { + /* account has been disabled? */ + if (!ea->enabled) { + printf("Account changed, now disabled %s\n", ea->uid); + p->stores = g_list_remove(p->stores, store); + ems_listener_event(ems, GNOME_Evolution_Mail_REMOVED, store); + g_object_unref(store); + } else { + printf("Account changed, dont know how %s\n", ea->uid); + ems_listener_event(ems, GNOME_Evolution_Mail_CHANGED, store); + } + } else if (ea->enabled && is_storage(ea)) { + printf("Account changed, now added %s\n", ea->uid); + store = evolution_mail_store_new(ems, ea); + p->stores = g_list_append(p->stores, store); + ems_listener_event(ems, GNOME_Evolution_Mail_ADDED, store); + } +} + +static void +ems_account_removed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) +{ + struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); + GList *l; + + /* for accounts we dont have, we dont care */ + + for (l = p->stores;l;l=l->next) { + EvolutionMailStore *store = l->data; + + if (store->account == ea) { + printf("Account removed %s\n", ea->uid); + p->stores = g_list_remove(p->stores, store); + ems_listener_event(ems, GNOME_Evolution_Mail_REMOVED, store); + g_object_unref(store); + break; + } + } +} + +static void evolution_mail_session_init (EvolutionMailSession *ems, EvolutionMailSessionClass *klass) { GConfClient *gconf = gconf_client_get_default(); struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); EIterator *iter; - EvolutionMailStore *store; - extern CamelSession *session; /* FIXME: listen to changes */ @@ -160,8 +310,9 @@ evolution_mail_session_init (EvolutionMailSession *ems, EvolutionMailSessionClas EAccount *ea; if ((ea = (EAccount *)e_iterator_get(iter)) - && (store = evolution_mail_store_new(ems, (struct _EAccount *)ea))) { - p->stores = g_list_append(p->stores, store); + && ea->enabled + && is_storage(ea)) { + p->stores = g_list_append(p->stores, evolution_mail_store_new(ems, ea)); } e_iterator_next(iter); @@ -170,7 +321,11 @@ evolution_mail_session_init (EvolutionMailSession *ems, EvolutionMailSessionClas g_object_unref(gconf); - ems->session = session; + p->account_added = g_signal_connect(p->accounts, "account_added", G_CALLBACK(ems_account_added), ems); + p->account_changed = g_signal_connect(p->accounts, "account_changed", G_CALLBACK(ems_account_changed), ems); + p->account_removed = g_signal_connect(p->accounts, "account_removed", G_CALLBACK(ems_account_removed), ems); + + ems->session = mail_component_peek_session(NULL); } BONOBO_TYPE_FUNC_FULL (EvolutionMailSession, GNOME_Evolution_Mail_Session, PARENT_TYPE, evolution_mail_session) |