aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mail-remote/e-corba-utils.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2005-05-26 18:40:56 +0800
committerMichael Zucci <zucchi@src.gnome.org>2005-05-26 18:40:56 +0800
commit10c92931e083b34d3395744433edda5a493a3054 (patch)
treee433d945f32e7316771e3b518afb29736c64a4f0 /plugins/mail-remote/e-corba-utils.c
parentf657c69d7b4375a9a4fd202890b17a1e7e280d89 (diff)
downloadgsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar
gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.gz
gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.bz2
gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.lz
gsoc2013-evolution-10c92931e083b34d3395744433edda5a493a3054.tar.xz
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.c188
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;
+ }
+}
+