diff options
Diffstat (limited to 'plugins/mail-remote')
23 files changed, 1233 insertions, 672 deletions
diff --git a/plugins/mail-remote/ChangeLog b/plugins/mail-remote/ChangeLog index 21ad107acd..de6a0cb4b9 100644 --- a/plugins/mail-remote/ChangeLog +++ b/plugins/mail-remote/ChangeLog @@ -1,3 +1,16 @@ +2005-05-26 Not Zed <NotZed@Ximian.com> + + * evolution-mail-folderlistener.[ch]: + * evolution-mail-sessionlistener.[ch]: + * evolution-mail-storelistener.[ch]: New helpers for listeners. + + * evolution-mail-listener.[ch]: removed. + + * Evolution-DataServer-Mail.idl: removed the GNOME prefix, Bonobo + doesn't use it, and it just adds pointless typing. Added + getmessage and appendmessage interaces. Moved listeners to each + object rather than one global listener. + 2005-05-24 Not Zed <NotZed@Ximian.com> * Lots more work. Now implements a full listener interface. diff --git a/plugins/mail-remote/Evolution-DataServer-Mail.idl b/plugins/mail-remote/Evolution-DataServer-Mail.idl index ffd32f8594..4d6b0ad43d 100644 --- a/plugins/mail-remote/Evolution-DataServer-Mail.idl +++ b/plugins/mail-remote/Evolution-DataServer-Mail.idl @@ -10,7 +10,6 @@ #include <Bonobo.idl> -module GNOME { module Evolution { module Mail { exception NOT_SUPPORTED { @@ -18,7 +17,7 @@ module Mail { }; exception FAILED { - string why; +// string why; }; interface Folder; @@ -113,43 +112,43 @@ module Mail { }; typedef sequence <FolderChange> FolderChanges; - interface Listener : Bonobo::Unknown { - oneway void sessionChanged(in Session session, in SessionChanges changes); - // maybe folder/store should be folderinfo/storeinfo? - oneway void storeChanged(in Session session, in Store store, in StoreChanges changes); - oneway void folderChanged(in Session session, in Store store, in Folder folder, in FolderChanges changes); + /* ********************************************************************** */ + /* listeners */ + + interface SessionListener : Bonobo::Unknown { + oneway void changed(in Session session, in SessionChanges changes); + + oneway void shutdown(in Session session); + }; + + interface StoreListener : Bonobo::Unknown { + oneway void changed(in Store store, in StoreChanges changes); + }; - // session is closed/exited? - //oneway void closed(); + interface FolderListener : Bonobo::Unknown { + oneway void changed(in Folder folder, in FolderChanges changes); }; /* ********************************************************************** */ - interface Session : Bonobo::Unknown { - // Flags to pass to addListener - const long SESSION_ADDED = 1 << 0; - const long SESSION_CHANGED = 1 << 1; - const long SESSION_REMOVED = 1 << 2; - const long STORE_ADDED = 1 << 3; - const long STORE_CHANGED = 1 << 4; - const long STORE_REMOVED = 1 << 5; - const long FOLDER_ADDED = 1 << 6; - const long FOLDER_CHANGED = 1 << 7; - const long FOLDER_REMOVED = 1 << 8; +// If this is done, then Session shouldn't have add/removeListener anymore +// interface Factory : Bonobo::Unknown { +// Session getSession(in string base, in SessionListener listener); +// }; + interface Session : Bonobo::Unknown { boolean getProperties(in PropertyNames names, out Properties props); - StoreInfos getStores(in string pattern); + StoreInfos getStores(in string pattern, in StoreListener listener); - /* flags defines what to listen to */ - void addListener(in Listener listener, in long flags); - void removeListener(in Listener listener); + void addListener(in SessionListener listener); + void removeListener(in SessionListener listener); }; interface Store : Bonobo::Unknown { boolean getProperties(in PropertyNames names, out Properties props); - FolderInfos getFolders(in string pattern) + FolderInfos getFolders(in string pattern, in FolderListener listener) raises (NOT_SUPPORTED, FAILED); void sendMessage(in Bonobo::Stream msg) @@ -157,21 +156,28 @@ module Mail { }; interface MessageIterator : Bonobo::Unknown { - MessageInfos next(in long limit); + MessageInfos next(in long limit) + raises (FAILED); + + void dispose(); }; interface Folder : Bonobo::Unknown { boolean getProperties(in PropertyNames names, out Properties props); - MessageIterator getMessages(in string pattern); + MessageIterator getMessages(in string pattern) + raises (NOT_SUPPORTED, FAILED); - void changeMessages(in MessageInfoSets infos); + void changeMessages(in MessageInfoSets infos) + raises (NOT_SUPPORTED); -// Bonobo::Stream getMessage(in string uid); -// void appendMessage(in MessageInfoSet info, in Bonobo::Stream msg); + Bonobo::Stream getMessage(in string uid) + raises (NOT_SUPPORTED, FAILED); + + void appendMessage(in MessageInfoSet info, in Bonobo::Stream msg) + raises (NOT_SUPPORTED, FAILED); }; }; }; -}; #endif diff --git a/plugins/mail-remote/Makefile.am b/plugins/mail-remote/Makefile.am index 8a43ea3473..8214ce36f1 100644 --- a/plugins/mail-remote/Makefile.am +++ b/plugins/mail-remote/Makefile.am @@ -15,16 +15,20 @@ liborg_gnome_evolution_mail_remote_la_SOURCES = \ e-corba-utils.h \ evolution-mail-folder.c \ evolution-mail-folder.h \ - evolution-mail-listener.c \ - evolution-mail-listener.h \ + evolution-mail-folderlistener.c \ + evolution-mail-folderlistener.h \ + evolution-mail-marshal.c \ + evolution-mail-marshal.h \ evolution-mail-messageiterator.c \ evolution-mail-messageiterator.h \ evolution-mail-session.c \ evolution-mail-session.h \ + evolution-mail-sessionlistener.c \ + evolution-mail-sessionlistener.h \ evolution-mail-store.c \ evolution-mail-store.h \ - evolution-mail-marshal.c \ - evolution-mail-marshal.h \ + evolution-mail-storelistener.c \ + evolution-mail-storelistener.h \ mail-remote.c liborg_gnome_evolution_mail_remote_la_LDFLAGS = -module -avoid-version @@ -34,7 +38,9 @@ client_SOURCES = \ client_LDADD = \ $(EVOLUTION_MAIL_LIBS) \ - evolution-mail-listener.o \ + evolution-mail-sessionlistener.o \ + evolution-mail-storelistener.o \ + evolution-mail-folderlistener.o \ evolution-mail-marshal.o \ Evolution-DataServer-Mail-common.o \ Evolution-DataServer-Mail-stubs.o \ diff --git a/plugins/mail-remote/client.c b/plugins/mail-remote/client.c index fae7401a36..0db3212426 100644 --- a/plugins/mail-remote/client.c +++ b/plugins/mail-remote/client.c @@ -6,17 +6,21 @@ #include "Evolution-DataServer-Mail.h" -#include "evolution-mail-listener.h" +#include "evolution-mail-sessionlistener.h" +#include "evolution-mail-storelistener.h" +#include "evolution-mail-folderlistener.h" #include <camel/camel-folder.h> -static EvolutionMailListener *listener; +static EvolutionMailSessionListener *listener_sess; +static EvolutionMailStoreListener *listener_store; +static EvolutionMailFolderListener *listener_folder; -static GNOME_Evolution_Mail_Session +static Evolution_Mail_Session get_session(void) { char *path, *ior; - GNOME_Evolution_Mail_Session sess = NULL; + Evolution_Mail_Session sess = NULL; CORBA_Environment ev = { 0 }; /* The new-improved bonobo-activation ... */ @@ -28,8 +32,10 @@ get_session(void) } if (sess != CORBA_OBJECT_NIL) { - listener = evolution_mail_listener_new(); - GNOME_Evolution_Mail_Session_addListener(sess, bonobo_object_corba_objref((BonoboObject *)listener), 0, &ev); + listener_sess = evolution_mail_sessionlistener_new(); + listener_store = evolution_mail_storelistener_new(); + listener_folder = evolution_mail_folderlistener_new(); + Evolution_Mail_Session_addListener(sess, bonobo_object_corba_objref((BonoboObject *)listener_sess), &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("AddListener failed: %s\n", ev._id); CORBA_exception_free(&ev); @@ -40,13 +46,13 @@ get_session(void) } static void -list_folder(GNOME_Evolution_Mail_Folder folder) +list_folder(Evolution_Mail_Folder folder) { CORBA_Environment ev = { 0 }; - GNOME_Evolution_Mail_MessageIterator iter; + Evolution_Mail_MessageIterator iter; int more, total = 0; - iter = GNOME_Evolution_Mail_Folder_getMessages(folder, "", &ev); + iter = Evolution_Mail_Folder_getMessages(folder, "", &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("getmessages failed: %s\n", ev._id); CORBA_exception_free(&ev); @@ -54,10 +60,10 @@ list_folder(GNOME_Evolution_Mail_Folder folder) } do { - GNOME_Evolution_Mail_MessageInfos *msgs; + Evolution_Mail_MessageInfos *msgs; int i; - msgs = GNOME_Evolution_Mail_MessageIterator_next(iter, 50, &ev); + msgs = Evolution_Mail_MessageIterator_next(iter, 50, &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("msgs.next(): %s\n", ev._id); CORBA_exception_free(&ev); @@ -66,19 +72,19 @@ list_folder(GNOME_Evolution_Mail_Folder folder) /* NB: set the first 50 messages in private to unseen */ if (total == 0) { - GNOME_Evolution_Mail_MessageInfoSets *changes; + Evolution_Mail_MessageInfoSets *changes; int j; - changes = GNOME_Evolution_Mail_MessageInfoSets__alloc(); + changes = Evolution_Mail_MessageInfoSets__alloc(); changes->_length = msgs->_length; changes->_maximum = msgs->_maximum; - changes->_buffer = GNOME_Evolution_Mail_MessageInfoSets_allocbuf(changes->_maximum); + changes->_buffer = Evolution_Mail_MessageInfoSets_allocbuf(changes->_maximum); for (j=0;j<msgs->_length;j++) { changes->_buffer[j].uid = CORBA_string_dup(msgs->_buffer[j].uid); changes->_buffer[j].flagSet = 0; changes->_buffer[j].flagMask = CAMEL_MESSAGE_SEEN; } - GNOME_Evolution_Mail_Folder_changeMessages(folder, changes, &ev); + Evolution_Mail_Folder_changeMessages(folder, changes, &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("changemessages failed: %s\n", ev._id); CORBA_exception_free(&ev); @@ -96,22 +102,47 @@ list_folder(GNOME_Evolution_Mail_Folder folder) CORBA_free(msgs); } while (more); + Evolution_Mail_MessageIterator_dispose(iter, &ev); CORBA_Object_release(iter, &ev); printf("Got %d messages total\n", total); } +static void +add_message(Evolution_Mail_Folder folder, const char *msg) +{ + BonoboObject *mem; + CORBA_Environment ev = { 0 }; + Evolution_Mail_MessageInfoSet mis = { 0 }; + + mis.uid = ""; + mis.flagSet = CAMEL_MESSAGE_SEEN; + mis.flagMask = CAMEL_MESSAGE_SEEN; + + mem = bonobo_stream_mem_create(msg, strlen(msg), TRUE, FALSE); + + printf("attempt send mail to store\n"); + Evolution_Mail_Folder_appendMessage(folder, &mis, bonobo_object_corba_objref(mem), &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + printf("appendmessage failed: %s\n", ev._id); + CORBA_exception_free(&ev); + CORBA_exception_init(&ev); + } + + bonobo_object_unref(mem); +} + static int domain(void *data) { - GNOME_Evolution_Mail_Session sess; - GNOME_Evolution_Mail_StoreInfos *stores; - GNOME_Evolution_Mail_FolderInfos *folders; + Evolution_Mail_Session sess; + Evolution_Mail_StoreInfos *stores; + Evolution_Mail_FolderInfos *folders; CORBA_Environment ev = { 0 }; int i, j, f; sess = get_session(); - stores = GNOME_Evolution_Mail_Session_getStores(sess, "", &ev); + stores = Evolution_Mail_Session_getStores(sess, "", bonobo_object_corba_objref((BonoboObject *)listener_store), &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("getStores failed: %s\n", ev._id); CORBA_exception_free(&ev); @@ -122,22 +153,22 @@ static int domain(void *data) printf("Got %d stores\n", stores->_length); for (i=0;i<stores->_length;i++) { #if 0 - GNOME_Evolution_Mail_PropertyName namesarray[] = { + Evolution_Mail_PropertyName namesarray[] = { "name", "uid" }; - GNOME_Evolution_Mail_PropertyNames names = { + Evolution_Mail_PropertyNames names = { 2, 2, namesarray, FALSE, }; - GNOME_Evolution_Mail_Properties *props; + Evolution_Mail_Properties *props; #endif - GNOME_Evolution_Mail_Store store = stores->_buffer[i].store; + Evolution_Mail_Store store = stores->_buffer[i].store; printf("store %p '%s' uid '%s'\n", store, stores->_buffer[i].name, stores->_buffer[i].uid); #if 0 - GNOME_Evolution_Mail_Store_getProperties(store, &names, &props, &ev); + Evolution_Mail_Store_getProperties(store, &names, &props, &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("getProperties failed\n"); return 1; @@ -167,7 +198,7 @@ static int domain(void *data) mem = bonobo_stream_mem_create(msg, strlen(msg), TRUE, FALSE); printf("attempt send mail to store\n"); - GNOME_Evolution_Mail_Store_sendMessage(store, bonobo_object_corba_objref(mem), &ev); + Evolution_Mail_Store_sendMessage(store, bonobo_object_corba_objref(mem), &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("sendmessage failed: %s\n", ev._id); CORBA_exception_free(&ev); @@ -178,7 +209,7 @@ static int domain(void *data) } #endif - folders = GNOME_Evolution_Mail_Store_getFolders(store, "", &ev); + folders = Evolution_Mail_Store_getFolders(store, "", bonobo_object_corba_objref((BonoboObject *)listener_folder), &ev); if (ev._major != CORBA_NO_EXCEPTION) { printf("getfolders failed\n"); /* FIXME: leaks ex data? */ @@ -190,7 +221,13 @@ static int domain(void *data) for (f = 0; f<folders->_length;f++) { if (!strcmp(folders->_buffer[f].full_name, "Private")) { + const char *msg = "To: notzed@novell.com\r\n" + "Subject: This is a test append from client\r\n" + "\r\n" + "Blah blah, test appended message!\r\n"; + list_folder(folders->_buffer[f].folder); + add_message(folders->_buffer[f].folder, msg); } } diff --git a/plugins/mail-remote/e-corba-utils.c b/plugins/mail-remote/e-corba-utils.c index 545ac425e3..2396f52d70 100644 --- a/plugins/mail-remote/e-corba-utils.c +++ b/plugins/mail-remote/e-corba-utils.c @@ -5,9 +5,24 @@ #include "evolution-mail-folder.h" #include <camel/camel-folder-summary.h> +#include <camel/camel-stream-mem.h> +#include <camel/camel-mime-message.h> + +#include <bonobo/bonobo-stream-memory.h> + +#include <libedataserver/e-msgport.h> + +CORBA_char * +e_corba_strdup(const char *v) +{ + if (v) + return CORBA_string_dup(v); + else + return CORBA_string_dup(""); +} void -e_mail_property_set_string(GNOME_Evolution_Mail_Property *prop, const char *name, const char *val) +e_mail_property_set_string(Evolution_Mail_Property *prop, const char *name, const char *val) { prop->value._release = CORBA_TRUE; prop->value._type = TC_CORBA_string; @@ -17,7 +32,7 @@ e_mail_property_set_string(GNOME_Evolution_Mail_Property *prop, const char *name } void -e_mail_property_set_null(GNOME_Evolution_Mail_Property *prop, const char *name) +e_mail_property_set_null(Evolution_Mail_Property *prop, const char *name) { prop->value._release = CORBA_TRUE; prop->value._type = TC_null; @@ -25,7 +40,7 @@ e_mail_property_set_null(GNOME_Evolution_Mail_Property *prop, const char *name) } void -e_mail_storeinfo_set_store(GNOME_Evolution_Mail_StoreInfo *si, EvolutionMailStore *store) +e_mail_storeinfo_set_store(Evolution_Mail_StoreInfo *si, EvolutionMailStore *store) { si->name = CORBA_string_dup(evolution_mail_store_get_name(store)); si->uid = CORBA_string_dup(evolution_mail_store_get_uid(store)); @@ -33,23 +48,23 @@ e_mail_storeinfo_set_store(GNOME_Evolution_Mail_StoreInfo *si, EvolutionMailStor } void -e_mail_messageinfo_set_message(GNOME_Evolution_Mail_MessageInfo *mi, CamelMessageInfo *info) +e_mail_messageinfo_set_message(Evolution_Mail_MessageInfo *mi, CamelMessageInfo *info) { const CamelTag *tag; const CamelFlag *flag; int i; mi->uid = CORBA_string_dup(camel_message_info_uid(info)); - mi->subject = CORBA_string_dup(camel_message_info_subject(info)); - mi->to = CORBA_string_dup(camel_message_info_to(info)); - mi->from = CORBA_string_dup(camel_message_info_from(info)); + mi->subject = e_corba_strdup(camel_message_info_subject(info)); + mi->to = e_corba_strdup(camel_message_info_to(info)); + mi->from = e_corba_strdup(camel_message_info_from(info)); mi->flags = camel_message_info_flags(info); flag = camel_message_info_user_flags(info); mi->userFlags._maximum = camel_flag_list_size((CamelFlag **)&flag); mi->userFlags._length = mi->userFlags._maximum; if (mi->userFlags._maximum) { - mi->userFlags._buffer = GNOME_Evolution_Mail_UserFlags_allocbuf(mi->userFlags._maximum); + mi->userFlags._buffer = Evolution_Mail_UserFlags_allocbuf(mi->userFlags._maximum); CORBA_sequence_set_release(&mi->userFlags, CORBA_TRUE); for (i=0;flag;flag = flag->next,i++) { @@ -62,7 +77,7 @@ e_mail_messageinfo_set_message(GNOME_Evolution_Mail_MessageInfo *mi, CamelMessag mi->userTags._maximum = camel_tag_list_size((CamelTag **)&tag); mi->userTags._length = mi->userTags._maximum; if (mi->userTags._maximum) { - mi->userTags._buffer = GNOME_Evolution_Mail_UserTags_allocbuf(mi->userTags._maximum); + mi->userTags._buffer = Evolution_Mail_UserTags_allocbuf(mi->userTags._maximum); CORBA_sequence_set_release(&mi->userFlags, CORBA_TRUE); for (i=0;tag;tag = tag->next,i++) { @@ -74,8 +89,24 @@ e_mail_messageinfo_set_message(GNOME_Evolution_Mail_MessageInfo *mi, CamelMessag } } +CamelMessageInfo * +e_mail_messageinfoset_to_info(const Evolution_Mail_MessageInfoSet *mi) +{ + CamelMessageInfo *info; + int i; + + info = camel_message_info_new(NULL); + camel_message_info_set_flags(info, mi->flagSet, mi->flagMask); + for (i=0;i<mi->userFlagSet._length;i++) + camel_message_info_set_user_flag(info, mi->userFlagSet._buffer[i], TRUE); + for (i=0;i<mi->userTags._length;i++) + camel_message_info_set_user_tag(info, mi->userTags._buffer[i].name, mi->userTags._buffer[i].value); + + return info; +} + void -e_mail_folderinfo_set_folder(GNOME_Evolution_Mail_FolderInfo *fi, EvolutionMailFolder *emf) +e_mail_folderinfo_set_folder(Evolution_Mail_FolderInfo *fi, EvolutionMailFolder *emf) { fi->name = CORBA_string_dup(emf->name); fi->full_name = CORBA_string_dup(emf->full_name); @@ -111,3 +142,140 @@ e_stream_bonobo_to_camel(Bonobo_Stream in, CamelStream *out) return 0; } +CamelMimeMessage * +e_stream_bonobo_to_message(Bonobo_Stream in) +{ + CamelStream *mem; + CamelMimeMessage *msg; + + mem = camel_stream_mem_new(); + if (e_stream_bonobo_to_camel(in, mem) == -1) + return NULL; + + msg = camel_mime_message_new(); + if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, mem) == -1) { + camel_object_unref(msg); + msg = NULL; + } + camel_object_unref(mem); + + return msg; +} + +Bonobo_Stream +e_stream_message_to_bonobo(CamelMimeMessage *msg) +{ + CamelStreamMem *mem; + BonoboObject *bmem; + + /* didn't say it was going to be efficient ... */ + + mem = (CamelStreamMem *)camel_stream_mem_new(); + camel_data_wrapper_write_to_stream((CamelDataWrapper *)msg, (CamelStream *)mem); + bmem = bonobo_stream_mem_create(mem->buffer->data, mem->buffer->len, TRUE, FALSE); + camel_object_unref(mem); + + return bonobo_object_corba_objref((BonoboObject *)bmem); +} + +struct _e_mail_listener { + struct _e_mail_listener *next; + struct _e_mail_listener *prev; + + CORBA_Object listener; +}; + +static struct _e_mail_listener * +eml_find(struct _EDList *list, CORBA_Object listener) +{ + struct _e_mail_listener *l, *n; + + l = (struct _e_mail_listener *)list->head; + n = l->next; + while (n) { + if (l->listener == listener) + return l; + l = n; + n = n->next; + } + + return NULL; +} + +static void +eml_remove(struct _e_mail_listener *l) +{ + CORBA_Environment ev = { 0 }; + + e_dlist_remove((EDListNode *)l); + CORBA_Object_release(l->listener, &ev); + g_free(l); + + if (ev._major != CORBA_NO_EXCEPTION) + CORBA_exception_free(&ev); +} + +void e_mail_listener_add(struct _EDList *list, CORBA_Object listener) +{ + struct _e_mail_listener *l; + CORBA_Environment ev = { 0 }; + + if (eml_find(list, listener) != NULL) + return; + + listener = CORBA_Object_duplicate(listener, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + CORBA_exception_free(&ev); + } else { + l = g_malloc(sizeof(*l)); + l->listener = listener; + e_dlist_addtail(list, (EDListNode *)l); + } +} + +gboolean e_mail_listener_remove(struct _EDList *list, CORBA_Object listener) +{ + struct _e_mail_listener *l; + + l = eml_find(list, listener); + if (l) + eml_remove(l); + + return !e_dlist_empty(list); +} + +gboolean e_mail_listener_emit(struct _EDList *list, EMailListenerChanged emit, CORBA_Object source, void *changes) +{ + struct _e_mail_listener *l, *n; + CORBA_Environment ev = { 0 }; + + l = (struct _e_mail_listener *)list->head; + n = l->next; + while (n) { + emit(l->listener, source, changes, &ev); + if (ev._major != CORBA_NO_EXCEPTION) { + printf("emit changed failed '%s', removing listener\n", ev._id); + CORBA_exception_free(&ev); + eml_remove(l); + } + l = n; + n = n->next; + } + + return !e_dlist_empty(list); +} + +void e_mail_listener_free(struct _EDList *list) +{ + struct _e_mail_listener *l, *n; + + l = (struct _e_mail_listener *)list->head; + n = l->next; + while (n) { + eml_remove(l); + + l = n; + n = n->next; + } +} + diff --git a/plugins/mail-remote/e-corba-utils.h b/plugins/mail-remote/e-corba-utils.h index b72e8043dd..cba1fb49ac 100644 --- a/plugins/mail-remote/e-corba-utils.h +++ b/plugins/mail-remote/e-corba-utils.h @@ -8,14 +8,28 @@ struct _EvolutionMailStore; struct _EvolutionMailFolder; struct _CamelMessageInfo; struct _CamelStream; +struct _CamelMimeMessage; -void e_mail_property_set_string(GNOME_Evolution_Mail_Property *prop, const char *name, const char *val); -void e_mail_property_set_null(GNOME_Evolution_Mail_Property *prop, const char *name); +void e_mail_property_set_string(Evolution_Mail_Property *prop, const char *name, const char *val); +void e_mail_property_set_null(Evolution_Mail_Property *prop, const char *name); -void e_mail_storeinfo_set_store(GNOME_Evolution_Mail_StoreInfo *si, struct _EvolutionMailStore *store); -void e_mail_folderinfo_set_folder(GNOME_Evolution_Mail_FolderInfo *fi, struct _EvolutionMailFolder *emf); -void e_mail_messageinfo_set_message(GNOME_Evolution_Mail_MessageInfo *mi, struct _CamelMessageInfo *info); +void e_mail_storeinfo_set_store(Evolution_Mail_StoreInfo *si, struct _EvolutionMailStore *store); +void e_mail_folderinfo_set_folder(Evolution_Mail_FolderInfo *fi, struct _EvolutionMailFolder *emf); + +void e_mail_messageinfo_set_message(Evolution_Mail_MessageInfo *mi, struct _CamelMessageInfo *info); +struct _CamelMessageInfo *e_mail_messageinfoset_to_info(const Evolution_Mail_MessageInfoSet *mi); int e_stream_bonobo_to_camel(Bonobo_Stream in, struct _CamelStream *out); +struct _CamelMimeMessage *e_stream_bonobo_to_message(Bonobo_Stream in); +Bonobo_Stream e_stream_message_to_bonobo(struct _CamelMimeMessage *msg); + +struct _EDList; + +typedef void (*EMailListenerChanged)(CORBA_Object, CORBA_Object, void *changes, CORBA_Environment *); + +void e_mail_listener_add(struct _EDList *list, CORBA_Object listener); +gboolean e_mail_listener_remove(struct _EDList *list, CORBA_Object listener); +gboolean e_mail_listener_emit(struct _EDList *list, EMailListenerChanged emit, CORBA_Object source, void *changes); +void e_mail_listener_free(struct _EDList *list); #endif /* !_E_CORBA_UTILS_H */ diff --git a/plugins/mail-remote/evolution-mail-folder.c b/plugins/mail-remote/evolution-mail-folder.c index c121c3bf3f..a64881015e 100644 --- a/plugins/mail-remote/evolution-mail-folder.c +++ b/plugins/mail-remote/evolution-mail-folder.c @@ -37,6 +37,8 @@ #include <camel/camel-store.h> #include <camel/camel-folder.h> +#include <libedataserver/e-msgport.h> + #include "e-corba-utils.h" #define PARENT_TYPE bonobo_object_get_type () @@ -49,6 +51,8 @@ struct _EvolutionMailFolderPrivate { CamelFolder *folder; guint32 folder_changed; + + EDList listeners; }; /* GObject methods */ @@ -64,6 +68,8 @@ impl_dispose (GObject *object) p->folder = NULL; } + e_mail_listener_free(&p->listeners); + (* G_OBJECT_CLASS (parent_class)->dispose) (object); } @@ -74,6 +80,7 @@ impl_finalize (GObject *object) struct _EvolutionMailFolderPrivate *p = _PRIVATE(object); p = p; + g_warning("EvolutionMailFolder is finalised!\n"); g_free(emf->full_name); @@ -86,24 +93,24 @@ impl_finalize (GObject *object) static CORBA_boolean impl_getProperties(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_PropertyNames* names, - GNOME_Evolution_Mail_Properties **propsp, + const Evolution_Mail_PropertyNames* names, + Evolution_Mail_Properties **propsp, CORBA_Environment * ev) { EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant); int i; - GNOME_Evolution_Mail_Properties *props; + Evolution_Mail_Properties *props; CORBA_boolean ok = CORBA_TRUE; - *propsp = props = GNOME_Evolution_Mail_Properties__alloc(); + *propsp = props = Evolution_Mail_Properties__alloc(); props->_length = names->_length; props->_maximum = props->_length; - props->_buffer = GNOME_Evolution_Mail_Properties_allocbuf(props->_maximum); + props->_buffer = Evolution_Mail_Properties_allocbuf(props->_maximum); CORBA_sequence_set_release(props, CORBA_TRUE); for (i=0;i<names->_length;i++) { const CORBA_char *name = names->_buffer[i]; - GNOME_Evolution_Mail_Property *prop = &props->_buffer[i]; + Evolution_Mail_Property *prop = &props->_buffer[i]; prop->value._release = CORBA_TRUE; @@ -124,22 +131,17 @@ impl_getProperties(PortableServer_Servant _servant, return ok; } -static GNOME_Evolution_Mail_MessageIterator +static Evolution_Mail_MessageIterator impl_getMessages(PortableServer_Servant _servant, const CORBA_char * pattern, CORBA_Environment * ev) { EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant); struct _CamelFolder *folder; EvolutionMailMessageIterator *emi; - GNOME_Evolution_Mail_MessageIterator iter; + Evolution_Mail_MessageIterator iter; folder = evolution_mail_folder_get_folder(emf); if (folder == NULL) { - GNOME_Evolution_Mail_FAILED *x; - - x = GNOME_Evolution_Mail_FAILED__alloc(); - x->why = CORBA_string_dup("Unable to open folder"); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, x); - + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); return CORBA_OBJECT_NIL; } @@ -154,7 +156,7 @@ impl_getMessages(PortableServer_Servant _servant, const CORBA_char * pattern, CO } static void -impl_changeMessages(PortableServer_Servant _servant, const GNOME_Evolution_Mail_MessageInfoSets *infos, CORBA_Environment * ev) +impl_changeMessages(PortableServer_Servant _servant, const Evolution_Mail_MessageInfoSets *infos, CORBA_Environment * ev) { EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant); struct _CamelFolder *folder; @@ -162,18 +164,14 @@ impl_changeMessages(PortableServer_Servant _servant, const GNOME_Evolution_Mail_ folder = evolution_mail_folder_get_folder(emf); if (folder == NULL) { - GNOME_Evolution_Mail_FAILED *x; - - x = GNOME_Evolution_Mail_FAILED__alloc(); - x->why = CORBA_string_dup("Unable to open folder"); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, x); + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); return; } camel_folder_freeze(folder); for (i=0;i<infos->_length;i++) { CamelMessageInfo *mi; - GNOME_Evolution_Mail_MessageInfoSet *mis = &infos->_buffer[i]; + Evolution_Mail_MessageInfoSet *mis = &infos->_buffer[i]; mi = camel_folder_get_message_info(folder, mis->uid); if (mi == NULL) @@ -196,12 +194,82 @@ impl_changeMessages(PortableServer_Servant _servant, const GNOME_Evolution_Mail_ camel_object_unref(folder); } +static Bonobo_Stream +impl_getMessage(PortableServer_Servant _servant, const CORBA_char * uid, CORBA_Environment *ev) +{ + EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant); + struct _CamelFolder *folder; + CamelMimeMessage *msg; + Bonobo_Stream out; + CamelException ex = { 0 }; + + folder = evolution_mail_folder_get_folder(emf); + if (folder == NULL) + goto fail; + + msg = camel_folder_get_message(folder, uid, &ex); + if (msg == NULL) + goto fail; + + out = e_stream_message_to_bonobo(msg); + camel_object_unref(msg); + + return out; + +fail: + if (folder) + camel_object_unref(folder); + + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); + camel_exception_clear(&ex); + + return CORBA_OBJECT_NIL; +} + +static void +impl_appendMessage(PortableServer_Servant _servant, const Evolution_Mail_MessageInfoSet*mi, const Bonobo_Stream message, CORBA_Environment *ev) +{ + EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant); + struct _CamelFolder *folder; + CamelMimeMessage *msg = NULL; + CamelMessageInfo *info; + CamelException ex = { 0 }; + + folder = evolution_mail_folder_get_folder(emf); + if (folder == NULL) + goto fail3; + + msg = e_stream_bonobo_to_message(message); + if (msg == NULL) + goto fail2; + + info = e_mail_messageinfoset_to_info(mi); + camel_folder_append_message(folder, msg, info, NULL, &ex); + camel_message_info_free(info); + + if (camel_exception_is_set(&ex)) + goto fail; + + camel_object_unref(msg); + camel_object_unref(folder); + + return; + +fail: + camel_object_unref(msg); +fail2: + camel_object_unref(folder); +fail3: + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); + camel_exception_clear(&ex); +} + /* Initialization */ static void evolution_mail_folder_class_init (EvolutionMailFolderClass *klass) { - POA_GNOME_Evolution_Mail_Folder__epv *epv = &klass->epv; + POA_Evolution_Mail_Folder__epv *epv = &klass->epv; GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); @@ -209,6 +277,8 @@ evolution_mail_folder_class_init (EvolutionMailFolderClass *klass) epv->getProperties = impl_getProperties; epv->getMessages = impl_getMessages; epv->changeMessages = impl_changeMessages; + epv->getMessage = impl_getMessage; + epv->appendMessage = impl_appendMessage; object_class->dispose = impl_dispose; object_class->finalize = impl_finalize; @@ -217,11 +287,15 @@ evolution_mail_folder_class_init (EvolutionMailFolderClass *klass) } static void -evolution_mail_folder_init(EvolutionMailFolder *component, EvolutionMailFolderClass *klass) +evolution_mail_folder_init(EvolutionMailFolder *emf, EvolutionMailFolderClass *klass) { + struct _EvolutionMailFolderPrivate *p = _PRIVATE(emf); + + bonobo_object_set_immortal((BonoboObject *)emf, TRUE); + e_dlist_init(&p->listeners); } -BONOBO_TYPE_FUNC_FULL (EvolutionMailFolder, GNOME_Evolution_Mail_Folder, PARENT_TYPE, evolution_mail_folder) +BONOBO_TYPE_FUNC_FULL (EvolutionMailFolder, Evolution_Mail_Folder, PARENT_TYPE, evolution_mail_folder) EvolutionMailFolder * evolution_mail_folder_new(EvolutionMailStore *ems, const char *name, const char *full_name) @@ -237,13 +311,13 @@ evolution_mail_folder_new(EvolutionMailStore *ems, const char *name, const char } static void -emf_set_change(GNOME_Evolution_Mail_FolderChange *change, GNOME_Evolution_Mail_ChangeType how, CamelFolder *folder, GPtrArray *uids) +emf_set_change(Evolution_Mail_FolderChange *change, Evolution_Mail_ChangeType how, CamelFolder *folder, GPtrArray *uids) { int total = 0, i; change->type = how; change->messages._maximum = uids->len; - change->messages._buffer = GNOME_Evolution_Mail_MessageInfos_allocbuf(uids->len); + change->messages._buffer = Evolution_Mail_MessageInfos_allocbuf(uids->len); for (i=0;i<uids->len;i++) { CamelMessageInfo *info = camel_folder_get_message_info(folder, uids->pdata[i]); @@ -267,40 +341,30 @@ emf_folder_changed(CamelObject *o, void *d, void *data) CamelFolder *folder = (CamelFolder *)o; CamelFolderChangeInfo *ci = d; int count = 0; - GNOME_Evolution_Mail_FolderChanges *changes; - CORBA_long flags; - - flags = evolution_mail_session_listening(emf->store->session); - - if ((flags & (GNOME_Evolution_Mail_Session_FOLDER_ADDED|GNOME_Evolution_Mail_Session_FOLDER_CHANGED|GNOME_Evolution_Mail_Session_FOLDER_REMOVED)) == 0) - return; + Evolution_Mail_FolderChanges *changes; - changes = GNOME_Evolution_Mail_FolderChanges__alloc(); + changes = Evolution_Mail_FolderChanges__alloc(); changes->_maximum = 3; - changes->_buffer = GNOME_Evolution_Mail_FolderChanges_allocbuf(3); + changes->_buffer = Evolution_Mail_FolderChanges_allocbuf(3); CORBA_sequence_set_release(changes, TRUE); /* could be a race if a new listener is added */ - if (ci->uid_added->len && (flags & GNOME_Evolution_Mail_Session_FOLDER_ADDED)) { - emf_set_change(&changes->_buffer[count], GNOME_Evolution_Mail_ADDED, folder, ci->uid_added); + if (ci->uid_added->len) { + emf_set_change(&changes->_buffer[count], Evolution_Mail_ADDED, folder, ci->uid_added); count++; } - if (ci->uid_removed->len && (flags & GNOME_Evolution_Mail_Session_FOLDER_REMOVED)) { - emf_set_change(&changes->_buffer[count], GNOME_Evolution_Mail_REMOVED, folder, ci->uid_removed); + if (ci->uid_removed->len) { + emf_set_change(&changes->_buffer[count], Evolution_Mail_REMOVED, folder, ci->uid_removed); count++; } - if (ci->uid_changed->len && (flags & GNOME_Evolution_Mail_Session_FOLDER_CHANGED)) { - emf_set_change(&changes->_buffer[count], GNOME_Evolution_Mail_CHANGED, folder, ci->uid_changed); + if (ci->uid_changed->len) { + emf_set_change(&changes->_buffer[count], Evolution_Mail_CHANGED, folder, ci->uid_changed); count++; } changes->_length = count; - evolution_mail_session_folder_changed(emf->store->session, - bonobo_object_corba_objref((BonoboObject *)emf->store), - bonobo_object_corba_objref((BonoboObject *)emf), - changes); - + evolution_mail_folder_changed(emf, changes); CORBA_free(changes); } @@ -330,3 +394,22 @@ struct _CamelFolder *evolution_mail_folder_get_folder(EvolutionMailFolder *emf) return p->folder; } + +void evolution_mail_folder_addlistener(EvolutionMailFolder *emf, Evolution_Mail_FolderListener listener) +{ + struct _EvolutionMailFolderPrivate *p = _PRIVATE(emf); + + /* FIXME: locking */ + e_mail_listener_add(&p->listeners, listener); +} + +void +evolution_mail_folder_changed(EvolutionMailFolder *emf, Evolution_Mail_FolderChanges *changes) +{ + struct _EvolutionMailFolderPrivate *p = _PRIVATE(emf); + + if (!e_mail_listener_emit(&p->listeners, (EMailListenerChanged)Evolution_Mail_FolderListener_changed, + bonobo_object_corba_objref((BonoboObject *)emf), changes)) { + printf("No more listeners for folder, could dispose store object now\n"); + } +} diff --git a/plugins/mail-remote/evolution-mail-folder.h b/plugins/mail-remote/evolution-mail-folder.h index 398d3f2d42..74320f4d78 100644 --- a/plugins/mail-remote/evolution-mail-folder.h +++ b/plugins/mail-remote/evolution-mail-folder.h @@ -48,13 +48,16 @@ struct _EvolutionMailFolder { struct _EvolutionMailFolderClass { BonoboObjectClass parent_class; - POA_GNOME_Evolution_Mail_Folder__epv epv; + POA_Evolution_Mail_Folder__epv epv; }; GType evolution_mail_folder_get_type(void); EvolutionMailFolder *evolution_mail_folder_new(struct _EvolutionMailStore *ems, const char *name, const char *full_name); +void evolution_mail_folder_addlistener(EvolutionMailFolder *emf, Evolution_Mail_FolderListener listener); +void evolution_mail_folder_changed(EvolutionMailFolder *emf, Evolution_Mail_FolderChanges *changes); + struct _CamelFolder *evolution_mail_folder_get_folder(EvolutionMailFolder *emf); #endif /* _EVOLUTION_MAIL_FOLDER_H_ */ diff --git a/plugins/mail-remote/evolution-mail-folderlistener.c b/plugins/mail-remote/evolution-mail-folderlistener.c new file mode 100644 index 0000000000..ba758d9483 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-folderlistener.c @@ -0,0 +1,155 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Michael Zucchi <notzed@novell.com> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <string.h> +#include <bonobo/bonobo-i18n.h> +#include <bonobo/bonobo-exception.h> +#include "evolution-mail-folderlistener.h" + +#include "evolution-mail-marshal.h" + +#define PARENT_TYPE bonobo_object_get_type () + +static BonoboObjectClass *parent_class = NULL; + +#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_folderlistener_get_type())) + +struct _EvolutionMailFolderListenerPrivate { + int dummy; +}; + +enum { + EML_CHANGED, + EML_LAST_SIGNAL +}; + +static guint eml_signals[EML_LAST_SIGNAL]; + +/* GObject methods */ + +static void +impl_dispose (GObject *object) +{ + struct _EvolutionMailFolderListenerPrivate *p = _PRIVATE(object); + + p = p; + + (* G_OBJECT_CLASS (parent_class)->dispose) (object); +} + +static void +impl_finalize (GObject *object) +{ + printf("EvolutionMailFolderListener finalised!\n"); + + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +/* Evolution.Mail.Listener */ +static const char *change_type_name(int type) +{ + switch (type) { + case Evolution_Mail_ADDED: + return "added"; + break; + case Evolution_Mail_CHANGED: + return "changed"; + break; + case Evolution_Mail_REMOVED: + return "removed"; + break; + default: + return ""; + } +} + +static void +impl_changed(PortableServer_Servant _servant, + const Evolution_Mail_Folder folder, + const Evolution_Mail_FolderChanges * changes, + CORBA_Environment * ev) +{ + EvolutionMailFolderListener *eml = (EvolutionMailFolderListener *)bonobo_object_from_servant(_servant); + int i, j; + + printf("folder changed!\n"); + for (i=0;i<changes->_length;i++) { + printf(" %d %s", changes->_buffer[i].messages._length, change_type_name(changes->_buffer[i].type)); + for (j=0;j<changes->_buffer[i].messages._length;j++) { + printf(" %s %s\n", changes->_buffer[i].messages._buffer[j].uid, changes->_buffer[i].messages._buffer[j].subject); + } + } + + g_signal_emit(eml, eml_signals[EML_CHANGED], 0, folder, changes); +} + +/* Initialization */ + +static void +evolution_mail_folderlistener_class_init (EvolutionMailFolderListenerClass *klass) +{ + POA_Evolution_Mail_FolderListener__epv *epv = &klass->epv; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + epv->changed = impl_changed; + + object_class->dispose = impl_dispose; + object_class->finalize = impl_finalize; + + g_type_class_add_private(klass, sizeof(struct _EvolutionMailFolderListenerPrivate)); + + eml_signals[EML_CHANGED] = + g_signal_new("changed", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvolutionMailFolderListenerClass, changed), + NULL, NULL, + evolution_mail_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_POINTER); +} + +static void +evolution_mail_folderlistener_init (EvolutionMailFolderListener *ems, EvolutionMailFolderListenerClass *klass) +{ + struct _EvolutionMailFolderListenerPrivate *p = _PRIVATE(ems); + + p = p; +} + +EvolutionMailFolderListener * +evolution_mail_folderlistener_new(void) +{ + EvolutionMailFolderListener *eml; + + eml = g_object_new(evolution_mail_folderlistener_get_type(), NULL); + + return eml; +} + +BONOBO_TYPE_FUNC_FULL (EvolutionMailFolderListener, Evolution_Mail_FolderListener, PARENT_TYPE, evolution_mail_folderlistener) diff --git a/plugins/mail-remote/evolution-mail-folderlistener.h b/plugins/mail-remote/evolution-mail-folderlistener.h new file mode 100644 index 0000000000..f555d36aa9 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-folderlistener.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * Author: Michael Zucchi <notzed@novell.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#ifndef _EVOLUTION_MAIL_FOLDERLISTENER_H_ +#define _EVOLUTION_MAIL_FOLDERLISTENER_H_ + +#include <bonobo/bonobo-object.h> +#include "Evolution-DataServer-Mail.h" + +#define EVOLUTION_MAIL_TYPE_FOLDERLISTENER (evolution_mail_folderlistener_get_type ()) +#define EVOLUTION_MAIL_FOLDERLISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailFolderListener)) +#define EVOLUTION_MAIL_FOLDERLISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailFolderListenerClass)) +#define EVOLUTION_MAIL_IS_FOLDERLISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) +#define EVOLUTION_MAIL_IS_FOLDERLISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) + +typedef struct _EvolutionMailFolderListener EvolutionMailFolderListener; +typedef struct _EvolutionMailFolderListenerClass EvolutionMailFolderListenerClass; + +struct _EvolutionMailFolderListener { + BonoboObject parent; +}; + +struct _EvolutionMailFolderListenerClass { + BonoboObjectClass parent_class; + + POA_Evolution_Mail_FolderListener__epv epv; + + void (*changed)(EvolutionMailFolderListener *, const Evolution_Mail_Folder folder, const Evolution_Mail_FolderChanges *); +}; + +GType evolution_mail_folderlistener_get_type(void); + +EvolutionMailFolderListener *evolution_mail_folderlistener_new(void); + +#endif /* _EVOLUTION_MAIL_FOLDERLISTENER_H_ */ diff --git a/plugins/mail-remote/evolution-mail-listener.c b/plugins/mail-remote/evolution-mail-listener.c deleted file mode 100644 index 842edf4f4f..0000000000 --- a/plugins/mail-remote/evolution-mail-listener.c +++ /dev/null @@ -1,232 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - * Copyright (C) 2005 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Michael Zucchi <notzed@novell.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <errno.h> -#include <string.h> -#include <bonobo/bonobo-shlib-factory.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-i18n.h> -#include <bonobo/bonobo-exception.h> -#include "evolution-mail-listener.h" - -#include "evolution-mail-store.h" - -#include "evolution-mail-marshal.h" - -#define PARENT_TYPE bonobo_object_get_type () - -static BonoboObjectClass *parent_class = NULL; - -#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_listener_get_type())) - -struct _EvolutionMailListenerPrivate { - int dummy; -}; - -enum { - EML_SESSION_CHANGED, - EML_STORE_CHANGED, - EML_FOLDER_CHANGED, - EML_LAST_SIGNAL -}; - -static guint eml_signals[EML_LAST_SIGNAL]; - -/* GObject methods */ - -static void -impl_dispose (GObject *object) -{ - struct _EvolutionMailListenerPrivate *p = _PRIVATE(object); - - p = p; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - printf("EvolutionMailListener finalised!\n"); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* Evolution.Mail.Listener */ -static const char *change_type_name(int type) -{ - switch (type) { - case GNOME_Evolution_Mail_ADDED: - return "added"; - break; - case GNOME_Evolution_Mail_CHANGED: - return "changed"; - break; - case GNOME_Evolution_Mail_REMOVED: - return "removed"; - break; - default: - return ""; - } -} - -static void -impl_sessionChanged(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_Session session, - const GNOME_Evolution_Mail_SessionChanges *changes, CORBA_Environment * ev) -{ - EvolutionMailListener *eml = (EvolutionMailListener *)bonobo_object_from_servant(_servant); - int i, j; - - printf("session changed!\n"); - for (i=0;i<changes->_length;i++) { - printf(" %d %s", changes->_buffer[i].stores._length, change_type_name(changes->_buffer[i].type)); - for (j=0;j<changes->_buffer[i].stores._length;j++) { - printf(" %s %s\n", changes->_buffer[i].stores._buffer[j].uid, changes->_buffer[i].stores._buffer[j].name); - } - } - - g_signal_emit(eml, eml_signals[EML_SESSION_CHANGED], 0, session, changes); -} - -static void -impl_storeChanged(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_Session session, - const GNOME_Evolution_Mail_Store store, - const GNOME_Evolution_Mail_StoreChanges * changes, - CORBA_Environment * ev) -{ - EvolutionMailListener *eml = (EvolutionMailListener *)bonobo_object_from_servant(_servant); - int i, j; - - printf("store changed!\n"); - for (i=0;i<changes->_length;i++) { - printf(" %d %s", changes->_buffer[i].folders._length, change_type_name(changes->_buffer[i].type)); - for (j=0;j<changes->_buffer[i].folders._length;j++) { - printf(" %s %s\n", changes->_buffer[i].folders._buffer[j].full_name, changes->_buffer[i].folders._buffer[j].name); - } - } - - g_signal_emit(eml, eml_signals[EML_STORE_CHANGED], 0, session, store, changes); -} - -static void -impl_folderChanged(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_Session session, - const GNOME_Evolution_Mail_Store store, - const GNOME_Evolution_Mail_Folder folder, - const GNOME_Evolution_Mail_FolderChanges *changes, CORBA_Environment * ev) -{ - EvolutionMailListener *eml = (EvolutionMailListener *)bonobo_object_from_servant(_servant); - int i, j; - - printf("folder changed!\n"); - for (i=0;i<changes->_length;i++) { - printf(" %d %s", changes->_buffer[i].messages._length, change_type_name(changes->_buffer[i].type)); - for (j=0;j<changes->_buffer[i].messages._length;j++) { - printf(" %s %s\n", changes->_buffer[i].messages._buffer[j].uid, changes->_buffer[i].messages._buffer[j].subject); - } - } - - g_signal_emit(eml, eml_signals[EML_STORE_CHANGED], 0, session, store, folder, changes); -} - -/* Initialization */ - -static void -evolution_mail_listener_class_init (EvolutionMailListenerClass *klass) -{ - POA_GNOME_Evolution_Mail_Listener__epv *epv = &klass->epv; - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - epv->sessionChanged = impl_sessionChanged; - epv->storeChanged = impl_storeChanged; - epv->folderChanged = impl_folderChanged; - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - g_type_class_add_private(klass, sizeof(struct _EvolutionMailListenerPrivate)); - - eml_signals[EML_SESSION_CHANGED] = - g_signal_new("session-changed", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionMailListenerClass, session_changed), - NULL, NULL, - evolution_mail_marshal_VOID__POINTER_POINTER, - G_TYPE_NONE, 2, - G_TYPE_POINTER, G_TYPE_POINTER); - - eml_signals[EML_STORE_CHANGED] = - g_signal_new("store-changed", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionMailListenerClass, store_changed), - NULL, NULL, - evolution_mail_marshal_VOID__POINTER_POINTER_POINTER, - G_TYPE_NONE, 3, - G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); - - eml_signals[EML_FOLDER_CHANGED] = - g_signal_new("folder-changed", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionMailListenerClass, folder_changed), - NULL, NULL, - evolution_mail_marshal_VOID__POINTER_POINTER_POINTER_POINTER, - G_TYPE_NONE, 4, - G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); -} - -static void -evolution_mail_listener_init (EvolutionMailListener *ems, EvolutionMailListenerClass *klass) -{ - struct _EvolutionMailListenerPrivate *p = _PRIVATE(ems); - - p = p; -} - -EvolutionMailListener * -evolution_mail_listener_new(void) -{ - EvolutionMailListener *eml; -#if 0 - static PortableServer_POA poa = NULL; - - /* NB: to simplify signal handling, we should only run in the idle loop? */ - - if (poa == NULL) - poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL); - eml = g_object_new(evolution_mail_listener_get_type(), "poa", poa, NULL); -#else - eml = g_object_new(evolution_mail_listener_get_type(), NULL); -#endif - return eml; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionMailListener, GNOME_Evolution_Mail_Listener, PARENT_TYPE, evolution_mail_listener) diff --git a/plugins/mail-remote/evolution-mail-listener.h b/plugins/mail-remote/evolution-mail-listener.h deleted file mode 100644 index 5dbf4aaf3a..0000000000 --- a/plugins/mail-remote/evolution-mail-listener.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - * Copyright (C) 2005 Novell, Inc. - * - * Author: Michael Zucchi <notzed@novell.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#ifndef _EVOLUTION_MAIL_LISTENER_H_ -#define _EVOLUTION_MAIL_LISTENER_H_ - -#include <bonobo/bonobo-object.h> -#include "Evolution-DataServer-Mail.h" - -#define EVOLUTION_MAIL_TYPE_LISTENER (evolution_mail_listener_get_type ()) -#define EVOLUTION_MAIL_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailListener)) -#define EVOLUTION_MAIL_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailListenerClass)) -#define EVOLUTION_MAIL_IS_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) -#define EVOLUTION_MAIL_IS_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) - -typedef struct _EvolutionMailListener EvolutionMailListener; -typedef struct _EvolutionMailListenerClass EvolutionMailListenerClass; - -struct _EvolutionMailListener { - BonoboObject parent; -}; - -struct _EvolutionMailListenerClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Mail_Listener__epv epv; - - void (*session_changed)(const GNOME_Evolution_Mail_Session session, const GNOME_Evolution_Mail_SessionChange *change); - void (*store_changed)(const GNOME_Evolution_Mail_Session session, const GNOME_Evolution_Mail_Store store, const GNOME_Evolution_Mail_StoreChanges *); - void (*folder_changed)(const GNOME_Evolution_Mail_Session session, const GNOME_Evolution_Mail_Store store, const GNOME_Evolution_Mail_Folder folder, const GNOME_Evolution_Mail_FolderChanges *); -}; - -GType evolution_mail_listener_get_type(void); - -EvolutionMailListener *evolution_mail_listener_new(void); - -#endif /* _EVOLUTION_MAIL_LISTENER_H_ */ diff --git a/plugins/mail-remote/evolution-mail-marshal.list b/plugins/mail-remote/evolution-mail-marshal.list index 14a6fbd358..7af68d8567 100644 --- a/plugins/mail-remote/evolution-mail-marshal.list +++ b/plugins/mail-remote/evolution-mail-marshal.list @@ -1,3 +1,3 @@ VOID:POINTER,POINTER -VOID:POINTER,POINTER,POINTER -VOID:POINTER,POINTER,POINTER,POINTER +VOID:POINTER + diff --git a/plugins/mail-remote/evolution-mail-messageiterator.c b/plugins/mail-remote/evolution-mail-messageiterator.c index 8cf123640d..0fa25f730f 100644 --- a/plugins/mail-remote/evolution-mail-messageiterator.c +++ b/plugins/mail-remote/evolution-mail-messageiterator.c @@ -74,12 +74,12 @@ impl_finalize (GObject *object) } /* Evolution.Mail.MessageIterator */ -static GNOME_Evolution_Mail_MessageInfos * +static Evolution_Mail_MessageInfos * impl_next(PortableServer_Servant _servant, const CORBA_long limit, CORBA_Environment * ev) { EvolutionMailMessageIterator *emf = (EvolutionMailMessageIterator *)bonobo_object_from_servant(_servant); int i, j; - GNOME_Evolution_Mail_MessageInfos *msgs; + Evolution_Mail_MessageInfos *msgs; struct _EvolutionMailMessageIteratorPrivate *p = _PRIVATE(emf); CamelException ex = { 0 }; @@ -97,9 +97,9 @@ impl_next(PortableServer_Servant _servant, const CORBA_long limit, CORBA_Environ p->index = 0; } - msgs = GNOME_Evolution_Mail_MessageInfos__alloc(); + msgs = Evolution_Mail_MessageInfos__alloc(); msgs->_maximum = MIN(limit, p->search->len - p->index); - msgs->_buffer = GNOME_Evolution_Mail_MessageInfos_allocbuf(msgs->_maximum); + msgs->_buffer = Evolution_Mail_MessageInfos_allocbuf(msgs->_maximum); CORBA_sequence_set_release(msgs, CORBA_TRUE); j=0; @@ -119,17 +119,27 @@ impl_next(PortableServer_Servant _servant, const CORBA_long limit, CORBA_Environ return msgs; } +static void +impl_mi_dispose(PortableServer_Servant _servant, CORBA_Environment *ev) +{ + EvolutionMailMessageIterator *emmi = (EvolutionMailMessageIterator *)bonobo_object_from_servant(_servant); + + bonobo_object_set_immortal((BonoboObject *)emmi, FALSE); + /*bonobo_object_unref((BonoboObject *)emmi);*/ +} + /* Initialization */ static void evolution_mail_messageiterator_class_init (EvolutionMailMessageIteratorClass *klass) { - POA_GNOME_Evolution_Mail_MessageIterator__epv *epv = &klass->epv; + POA_Evolution_Mail_MessageIterator__epv *epv = &klass->epv; GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); epv->next = impl_next; + epv->dispose = impl_mi_dispose; object_class->dispose = impl_dispose; object_class->finalize = impl_finalize; @@ -138,11 +148,12 @@ evolution_mail_messageiterator_class_init (EvolutionMailMessageIteratorClass *kl } static void -evolution_mail_messageiterator_init(EvolutionMailMessageIterator *component, EvolutionMailMessageIteratorClass *klass) +evolution_mail_messageiterator_init(EvolutionMailMessageIterator *emi, EvolutionMailMessageIteratorClass *klass) { + bonobo_object_set_immortal((BonoboObject *)emi, TRUE); } -BONOBO_TYPE_FUNC_FULL (EvolutionMailMessageIterator, GNOME_Evolution_Mail_MessageIterator, PARENT_TYPE, evolution_mail_messageiterator) +BONOBO_TYPE_FUNC_FULL (EvolutionMailMessageIterator, Evolution_Mail_MessageIterator, PARENT_TYPE, evolution_mail_messageiterator) EvolutionMailMessageIterator * evolution_mail_messageiterator_new(CamelFolder *folder, const char *expr) diff --git a/plugins/mail-remote/evolution-mail-messageiterator.h b/plugins/mail-remote/evolution-mail-messageiterator.h index 746e96fbe8..772ea8f2b0 100644 --- a/plugins/mail-remote/evolution-mail-messageiterator.h +++ b/plugins/mail-remote/evolution-mail-messageiterator.h @@ -37,7 +37,7 @@ struct _EvolutionMailMessageIterator { struct _EvolutionMailMessageIteratorClass { BonoboObjectClass parent_class; - POA_GNOME_Evolution_Mail_MessageIterator__epv epv; + POA_Evolution_Mail_MessageIterator__epv epv; }; GType evolution_mail_messageiterator_get_type(void); diff --git a/plugins/mail-remote/evolution-mail-session.c b/plugins/mail-remote/evolution-mail-session.c index 6cdee95b2b..9fa6fdfdb7 100644 --- a/plugins/mail-remote/evolution-mail-session.c +++ b/plugins/mail-remote/evolution-mail-session.c @@ -44,14 +44,6 @@ static BonoboObjectClass *parent_class = NULL; #define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_session_get_type())) -struct _listener { - struct _listener *next; - struct _listener *prev; - - CORBA_long flags; - GNOME_Evolution_Mail_Listener listener; -}; - struct _EvolutionMailSessionPrivate { EAccountList *accounts; GList *stores; @@ -105,8 +97,8 @@ impl_finalize (GObject *object) static CORBA_boolean impl_getProperties(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_PropertyNames* names, - GNOME_Evolution_Mail_Properties **props, + const Evolution_Mail_PropertyNames* names, + Evolution_Mail_Properties **props, CORBA_Environment * ev) { EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); @@ -116,18 +108,19 @@ impl_getProperties(PortableServer_Servant _servant, return CORBA_TRUE; } -static GNOME_Evolution_Mail_StoreInfos * +static Evolution_Mail_StoreInfos * impl_getStores(PortableServer_Servant _servant, const CORBA_char * pattern, + const Evolution_Mail_StoreListener listener, CORBA_Environment * ev) { EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - GNOME_Evolution_Mail_StoreInfos *seq; + Evolution_Mail_StoreInfos *seq; int i, len; GList *l; - seq = GNOME_Evolution_Mail_StoreInfos__alloc(); + seq = Evolution_Mail_StoreInfos__alloc(); /* FIXME: pattern? */ @@ -135,13 +128,15 @@ impl_getStores(PortableServer_Servant _servant, seq->_length = len; seq->_maximum = len; - seq->_buffer = GNOME_Evolution_Mail_StoreInfos_allocbuf(seq->_length); + seq->_buffer = Evolution_Mail_StoreInfos_allocbuf(seq->_length); CORBA_sequence_set_release(seq, TRUE); l = p->stores; for (i=0;l && i<len;i++) { EvolutionMailStore *store = l->data; + evolution_mail_store_addlistener(store, listener); + e_mail_storeinfo_set_store(&seq->_buffer[i], store); l = g_list_next(l); } @@ -151,54 +146,27 @@ impl_getStores(PortableServer_Servant _servant, static void impl_addListener(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_Listener listener, - CORBA_long flags, + const Evolution_Mail_SessionListener listener, CORBA_Environment * ev) { EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l; - - printf("Adding listener to session %p\n", listener); - l = g_malloc0(sizeof(*l)); - l->listener = CORBA_Object_duplicate(listener, ev); - l->flags = flags?flags:~0; - e_dlist_addtail(&p->listeners, (EDListNode *)l); -} - -static void -remove_listener(struct _listener *l) -{ - CORBA_Environment ev = { 0 }; - - CORBA_Object_release(l->listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - CORBA_exception_free(&ev); - e_dlist_remove((EDListNode *)l); - g_free(l); + e_mail_listener_add(&p->listeners, listener); } static void impl_removeListener(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_Listener listener, + const Evolution_Mail_SessionListener listener, CORBA_Environment * ev) { EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant); struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l; printf("Removing listener from session\n"); - l = (struct _listener *)p->listeners.head; - while (l->next) { - /* FIXME: need to use proper comparison function & free stuff, this works with orbit though */ - if (l->listener == listener) { - remove_listener(l); - break; - } - - l = l->next; + if (!e_mail_listener_remove(&p->listeners, listener)) { + printf("no more listeners, could shut down session?\n"); } } @@ -207,7 +175,7 @@ impl_removeListener(PortableServer_Servant _servant, static void evolution_mail_session_class_init (EvolutionMailSessionClass *klass) { - POA_GNOME_Evolution_Mail_Session__epv *epv = &klass->epv; + POA_Evolution_Mail_Session__epv *epv = &klass->epv; GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); @@ -225,48 +193,32 @@ evolution_mail_session_class_init (EvolutionMailSessionClass *klass) } static void -ems_set_changes(GNOME_Evolution_Mail_SessionChange *change, GNOME_Evolution_Mail_ChangeType how, EvolutionMailStore *store) +ems_set_changes(Evolution_Mail_SessionChange *change, Evolution_Mail_ChangeType how, EvolutionMailStore *store) { change->type = how; change->stores._length = 1; change->stores._maximum = 1; - change->stores._buffer = GNOME_Evolution_Mail_StoreInfos_allocbuf(change->stores._maximum); + change->stores._buffer = Evolution_Mail_StoreInfos_allocbuf(change->stores._maximum); CORBA_sequence_set_release(&change->stores, TRUE); e_mail_storeinfo_set_store(&change->stores._buffer[0], store); } static void -ems_listener_session_event(EvolutionMailSession *ems, GNOME_Evolution_Mail_ChangeType how, EvolutionMailStore *store) +ems_listener_session_event(EvolutionMailSession *ems, Evolution_Mail_ChangeType how, EvolutionMailStore *store) { - GNOME_Evolution_Mail_SessionChanges *changes; - CORBA_long flags = 0; - - switch (how) { - case GNOME_Evolution_Mail_ADDED: - flags = GNOME_Evolution_Mail_Session_SESSION_ADDED; - break; - case GNOME_Evolution_Mail_CHANGED: - flags = GNOME_Evolution_Mail_Session_SESSION_CHANGED; - break; - case GNOME_Evolution_Mail_REMOVED: - flags = GNOME_Evolution_Mail_Session_SESSION_REMOVED; - break; - } - - if ((evolution_mail_session_listening(ems) & flags) == 0) - return; + Evolution_Mail_SessionChanges *changes; /* NB: we only ever create 1 changetype at the moment */ - changes = GNOME_Evolution_Mail_SessionChanges__alloc(); + changes = Evolution_Mail_SessionChanges__alloc(); changes->_maximum = 1; changes->_length = 1; - changes->_buffer = GNOME_Evolution_Mail_SessionChanges_allocbuf(1); + changes->_buffer = Evolution_Mail_SessionChanges_allocbuf(1); CORBA_sequence_set_release(changes, TRUE); ems_set_changes(&changes->_buffer[0], how, store); - evolution_mail_session_session_changed(ems, changes); + evolution_mail_session_changed(ems, changes); CORBA_free(changes); } @@ -282,7 +234,7 @@ ems_account_added(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) printf("Account added %s\n", ea->uid); store = evolution_mail_store_new(ems, ea); p->stores = g_list_append(p->stores, store); - ems_listener_session_event(ems, GNOME_Evolution_Mail_ADDED, store); + ems_listener_session_event(ems, Evolution_Mail_ADDED, store); } } @@ -305,17 +257,17 @@ ems_account_changed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) if (!ea->enabled) { printf("Account changed, now disabled %s\n", ea->uid); p->stores = g_list_remove(p->stores, store); - ems_listener_session_event(ems, GNOME_Evolution_Mail_REMOVED, store); + ems_listener_session_event(ems, Evolution_Mail_REMOVED, store); g_object_unref(store); } else { printf("Account changed, dont know how %s\n", ea->uid); - ems_listener_session_event(ems, GNOME_Evolution_Mail_CHANGED, store); + ems_listener_session_event(ems, 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_session_event(ems, GNOME_Evolution_Mail_ADDED, store); + ems_listener_session_event(ems, Evolution_Mail_ADDED, store); } } @@ -333,7 +285,7 @@ ems_account_removed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems) if (store->account == ea) { printf("Account removed %s\n", ea->uid); p->stores = g_list_remove(p->stores, store); - ems_listener_session_event(ems, GNOME_Evolution_Mail_REMOVED, store); + ems_listener_session_event(ems, Evolution_Mail_REMOVED, store); g_object_unref(store); break; } @@ -379,108 +331,14 @@ evolution_mail_session_init (EvolutionMailSession *ems, EvolutionMailSessionClas } void -evolution_mail_session_session_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_SessionChanges *changes) -{ - struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l, *n; - CORBA_Environment ev; - - l=(struct _listener *)p->listeners.head; - n=l->next; - while (n) { - if (l->flags & (GNOME_Evolution_Mail_Session_SESSION_CHANGED|GNOME_Evolution_Mail_Session_SESSION_ADDED|GNOME_Evolution_Mail_Session_SESSION_REMOVED)) { - memset(&ev, 0, sizeof(ev)); - GNOME_Evolution_Mail_Listener_sessionChanged(l->listener, bonobo_object_corba_objref((BonoboObject *)ems), changes, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - printf("listener.sessionChanged() failed, removing listener: %s\n", ev._id); - CORBA_exception_free(&ev); - - remove_listener(l); - } else { - printf("listener.sessionChanged() successful\n"); - } - } - l = n; - n = n->next; - } -} - -void -evolution_mail_session_store_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_Store store, GNOME_Evolution_Mail_StoreChanges *changes) +evolution_mail_session_changed(EvolutionMailSession *ems, Evolution_Mail_SessionChanges *changes) { struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l, *n; - CORBA_Environment ev; - - l=(struct _listener *)p->listeners.head; - n=l->next; - while (n) { - if (l->flags & (GNOME_Evolution_Mail_Session_STORE_CHANGED|GNOME_Evolution_Mail_Session_STORE_ADDED|GNOME_Evolution_Mail_Session_STORE_REMOVED)) { - memset(&ev, 0, sizeof(ev)); - GNOME_Evolution_Mail_Listener_storeChanged(l->listener, bonobo_object_corba_objref((BonoboObject *)ems), - store, changes, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - printf("listener.storeChanged() failed, removing listener: %s\n", ev._id); - CORBA_exception_free(&ev); - - remove_listener(l); - } else { - printf("listener.storeChanged() successful\n"); - } - } - l = n; - n = n->next; - } -} -void -evolution_mail_session_folder_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_Store store, GNOME_Evolution_Mail_Folder folder, GNOME_Evolution_Mail_FolderChanges *changes) -{ - struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l, *n; - CORBA_Environment ev; - - l=(struct _listener *)p->listeners.head; - n=l->next; - while (n) { - if (l->flags & (GNOME_Evolution_Mail_Session_FOLDER_CHANGED|GNOME_Evolution_Mail_Session_FOLDER_ADDED|GNOME_Evolution_Mail_Session_FOLDER_REMOVED)) { - memset(&ev, 0, sizeof(ev)); - GNOME_Evolution_Mail_Listener_folderChanged(l->listener, bonobo_object_corba_objref((BonoboObject *)ems), - store, folder, changes, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - printf("listener.folderChanged() failed, removing listener: %s\n", ev._id); - CORBA_exception_free(&ev); - remove_listener(l); - } else { - printf("listener.folderChanged() successful\n"); - } - } - l = n; - n = n->next; + if (!e_mail_listener_emit(&p->listeners, (EMailListenerChanged)Evolution_Mail_SessionListener_changed, + bonobo_object_corba_objref((BonoboObject *)ems), changes)) { + printf("No more listeners for store, could dispose session object now?\n"); } } -/** - * evolution_mail_session_listening: - * @ems: - * - * Check if anything is listening for events. Used to optimise the - * code so it doesn't generate events if it doesn't need to. - * - * Return value: - **/ -CORBA_long evolution_mail_session_listening(EvolutionMailSession *ems) -{ - struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems); - struct _listener *l; - CORBA_long flags = 0; - - for (l=(struct _listener *)p->listeners.head;l->next;l=l->next) - flags |= l->flags; - - return flags; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionMailSession, GNOME_Evolution_Mail_Session, PARENT_TYPE, evolution_mail_session) +BONOBO_TYPE_FUNC_FULL (EvolutionMailSession, Evolution_Mail_Session, PARENT_TYPE, evolution_mail_session) diff --git a/plugins/mail-remote/evolution-mail-session.h b/plugins/mail-remote/evolution-mail-session.h index 6b9ff61abc..bb29a53120 100644 --- a/plugins/mail-remote/evolution-mail-session.h +++ b/plugins/mail-remote/evolution-mail-session.h @@ -44,15 +44,11 @@ struct _EvolutionMailSession { struct _EvolutionMailSessionClass { BonoboObjectClass parent_class; - POA_GNOME_Evolution_Mail_Session__epv epv; + POA_Evolution_Mail_Session__epv epv; }; GType evolution_mail_session_get_type(void); -CORBA_long evolution_mail_session_listening(EvolutionMailSession *ems); - -void evolution_mail_session_session_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_SessionChanges *changes); -void evolution_mail_session_store_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_Store store, GNOME_Evolution_Mail_StoreChanges *changes); -void evolution_mail_session_folder_changed(EvolutionMailSession *ems, GNOME_Evolution_Mail_Store store, GNOME_Evolution_Mail_Folder folder, GNOME_Evolution_Mail_FolderChanges *changes); +void evolution_mail_session_changed(EvolutionMailSession *ems, Evolution_Mail_SessionChanges *changes); #endif /* _EVOLUTION_MAIL_SESSION_H_ */ diff --git a/plugins/mail-remote/evolution-mail-sessionlistener.c b/plugins/mail-remote/evolution-mail-sessionlistener.c new file mode 100644 index 0000000000..addbe1a820 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-sessionlistener.c @@ -0,0 +1,179 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Michael Zucchi <notzed@novell.com> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <string.h> +#include <bonobo/bonobo-i18n.h> +#include <bonobo/bonobo-exception.h> +#include "evolution-mail-sessionlistener.h" + +#include "evolution-mail-marshal.h" + +#define PARENT_TYPE bonobo_object_get_type () + +static BonoboObjectClass *parent_class = NULL; + +#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_sessionlistener_get_type())) + +struct _EvolutionMailSessionListenerPrivate { + int dummy; +}; + +enum { + EML_CHANGED, + EML_SHUTDOWN, + EML_LAST_SIGNAL +}; + +static guint eml_signals[EML_LAST_SIGNAL]; + +/* GObject methods */ + +static void +impl_dispose (GObject *object) +{ + struct _EvolutionMailSessionListenerPrivate *p = _PRIVATE(object); + + p = p; + + (* G_OBJECT_CLASS (parent_class)->dispose) (object); +} + +static void +impl_finalize (GObject *object) +{ + printf("EvolutionMailSessionListener finalised!\n"); + + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +/* Evolution.Mail.Listener */ +static const char *change_type_name(int type) +{ + switch (type) { + case Evolution_Mail_ADDED: + return "added"; + break; + case Evolution_Mail_CHANGED: + return "changed"; + break; + case Evolution_Mail_REMOVED: + return "removed"; + break; + default: + return ""; + } +} + +static void +impl_changed(PortableServer_Servant _servant, + const Evolution_Mail_Session session, + const Evolution_Mail_SessionChanges * changes, + CORBA_Environment * ev) +{ + EvolutionMailSessionListener *eml = (EvolutionMailSessionListener *)bonobo_object_from_servant(_servant); + int i, j; + + printf("session changed!\n"); + for (i=0;i<changes->_length;i++) { + printf(" %d %s", changes->_buffer[i].stores._length, change_type_name(changes->_buffer[i].type)); + for (j=0;j<changes->_buffer[i].stores._length;j++) { + printf(" %s %s\n", changes->_buffer[i].stores._buffer[j].uid, changes->_buffer[i].stores._buffer[j].name); + } + } + + g_signal_emit(eml, eml_signals[EML_CHANGED], 0, session, changes); +} + +static void +impl_shutdown(PortableServer_Servant _servant, + const Evolution_Mail_Session session, + CORBA_Environment * ev) +{ + EvolutionMailSessionListener *eml = (EvolutionMailSessionListener *)bonobo_object_from_servant(_servant); + + printf("session shutdown?\n"); + + g_signal_emit(eml, eml_signals[EML_SHUTDOWN], 0, session); +} + +/* Initialization */ + +static void +evolution_mail_sessionlistener_class_init (EvolutionMailSessionListenerClass *klass) +{ + POA_Evolution_Mail_SessionListener__epv *epv = &klass->epv; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + epv->changed = impl_changed; + epv->shutdown = impl_shutdown; + + object_class->dispose = impl_dispose; + object_class->finalize = impl_finalize; + + g_type_class_add_private(klass, sizeof(struct _EvolutionMailSessionListenerPrivate)); + + eml_signals[EML_CHANGED] = + g_signal_new("changed", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvolutionMailSessionListenerClass, changed), + NULL, NULL, + evolution_mail_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_POINTER); + + eml_signals[EML_CHANGED] = + g_signal_new("shutdown", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvolutionMailSessionListenerClass, changed), + NULL, NULL, + evolution_mail_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); +} + +static void +evolution_mail_sessionlistener_init (EvolutionMailSessionListener *ems, EvolutionMailSessionListenerClass *klass) +{ + struct _EvolutionMailSessionListenerPrivate *p = _PRIVATE(ems); + + p = p; +} + +EvolutionMailSessionListener * +evolution_mail_sessionlistener_new(void) +{ + EvolutionMailSessionListener *eml; + + eml = g_object_new(evolution_mail_sessionlistener_get_type(), NULL); + + return eml; +} + +BONOBO_TYPE_FUNC_FULL (EvolutionMailSessionListener, Evolution_Mail_SessionListener, PARENT_TYPE, evolution_mail_sessionlistener) diff --git a/plugins/mail-remote/evolution-mail-sessionlistener.h b/plugins/mail-remote/evolution-mail-sessionlistener.h new file mode 100644 index 0000000000..654de4e238 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-sessionlistener.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * Author: Michael Zucchi <notzed@novell.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#ifndef _EVOLUTION_MAIL_SESSIONLISTENER_H_ +#define _EVOLUTION_MAIL_SESSIONLISTENER_H_ + +#include <bonobo/bonobo-object.h> +#include "Evolution-DataServer-Mail.h" + +#define EVOLUTION_MAIL_TYPE_SESSIONLISTENER (evolution_mail_sessionlistener_get_type ()) +#define EVOLUTION_MAIL_SESSIONLISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailSessionListener)) +#define EVOLUTION_MAIL_SESSIONLISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailSessionListenerClass)) +#define EVOLUTION_MAIL_IS_SESSIONLISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) +#define EVOLUTION_MAIL_IS_SESSIONLISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) + +typedef struct _EvolutionMailSessionListener EvolutionMailSessionListener; +typedef struct _EvolutionMailSessionListenerClass EvolutionMailSessionListenerClass; + +struct _EvolutionMailSessionListener { + BonoboObject parent; +}; + +struct _EvolutionMailSessionListenerClass { + BonoboObjectClass parent_class; + + POA_Evolution_Mail_SessionListener__epv epv; + + void (*changed)(EvolutionMailSessionListener *, const Evolution_Mail_Session session, const Evolution_Mail_SessionChanges *); +}; + +GType evolution_mail_sessionlistener_get_type(void); + +EvolutionMailSessionListener *evolution_mail_sessionlistener_new(void); + +#endif /* _EVOLUTION_MAIL_SESSIONLISTENER_H_ */ diff --git a/plugins/mail-remote/evolution-mail-store.c b/plugins/mail-remote/evolution-mail-store.c index b5cfd3840d..349925dd61 100644 --- a/plugins/mail-remote/evolution-mail-store.c +++ b/plugins/mail-remote/evolution-mail-store.c @@ -67,6 +67,8 @@ struct _EvolutionMailStorePrivate { guint32 folder_renamed; guint32 folder_subscribed; guint32 folder_unsubscribed; + + EDList listeners; }; /* GObject methods */ @@ -77,8 +79,6 @@ impl_dispose (GObject *object) EvolutionMailStore *ems = (EvolutionMailStore *)object; struct _EvolutionMailStorePrivate *p = _PRIVATE(object); - p = p; - /* FIXME: unref store unhook events */ @@ -87,6 +87,8 @@ impl_dispose (GObject *object) ems->account = NULL; } + e_mail_listener_free(&p->listeners); + (* G_OBJECT_CLASS (parent_class)->dispose) (object); } @@ -111,25 +113,25 @@ impl_finalize (GObject *object) static CORBA_boolean impl_getProperties(PortableServer_Servant _servant, - const GNOME_Evolution_Mail_PropertyNames* names, - GNOME_Evolution_Mail_Properties **propsp, + const Evolution_Mail_PropertyNames* names, + Evolution_Mail_Properties **propsp, CORBA_Environment * ev) { EvolutionMailStore *ems = (EvolutionMailStore *)bonobo_object_from_servant(_servant); int i; - GNOME_Evolution_Mail_Properties *props; + Evolution_Mail_Properties *props; /*struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);*/ CORBA_boolean ok = CORBA_TRUE; - *propsp = props = GNOME_Evolution_Mail_Properties__alloc(); + *propsp = props = Evolution_Mail_Properties__alloc(); props->_length = names->_length; props->_maximum = props->_length; - props->_buffer = GNOME_Evolution_Mail_Properties_allocbuf(props->_maximum); + props->_buffer = Evolution_Mail_Properties_allocbuf(props->_maximum); CORBA_sequence_set_release(props, CORBA_TRUE); for (i=0;i<names->_length;i++) { const CORBA_char *name = names->_buffer[i]; - GNOME_Evolution_Mail_Property *prop = &props->_buffer[i]; + Evolution_Mail_Property *prop = &props->_buffer[i]; printf("getting property '%s'\n", name); @@ -212,31 +214,31 @@ ems_sort_folders(struct _EvolutionMailStorePrivate *p) } static void -ems_set_changes(GNOME_Evolution_Mail_StoreChange *change, GNOME_Evolution_Mail_ChangeType how, GPtrArray *changed) +ems_set_changes(Evolution_Mail_StoreChange *change, Evolution_Mail_ChangeType how, GPtrArray *changed) { int i; change->type = how; change->folders._maximum = changed->len; change->folders._length = changed->len; - change->folders._buffer = GNOME_Evolution_Mail_FolderInfos_allocbuf(change->folders._maximum); + change->folders._buffer = Evolution_Mail_FolderInfos_allocbuf(change->folders._maximum); CORBA_sequence_set_release(&change->folders, TRUE); for (i=0;i<changed->len;i++) e_mail_folderinfo_set_folder(&change->folders._buffer[i], changed->pdata[i]); } -static GNOME_Evolution_Mail_StoreChanges * -ems_create_changes(EvolutionMailStore *ems, GNOME_Evolution_Mail_ChangeType how, GPtrArray *changed) +static Evolution_Mail_StoreChanges * +ems_create_changes(EvolutionMailStore *ems, Evolution_Mail_ChangeType how, GPtrArray *changed) { - GNOME_Evolution_Mail_StoreChanges *changes; + Evolution_Mail_StoreChanges *changes; /* NB: we only ever create 1 changetype at the moment */ - changes = GNOME_Evolution_Mail_StoreChanges__alloc(); + changes = Evolution_Mail_StoreChanges__alloc(); changes->_maximum = 1; changes->_length = 1; - changes->_buffer = GNOME_Evolution_Mail_StoreChanges_allocbuf(1); + changes->_buffer = Evolution_Mail_StoreChanges_allocbuf(1); CORBA_sequence_set_release(changes, TRUE); ems_set_changes(&changes->_buffer[0], how, changed); @@ -260,19 +262,17 @@ ems_folder_subscribed(CamelObject *o, void *d, void *data) { EvolutionMailStore *ems = data; CamelFolderInfo *fi = d; - GPtrArray *added = NULL; + GPtrArray *added; int i; - if (evolution_mail_session_listening(ems->session) & GNOME_Evolution_Mail_Session_STORE_ADDED) - added = g_ptr_array_new(); - + added = g_ptr_array_new(); ems_add_folders(ems, fi, added); if (added) { if (added->len) { - GNOME_Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, GNOME_Evolution_Mail_ADDED, added); + Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_ADDED, added); - evolution_mail_session_store_changed(ems->session, bonobo_object_corba_objref((BonoboObject *)ems), changes); + evolution_mail_store_changed(ems, changes); CORBA_free(changes); for (i=0;i<added->len;i++) @@ -290,16 +290,14 @@ ems_folder_unsubscribed(CamelObject *o, void *d, void *data) GPtrArray *removed = NULL; int i; - if (evolution_mail_session_listening(ems->session) & GNOME_Evolution_Mail_Session_STORE_REMOVED) - removed = g_ptr_array_new(); - + removed = g_ptr_array_new(); ems_remove_folders(ems, fi, removed); if (removed) { if (removed->len) { - GNOME_Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, GNOME_Evolution_Mail_REMOVED, removed); + Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_REMOVED, removed); - evolution_mail_session_store_changed(ems->session, bonobo_object_corba_objref((BonoboObject *)ems), changes); + evolution_mail_store_changed(ems, changes); CORBA_free(changes); for (i=0;i<removed->len;i++) @@ -356,13 +354,10 @@ ems_folder_renamed(CamelObject *o, void *d, void *data) struct _EvolutionMailStorePrivate *p = _PRIVATE(ems); CamelRenameInfo *reninfo = d; int i, oldlen, newlen; - GPtrArray *renamed = NULL, *folders = g_ptr_array_new(); + GPtrArray *renamed = g_ptr_array_new(), *folders = g_ptr_array_new(); CamelFolderInfo *top; GString *name = g_string_new(""); - if (evolution_mail_session_listening(ems->session) & GNOME_Evolution_Mail_Session_STORE_CHANGED) - renamed = g_ptr_array_new(); - /* flatten/sort folders to make sure they're in the right order */ get_folders(reninfo->new, folders); qsort(folders->pdata, folders->len, sizeof(folders->pdata[0]), folder_cmp); @@ -397,9 +392,9 @@ ems_folder_renamed(CamelObject *o, void *d, void *data) if (renamed) { if (renamed->len) { - GNOME_Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, GNOME_Evolution_Mail_CHANGED, renamed); + Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_CHANGED, renamed); - evolution_mail_session_store_changed(ems->session, bonobo_object_corba_objref((BonoboObject *)ems), changes); + evolution_mail_store_changed(ems, changes); CORBA_free(changes); for (i=0;i<renamed->len;i++) @@ -409,27 +404,23 @@ ems_folder_renamed(CamelObject *o, void *d, void *data) } } -static GNOME_Evolution_Mail_FolderInfos * +static Evolution_Mail_FolderInfos * impl_getFolders(PortableServer_Servant _servant, const CORBA_char * pattern, + const Evolution_Mail_FolderListener listener, CORBA_Environment * ev) { EvolutionMailStore *ems = (EvolutionMailStore *)bonobo_object_from_servant(_servant); struct _EvolutionMailStorePrivate *p = _PRIVATE(ems); CamelFolderInfo *fi; CamelException ex = { 0 }; - GNOME_Evolution_Mail_FolderInfos *folders = NULL; + Evolution_Mail_FolderInfos *folders = NULL; int i; CamelStore *store; store = evolution_mail_store_get_store(ems); if (store == NULL) { - GNOME_Evolution_Mail_FAILED *x; - - x = GNOME_Evolution_Mail_FAILED__alloc(); - x->why = CORBA_string_dup("Unable to open store"); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, x); - + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); return CORBA_OBJECT_NIL; } @@ -443,26 +434,23 @@ impl_getFolders(PortableServer_Servant _servant, camel_store_free_folder_info(store, fi); ems_sort_folders(p); } else { - GNOME_Evolution_Mail_FAILED *x; - - x = GNOME_Evolution_Mail_FAILED__alloc(); - x->why = CORBA_string_dup("Unable to list folders"); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, x); + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); camel_object_unref(store); return CORBA_OBJECT_NIL; } } - folders = GNOME_Evolution_Mail_FolderInfos__alloc(); + folders = Evolution_Mail_FolderInfos__alloc(); folders->_length = p->folders_array->len; folders->_maximum = folders->_length; - folders->_buffer = GNOME_Evolution_Mail_FolderInfos_allocbuf(folders->_maximum); + folders->_buffer = Evolution_Mail_FolderInfos_allocbuf(folders->_maximum); CORBA_sequence_set_release(folders, CORBA_TRUE); for (i=0;i<p->folders_array->len;i++) { EvolutionMailFolder *emf = p->folders_array->pdata[i]; + evolution_mail_folder_addlistener(emf, listener); e_mail_folderinfo_set_folder(&folders->_buffer[i], emf); } @@ -481,37 +469,25 @@ impl_sendMessage(PortableServer_Servant _servant, CamelMimeMessage *msg; CamelInternetAddress *from; CamelMessageInfo *info; - CamelStream *mem; if (ems->account == NULL || ems->account->transport == NULL || ems->account->transport->url == NULL) { #if 0 - GNOME_Evolution_Mail_NOT_SUPPORTED *x; + Evolution_Mail_NOT_SUPPORTED *x; - x = GNOME_Evolution_Mail_NOT_SUPPORTED__alloc(); + x = Evolution_Mail_NOT_SUPPORTED__alloc(); x->why = CORBA_string_dup(ex.desc); #endif - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_NOT_SUPPORTED, NULL); - return; - } - - mem = camel_stream_mem_new(); - if (e_stream_bonobo_to_camel(message, mem) == -1) { - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, NULL); + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_NOT_SUPPORTED, NULL); return; } - printf("Sending message '%.*s'\n", ((CamelStreamMem *)mem)->buffer->len, ((CamelStreamMem *)mem)->buffer->data); - - msg = camel_mime_message_new(); - if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, mem) == -1) { - camel_object_unref(mem); - camel_object_unref(msg); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, NULL); + msg = e_stream_bonobo_to_message(message); + if (msg == NULL) { + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); return; } - camel_object_unref(mem); from = camel_internet_address_new(); camel_internet_address_add(from, ems->account->id->name, ems->account->id->address); @@ -530,7 +506,7 @@ impl_sendMessage(PortableServer_Servant _servant, camel_message_info_free(info); if (camel_exception_is_set(&ex)) { - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Mail_FAILED, NULL); + CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_FAILED, NULL); camel_exception_clear(&ex); } else { /*mail_send();*/ @@ -544,7 +520,7 @@ impl_sendMessage(PortableServer_Servant _servant, static void evolution_mail_store_class_init (EvolutionMailStoreClass *klass) { - POA_GNOME_Evolution_Mail_Store__epv *epv = &klass->epv; + POA_Evolution_Mail_Store__epv *epv = &klass->epv; GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); @@ -560,11 +536,15 @@ evolution_mail_store_class_init (EvolutionMailStoreClass *klass) } static void -evolution_mail_store_init(EvolutionMailStore *component, EvolutionMailStoreClass *klass) +evolution_mail_store_init(EvolutionMailStore *ems, EvolutionMailStoreClass *klass) { + struct _EvolutionMailStorePrivate *p = _PRIVATE(ems); + + bonobo_object_set_immortal((BonoboObject *)ems, TRUE); + e_dlist_init(&p->listeners); } -BONOBO_TYPE_FUNC_FULL (EvolutionMailStore, GNOME_Evolution_Mail_Store, PARENT_TYPE, evolution_mail_store) +BONOBO_TYPE_FUNC_FULL (EvolutionMailStore, Evolution_Mail_Store, PARENT_TYPE, evolution_mail_store) EvolutionMailStore * evolution_mail_store_new(struct _EvolutionMailSession *s, struct _EAccount *ea) @@ -642,3 +622,23 @@ CamelStore *evolution_mail_store_get_store(EvolutionMailStore *ems) camel_object_ref(p->store); return p->store; } + +void +evolution_mail_store_addlistener(EvolutionMailStore *ems, Evolution_Mail_StoreListener listener) +{ + struct _EvolutionMailStorePrivate *p = _PRIVATE(ems); + + /* FIXME: locking */ + e_mail_listener_add(&p->listeners, listener); +} + +void +evolution_mail_store_changed(EvolutionMailStore *ems, Evolution_Mail_StoreChanges *changes) +{ + struct _EvolutionMailStorePrivate *p = _PRIVATE(ems); + + if (!e_mail_listener_emit(&p->listeners, (EMailListenerChanged)Evolution_Mail_StoreListener_changed, + bonobo_object_corba_objref((BonoboObject *)ems), changes)) { + printf("No more listeners for store, could dispose store object now\n"); + } +} diff --git a/plugins/mail-remote/evolution-mail-store.h b/plugins/mail-remote/evolution-mail-store.h index b0e8be8e84..d93c32c26e 100644 --- a/plugins/mail-remote/evolution-mail-store.h +++ b/plugins/mail-remote/evolution-mail-store.h @@ -48,13 +48,16 @@ struct _EvolutionMailStore { struct _EvolutionMailStoreClass { BonoboObjectClass parent_class; - POA_GNOME_Evolution_Mail_Store__epv epv; + POA_Evolution_Mail_Store__epv epv; }; GType evolution_mail_store_get_type(void); EvolutionMailStore *evolution_mail_store_new(struct _EvolutionMailSession *s, struct _EAccount *ea); +void evolution_mail_store_addlistener(EvolutionMailStore *store, Evolution_Mail_StoreListener listener); +void evolution_mail_store_changed(EvolutionMailStore *ems, Evolution_Mail_StoreChanges *changes); + const char *evolution_mail_store_get_name(EvolutionMailStore *); const char *evolution_mail_store_get_uid(EvolutionMailStore *); diff --git a/plugins/mail-remote/evolution-mail-storelistener.c b/plugins/mail-remote/evolution-mail-storelistener.c new file mode 100644 index 0000000000..3d859383c0 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-storelistener.c @@ -0,0 +1,155 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Michael Zucchi <notzed@novell.com> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <errno.h> +#include <string.h> +#include <bonobo/bonobo-i18n.h> +#include <bonobo/bonobo-exception.h> +#include "evolution-mail-storelistener.h" + +#include "evolution-mail-marshal.h" + +#define PARENT_TYPE bonobo_object_get_type () + +static BonoboObjectClass *parent_class = NULL; + +#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_storelistener_get_type())) + +struct _EvolutionMailStoreListenerPrivate { + int dummy; +}; + +enum { + EML_CHANGED, + EML_LAST_SIGNAL +}; + +static guint eml_signals[EML_LAST_SIGNAL]; + +/* GObject methods */ + +static void +impl_dispose (GObject *object) +{ + struct _EvolutionMailStoreListenerPrivate *p = _PRIVATE(object); + + p = p; + + (* G_OBJECT_CLASS (parent_class)->dispose) (object); +} + +static void +impl_finalize (GObject *object) +{ + printf("EvolutionMailStoreListener finalised!\n"); + + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +/* Evolution.Mail.Listener */ +static const char *change_type_name(int type) +{ + switch (type) { + case Evolution_Mail_ADDED: + return "added"; + break; + case Evolution_Mail_CHANGED: + return "changed"; + break; + case Evolution_Mail_REMOVED: + return "removed"; + break; + default: + return ""; + } +} + +static void +impl_changed(PortableServer_Servant _servant, + const Evolution_Mail_Store store, + const Evolution_Mail_StoreChanges * changes, + CORBA_Environment * ev) +{ + EvolutionMailStoreListener *eml = (EvolutionMailStoreListener *)bonobo_object_from_servant(_servant); + int i, j; + + printf("store changed!\n"); + for (i=0;i<changes->_length;i++) { + printf(" %d %s", changes->_buffer[i].folders._length, change_type_name(changes->_buffer[i].type)); + for (j=0;j<changes->_buffer[i].folders._length;j++) { + printf(" %s %s\n", changes->_buffer[i].folders._buffer[j].full_name, changes->_buffer[i].folders._buffer[j].name); + } + } + + g_signal_emit(eml, eml_signals[EML_CHANGED], 0, store, changes); +} + +/* Initialization */ + +static void +evolution_mail_storelistener_class_init (EvolutionMailStoreListenerClass *klass) +{ + POA_Evolution_Mail_StoreListener__epv *epv = &klass->epv; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + epv->changed = impl_changed; + + object_class->dispose = impl_dispose; + object_class->finalize = impl_finalize; + + g_type_class_add_private(klass, sizeof(struct _EvolutionMailStoreListenerPrivate)); + + eml_signals[EML_CHANGED] = + g_signal_new("changed", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvolutionMailStoreListenerClass, changed), + NULL, NULL, + evolution_mail_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_POINTER); +} + +static void +evolution_mail_storelistener_init (EvolutionMailStoreListener *ems, EvolutionMailStoreListenerClass *klass) +{ + struct _EvolutionMailStoreListenerPrivate *p = _PRIVATE(ems); + + p = p; +} + +EvolutionMailStoreListener * +evolution_mail_storelistener_new(void) +{ + EvolutionMailStoreListener *eml; + + eml = g_object_new(evolution_mail_storelistener_get_type(), NULL); + + return eml; +} + +BONOBO_TYPE_FUNC_FULL (EvolutionMailStoreListener, Evolution_Mail_StoreListener, PARENT_TYPE, evolution_mail_storelistener) diff --git a/plugins/mail-remote/evolution-mail-storelistener.h b/plugins/mail-remote/evolution-mail-storelistener.h new file mode 100644 index 0000000000..4aa002bdd2 --- /dev/null +++ b/plugins/mail-remote/evolution-mail-storelistener.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2005 Novell, Inc. + * + * Author: Michael Zucchi <notzed@novell.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#ifndef _EVOLUTION_MAIL_STORELISTENER_H_ +#define _EVOLUTION_MAIL_STORELISTENER_H_ + +#include <bonobo/bonobo-object.h> +#include "Evolution-DataServer-Mail.h" + +#define EVOLUTION_MAIL_TYPE_STORELISTENER (evolution_mail_storelistener_get_type ()) +#define EVOLUTION_MAIL_STORELISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailStoreListener)) +#define EVOLUTION_MAIL_STORELISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_LISTENER, EvolutionMailStoreListenerClass)) +#define EVOLUTION_MAIL_IS_STORELISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) +#define EVOLUTION_MAIL_IS_STORELISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_LISTENER)) + +typedef struct _EvolutionMailStoreListener EvolutionMailStoreListener; +typedef struct _EvolutionMailStoreListenerClass EvolutionMailStoreListenerClass; + +struct _EvolutionMailStoreListener { + BonoboObject parent; +}; + +struct _EvolutionMailStoreListenerClass { + BonoboObjectClass parent_class; + + POA_Evolution_Mail_StoreListener__epv epv; + + void (*changed)(EvolutionMailStoreListener *, const Evolution_Mail_Store store, const Evolution_Mail_StoreChanges *); +}; + +GType evolution_mail_storelistener_get_type(void); + +EvolutionMailStoreListener *evolution_mail_storelistener_new(void); + +#endif /* _EVOLUTION_MAIL_STORELISTENER_H_ */ |