aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/vee
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/vee')
-rw-r--r--camel/providers/vee/camel-vee-folder.c164
1 files changed, 110 insertions, 54 deletions
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.