aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mail-remote/evolution-mail-session.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2005-05-20 21:12:05 +0800
committerMichael Zucci <zucchi@src.gnome.org>2005-05-20 21:12:05 +0800
commitca5c50ddfeda1a3a8aaaaa7e1a42ab4c34200283 (patch)
treeabfaabf3ea4b49215ea76c79f15e0788e6e07a27 /plugins/mail-remote/evolution-mail-session.c
parentef769539607b93774280c2111ba6d2f159e121c7 (diff)
downloadgsoc2013-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.c181
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)