aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/imap/camel-imap-folder.c37
-rw-r--r--camel/providers/mbox/camel-mbox-folder.c127
-rw-r--r--camel/providers/vee/camel-vee-folder.c164
3 files changed, 199 insertions, 129 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 33e4980d24..c38ff8a18c 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -555,35 +555,6 @@ imap_delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelExceptio
return;
}
-/* track flag changes in the summary */
-static void
-message_changed (CamelMimeMessage *m, int type, CamelImapFolder *mf)
-{
- CamelMessageInfo *info;
- CamelFlag *flag;
-
- printf("Message changed: %s: %d\n", m->message_uid, type);
- switch (type) {
- case MESSAGE_FLAGS_CHANGED:
- info = camel_folder_summary_uid(CAMEL_FOLDER_SUMMARY (mf->summary), m->message_uid);
- if (info) {
- info->flags = m->flags | CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_flag_list_free(&info->user_flags);
- flag = m->user_flags;
- while (flag) {
- camel_flag_set(&info->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
- camel_folder_summary_touch(CAMEL_FOLDER_SUMMARY (mf->summary));
- } else
- g_warning("Message changed event on message not in summary: %s", m->message_uid);
- break;
- default:
- printf("Unhandled message change event: %d\n", type);
- break;
- }
-}
-
static CamelMimeMessage *
imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
{
@@ -702,14 +673,6 @@ imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *
g_warning("Construction failed");
goto fail;
}
-
- /* we're constructed, finish setup and clean up */
- message->folder = folder;
- gtk_object_ref(GTK_OBJECT (folder));
- message->message_uid = g_strdup(uid);
- message->flags = info->info.flags;
- gtk_signal_connect(GTK_OBJECT (message), "message_changed", message_changed, folder);
-
gtk_object_unref(GTK_OBJECT (parser));
return message;
diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c
index 3c8de8dfcf..97ba44180a 100644
--- a/camel/providers/mbox/camel-mbox-folder.c
+++ b/camel/providers/mbox/camel-mbox-folder.c
@@ -82,6 +82,12 @@ static const CamelMessageInfo *mbox_summary_get_by_uid(CamelFolder *f, const cha
static GList *mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex);
+static guint32 mbox_get_message_flags (CamelFolder *folder, const char *uid, CamelException *ex);
+static void mbox_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set, CamelException *ex);
+static gboolean mbox_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name, CamelException *ex);
+static void mbox_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value, CamelException *ex);
+
+
static void mbox_finalize (GtkObject *object);
static void
@@ -112,6 +118,11 @@ camel_mbox_folder_class_init (CamelMboxFolderClass *camel_mbox_folder_class)
camel_folder_class->summary_get_by_uid = mbox_summary_get_by_uid;
+ camel_folder_class->get_message_flags = mbox_get_message_flags;
+ camel_folder_class->set_message_flags = mbox_set_message_flags;
+ camel_folder_class->get_message_user_flag = mbox_get_message_user_flag;
+ camel_folder_class->set_message_user_flag = mbox_set_message_user_flag;
+
gtk_object_class->finalize = mbox_finalize;
}
@@ -182,6 +193,7 @@ mbox_init (CamelFolder *folder, CamelStore *parent_store,
CAMEL_MESSAGE_FLAGGED |
CAMEL_MESSAGE_SEEN |
CAMEL_MESSAGE_USER;
+ /* FIXME: we don't actually preserve user flags right now. */
mbox_folder->summary = NULL;
mbox_folder->search = NULL;
@@ -309,7 +321,7 @@ mbox_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelExcept
/* assign a new x-evolution header/uid */
camel_medium_remove_header((CamelMedium *)message, "X-Evolution");
uid = camel_folder_summary_next_uid((CamelFolderSummary *)mbox_folder->summary);
- xev = g_strdup_printf("%08x-%04x", uid, message->flags & 0xffff);
+ xev = g_strdup_printf("%08x-0000", uid);
camel_medium_add_header((CamelMedium *)message, "X-Evolution", xev);
g_free(xev);
@@ -404,35 +416,6 @@ mbox_delete_message_by_uid(CamelFolder *folder, const gchar *uid, CamelException
}
}
-/* track flag changes in the summary */
-static void
-message_changed(CamelMimeMessage *m, int type, CamelMboxFolder *mf)
-{
- CamelMessageInfo *info;
- CamelFlag *flag;
-
- printf("Message changed: %s: %d\n", m->message_uid, type);
- switch (type) {
- case MESSAGE_FLAGS_CHANGED:
- info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, m->message_uid);
- if (info) {
- info->flags = m->flags | CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_flag_list_free(&info->user_flags);
- flag = m->user_flags;
- while (flag) {
- camel_flag_set(&info->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
- camel_folder_summary_touch((CamelFolderSummary *)mf->summary);
- } else
- g_warning("Message changed event on message not in summary: %s", m->message_uid);
- break;
- default:
- printf("Unhandled message change event: %d\n", type);
- break;
- }
-}
-
static CamelMimeMessage *
mbox_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
{
@@ -486,14 +469,6 @@ mbox_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *
g_warning("Construction failed");
goto fail;
}
-
- /* we're constructed, finish setup and clean up */
- message->folder = folder;
- gtk_object_ref((GtkObject *)folder);
- message->message_uid = g_strdup(uid);
- message->flags = info->info.flags;
- gtk_signal_connect((GtkObject *)message, "message_changed", message_changed, folder);
-
gtk_object_unref((GtkObject *)parser);
return message;
@@ -551,3 +526,79 @@ mbox_search_by_expression(CamelFolder *folder, const char *expression, CamelExce
return camel_folder_search_execute_expression(mbox_folder->search, expression, ex);
}
+
+static guint32
+mbox_get_message_flags (CamelFolder *folder, const char *uid,
+ CamelException *ex)
+{
+ CamelMessageInfo *info;
+ CamelMboxFolder *mf = (CamelMboxFolder *)folder;
+
+ info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, uid);
+ if (info)
+ return info->flags;
+ else {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "No such message %s in %s.", uid,
+ folder->name);
+ return 0;
+ }
+}
+
+static void
+mbox_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags,
+ guint32 set, CamelException *ex)
+{
+ CamelMessageInfo *info;
+ CamelMboxFolder *mf = (CamelMboxFolder *)folder;
+
+ info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, uid);
+ if (info) {
+ info->flags = (info->flags & ~flags) | (set & flags) |
+ CAMEL_MESSAGE_FOLDER_FLAGGED;
+ camel_folder_summary_touch((CamelFolderSummary *)mf->summary);
+ gtk_signal_emit_by_name((GtkObject *)folder, "message_changed", uid);
+ } else {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "No such message %s in %s.", uid,
+ folder->name);
+ }
+}
+
+static gboolean
+mbox_get_message_user_flag (CamelFolder *folder, const char *uid,
+ const char *name, CamelException *ex)
+{
+ CamelMessageInfo *info;
+ CamelMboxFolder *mf = (CamelMboxFolder *)folder;
+
+ info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, uid);
+ if (info)
+ return camel_flag_get(&info->user_flags, name);
+ else {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "No such message %s in %s.", uid,
+ folder->name);
+ return FALSE;
+ }
+}
+
+static void mbox_set_message_user_flag (CamelFolder *folder, const char *uid,
+ const char *name, gboolean value,
+ CamelException *ex)
+{
+ CamelMessageInfo *info;
+ CamelMboxFolder *mf = (CamelMboxFolder *)folder;
+
+ info = camel_folder_summary_uid((CamelFolderSummary *)mf->summary, uid);
+ if (info) {
+ camel_flag_set(&info->user_flags, name, value);
+ info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
+ camel_folder_summary_touch((CamelFolderSummary *)mf->summary);
+ gtk_signal_emit_by_name((GtkObject *)folder, "message_changed", uid);
+ } else {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "No such message %s in %s.", uid,
+ folder->name);
+ }
+}
diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c
index 0b7b02d2e2..9d0d33b475 100644
--- a/camel/providers/vee/camel-vee-folder.c
+++ b/camel/providers/vee/camel-vee-folder.c
@@ -50,11 +50,14 @@ void vee_free_summary (CamelFolder *folder, GPtrArray *array);
static gint vee_get_message_count (CamelFolder *folder, CamelException *ex);
static CamelMimeMessage *vee_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex);
-static void vee_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex);
-
static const CamelMessageInfo *vee_summary_get_by_uid(CamelFolder *f, const char *uid);
static GList *vee_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex);
+static guint32 vee_get_message_flags (CamelFolder *folder, const char *uid, CamelException *ex);
+static void vee_set_message_flags (CamelFolder *folder, const char *uid, guint32 flags, guint32 set, CamelException *ex);
+static gboolean vee_get_message_user_flag (CamelFolder *folder, const char *uid, const char *name, CamelException *ex);
+static void vee_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name, gboolean value, CamelException *ex);
+
static void camel_vee_folder_class_init (CamelVeeFolderClass *klass);
static void camel_vee_folder_init (CamelVeeFolder *obj);
@@ -109,13 +112,17 @@ camel_vee_folder_class_init (CamelVeeFolderClass *klass)
folder_class->get_summary = vee_get_summary;
folder_class->free_summary = vee_free_summary;
folder_class->get_message_by_uid = vee_get_message_by_uid;
- folder_class->append_message = vee_append_message;
folder_class->summary_get_by_uid = vee_summary_get_by_uid;
folder_class->get_message_count = vee_get_message_count;
folder_class->search_by_expression = vee_search_by_expression;
+ folder_class->get_message_flags = vee_get_message_flags;
+ folder_class->set_message_flags = vee_set_message_flags;
+ folder_class->get_message_user_flag = vee_get_message_user_flag;
+ folder_class->set_message_user_flag = vee_set_message_user_flag;
+
object_class->finalize = camel_vee_folder_finalise;
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
@@ -176,6 +183,33 @@ folder_changed(CamelFolder *sub, int type, CamelVeeFolder *vf)
gtk_signal_emit_by_name((GtkObject *)vf, "folder_changed", 0);
}
+/* track flag changes in the summary */
+static void
+message_changed(CamelFolder *f, const char *uid, CamelVeeFolder *mf)
+{
+ const CamelMessageInfo *info;
+ CamelMessageInfo *vinfo;
+ CamelFlag *flag;
+ char *vuid;
+
+ printf("VMessage changed: %s\n", uid);
+ info = camel_folder_summary_get_by_uid(f, uid);
+
+ vuid = g_strdup_printf("%p:%s", f, uid);
+ vinfo = (CamelMessageInfo *)vee_summary_get_by_uid((CamelFolder *)mf, vuid);
+ if (info && vinfo) {
+ vinfo->flags = info->flags;
+ camel_flag_list_free(&vinfo->user_flags);
+ flag = info->user_flags;
+ while (flag) {
+ camel_flag_set(&vinfo->user_flags, flag->name, TRUE);
+ flag = flag->next;
+ }
+ gtk_signal_emit_by_name((GtkObject *)mf, "message_changed", vinfo->uid);
+ }
+ g_free(vuid);
+}
+
void
camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
{
@@ -186,6 +220,7 @@ camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
p->folders = g_list_append(p->folders, sub);
gtk_signal_connect((GtkObject *)sub, "folder_changed", folder_changed, vf);
+ gtk_signal_connect((GtkObject *)sub, "message_changed", message_changed, vf);
ex = camel_exception_new();
vee_folder_build_folder(vf, sub, ex);
@@ -242,19 +277,6 @@ static void vee_init (CamelFolder *folder, CamelStore *parent_store,
vee_folder_build(vf, ex);
}
-static void vee_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex)
-{
- CamelVeeFolder *vf = (CamelVeeFolder *)folder;
-
- if (message->folder && message->folder->permanent_flags & CAMEL_MESSAGE_USER) {
- /* set the flag on the message ... */
- camel_mime_message_set_user_flag(message, vf->vname, TRUE);
- } else {
- /* FIXME: error code */
- camel_exception_setv(ex, 1, "Cannot append this message to virtual folder");
- }
-}
-
static gint vee_get_message_count (CamelFolder *folder, CamelException *ex)
{
CamelVeeFolder *vf = (CamelVeeFolder *)folder;
@@ -262,54 +284,35 @@ static gint vee_get_message_count (CamelFolder *folder, CamelException *ex)
return vf->messages->len;
}
-/* track flag changes in the summary */
-static void
-message_changed(CamelMimeMessage *m, int type, CamelVeeFolder *mf)
+static gboolean
+get_real_message (CamelFolder *folder, const char *uid,
+ CamelFolder **out_folder, const char **out_uid,
+ CamelException *ex)
{
- CamelMessageInfo *info;
- CamelFlag *flag;
- char *uid;
+ CamelVeeMessageInfo *mi;
- printf("VMessage changed: %s: %d\n", m->message_uid, type);
- switch (type) {
- case MESSAGE_FLAGS_CHANGED:
- uid = g_strdup_printf("%p:%s", m->folder, m->message_uid);
- info = (CamelMessageInfo *)vee_summary_get_by_uid((CamelFolder *)mf, uid);
- if (info) {
- info->flags = m->flags;
- camel_flag_list_free(&info->user_flags);
- flag = m->user_flags;
- while (flag) {
- camel_flag_set(&info->user_flags, flag->name, TRUE);
- flag = flag->next;
- }
- } else {
- g_warning("Message changed event on message not in summary: %s", uid);
- }
- g_free(uid);
- break;
- default:
- printf("Unhandled message change event: %d\n", type);
- break;
+ mi = (CamelVeeMessageInfo *)vee_summary_get_by_uid(folder, uid);
+ if (mi == NULL) {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID,
+ "No such message %s in %s", uid,
+ folder->name);
+ return FALSE;
}
+
+ *out_folder = mi->folder;
+ *out_uid = strchr(mi->info.uid, ':')+1;
+ return TRUE;
}
static CamelMimeMessage *vee_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
{
- CamelVeeMessageInfo *mi;
- CamelMimeMessage *mm;
+ const char *real_uid;
+ CamelFolder *real_folder;
- mi = (CamelVeeMessageInfo *)vee_summary_get_by_uid(folder, uid);
- if (mi == NULL) {
- camel_exception_setv(ex, 1, "Failed");
+ if (!get_real_message (folder, uid, &real_folder, &real_uid, ex))
return NULL;
- }
- mm = camel_folder_get_message_by_uid(mi->folder, strchr(mi->info.uid, ':')+1, ex);
- if (mm) {
- gtk_signal_connect((GtkObject *)mm, "message_changed", message_changed, folder);
- }
- return mm;
+ return camel_folder_get_message_by_uid(real_folder, real_uid, ex);
}
GPtrArray *vee_get_summary (CamelFolder *folder, CamelException *ex)
@@ -373,6 +376,59 @@ vee_search_by_expression(CamelFolder *folder, const char *expression, CamelExcep
return result;
}
+static guint32
+vee_get_message_flags(CamelFolder *folder, const char *uid, CamelException *ex)
+{
+ const char *real_uid;
+ CamelFolder *real_folder;
+
+ if (!get_real_message (folder, uid, &real_folder, &real_uid, ex))
+ return 0;
+
+ return camel_folder_get_message_flags(real_folder, real_uid, ex);
+}
+
+static void
+vee_set_message_flags(CamelFolder *folder, const char *uid, guint32 flags,
+ guint32 set, CamelException *ex)
+{
+ const char *real_uid;
+ CamelFolder *real_folder;
+
+ if (!get_real_message (folder, uid, &real_folder, &real_uid, ex))
+ return;
+
+ camel_folder_set_message_flags(real_folder, real_uid, flags, set, ex);
+}
+
+static gboolean
+vee_get_message_user_flag(CamelFolder *folder, const char *uid,
+ const char *name, CamelException *ex)
+{
+ const char *real_uid;
+ CamelFolder *real_folder;
+
+ if (!get_real_message (folder, uid, &real_folder, &real_uid, ex))
+ return FALSE;
+
+ return camel_folder_get_message_user_flag(real_folder, real_uid, name, ex);
+}
+
+static void
+vee_set_message_user_flag(CamelFolder *folder, const char *uid,
+ const char *name, gboolean value,
+ CamelException *ex)
+{
+ const char *real_uid;
+ CamelFolder *real_folder;
+
+ if (!get_real_message (folder, uid, &real_folder, &real_uid, ex))
+ return;
+
+ return camel_folder_set_message_user_flag(real_folder, real_uid, name, value, ex);
+}
+
+
/*
need incremental update, based on folder.
Need to watch folders for changes and update accordingly.