Actually remove the mail-remote plugin, like the ChangeLog says.

svn path=/trunk/; revision=34721
This commit is contained in:
Matthew Barnes
2007-12-17 13:22:59 +00:00
parent 8bdb85463f
commit 70aeb47914
28 changed files with 0 additions and 4066 deletions

View File

@ -1,99 +0,0 @@
2007-10-29 Matthew Barnes <mbarnes@redhat.com>
* evolution-mail-sessionlistener.c:
Use g_cclosure_marshal_VOID__POINTER instead of
evolution_mail_marshal_VOID__POINTER.
2007-09-27 Hiroyuki Ikezoe <poincare@ikezoe.net>
** Fix for bug #461195
* evolution-mail-marshal.list: Remove needless marshalers.
2007-05-12 Matthew Barnes <mbarnes@redhat.com>
** Fixes part of bug #337616
* Makefile.am: Add "eplug.xml" file to EXTRA_DIST.
2007-04-02 Sankar P <psankar@novell.com>
* Committed on behalf of Gilles Dartiguelongue <dartigug@esiee.fr>
* org-gnome-evolution-mail-remote.eplug.xml:
Cleanup.
Fixes part of #301149
2006-01-06 Simon Zheng <simon.zheng@sun.com>
* evolution-mail-session.c:
* evolution-mail-store.c:
use libedataserver/e-account-list.h instead of e-util/e-account-list.h.
use libedataserver/e-account.h instead of e-util/e-account.h.
2005-08-10 Not Zed <NotZed@Ximian.com>
** See #271985.
* evolution-mail-session.c (is_storage): check for uri "" and pass
exception to provider get.
2005-08-02 Not Zed <NotZed@Ximian.com>
* org-gnome-evolution-mail-remote.eplug.xml: How strange, this was
never added, but nobody noticed till now.
2005-06-02 Not Zed <NotZed@Ximian.com>
* Evolution.idl: seutp an idl file so we only need to generate one
set of skels/stubs for all imported.
* mail-remote.c (e_plugin_lib_enable): instead of writing ior to a
file, just add the Session interface to the mail component.
* client.c (get_session): use the new shell interface to find the
mail compnent and retrieve the session interface using
bonobo-activation, so the mailer starts if we try to access it.
2005-05-27 Not Zed <NotZed@Ximian.com>
* em-message-stream.[ch]: A camel-stream to wrap
Evolution_Mail_MessageStream.
* evolution-mail-messagestream.[ch]: simplified read-only stream
interface rather than using bonobo-stream. It wraps a
camel-stream only & simplified lifecycle management.
* evolution-mail-store.c (evolution_mail_store_changed): if we
have no more listeners, close the camelstore object off.
* Evolution-DataServer-Mail.idl: changed exceptions to use one
exception type with details. Fixed code to use these.
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.
Filled out api.
2005-05-20 Not Zed <NotZed@Ximian.com>
* Lots of work, filled out functions, cleaned up idl to make the
data more useful, added a listener interface, etc.
2005-05-12 Not Zed <NotZed@Ximian.com>
* A remote mail interface plugin for evolution.

View File

@ -1,209 +0,0 @@
/* Evolution Mail Data Interface
*
* Copyright (C) 2005 Novell, Inc.
*
* Authors: Michael Zucchi <notzed@novell.com>
*/
#ifndef _EVOLUTION_DATASERVER_MAIL_IDL_
#define _EVOLUTION_DATASERVER_MAIL_IDL_
#include <Bonobo.idl>
module Evolution {
module Mail {
/* ********************************************************************** */
// NB: tiny subset of omg properties service
typedef string PropertyName;
typedef sequence <PropertyName> PropertyNames;
struct Property {
PropertyName name;
any value;
};
typedef sequence <Property> Properties;
/* ********************************************************************** */
// exceptions
enum ErrorType {
SYSTEM_ERROR,
CAMEL_ERROR,
FAILED,
NOT_SUPPORTED,
NO_PERMISSION
};
exception MailException {
ErrorType id;
string desc;
};
/* ********************************************************************** */
// Main interfaces
interface Folder;
typedef sequence<Folder> Folders;
struct FolderInfo {
string name;
string full_name;
Folder folder;
};
typedef sequence <FolderInfo> FolderInfos;
interface Store;
typedef sequence<Store> Stores;
struct StoreInfo {
string name;
string uid;
Store store;
};
typedef sequence <StoreInfo> StoreInfos;
interface Session;
// **********************************************************************
// MessageInfo wrappers
typedef string UserFlag;
typedef sequence <UserFlag> UserFlags;
struct UserTag {
string name;
string value; // value == "" == unset
};
typedef sequence <UserTag> UserTags;
struct MessageInfo {
string uid;
string subject;
string to;
string from;
long flags; // CamelMessageInfo flag bits
UserFlags userFlags;
UserTags userTags;
};
typedef sequence <MessageInfo> MessageInfos;
// Used to pass to altering functions
struct MessageInfoSet {
string uid;
long flagSet; // values bits to set in the flags
long flagMask; // mask of bits to change in the flags
UserFlags userFlagSet;
UserFlags userFlagUnset;
UserTags userTags;
};
typedef sequence <MessageInfoSet> MessageInfoSets;
/* ********************************************************************** */
/* Messages are passed as full rfc822 encoded messages in a stream */
typedef sequence <octet>Buffer;
interface MessageStream : Bonobo::Unknown {
Buffer next(in long size)
raises (MailException);
void dispose();
};
interface MessageIterator : Bonobo::Unknown {
MessageInfos next(in long limit)
raises (MailException);
void dispose();
};
/* ********************************************************************** */
enum ChangeType {
ADDED,
REMOVED,
CHANGED
};
// ??
struct SessionChange {
ChangeType type;
StoreInfos stores;
};
typedef sequence <SessionChange> SessionChanges;
struct StoreChange {
ChangeType type;
FolderInfos folders;
};
typedef sequence <StoreChange> StoreChanges;
struct FolderChange {
ChangeType type;
MessageInfos messages;
};
typedef sequence <FolderChange> FolderChanges;
/* ********************************************************************** */
/* listeners */
interface SessionListener : Bonobo::Unknown {
oneway void changed(in Session session, in SessionChanges changes);
oneway void shutdown(in Session session);
// We need to use gnome-keyring instead of an interface like this?
// Or does gnome-keyring run off this?
//string getPassword(in Session session, string uri, string domain, string item, string prompt, long flags);
};
interface StoreListener : Bonobo::Unknown {
oneway void changed(in Store store, in StoreChanges changes);
};
interface FolderListener : Bonobo::Unknown {
oneway void changed(in Folder folder, in FolderChanges changes);
};
/* ********************************************************************** */
// 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, in StoreListener listener)
raises (MailException);
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, in FolderListener listener)
raises (MailException);
void sendMessage(in MessageStream msg)
raises (MailException);
};
interface Folder : Bonobo::Unknown {
boolean getProperties(in PropertyNames names, out Properties props);
MessageIterator getMessages(in string pattern)
raises (MailException);
void changeMessages(in MessageInfoSets infos)
raises (MailException);
MessageStream getMessage(in string uid)
raises (MailException);
void appendMessage(in MessageInfoSet info, in MessageStream msg)
raises (MailException);
};
};
};
#endif

View File

@ -1,6 +0,0 @@
/* All external interfaces should go here, so we only create a single skels file */
#include <Bonobo.idl>
#include <shell/Evolution.idl>
#include <mail/Evolution-Mail.idl>

View File

@ -1,94 +0,0 @@
INCLUDES = \
-I$(top_srcdir) \
$(EVOLUTION_MAIL_CFLAGS)
@EVO_PLUGIN_RULE@
plugin_DATA = org-gnome-evolution-mail-remote.eplug
plugin_LTLIBRARIES = liborg-gnome-evolution-mail-remote.la
liborg_gnome_evolution_mail_remote_la_SOURCES = \
$(IDL_GENERATED_C) \
$(IDL_GENERATED_H) \
e-corba-utils.c \
e-corba-utils.h \
em-message-stream.c \
em-message-stream.h \
evolution-mail-folder.c \
evolution-mail-folder.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-messagestream.c \
evolution-mail-messagestream.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-storelistener.c \
evolution-mail-storelistener.h \
mail-remote.c
liborg_gnome_evolution_mail_remote_la_LDFLAGS = -module -avoid-version
client_SOURCES = \
client.c
client_LDADD = \
$(EVOLUTION_MAIL_LIBS) \
evolution-mail-sessionlistener.o \
evolution-mail-storelistener.o \
evolution-mail-folderlistener.o \
evolution-mail-marshal.o \
evolution-mail-messagestream.o \
Evolution-DataServer-Mail-common.o \
Evolution-DataServer-Mail-stubs.o \
Evolution-DataServer-Mail-skels.o \
Evolution-common.o \
Evolution-stubs.o
noinst_PROGRAMS = \
client
# mail idl
IDL = Evolution-DataServer-Mail.idl
IDL_GENERATED_H = \
Evolution-DataServer-Mail.h
IDL_GENERATED_C = \
Evolution-DataServer-Mail-common.c \
Evolution-DataServer-Mail-skels.c \
Evolution-DataServer-Mail-stubs.c
EVO_GENERATED = Evolution.h Evolution-common.c Evolution-stubs.c Evolution-skels.c
$(IDL_GENERATED_H) $(IDL_GENERATED_C): $(IDL)
$(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl $(IDL_INCLUDES) $^
$(EVO_GENERATED): $(srcdir)/Evolution.idl
$(ORBIT_IDL) -I $(top_srcdir) -I $(top_srcdir)/shell -I $(datadir)/idl $(IDL_INCLUDES) $^
# installed idls
#idl_DATA = $(IDL)
# marshallers for glib
MARSHAL_GENERATED = evolution-mail-marshal.c evolution-mail-marshal.h
@EVO_MARSHAL_RULE@
EXTRA_DIST = \
$(IDL) \
Evolution.idl \
evolution-mail-marshal.list \
org-gnome-evolution-mail-remote.eplug.xml
BUILT_SOURCES = $(IDL_GENERATED_H) $(IDL_GENERATED_C) $(MARSHAL_GENERATED) $(SHELL_GENERATED)
CLEANFILES = $(BUILT_SOURCES)

View File

@ -1,342 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <libbonobo.h>
#include "Evolution-DataServer-Mail.h"
#include "evolution-mail-sessionlistener.h"
#include "evolution-mail-storelistener.h"
#include "evolution-mail-folderlistener.h"
#include "evolution-mail-messagestream.h"
#include "shell/e-shell.h"
#include <camel/camel-folder.h>
static EvolutionMailSessionListener *listener_sess;
static EvolutionMailStoreListener *listener_store;
static EvolutionMailFolderListener *listener_folder;
#if 0
static char *
em_map_mail_ex(CORBA_Environment *ev, void *data)
{
Evolution_Mail_MailException *x = CORBA_exception_value(ev);
switch (x->id) {
case Evolution_Mail_SYSTEM_ERROR:
return g_strdup_printf(_("System error: %s"), x->desc);
case Evolution_Mail_CAMEL_ERROR:
return g_strdup_printf(_("Camel error: %s"), x->desc);
default:
return g_strdup(x->desc);
}
}
#endif
static void e_mail_exception_dump(CORBA_Environment *ev, char *what)
{
#if 0
static int init = 0;
char *d;
/* *shrug* this doesn't work */
if (!init) {
bonobo_exception_add_handler_fn(ex_Evolution_Mail_MailException, em_map_mail_ex, NULL, NULL);
init = 1;
}
d = bonobo_exception_get_text(ev);
if (d) {
printf("Failed %s: %s\n", what, d);
g_free(d);
}
CORBA_exception_free(ev);
#else
const char *id = CORBA_exception_id(ev);
switch (ev->_major) {
case CORBA_USER_EXCEPTION:
if (!strcmp(id, ex_Evolution_Mail_MailException)) {
Evolution_Mail_MailException *x = CORBA_exception_value(ev);
switch (x->id) {
case Evolution_Mail_SYSTEM_ERROR:
printf("Failed %s: System error %s\n", what, x->desc);
break;
case Evolution_Mail_CAMEL_ERROR:
printf("Failed %s: Camel error %s\n", what, x->desc);
break;
default:
printf("Failed %s: %s\n", what, x->desc);
break;
}
break;
}
default:
printf("Failed %s: %s\n", what, id);
break;
}
CORBA_exception_free(ev);
#endif
}
static Evolution_Mail_Session
get_session(void)
{
Evolution_Mail_Session sess = NULL;
CORBA_Environment ev = { 0 };
GNOME_Evolution_Component mail;
GNOME_Evolution_Shell shell;
shell = bonobo_activation_activate_from_id("OAFIID:GNOME_Evolution_Shell:2.4", 0, NULL, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "activating shell");
return NULL;
}
do {
mail = GNOME_Evolution_Shell_findComponent(shell, "mail", &ev);
if (ev._major == CORBA_USER_EXCEPTION
&& !strcmp(ev._id, ex_GNOME_Evolution_Shell_NotReady)) {
CORBA_exception_free(&ev);
printf("Shell not ready yet, waiting\n");
sleep(1);
} else if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "finding mail component");
CORBA_Object_release(shell, NULL);
return NULL;
} else
break;
} while (1);
printf("got mail interface\n");
GNOME_Evolution_MailComponent_test(mail, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "testing mail interface?");
}
sess = Bonobo_Unknown_queryInterface(mail, "IDL:Evolution/Mail/Session:1.0", &ev);
if (sess == NULL || ev._major != CORBA_NO_EXCEPTION) {
if (ev._major != CORBA_NO_EXCEPTION)
e_mail_exception_dump(&ev, "querying for session interface");
else
printf("can't find session interface?\n");
CORBA_Object_release(shell, NULL);
CORBA_Object_release(mail, NULL);
return NULL;
}
printf("got session interface: %p\n", sess);
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) {
e_mail_exception_dump(&ev, "adding store listener");
return NULL;
}
return sess;
}
static void
list_folder(Evolution_Mail_Folder folder)
{
CORBA_Environment ev = { 0 };
Evolution_Mail_MessageIterator iter;
int more, total = 0;
iter = Evolution_Mail_Folder_getMessages(folder, "", &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "getting mssages");
return;
}
do {
Evolution_Mail_MessageInfos *msgs;
int i;
msgs = Evolution_Mail_MessageIterator_next(iter, 50, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "getting next messages");
break;
}
/* NB: set the first 50 messages in private to unseen */
if (total == 0) {
Evolution_Mail_MessageInfoSets *changes;
int j;
changes = Evolution_Mail_MessageInfoSets__alloc();
changes->_length = msgs->_length;
changes->_maximum = msgs->_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;
}
Evolution_Mail_Folder_changeMessages(folder, changes, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
e_mail_exception_dump(&ev, "changing messages");
}
total += msgs->_length;
more = msgs->_length == 50;
#if 0
for (i=0;i<msgs->_length;i++) {
printf("uid: %s '%s'\n", msgs->_buffer[i].uid, msgs->_buffer[i].subject);
}
#endif
CORBA_free(msgs);
} while (more);
printf("calling dispose\n");
Evolution_Mail_MessageIterator_dispose(iter, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
e_mail_exception_dump(&ev, "disposing messageiterator");
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 = (BonoboObject *)evolution_mail_messagestream_new_buffer(msg, strlen(msg));
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);
}
}
static int domain(void *data)
{
Evolution_Mail_Session sess;
Evolution_Mail_StoreInfos *stores;
Evolution_Mail_FolderInfos *folders;
CORBA_Environment ev = { 0 };
int i, j, f;
sess = get_session();
stores = Evolution_Mail_Session_getStores(sess, "", bonobo_object_corba_objref((BonoboObject *)listener_store), &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "getting stores");
_exit(1);
return 0;
}
printf("Got %d stores\n", stores->_length);
for (i=0;i<stores->_length;i++) {
#if 0
Evolution_Mail_PropertyName namesarray[] = {
"name", "uid"
};
Evolution_Mail_PropertyNames names = {
2, 2,
namesarray,
FALSE,
};
Evolution_Mail_Properties *props;
#endif
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
Evolution_Mail_Store_getProperties(store, &names, &props, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "getting store properties");
return 1;
}
for (j=0;j<props->_length;j++) {
printf(" %s = (%s)", props->_buffer[j].name, (char *)ORBit_tk_to_name(props->_buffer[j].value._type->kind));
if (props->_buffer[j].value._type == TC_CORBA_string) {
printf(" '%s'\n", (char *)props->_buffer[j].value._value);
} else {
printf(" '%s' ", BONOBO_ARG_GET_STRING(&props->_buffer[j].value));
printf(" <unknonw type>\n");
}
}
CORBA_free(props);
#endif
#if 1
{
char *msg = "To: notzed@novell.com\r\n"
"Subject: This is a test from auto-send\r\n"
"\r\n"
"Blah blah, test message!\r\n";
BonoboObject *mem;
mem = (BonoboObject *)evolution_mail_messagestream_new_buffer(msg, strlen(msg));
printf("attempt send mail to store\n");
Evolution_Mail_Store_sendMessage(store, bonobo_object_corba_objref(mem), &ev);
if (ev._major != CORBA_NO_EXCEPTION)
e_mail_exception_dump(&ev, "sending message to store");
/* If we get a system exception, do we have to dispose it ourselves?? */
}
#endif
folders = Evolution_Mail_Store_getFolders(store, "", bonobo_object_corba_objref((BonoboObject *)listener_folder), &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
e_mail_exception_dump(&ev, "getting folders");
} else {
for (f = 0; f<folders->_length;f++) {
printf("folder %p full:'%s' name:'%s'\n", folders->_buffer[f].folder, folders->_buffer[f].full_name, folders->_buffer[f].name);
}
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);
}
}
}
CORBA_free(folders);
}
CORBA_free(stores);
return 0;
}
int main(int argc, char **argv)
{
bonobo_init(&argc, argv);
g_idle_add(domain, NULL);
bonobo_main();
return 0;
}

View File

@ -1,288 +0,0 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <errno.h>
#include "e-corba-utils.h"
#include "evolution-mail-store.h"
#include "evolution-mail-folder.h"
#include "evolution-mail-messagestream.h"
#include "em-message-stream.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 <bonobo/bonobo-i18n.h>
#include <bonobo/bonobo-exception.h>
#include <libedataserver/e-msgport.h>
static 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(Evolution_Mail_Property *prop, const char *name, const char *val)
{
prop->value._release = CORBA_TRUE;
prop->value._type = TC_CORBA_string;
prop->value._value = CORBA_sequence_CORBA_string_allocbuf(1);
((char **)prop->value._value)[0] = CORBA_string_dup(val);
prop->name = CORBA_string_dup(name);
}
void
e_mail_property_set_null(Evolution_Mail_Property *prop, const char *name)
{
prop->value._release = CORBA_TRUE;
prop->value._type = TC_null;
prop->name = CORBA_string_dup(name);
}
void
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));
si->store = CORBA_Object_duplicate(bonobo_object_corba_objref((BonoboObject *)store), NULL);
}
void
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 = 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 = Evolution_Mail_UserFlags_allocbuf(mi->userFlags._maximum);
CORBA_sequence_set_release(&mi->userFlags, CORBA_TRUE);
for (i=0;flag;flag = flag->next,i++) {
mi->userFlags._buffer[i] = CORBA_string_dup(flag->name);
g_assert(mi->userFlags._buffer[i]);
}
}
tag = camel_message_info_user_tags(info);
mi->userTags._maximum = camel_tag_list_size((CamelTag **)&tag);
mi->userTags._length = mi->userTags._maximum;
if (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++) {
mi->userTags._buffer[i].name = CORBA_string_dup(tag->name);
mi->userTags._buffer[i].value = CORBA_string_dup(tag->value);
g_assert(mi->userTags._buffer[i].name);
g_assert(mi->userTags._buffer[i].value);
}
}
}
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(Evolution_Mail_FolderInfo *fi, EvolutionMailFolder *emf)
{
fi->name = CORBA_string_dup(emf->name);
fi->full_name = CORBA_string_dup(emf->full_name);
fi->folder = CORBA_Object_duplicate(bonobo_object_corba_objref((BonoboObject *)emf), NULL);
}
CamelMimeMessage *
e_messagestream_to_message(const Evolution_Mail_MessageStream in, CORBA_Environment *ev)
{
CamelStream *emms;
CamelMimeMessage *msg;
emms = em_message_stream_new(in);
if (emms == NULL) {
e_mail_exception_set(ev, Evolution_Mail_FAILED, _("Unknown reason"));
return NULL;
}
msg = camel_mime_message_new();
if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, emms) == -1) {
e_mail_exception_set(ev, Evolution_Mail_SYSTEM_ERROR, g_strerror(errno));
camel_object_unref(msg);
msg = NULL;
}
camel_object_unref(emms);
return msg;
}
Evolution_Mail_MessageStream
e_messagestream_from_message(CamelMimeMessage *msg, CORBA_Environment *ev)
{
CamelStreamMem *mem;
EvolutionMailMessageStream *emms;
Evolution_Mail_MessageStream out;
/* didn't say it was going to be efficient ... */
mem = (CamelStreamMem *)camel_stream_mem_new();
if (camel_data_wrapper_write_to_stream((CamelDataWrapper *)msg, (CamelStream *)mem) == -1) {
e_mail_exception_set(ev, Evolution_Mail_SYSTEM_ERROR, g_strerror(errno));
out = CORBA_OBJECT_NIL;
} else {
camel_stream_reset((CamelStream *)mem);
emms = evolution_mail_messagestream_new((CamelStream *)mem);
out = CORBA_Object_duplicate(bonobo_object_corba_objref((BonoboObject *)emms), NULL);
}
camel_object_unref(mem);
return out;
}
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) {
e(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;
}
}
void e_mail_exception_set(CORBA_Environment *ev, Evolution_Mail_ErrorType id, const char *desc)
{
Evolution_Mail_MailException *x;
x = Evolution_Mail_MailException__alloc();
x->id = id;
x->desc = CORBA_string_dup(desc);
CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_MailException, x);
}
void e_mail_exception_xfer_camel(CORBA_Environment *ev, CamelException *ex)
{
e_mail_exception_set(ev, Evolution_Mail_CAMEL_ERROR, ex && ex->desc ? ex->desc:"");
camel_exception_clear(ex);
}

View File

@ -1,44 +0,0 @@
#ifndef _E_CORBA_UTILS_H
#define _E_CORBA_UTILS_H
#include "Evolution-DataServer-Mail.h"
/* Debug, warning debug, error debug, global for whole plugin to make it easier to enable/disable */
#define d(x)
#define w(x)
#define e(x)
struct _EvolutionMailStore;
struct _EvolutionMailFolder;
struct _CamelMessageInfo;
struct _CamelStream;
struct _CamelMimeMessage;
struct _CamelException;
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(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);
struct _CamelMimeMessage *e_messagestream_to_message(const Evolution_Mail_MessageStream in, CORBA_Environment *ev);
Evolution_Mail_MessageStream e_messagestream_from_message(struct _CamelMimeMessage *msg, CORBA_Environment *ev);
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);
/* raise an exception */
void e_mail_exception_set(CORBA_Environment *ev, Evolution_Mail_ErrorType id, const char *desc);
void e_mail_exception_xfer_camel(CORBA_Environment *ev, struct _CamelException *ex);
#endif /* !_E_CORBA_UTILS_H */

View File

@ -1,144 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Authors: Michael Zucchi <notzed@novel.com>
*
* Copyright 2005 Novell, Inc. (www.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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <camel/camel-stream.h>
#include "em-message-stream.h"
#include "e-corba-utils.h"
#define EMSS_CLASS(x) ((EMMessageStreamClass *)(((CamelObject *)(x))->klass))
static CamelStreamClass *parent_class = NULL;
static ssize_t
emms_read(CamelStream *stream, char *buffer, size_t n)
{
EMMessageStream *emms = (EMMessageStream *)stream;
ssize_t len;
Evolution_Mail_Buffer *buf;
CORBA_Environment ev = { 0 };
/* To avoid all of the rount-trip overhead, this could always fire off
one request in advance, to pipeline the data. Using another thread. */
if (emms->source == CORBA_OBJECT_NIL) {
errno = EBADF;
return -1;
}
buf = Evolution_Mail_MessageStream_next(emms->source, n, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
CORBA_exception_free(&ev);
Evolution_Mail_MessageStream_dispose(emms->source, &ev);
emms->source = CORBA_OBJECT_NIL;
stream->eos = TRUE;
errno = EBADF;
return -1;
}
if (buf->_length == 0)
stream->eos = TRUE;
len = buf->_length;
memcpy(buffer, buf->_buffer, buf->_length);
CORBA_free(buf);
return len;
}
static void
em_message_stream_init (CamelObject *object)
{
/*EMMessageStream *emss = (EMMessageStream *)object;*/
}
static void
em_message_stream_finalize (CamelObject *object)
{
EMMessageStream *emms = (EMMessageStream *)object;
d(printf("EMMessageStream.finalise()\n"));
if (emms->source) {
CORBA_Environment ev = { 0 };
Evolution_Mail_MessageStream_dispose(emms->source, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
CORBA_exception_free(&ev);
CORBA_Object_release(emms->source, &ev);
if (ev._major != CORBA_NO_EXCEPTION)
CORBA_exception_free(&ev);
}
}
static void
em_message_stream_class_init (EMMessageStreamClass *klass)
{
CamelStreamClass *stream_class = CAMEL_STREAM_CLASS (klass);
parent_class = (CamelStreamClass *) CAMEL_STREAM_TYPE;
stream_class->read = emms_read;
}
CamelType
em_message_stream_get_type (void)
{
static CamelType type = CAMEL_INVALID_TYPE;
if (type == CAMEL_INVALID_TYPE) {
type = camel_type_register (CAMEL_STREAM_TYPE,
"EMMessageStream",
sizeof (EMMessageStream),
sizeof (EMMessageStreamClass),
(CamelObjectClassInitFunc) em_message_stream_class_init,
NULL,
(CamelObjectInitFunc) em_message_stream_init,
(CamelObjectFinalizeFunc) em_message_stream_finalize);
}
return type;
}
CamelStream *
em_message_stream_new(const Evolution_Mail_MessageStream source)
{
EMMessageStream *ems = (EMMessageStream *)camel_object_new(em_message_stream_get_type());
CORBA_Environment ev = { 0 };
ems->source = CORBA_Object_duplicate(source, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
CORBA_exception_free(&ev);
camel_object_unref(ems);
ems = NULL;
}
return (CamelStream *)ems;
}

View File

@ -1,57 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Authors: Michael Zucchi <notzed@ximian.com>
*
* Copyright 2003 Ximian, Inc. (www.ximian.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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef EM_MESSAGE_STREAM_H
#define EM_MESSAGE_STREAM_H
#ifdef __cplusplus
extern "C" {
#pragma }
#endif /* __cplusplus */
#define EM_MESSAGE_STREAM_TYPE (em_message_stream_get_type ())
#define EM_MESSAGE_STREAM(obj) (CAMEL_CHECK_CAST((obj), EM_MESSAGE_STREAM_TYPE, EMMessageStream))
#define EM_MESSAGE_STREAM_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), EM_MESSAGE_STREAM_TYPE, EMMessageStreamClass))
#define EM_IS_MESSAGE_STREAM(o) (CAMEL_CHECK_TYPE((o), EM_MESSAGE_STREAM_TYPE))
#include <camel/camel-stream.h>
#include "Evolution-DataServer-Mail.h"
typedef struct _EMMessageStream {
CamelStream parent_stream;
Evolution_Mail_MessageStream source;
} EMMessageStream;
typedef struct {
CamelStreamClass parent_class;
} EMMessageStreamClass;
CamelType em_message_stream_get_type (void);
CamelStream *em_message_stream_new(const Evolution_Mail_MessageStream source);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* EM_MESSAGE_STREAM_H */

View File

@ -1,417 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/*
* Copyright (C) 2005 Novell, Inc.
*
* Authors: 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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#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 <bonobo/bonobo-arg.h>
#include "evolution-mail-folder.h"
#include "evolution-mail-store.h"
#include "evolution-mail-messageiterator.h"
#include "evolution-mail-session.h"
#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 ()
static BonoboObjectClass *parent_class = NULL;
#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_folder_get_type()))
struct _EvolutionMailFolderPrivate {
CamelFolder *folder;
guint32 folder_changed;
EDList listeners;
};
/* GObject methods */
static void
impl_dispose (GObject *object)
{
struct _EvolutionMailFolderPrivate *p = _PRIVATE(object);
if (p->folder) {
camel_object_remove_event(p->folder, p->folder_changed);
camel_object_unref(p->folder);
p->folder = NULL;
}
e_mail_listener_free(&p->listeners);
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
EvolutionMailFolder *emf = (EvolutionMailFolder *)object;
struct _EvolutionMailFolderPrivate *p = _PRIVATE(object);
p = p;
g_warning("EvolutionMailFolder is finalised!\n");
g_free(emf->full_name);
g_free(emf->name);
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Evolution.Mail.Folder */
static CORBA_boolean
impl_getProperties(PortableServer_Servant _servant,
const Evolution_Mail_PropertyNames* names,
Evolution_Mail_Properties **propsp,
CORBA_Environment * ev)
{
EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant);
int i;
Evolution_Mail_Properties *props;
CORBA_boolean ok = CORBA_TRUE;
*propsp = props = Evolution_Mail_Properties__alloc();
props->_length = names->_length;
props->_maximum = props->_length;
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];
Evolution_Mail_Property *prop = &props->_buffer[i];
prop->value._release = CORBA_TRUE;
if (!strcmp(name, "name")) {
prop->value._type = TC_CORBA_string;
prop->value._value = CORBA_string_dup(emf->name);
} else if (!strcmp(name, "full_name")) {
prop->value._type = TC_CORBA_string;
prop->value._value = CORBA_string_dup(emf->full_name);
} else {
prop->value._type = TC_null;
ok = CORBA_FALSE;
}
prop->name = CORBA_string_dup(name);
}
return ok;
}
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;
Evolution_Mail_MessageIterator iter;
folder = evolution_mail_folder_get_folder(emf, ev);
if (folder == NULL)
return CORBA_OBJECT_NIL;
emi = evolution_mail_messageiterator_new(folder, pattern);
camel_object_unref(folder);
/* NB: How do we destroy the object once we're done? */
iter = CORBA_Object_duplicate(bonobo_object_corba_objref((BonoboObject *)emi), NULL);
return iter;
}
static void
impl_changeMessages(PortableServer_Servant _servant, const Evolution_Mail_MessageInfoSets *infos, CORBA_Environment * ev)
{
EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant);
struct _CamelFolder *folder;
int i, j;
folder = evolution_mail_folder_get_folder(emf, ev);
if (folder == NULL)
return;
camel_folder_freeze(folder);
for (i=0;i<infos->_length;i++) {
CamelMessageInfo *mi;
Evolution_Mail_MessageInfoSet *mis = &infos->_buffer[i];
mi = camel_folder_get_message_info(folder, mis->uid);
if (mi == NULL)
continue;
if (mis->flagMask)
camel_message_info_set_flags(mi, mis->flagMask, mis->flagSet);
for (j=0;j<mis->userFlagSet._length;j++)
camel_message_info_set_user_flag(mi, mis->userFlagSet._buffer[j], TRUE);
for (j=0;j<mis->userFlagUnset._length;j++)
camel_message_info_set_user_flag(mi, mis->userFlagUnset._buffer[j], FALSE);
for (j=0;j<mis->userTags._length;j++)
camel_message_info_set_user_tag(mi, mis->userTags._buffer[j].name, mis->userTags._buffer[j].value[0]?mis->userTags._buffer[j].value:NULL);
camel_message_info_free(mi);
}
camel_folder_thaw(folder);
camel_object_unref(folder);
}
static Evolution_Mail_MessageStream
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;
Evolution_Mail_MessageStream out;
CamelException ex = { 0 };
folder = evolution_mail_folder_get_folder(emf, ev);
if (folder == NULL)
return CORBA_OBJECT_NIL;
msg = camel_folder_get_message(folder, uid, &ex);
if (msg == NULL) {
e_mail_exception_xfer_camel(ev, &ex);
out = CORBA_OBJECT_NIL;
} else {
out = e_messagestream_from_message(msg, ev);
camel_object_unref(msg);
}
camel_object_unref(folder);
return out;
}
static void
impl_appendMessage(PortableServer_Servant _servant, const Evolution_Mail_MessageInfoSet*mi, const Evolution_Mail_MessageStream message, CORBA_Environment *ev)
{
EvolutionMailFolder *emf = (EvolutionMailFolder *)bonobo_object_from_servant(_servant);
struct _CamelFolder *folder;
CamelMimeMessage *msg = NULL;
CamelMessageInfo *info;
CamelException ex = { 0 };
CORBA_Environment wev = { 0 };
folder = evolution_mail_folder_get_folder(emf, ev);
if (folder == NULL)
goto fail3;
msg = e_messagestream_to_message(message, ev);
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))
e_mail_exception_xfer_camel(ev, &ex);
camel_object_unref(msg);
fail2:
camel_object_unref(folder);
fail3:
Evolution_Mail_MessageStream_dispose(message, &wev);
}
/* Initialization */
static void
evolution_mail_folder_class_init (EvolutionMailFolderClass *klass)
{
POA_Evolution_Mail_Folder__epv *epv = &klass->epv;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (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;
g_type_class_add_private(klass, sizeof(struct _EvolutionMailFolderPrivate));
}
static void
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, Evolution_Mail_Folder, PARENT_TYPE, evolution_mail_folder)
EvolutionMailFolder *
evolution_mail_folder_new(EvolutionMailStore *ems, const char *name, const char *full_name)
{
EvolutionMailFolder *emf = g_object_new (EVOLUTION_MAIL_TYPE_FOLDER, NULL);
emf->name = g_strdup(name);
emf->full_name = g_strdup(full_name);
emf->store = ems;
return emf;
}
static void
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 = Evolution_Mail_MessageInfos_allocbuf(uids->len);
for (i=0;i<uids->len;i++) {
CamelMessageInfo *info = camel_folder_get_message_info(folder, uids->pdata[i]);
if (info) {
e_mail_messageinfo_set_message(&change->messages._buffer[total], info);
camel_message_info_free(info);
total++;
} else {
w(printf("couldn't get info for changed uid '%s'?\n", (char *)uids->pdata[i]));
}
}
change->messages._length = total;
}
static void
emf_folder_changed(CamelObject *o, void *d, void *data)
{
EvolutionMailFolder *emf = data;
CamelFolder *folder = (CamelFolder *)o;
CamelFolderChangeInfo *ci = d;
int count = 0;
Evolution_Mail_FolderChanges *changes;
changes = Evolution_Mail_FolderChanges__alloc();
changes->_maximum = 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) {
emf_set_change(&changes->_buffer[count], Evolution_Mail_ADDED, folder, ci->uid_added);
count++;
}
if (ci->uid_removed->len) {
emf_set_change(&changes->_buffer[count], Evolution_Mail_REMOVED, folder, ci->uid_removed);
count++;
}
if (ci->uid_changed->len) {
emf_set_change(&changes->_buffer[count], Evolution_Mail_CHANGED, folder, ci->uid_changed);
count++;
}
changes->_length = count;
evolution_mail_folder_changed(emf, changes);
CORBA_free(changes);
}
struct _CamelFolder *evolution_mail_folder_get_folder(EvolutionMailFolder *emf, CORBA_Environment *ev)
{
struct _EvolutionMailFolderPrivate *p = _PRIVATE(emf);
CamelStore *store;
CamelException ex;
if (p->folder == NULL) {
store = evolution_mail_store_get_store(emf->store, ev);
if (store == NULL)
return NULL;
camel_exception_init(&ex);
p->folder = camel_store_get_folder(store, emf->full_name, 0, &ex);
if (p->folder) {
p->folder_changed = camel_object_hook_event(p->folder, "folder_changed", emf_folder_changed, emf);
} else {
e_mail_exception_xfer_camel(ev, &ex);
}
camel_object_unref(store);
}
if (p->folder)
camel_object_ref(p->folder);
return p->folder;
}
int evolution_mail_folder_close_folder(EvolutionMailFolder *emf)
{
struct _EvolutionMailFolderPrivate *p = _PRIVATE(emf);
/* FIXME: locking */
if (p->folder) {
if (!e_dlist_empty(&p->listeners))
return -1;
camel_object_remove_event(p->folder, p->folder_changed);
camel_object_unref(p->folder);
p->folder = NULL;
}
return 0;
}
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)) {
d(printf("No more listeners for folder, could dispose store object now\n"));
evolution_mail_folder_close_folder(emf);
}
}

View File

@ -1,64 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Michael Zucchi <notzed@novell.com>
*/
#ifndef _EVOLUTION_MAIL_FOLDER_H_
#define _EVOLUTION_MAIL_FOLDER_H_
#include <bonobo/bonobo-object.h>
#include "Evolution-DataServer-Mail.h"
#define EVOLUTION_MAIL_TYPE_FOLDER (evolution_mail_folder_get_type ())
#define EVOLUTION_MAIL_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_FOLDER, EvolutionMailFolder))
#define EVOLUTION_MAIL_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_FOLDER, EvolutionMailFolderClass))
#define EVOLUTION_MAIL_IS_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_FOLDER))
#define EVOLUTION_MAIL_IS_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_FOLDER))
struct _EvolutionMailStore;
typedef struct _EvolutionMailFolder EvolutionMailFolder;
typedef struct _EvolutionMailFolderClass EvolutionMailFolderClass;
struct _EvolutionMailFolder {
BonoboObject parent;
struct _EvolutionMailStore *store;
char *full_name;
char *name;
};
struct _EvolutionMailFolderClass {
BonoboObjectClass parent_class;
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, CORBA_Environment *ev);
int evolution_mail_folder_close_folder(EvolutionMailFolder *emf);
#endif /* _EVOLUTION_MAIL_FOLDER_H_ */

View File

@ -1,156 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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"
#include "e-corba-utils.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)
{
d(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;
d(printf("folder changed!\n"));
for (i=0;i<changes->_length;i++) {
d(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++) {
d(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)

View File

@ -1,54 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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_ */

View File

@ -1 +0,0 @@
VOID:POINTER,POINTER

View File

@ -1,171 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/*
* Copyright (C) 2005 Novell, Inc.
*
* Authors: 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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#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 <bonobo/bonobo-arg.h>
#include "evolution-mail-messageiterator.h"
#include <camel/camel-folder.h>
#include "e-corba-utils.h"
#define d(x)
#define PARENT_TYPE bonobo_object_get_type ()
static BonoboObjectClass *parent_class = NULL;
#define _PRIVATE(o) (g_type_instance_get_private ((GTypeInstance *)o, evolution_mail_messageiterator_get_type()))
struct _EvolutionMailMessageIteratorPrivate {
int index;
CamelFolder *folder;
char *expr;
GPtrArray *search;
};
/* GObject methods */
static void
impl_dispose (GObject *object)
{
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
struct _EvolutionMailMessageIteratorPrivate *p = _PRIVATE(object);
d(printf("EvolutionMailMessageIterator: finalise\n"));
if (*p->expr)
camel_folder_search_free(p->folder, p->search);
else
camel_folder_free_uids(p->folder, p->search);
g_free(p->expr);
camel_object_unref(p->folder);
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Evolution.Mail.MessageIterator */
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;
Evolution_Mail_MessageInfos *msgs;
struct _EvolutionMailMessageIteratorPrivate *p = _PRIVATE(emf);
CamelException ex = { 0 };
if (p->search == NULL) {
if (*p->expr)
p->search = camel_folder_search_by_expression(p->folder, p->expr, &ex);
else
p->search = camel_folder_get_uids(p->folder);
if (camel_exception_is_set(&ex)) {
camel_exception_clear(&ex);
return NULL;
}
p->index = 0;
}
msgs = Evolution_Mail_MessageInfos__alloc();
msgs->_maximum = MIN(limit, p->search->len - p->index);
msgs->_buffer = Evolution_Mail_MessageInfos_allocbuf(msgs->_maximum);
CORBA_sequence_set_release(msgs, CORBA_TRUE);
j=0;
for (i=p->index;i<p->search->len && j<msgs->_maximum;i++) {
CamelMessageInfo *info = camel_folder_get_message_info(p->folder, p->search->pdata[i]);
if (info) {
e_mail_messageinfo_set_message(&msgs->_buffer[j], info);
j++;
camel_message_info_free(info);
}
}
p->index = i;
msgs->_length = j;
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_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;
g_type_class_add_private(klass, sizeof(struct _EvolutionMailMessageIteratorPrivate));
}
static void
evolution_mail_messageiterator_init(EvolutionMailMessageIterator *emi, EvolutionMailMessageIteratorClass *klass)
{
bonobo_object_set_immortal((BonoboObject *)emi, TRUE);
}
BONOBO_TYPE_FUNC_FULL (EvolutionMailMessageIterator, Evolution_Mail_MessageIterator, PARENT_TYPE, evolution_mail_messageiterator)
EvolutionMailMessageIterator *
evolution_mail_messageiterator_new(CamelFolder *folder, const char *expr)
{
EvolutionMailMessageIterator *emf = g_object_new(evolution_mail_messageiterator_get_type(), NULL);
struct _EvolutionMailMessageIteratorPrivate *p = _PRIVATE(emf);
p->folder = folder;
camel_object_ref(folder);
p->expr = g_strdup(expr);
return emf;
}

View File

@ -1,47 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Michael Zucchi <notzed@novell.com>
*/
#ifndef _EVOLUTION_MAIL_MESSAGEITERATOR_H_
#define _EVOLUTION_MAIL_MESSAGEITERATOR_H_
#include <bonobo/bonobo-object.h>
#include "Evolution-DataServer-Mail.h"
struct _CamelFolder;
typedef struct _EvolutionMailMessageIterator EvolutionMailMessageIterator;
typedef struct _EvolutionMailMessageIteratorClass EvolutionMailMessageIteratorClass;
struct _EvolutionMailMessageIterator {
BonoboObject parent;
};
struct _EvolutionMailMessageIteratorClass {
BonoboObjectClass parent_class;
POA_Evolution_Mail_MessageIterator__epv epv;
};
GType evolution_mail_messageiterator_get_type(void);
EvolutionMailMessageIterator *evolution_mail_messageiterator_new(struct _CamelFolder *folder, const char *expr);
#endif /* _EVOLUTION_MAIL_MESSAGEITERATOR_H_ */

View File

@ -1,158 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/*
* Copyright (C) 2005 Novell, Inc.
*
* Authors: 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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#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-messagestream.h"
#include <camel/camel-stream-mem.h>
#include "e-corba-utils.h"
#define PARENT_TYPE bonobo_object_get_type ()
static BonoboObjectClass *parent_class = NULL;
/* GObject methods */
static void
impl_dispose (GObject *object)
{
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
EvolutionMailMessageStream *emms = (EvolutionMailMessageStream *)object;
d(printf("EvolutionMailMessageStream: finalise\n"));
if (emms->source)
camel_object_unref(emms->source);
g_free(emms->buffer);
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Evolution.Mail.MessageStream */
static Evolution_Mail_Buffer *
impl_next(PortableServer_Servant _servant, const CORBA_long limit, CORBA_Environment * ev)
{
EvolutionMailMessageStream *emf = (EvolutionMailMessageStream *)bonobo_object_from_servant(_servant);
Evolution_Mail_Buffer *buf;
ssize_t len;
buf = Evolution_Mail_Buffer__alloc();
buf->_maximum = limit;
buf->_buffer = Evolution_Mail_Buffer_allocbuf(buf->_maximum);
if (emf->source) {
len = camel_stream_read(emf->source, buf->_buffer, buf->_maximum);
if (len == -1) {
Evolution_Mail_MailException *x;
x = Evolution_Mail_MailException__alloc();
x->id = Evolution_Mail_SYSTEM_ERROR;
x->desc = CORBA_string_dup(g_strerror(errno));
CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_MailException, x);
CORBA_free(buf);
buf = CORBA_OBJECT_NIL;
} else {
buf->_length = len;
}
} else {
len = MIN(limit, (emf->len - emf->pos));
memcpy(buf->_buffer, emf->buffer + emf->pos, len);
emf->pos += len;
buf->_length = len;
}
return buf;
}
static void
impl_mi_dispose(PortableServer_Servant _servant, CORBA_Environment *ev)
{
EvolutionMailMessageStream *emmi = (EvolutionMailMessageStream *)bonobo_object_from_servant(_servant);
bonobo_object_set_immortal((BonoboObject *)emmi, FALSE);
bonobo_object_unref((BonoboObject *)emmi);
}
/* Initialization */
static void
evolution_mail_messagestream_class_init (EvolutionMailMessageStreamClass *klass)
{
POA_Evolution_Mail_MessageStream__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;
}
static void
evolution_mail_messagestream_init(EvolutionMailMessageStream *emi, EvolutionMailMessageStreamClass *klass)
{
bonobo_object_set_immortal((BonoboObject *)emi, TRUE);
}
BONOBO_TYPE_FUNC_FULL (EvolutionMailMessageStream, Evolution_Mail_MessageStream, PARENT_TYPE, evolution_mail_messagestream)
EvolutionMailMessageStream *
evolution_mail_messagestream_new(CamelStream *source)
{
/* FIXME: use right poa, thread per object? */
EvolutionMailMessageStream *emf = g_object_new(evolution_mail_messagestream_get_type(), NULL);
emf->source = source;
camel_object_ref(source);
return emf;
}
EvolutionMailMessageStream *
evolution_mail_messagestream_new_buffer(const char *buffer, size_t len)
{
/* FIXME: use right poa, thread per object? */
EvolutionMailMessageStream *emf = g_object_new(evolution_mail_messagestream_get_type(), NULL);
emf->buffer = g_malloc(len);
memcpy(emf->buffer, buffer, len);
emf->len = len;
emf->pos = 0;
return emf;
}

View File

@ -1,53 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Michael Zucchi <notzed@novell.com>
*/
#ifndef _EVOLUTION_MAIL_MESSAGESTREAM_H_
#define _EVOLUTION_MAIL_MESSAGESTREAM_H_
#include <bonobo/bonobo-object.h>
#include "Evolution-DataServer-Mail.h"
typedef struct _EvolutionMailMessageStream EvolutionMailMessageStream;
typedef struct _EvolutionMailMessageStreamClass EvolutionMailMessageStreamClass;
struct _EvolutionMailMessageStream {
BonoboObject parent;
/* only one or the other is set */
struct _CamelStream *source;
char *buffer;
size_t len;
size_t pos;
};
struct _EvolutionMailMessageStreamClass {
BonoboObjectClass parent_class;
POA_Evolution_Mail_MessageStream__epv epv;
};
GType evolution_mail_messagestream_get_type(void);
EvolutionMailMessageStream *evolution_mail_messagestream_new(struct _CamelStream *source);
EvolutionMailMessageStream *evolution_mail_messagestream_new_buffer(const char *buffer, size_t len);
#endif /* _EVOLUTION_MAIL_MESSAGESTREAM_H_ */

View File

@ -1,354 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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-session.h"
#include <libedataserver/e-account-list.h>
#include "evolution-mail-store.h"
#include "e-corba-utils.h"
#include <camel/camel-session.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_session_get_type()))
struct _EvolutionMailSessionPrivate {
EAccountList *accounts;
GList *stores;
/* FIXME: locking */
EDList listeners;
guint account_added;
guint account_changed;
guint account_removed;
};
static int
is_storage(EAccount *ea)
{
const char *uri;
int ok = FALSE;
uri = e_account_get_string(ea, E_ACCOUNT_SOURCE_URL);
if (uri && uri[0]) {
CamelProvider *prov;
CamelException ex = { 0 };
prov = camel_provider_get(uri, &ex);
camel_exception_clear(&ex);
ok = prov && (prov->flags & CAMEL_PROVIDER_IS_STORAGE);
}
return ok;
}
/* GObject methods */
static void
impl_dispose (GObject *object)
{
struct _EvolutionMailSessionPrivate *p = _PRIVATE(object);
if (p->stores) {
/* FIXME: free stores */
}
/* FIXME: Free accounts */
/* FIXME: free listners */
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
g_warning("EvolutionMailStore is finalised!\n");
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Evolution.Mail.Session */
static CORBA_boolean
impl_getProperties(PortableServer_Servant _servant,
const Evolution_Mail_PropertyNames* names,
Evolution_Mail_Properties **props,
CORBA_Environment * ev)
{
EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant);
ems = ems;
return CORBA_TRUE;
}
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);
Evolution_Mail_StoreInfos *seq;
int i, len;
GList *l;
seq = Evolution_Mail_StoreInfos__alloc();
/* FIXME: pattern? */
len = g_list_length(p->stores);
seq->_length = len;
seq->_maximum = len;
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);
}
return seq;
}
static void
impl_addListener(PortableServer_Servant _servant,
const Evolution_Mail_SessionListener listener,
CORBA_Environment * ev)
{
EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant);
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
e_mail_listener_add(&p->listeners, listener);
}
static void
impl_removeListener(PortableServer_Servant _servant,
const Evolution_Mail_SessionListener listener,
CORBA_Environment * ev)
{
EvolutionMailSession *ems = (EvolutionMailSession *)bonobo_object_from_servant(_servant);
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
d(printf("Removing listener from session\n"));
if (!e_mail_listener_remove(&p->listeners, listener)) {
d(printf("no more listeners, could shut down session?\n"));
}
}
/* Initialization */
static void
evolution_mail_session_class_init (EvolutionMailSessionClass *klass)
{
POA_Evolution_Mail_Session__epv *epv = &klass->epv;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
epv->getProperties = impl_getProperties;
epv->getStores = impl_getStores;
epv->addListener = impl_addListener;
epv->removeListener = impl_removeListener;
object_class->dispose = impl_dispose;
object_class->finalize = impl_finalize;
g_type_class_add_private(klass, sizeof(struct _EvolutionMailSessionPrivate));
}
static void
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 = 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, Evolution_Mail_ChangeType how, EvolutionMailStore *store)
{
Evolution_Mail_SessionChanges *changes;
/* NB: we only ever create 1 changetype at the moment */
changes = Evolution_Mail_SessionChanges__alloc();
changes->_maximum = 1;
changes->_length = 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_changed(ems, changes);
CORBA_free(changes);
}
static void
ems_account_added(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems)
{
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
if (ea->enabled && is_storage(ea)) {
EvolutionMailStore *store;
d(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, Evolution_Mail_ADDED, store);
}
}
static void
ems_account_changed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems)
{
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
EvolutionMailStore *store = NULL;
GList *l;
for (l = p->stores;l;l=l->next) {
if (((EvolutionMailStore *)l->data)->account == ea) {
store = l->data;
break;
}
}
if (store) {
/* account has been disabled? */
if (!ea->enabled) {
d(printf("Account changed, now disabled %s\n", ea->uid));
p->stores = g_list_remove(p->stores, store);
ems_listener_session_event(ems, Evolution_Mail_REMOVED, store);
g_object_unref(store);
} else {
d(printf("Account changed, dont know how %s\n", ea->uid));
ems_listener_session_event(ems, Evolution_Mail_CHANGED, store);
}
} else if (ea->enabled && is_storage(ea)) {
d(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, Evolution_Mail_ADDED, store);
}
}
static void
ems_account_removed(EAccountList *eal, EAccount *ea, EvolutionMailSession *ems)
{
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
GList *l;
/* for accounts we dont have, we dont care */
for (l = p->stores;l;l=l->next) {
EvolutionMailStore *store = l->data;
if (store->account == ea) {
d(printf("Account removed %s\n", ea->uid));
p->stores = g_list_remove(p->stores, store);
ems_listener_session_event(ems, Evolution_Mail_REMOVED, store);
g_object_unref(store);
break;
}
}
}
static void
evolution_mail_session_init (EvolutionMailSession *ems, EvolutionMailSessionClass *klass)
{
GConfClient *gconf = gconf_client_get_default();
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
EIterator *iter;
d(printf("EvolutionMailSession.init\n"));
e_dlist_init(&p->listeners);
/* local store first */
p->stores = g_list_append(p->stores, evolution_mail_store_new(ems, NULL));
p->accounts = e_account_list_new(gconf);
iter = e_list_get_iterator((EList *)p->accounts);
while (e_iterator_is_valid (iter)) {
EAccount *ea;
if ((ea = (EAccount *)e_iterator_get(iter))
&& ea->enabled
&& is_storage(ea)) {
p->stores = g_list_append(p->stores, evolution_mail_store_new(ems, ea));
}
e_iterator_next(iter);
}
g_object_unref(iter);
g_object_unref(gconf);
p->account_added = g_signal_connect(p->accounts, "account_added", G_CALLBACK(ems_account_added), ems);
p->account_changed = g_signal_connect(p->accounts, "account_changed", G_CALLBACK(ems_account_changed), ems);
p->account_removed = g_signal_connect(p->accounts, "account_removed", G_CALLBACK(ems_account_removed), ems);
ems->session = mail_component_peek_session(NULL);
bonobo_object_set_immortal((BonoboObject *)ems, TRUE);
}
void
evolution_mail_session_changed(EvolutionMailSession *ems, Evolution_Mail_SessionChanges *changes)
{
struct _EvolutionMailSessionPrivate *p = _PRIVATE(ems);
if (!e_mail_listener_emit(&p->listeners, (EMailListenerChanged)Evolution_Mail_SessionListener_changed,
bonobo_object_corba_objref((BonoboObject *)ems), changes)) {
w(printf("No more listeners for store, could dispose session object now?\n"));
}
}
BONOBO_TYPE_FUNC_FULL (EvolutionMailSession, Evolution_Mail_Session, PARENT_TYPE, evolution_mail_session)

View File

@ -1,54 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef _EVOLUTION_MAIL_SESSION_H_
#define _EVOLUTION_MAIL_SESSION_H_
#include <bonobo/bonobo-object.h>
#include "Evolution-DataServer-Mail.h"
#define EVOLUTION_MAIL_TYPE_SESSION (evolution_mail_session_get_type ())
#define EVOLUTION_MAIL_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_SESSION, EvolutionMailSession))
#define EVOLUTION_MAIL_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_SESSION, EvolutionMailSessionClass))
#define EVOLUTION_MAIL_IS_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_SESSION))
#define EVOLUTION_MAIL_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_SESSION))
typedef struct _EvolutionMailSession EvolutionMailSession;
typedef struct _EvolutionMailSessionClass EvolutionMailSessionClass;
struct _EvolutionMailSession {
BonoboObject parent;
struct _CamelSession *session;
};
struct _EvolutionMailSessionClass {
BonoboObjectClass parent_class;
POA_Evolution_Mail_Session__epv epv;
};
GType evolution_mail_session_get_type(void);
void evolution_mail_session_changed(EvolutionMailSession *ems, Evolution_Mail_SessionChanges *changes);
#endif /* _EVOLUTION_MAIL_SESSION_H_ */

View File

@ -1,180 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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"
#include "e-corba-utils.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)
{
d(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;
d(printf("session changed!\n"));
for (i=0;i<changes->_length;i++) {
d(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++) {
d(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);
d(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,
g_cclosure_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)

View File

@ -1,54 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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_ */

View File

@ -1,665 +0,0 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/*
* Copyright (C) 2005 Novell, Inc.
*
* Authors: 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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#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 <bonobo/bonobo-arg.h>
#include <bonobo/bonobo-main.h>
#include "evolution-mail-session.h"
#include "evolution-mail-store.h"
#include "evolution-mail-folder.h"
#include "e-corba-utils.h"
#include <camel/camel-store.h>
#include <camel/camel-session.h>
#include <camel/camel-stream-mem.h>
#include <camel/camel-mime-message.h>
#include <camel/camel-folder.h>
#include <libedataserver/e-account.h>
#include "mail/mail-component.h"
#include "mail/mail-send-recv.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_store_get_type()))
struct _EvolutionMailStorePrivate {
CamelStore *store;
GHashTable *folders;
/* sorted array of folders by full_name */
GPtrArray *folders_array;
guint32 folder_opened;
guint32 folder_created;
guint32 folder_deleted;
guint32 folder_renamed;
guint32 folder_subscribed;
guint32 folder_unsubscribed;
EDList listeners;
};
/* GObject methods */
static void
impl_dispose (GObject *object)
{
EvolutionMailStore *ems = (EvolutionMailStore *)object;
struct _EvolutionMailStorePrivate *p = _PRIVATE(object);
/* FIXME: unref store
unhook events */
if (ems->account) {
g_object_unref(ems->account);
ems->account = NULL;
}
e_mail_listener_free(&p->listeners);
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
struct _EvolutionMailStorePrivate *p = _PRIVATE(object);
g_warning("EvolutionMailStore is finalised!\n");
if (p->folders) {
/* FIXME: bonobo unref? */
g_hash_table_foreach(p->folders, (GHFunc)g_object_unref, NULL);
g_hash_table_destroy(p->folders);
g_ptr_array_free(p->folders_array, TRUE);
}
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Evolution.Mail.Store */
static CORBA_boolean
impl_getProperties(PortableServer_Servant _servant,
const Evolution_Mail_PropertyNames* names,
Evolution_Mail_Properties **propsp,
CORBA_Environment * ev)
{
EvolutionMailStore *ems = (EvolutionMailStore *)bonobo_object_from_servant(_servant);
int i;
Evolution_Mail_Properties *props;
/*struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);*/
CORBA_boolean ok = CORBA_TRUE;
*propsp = props = Evolution_Mail_Properties__alloc();
props->_length = names->_length;
props->_maximum = props->_length;
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];
Evolution_Mail_Property *prop = &props->_buffer[i];
d(printf("getting property '%s'\n", name));
if (!strcmp(name, "name")) {
e_mail_property_set_string(prop, name, evolution_mail_store_get_name(ems));
} else if (!strcmp(name, "uid")) {
e_mail_property_set_string(prop, name, evolution_mail_store_get_uid(ems));
} else {
e_mail_property_set_null(prop, name);
ok = CORBA_FALSE;
}
}
return ok;
}
static void
ems_add_folders(EvolutionMailStore *ems, CamelFolderInfo *fi, GPtrArray *added)
{
struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);
while (fi) {
if (g_hash_table_lookup(p->folders, fi->full_name) == NULL) {
EvolutionMailFolder *emf = evolution_mail_folder_new(ems, fi->name, fi->full_name);
g_hash_table_insert(p->folders, emf->full_name, emf);
g_ptr_array_add(p->folders_array, emf);
if (added) {
g_object_ref(emf);
g_ptr_array_add(added, emf);
}
}
if (fi->child)
ems_add_folders(ems, fi->child, added);
fi = fi->next;
}
}
static void
ems_remove_folders(EvolutionMailStore *ems, CamelFolderInfo *fi, GPtrArray *removed)
{
struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);
EvolutionMailFolder *emf;
while (fi) {
emf = g_hash_table_lookup(p->folders, fi->full_name);
if (emf) {
g_hash_table_remove(p->folders, fi->full_name);
g_ptr_array_remove(p->folders_array, emf);
if (removed)
g_ptr_array_add(removed, emf);
else
g_object_unref(emf);
} else {
g_warning("Folder removed I didn't know existed '%s'\n", fi->full_name);
}
if (fi->child)
ems_remove_folders(ems, fi->child, removed);
fi = fi->next;
}
}
static int
ems_sort_folders_cmp(const void *ap, const void *bp)
{
const EvolutionMailFolder *a = ((const EvolutionMailFolder **)ap)[0];
const EvolutionMailFolder *b = ((const EvolutionMailFolder **)bp)[0];
return strcmp(a->full_name, b->full_name);
}
static void
ems_sort_folders(struct _EvolutionMailStorePrivate *p)
{
qsort(p->folders_array->pdata, p->folders_array->len, sizeof(p->folders_array->pdata[0]), ems_sort_folders_cmp);
}
static void
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 = 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 Evolution_Mail_StoreChanges *
ems_create_changes(EvolutionMailStore *ems, Evolution_Mail_ChangeType how, GPtrArray *changed)
{
Evolution_Mail_StoreChanges *changes;
/* NB: we only ever create 1 changetype at the moment */
changes = Evolution_Mail_StoreChanges__alloc();
changes->_maximum = 1;
changes->_length = 1;
changes->_buffer = Evolution_Mail_StoreChanges_allocbuf(1);
CORBA_sequence_set_release(changes, TRUE);
ems_set_changes(&changes->_buffer[0], how, changed);
return changes;
}
static void
ems_folder_opened(CamelObject *o, void *d, void *data)
{
EvolutionMailStore *ems = data;
CamelFolder *folder = d;
ems = ems;
folder = folder;
/* noop */
}
static void
ems_folder_subscribed(CamelObject *o, void *d, void *data)
{
EvolutionMailStore *ems = data;
CamelFolderInfo *fi = d;
GPtrArray *added;
int i;
added = g_ptr_array_new();
ems_add_folders(ems, fi, added);
if (added) {
if (added->len) {
Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_ADDED, added);
evolution_mail_store_changed(ems, changes);
CORBA_free(changes);
for (i=0;i<added->len;i++)
g_object_unref(added->pdata[i]);
}
g_ptr_array_free(added, TRUE);
}
}
static void
ems_folder_unsubscribed(CamelObject *o, void *d, void *data)
{
EvolutionMailStore *ems = data;
CamelFolderInfo *fi = d;
GPtrArray *removed = NULL;
int i;
removed = g_ptr_array_new();
ems_remove_folders(ems, fi, removed);
if (removed) {
if (removed->len) {
Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_REMOVED, removed);
evolution_mail_store_changed(ems, changes);
CORBA_free(changes);
for (i=0;i<removed->len;i++)
g_object_unref(removed->pdata[i]);
}
g_ptr_array_free(removed, TRUE);
}
}
static void
ems_folder_created(CamelObject *o, void *d, void *data)
{
CamelStore *store = (CamelStore *)o;
if (!camel_store_supports_subscriptions(store))
ems_folder_subscribed(o, d, data);
}
static void
ems_folder_deleted(CamelObject *o, void *d, void *data)
{
CamelStore *store = (CamelStore *)o;
if (!camel_store_supports_subscriptions(store))
ems_folder_unsubscribed(o, d, data);
}
static void
get_folders(CamelFolderInfo *fi, GPtrArray *folders)
{
while (fi) {
g_ptr_array_add(folders, fi);
if (fi->child)
get_folders(fi->child, folders);
fi = fi->next;
}
}
static int
folder_cmp(const void *ap, const void *bp)
{
const CamelFolderInfo *a = ((CamelFolderInfo **)ap)[0];
const CamelFolderInfo *b = ((CamelFolderInfo **)bp)[0];
return strcmp(a->full_name, b->full_name);
}
static void
ems_folder_renamed(CamelObject *o, void *d, void *data)
{
EvolutionMailStore *ems = data;
struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);
CamelRenameInfo *reninfo = d;
int i, oldlen, newlen;
GPtrArray *renamed = g_ptr_array_new(), *folders = g_ptr_array_new();
CamelFolderInfo *top;
GString *name = g_string_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);
top = folders->pdata[0];
oldlen = strlen(reninfo->old_base);
newlen = strlen(top->full_name);
for (i=0;i<folders->len;i++) {
CamelFolderInfo *fi = folders->pdata[i];
EvolutionMailFolder *emf;
if (strlen(fi->full_name) >= newlen) {
g_string_printf(name, "%s%s", reninfo->old_base, fi->full_name + newlen);
if ((emf = g_hash_table_lookup(p->folders, name->str))) {
/* FIXME: locking / or api to rename */
g_hash_table_remove(p->folders, emf->full_name);
g_free(emf->full_name);
g_free(emf->name);
emf->full_name = g_strdup(fi->full_name);
emf->name = g_strdup(fi->name);
g_hash_table_insert(p->folders, emf->full_name, emf);
g_object_ref(emf);
g_ptr_array_add(renamed, emf);
}
}
}
g_string_free(name, TRUE);
g_ptr_array_free(folders, TRUE);
if (renamed) {
if (renamed->len) {
Evolution_Mail_StoreChanges *changes = ems_create_changes(ems, Evolution_Mail_CHANGED, renamed);
evolution_mail_store_changed(ems, changes);
CORBA_free(changes);
for (i=0;i<renamed->len;i++)
g_object_unref(renamed->pdata[i]);
}
g_ptr_array_free(renamed, TRUE);
}
}
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 };
Evolution_Mail_FolderInfos *folders = NULL;
int i;
CamelStore *store;
store = evolution_mail_store_get_store(ems, ev);
if (store == NULL) {
return CORBA_OBJECT_NIL;
}
if (p->folders == NULL) {
fi = camel_store_get_folder_info(store, "", CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST, &ex);
if (fi) {
p->folders = g_hash_table_new(g_str_hash, g_str_equal);
p->folders_array = g_ptr_array_new();
ems_add_folders(ems, fi, NULL);
camel_store_free_folder_info(store, fi);
ems_sort_folders(p);
} else {
e_mail_exception_xfer_camel(ev, &ex);
camel_object_unref(store);
return CORBA_OBJECT_NIL;
}
}
folders = Evolution_Mail_FolderInfos__alloc();
folders->_length = p->folders_array->len;
folders->_maximum = folders->_length;
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);
}
camel_object_unref(store);
return folders;
}
static void
impl_sendMessage(PortableServer_Servant _servant,
const Evolution_Mail_MessageStream message,
CORBA_Environment * ev)
{
EvolutionMailStore *ems = (EvolutionMailStore *)bonobo_object_from_servant(_servant);
CamelException ex = { 0 };
CamelMimeMessage *msg;
CamelInternetAddress *from;
CamelMessageInfo *info;
CORBA_Environment wev = { 0 };
if (ems->account == NULL
|| ems->account->transport == NULL
|| ems->account->transport->url == NULL) {
e_mail_exception_set(ev, Evolution_Mail_NOT_SUPPORTED, _("Account cannot send e-mail"));
goto done;
}
msg = e_messagestream_to_message(message, ev);
if (msg == NULL)
goto done;
from = camel_internet_address_new();
camel_internet_address_add(from, ems->account->id->name, ems->account->id->address);
camel_mime_message_set_from(msg, from);
camel_object_unref(from);
camel_medium_set_header((CamelMedium *)msg, "X-Evolution-Account", ems->account->uid);
if (msg->date == 0)
camel_mime_message_set_date(msg, CAMEL_MESSAGE_DATE_CURRENT, 0);
info = camel_message_info_new(NULL);
camel_message_info_set_flags(info, CAMEL_MESSAGE_SEEN, ~0);
camel_folder_append_message(mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_OUTBOX), msg, info, NULL, &ex);
camel_message_info_free(info);
if (camel_exception_is_set(&ex)) {
e_mail_exception_xfer_camel(ev, &ex);
} else {
mail_send();
}
camel_object_unref(msg);
done:
Evolution_Mail_MessageStream_dispose(message, &wev);
if (wev._major != CORBA_NO_EXCEPTION)
CORBA_exception_free(&wev);
}
/* Initialization */
static void
evolution_mail_store_class_init (EvolutionMailStoreClass *klass)
{
POA_Evolution_Mail_Store__epv *epv = &klass->epv;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
epv->getProperties = impl_getProperties;
epv->getFolders = impl_getFolders;
epv->sendMessage = impl_sendMessage;
object_class->dispose = impl_dispose;
object_class->finalize = impl_finalize;
g_type_class_add_private(klass, sizeof(struct _EvolutionMailStorePrivate));
}
static void
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, Evolution_Mail_Store, PARENT_TYPE, evolution_mail_store)
EvolutionMailStore *
evolution_mail_store_new(struct _EvolutionMailSession *s, struct _EAccount *ea)
{
EvolutionMailStore *ems;
struct _EvolutionMailStorePrivate *p;
static PortableServer_POA poa = NULL;
d(printf("EvolutionMailStore.new(\"%s\")\n", ea?ea->name:"local"));
if (poa == NULL)
poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL);
ems = g_object_new (EVOLUTION_MAIL_TYPE_STORE, "poa", poa, NULL);
p = _PRIVATE(ems);
if (ea) {
ems->account = ea;
g_object_ref(ea);
}
ems->session = s;
return ems;
}
const char *evolution_mail_store_get_name(EvolutionMailStore *ems)
{
if (ems->account)
return ems->account->name;
else
return ("On This Computer");
}
const char *evolution_mail_store_get_uid(EvolutionMailStore *ems)
{
if (ems->account)
return ems->account->uid;
else
return "local@local";
}
CamelStore *evolution_mail_store_get_store(EvolutionMailStore *ems, CORBA_Environment *ev)
{
struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);
if (p->store == NULL) {
if (ems->account == NULL) {
p->store = mail_component_peek_local_store(NULL);
camel_object_ref(p->store);
} else {
const char *uri;
CamelException ex = { 0 };
uri = e_account_get_string(ems->account, E_ACCOUNT_SOURCE_URL);
if (uri && *uri) {
p->store = camel_session_get_store(ems->session->session, uri, &ex);
if (camel_exception_is_set(&ex)) {
e_mail_exception_xfer_camel(ev, &ex);
return NULL;
}
} else {
e_mail_exception_set(ev, Evolution_Mail_NOT_SUPPORTED, _("No store available"));
return NULL;
}
}
p->folder_opened = camel_object_hook_event(p->store, "folder_opened", ems_folder_opened, ems);
p->folder_created = camel_object_hook_event(p->store, "folder_created", ems_folder_created, ems);
p->folder_deleted = camel_object_hook_event(p->store, "folder_deleted", ems_folder_deleted, ems);
p->folder_renamed = camel_object_hook_event(p->store, "folder_renamed", ems_folder_renamed, ems);
p->folder_subscribed = camel_object_hook_event(p->store, "folder_subscribed", ems_folder_subscribed, ems);
p->folder_unsubscribed = camel_object_hook_event(p->store, "folder_unsubscribed", ems_folder_unsubscribed, ems);
}
camel_object_ref(p->store);
return p->store;
}
int evolution_mail_store_close_store(EvolutionMailStore *ems)
{
struct _EvolutionMailStorePrivate *p = _PRIVATE(ems);
/* FIXME: locking */
if (p->store) {
if (!e_dlist_empty(&p->listeners))
return -1;
camel_object_remove_event(p->store, p->folder_opened);
camel_object_remove_event(p->store, p->folder_created);
camel_object_remove_event(p->store, p->folder_deleted);
camel_object_remove_event(p->store, p->folder_renamed);
camel_object_remove_event(p->store, p->folder_subscribed);
camel_object_remove_event(p->store, p->folder_unsubscribed);
camel_object_unref(p->store);
p->store = NULL;
}
/* FIXME: need to close of sub-folders too? */
return 0;
}
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)) {
evolution_mail_store_close_store(ems);
w(printf("No more listeners for store, could dispose store object now?\n"));
}
}

View File

@ -1,68 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Michael Zucchi <notzed@novell.com>
*/
#ifndef _EVOLUTION_MAIL_STORE_H_
#define _EVOLUTION_MAIL_STORE_H_
#include <bonobo/bonobo-object.h>
#include "Evolution-DataServer-Mail.h"
#define EVOLUTION_MAIL_TYPE_STORE (evolution_mail_store_get_type ())
#define EVOLUTION_MAIL_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_MAIL_TYPE_STORE, EvolutionMailStore))
#define EVOLUTION_MAIL_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_MAIL_TYPE_STORE, EvolutionMailStoreClass))
#define EVOLUTION_MAIL_IS_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_MAIL_TYPE_STORE))
#define EVOLUTION_MAIL_IS_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_MAIL_TYPE_STORE))
struct _EAccount;
struct _EvolutionMailSession;
typedef struct _EvolutionMailStore EvolutionMailStore;
typedef struct _EvolutionMailStoreClass EvolutionMailStoreClass;
struct _EvolutionMailStore {
BonoboObject parent;
struct _EvolutionMailSession *session;
struct _EAccount *account;
};
struct _EvolutionMailStoreClass {
BonoboObjectClass parent_class;
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 *);
/* unref when done */
struct _CamelStore *evolution_mail_store_get_store(EvolutionMailStore *ems, CORBA_Environment *ev);
int evolution_mail_store_close_store(EvolutionMailStore *ems);
#endif /* _EVOLUTION_MAIL_STORE_H_ */

View File

@ -1,156 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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"
#include "e-corba-utils.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)
{
d(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;
d(printf("store changed!\n"));
for (i=0;i<changes->_length;i++) {
d(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++) {
d(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)

View File

@ -1,54 +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., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, 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_ */

View File

@ -1,59 +0,0 @@
#include <stdio.h>
#include <unistd.h>
#include "evolution-mail-session.h"
#include <bonobo/bonobo-main.h>
#include "e-corba-utils.h"
struct _EPlugin;
struct _ESEventTargetUpgrade;
void org_gnome_evolution_mail_remote_startup(struct _EPlugin *ep, struct _ESEventTargetUpgrade *target);
int e_plugin_lib_enable(int enable);
void org_gnome_evolution_mail_remote_startup(struct _EPlugin *ep, struct _ESEventTargetUpgrade *target) {
/* noop */ ;
}
int e_plugin_lib_enable(int enable)
{
static EvolutionMailSession *sess;
char *path;
FILE *fp;
if (enable) {
static PortableServer_POA poa = NULL;
void *component;
if (sess != NULL)
return 0;
component = mail_component_peek();
if (component == NULL) {
g_warning("Unable to find mail component, cannot instantiate mail remote api");
return -1;
}
if (poa == NULL)
poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL);
sess = g_object_new(evolution_mail_session_get_type(), "poa", poa, NULL);
/*
NB: This only works if this is done early enough in the process ...
I guess it will be. But i'm not entirely sure ...
If this wrong, then we have to add a mechanism to the mailcomponent directly
to retrieve it */
bonobo_object_add_interface((BonoboObject *)component, (BonoboObject *)sess);
w(printf(" ** Added mail interface to mail component\n"));
} else {
/* can't easily disable this until restart? */
/* can we just destroy it? */
}
return 0;
}

View File

@ -1,18 +0,0 @@
<?xml version="1.0"?>
<e-plugin-list>
<e-plugin
type="shlib"
id="org.gnome.evolution.plugin.mailRemote"
location="@PLUGINDIR@/liborg-gnome-evolution-mail-remote@SOEXT@"
_name="Mail Remote">
<_description>A plugin which implements a CORBA
interface for accessing mail data remotely.</_description>
<author name="Michael Zucchi" email="notzed@novell.com"/>
<!-- hacky way to find out if the system has started up -->
<hook class="org.gnome.evolution.shell.events:1.0">
<event target="upgrade" id="upgrade.done" handle="org_gnome_evolution_mail_remote_startup"/>
</hook>
</e-plugin>
</e-plugin-list>