diff options
author | Not Zed <NotZed@Ximian.com> | 2005-05-26 18:40:56 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2005-05-26 18:40:56 +0800 |
commit | 10c92931e083b34d3395744433edda5a493a3054 (patch) | |
tree | e433d945f32e7316771e3b518afb29736c64a4f0 /plugins/mail-remote/e-corba-utils.c | |
parent | f657c69d7b4375a9a4fd202890b17a1e7e280d89 (diff) | |
download | gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.gz gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.zst gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.zip |
New helpers for listeners.
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.
svn path=/trunk/; revision=29414
Diffstat (limited to 'plugins/mail-remote/e-corba-utils.c')
-rw-r--r-- | plugins/mail-remote/e-corba-utils.c | 188 |
1 files changed, 178 insertions, 10 deletions
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; + } +} + |