From bcd1f61f19fd7c7639874c25d48f04fc5d1b8001 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 24 Apr 2010 16:35:29 -0400 Subject: [PATCH] Use GObject properties instead of CamelArg. Persistent properties are implemented as normal GObject properties, but with a special GParamFlag: CAMEL_PARAM_PERSISTENT. Currently all persistent properties are of type boolean, so the state file read/write logic has been scaled down to support only booleans. --- camel/Makefile.am | 2 - camel/camel-arg.c | 131 ---- camel/camel-arg.h | 118 ---- camel/camel-certdb.h | 7 +- camel/camel-data-cache.c | 19 + camel/camel-data-wrapper.c | 3 +- camel/camel-data-wrapper.h | 7 +- camel/camel-db.c | 10 +- camel/camel-db.h | 10 +- camel/camel-disco-diary.c | 19 +- camel/camel-disco-diary.h | 8 - camel/camel-disco-folder.c | 216 +++--- camel/camel-disco-folder.h | 18 +- camel/camel-disco-store.c | 4 +- camel/camel-disco-store.h | 4 - camel/camel-folder-search.c | 29 +- camel/camel-folder-summary.c | 226 ++++--- camel/camel-folder.c | 597 +++++++++-------- camel/camel-folder.h | 63 +- camel/camel-gpg-context.c | 6 + camel/camel-index.c | 8 + camel/camel-object.c | 721 ++++++++++----------- camel/camel-object.h | 55 +- camel/camel-offline-folder.c | 182 +++--- camel/camel-offline-folder.h | 29 +- camel/camel-offline-journal.c | 6 +- camel/camel-offline-store.c | 4 +- camel/camel-offline-store.h | 4 - camel/camel-sasl.c | 25 + camel/camel-service.c | 123 ---- camel/camel-service.h | 22 +- camel/camel-session.h | 5 + camel/camel-store-summary.h | 5 + camel/camel-store.c | 17 +- camel/camel-store.h | 9 +- camel/camel-stream-filter.c | 8 + camel/camel-stream-fs.c | 6 + camel/camel-stream-mem.c | 6 + camel/camel-transport.h | 9 +- camel/camel-vee-folder.c | 376 +++++------ camel/camel-vee-folder.h | 7 +- camel/camel-vee-store.c | 73 ++- camel/camel-vee-summary.c | 49 +- camel/camel-vtrash-folder.c | 111 +--- camel/camel.h | 1 - camel/providers/groupwise/camel-groupwise-folder.c | 456 ++++++++----- camel/providers/groupwise/camel-groupwise-folder.h | 5 +- .../providers/groupwise/camel-groupwise-journal.c | 15 +- camel/providers/groupwise/camel-groupwise-store.c | 26 +- camel/providers/imap/camel-imap-command.c | 6 +- camel/providers/imap/camel-imap-folder.c | 529 +++++++++------ camel/providers/imap/camel-imap-folder.h | 78 ++- camel/providers/imap/camel-imap-journal.c | 29 +- camel/providers/imap/camel-imap-private.h | 1 + camel/providers/imap/camel-imap-search.c | 12 +- camel/providers/imap/camel-imap-store.c | 138 +--- camel/providers/imap/camel-imap-store.h | 4 +- camel/providers/imap/camel-imap-summary.c | 9 +- camel/providers/imap/camel-imap-wrapper.c | 7 +- camel/providers/imapx/camel-imapx-folder.c | 53 +- camel/providers/imapx/camel-imapx-server.c | 171 +++-- camel/providers/imapx/camel-imapx-store.c | 10 +- camel/providers/imapx/camel-imapx-summary.c | 7 +- camel/providers/imapx/camel-imapx-utils.c | 15 +- camel/providers/local/camel-local-folder.c | 310 ++++----- camel/providers/local/camel-local-folder.h | 40 +- camel/providers/local/camel-local-store.c | 20 +- camel/providers/local/camel-maildir-folder.c | 51 +- camel/providers/local/camel-maildir-summary.c | 5 +- camel/providers/local/camel-mbox-folder.c | 14 +- camel/providers/local/camel-mbox-store.c | 10 +- camel/providers/local/camel-mbox-summary.c | 25 +- camel/providers/local/camel-mh-folder.c | 13 +- camel/providers/local/camel-mh-summary.c | 5 +- camel/providers/local/camel-spool-folder.c | 13 +- camel/providers/local/camel-spool-summary.c | 5 +- camel/providers/nntp/camel-nntp-folder.c | 84 ++- camel/providers/nntp/camel-nntp-store.c | 10 +- camel/providers/nntp/camel-nntp-summary.c | 9 +- camel/providers/pop3/camel-pop3-folder.c | 58 +- docs/reference/camel/camel-docs.sgml | 1 - docs/reference/camel/camel-sections.txt | 100 ++- docs/reference/camel/tmpl/camel-arg.sgml | 127 ---- docs/reference/camel/tmpl/camel-certdb.sgml | 28 + .../reference/camel/tmpl/camel-cipher-context.sgml | 14 + docs/reference/camel/tmpl/camel-data-cache.sgml | 18 + docs/reference/camel/tmpl/camel-data-wrapper.sgml | 25 + docs/reference/camel/tmpl/camel-disco-diary.sgml | 10 - docs/reference/camel/tmpl/camel-disco-folder.sgml | 23 + .../reference/camel/tmpl/camel-folder-summary.sgml | 51 +- docs/reference/camel/tmpl/camel-folder.sgml | 102 ++- docs/reference/camel/tmpl/camel-gpg-context.sgml | 9 + docs/reference/camel/tmpl/camel-index.sgml | 10 + docs/reference/camel/tmpl/camel-object.sgml | 66 +- .../reference/camel/tmpl/camel-offline-folder.sgml | 23 + docs/reference/camel/tmpl/camel-sasl.sgml | 45 ++ docs/reference/camel/tmpl/camel-service.sgml | 61 +- docs/reference/camel/tmpl/camel-session.sgml | 26 + docs/reference/camel/tmpl/camel-store-summary.sgml | 27 + docs/reference/camel/tmpl/camel-store.sgml | 25 + docs/reference/camel/tmpl/camel-stream-filter.sgml | 18 + docs/reference/camel/tmpl/camel-stream-fs.sgml | 9 + docs/reference/camel/tmpl/camel-stream-mem.sgml | 9 + docs/reference/camel/tmpl/camel-transport.sgml | 25 + docs/reference/camel/tmpl/camel-unused.sgml | 269 ++++++++ docs/reference/camel/tmpl/camel-vee-folder.sgml | 48 +- 106 files changed, 3715 insertions(+), 3055 deletions(-) delete mode 100644 camel/camel-arg.c delete mode 100644 camel/camel-arg.h diff --git a/camel/Makefile.am b/camel/Makefile.am index b19f81c..a411f4e 100644 --- a/camel/Makefile.am +++ b/camel/Makefile.am @@ -159,7 +159,6 @@ libcamel_1_2_la_CPPFLAGS = \ libcamel_1_2_la_SOURCES = \ camel-address.c \ - camel-arg.c \ camel-block-file.c \ camel-certdb.c \ camel-charset-map.c \ @@ -232,7 +231,6 @@ libcamel_1_2_la_SOURCES = \ libcamelinclude_HEADERS = \ camel-address.h \ - camel-arg.h \ camel-block-file.h \ camel-certdb.h \ camel-charset-map.h \ diff --git a/camel/camel-arg.c b/camel/camel-arg.c deleted file mode 100644 index 705a040..0000000 --- a/camel/camel-arg.c +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- * - * - * Author: - * Michael Zucchi - * - * Copyright (C) 1999-2008 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 Lesser 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 -#endif - -#include - -#include "camel-arg.h" - -gint camel_argv_build(CamelArgV *tv) -{ - register guint32 tag; - register gint i; - register CamelArg *a; - gint more = TRUE; - - for (i=0;iargv[i]; - - if ( (tag = va_arg(tv->ap, guint32)) == 0) { - more = FALSE; - break; - } - - a->tag = tag; - - switch ((tag & CAMEL_ARG_TYPE)) { - case CAMEL_ARG_OBJ: - a->ca_object = va_arg(tv->ap, gpointer ); - break; - case CAMEL_ARG_INT: - a->ca_int = va_arg(tv->ap, gint); - break; - case CAMEL_ARG_DBL: - a->ca_double = va_arg(tv->ap, double); - break; - case CAMEL_ARG_STR: - a->ca_str = va_arg(tv->ap, gchar *); - break; - case CAMEL_ARG_PTR: - a->ca_ptr = va_arg(tv->ap, gpointer ); - break; - case CAMEL_ARG_BOO: - a->ca_int = va_arg(tv->ap, gint) != 0; - break; - default: - printf("Error, unknown type, truncating result\n"); - more = FALSE; - goto fail; - } - - } -fail: - tv->argc = i; - - return more; -} - -gint camel_arggetv_build(CamelArgGetV *tv) -{ - register guint32 tag; - register gint i; - register CamelArgGet *a; - gint more = TRUE; - - for (i=0;iargv[i]; - - if ( (tag = va_arg(tv->ap, guint32)) == 0) { - more = FALSE; - break; - } - - a->tag = tag; - - switch ((tag & CAMEL_ARG_TYPE)) { - case CAMEL_ARG_OBJ: - a->ca_object = va_arg(tv->ap, gpointer *); - *a->ca_object = NULL; - break; - case CAMEL_ARG_INT: - case CAMEL_ARG_BOO: - a->ca_int = va_arg(tv->ap, gint *); - *a->ca_int = 0; - break; - case CAMEL_ARG_DBL: - a->ca_double = va_arg(tv->ap, gdouble *); - *a->ca_double = 0.0; - break; - case CAMEL_ARG_STR: - a->ca_str = va_arg(tv->ap, gchar **); - *a->ca_str = NULL; - break; - case CAMEL_ARG_PTR: - a->ca_ptr = va_arg(tv->ap, gpointer *); - *a->ca_ptr = NULL; - break; - default: - printf("Error, unknown type, truncating result\n"); - more = FALSE; - goto fail; - } - - } -fail: - tv->argc = i; - - return more; -} - diff --git a/camel/camel-arg.h b/camel/camel-arg.h deleted file mode 100644 index 0923c9e..0000000 --- a/camel/camel-arg.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- - * - * Author: - * Michael Zucchi - * - * Copyright (C) 1999-2008 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 Lesser 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser 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 - */ - -#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef CAMEL_ARG_H -#define CAMEL_ARG_H - -#include -#include - -G_BEGIN_DECLS - -enum camel_arg_t { - CAMEL_ARG_END = 0, - CAMEL_ARG_IGNORE = 1, /* override/ignore an arg in-place */ - - CAMEL_ARG_FIRST = 1024, /* 1024 args reserved for arg system */ - - CAMEL_ARG_TYPE = 0xf0000000, /* type field for tags */ - CAMEL_ARG_TAG = 0x0fffffff, /* tag field for args */ - - CAMEL_ARG_OBJ = 0x00000000, /* object */ - CAMEL_ARG_INT = 0x10000000, /* gint */ - CAMEL_ARG_DBL = 0x20000000, /* gdouble */ - CAMEL_ARG_STR = 0x30000000, /* c string */ - CAMEL_ARG_PTR = 0x40000000, /* ptr */ - CAMEL_ARG_BOO = 0x50000000 /* bool */ -}; - -typedef struct _CamelArg CamelArg; -typedef struct _CamelArgV CamelArgV; - -typedef struct _CamelArgGet CamelArgGet; -typedef struct _CamelArgGetV CamelArgGetV; - -struct _CamelArg { - guint32 tag; - union { - gpointer ca_object; - gint ca_int; - gdouble ca_double; - gchar *ca_str; - gpointer ca_ptr; - } u; -}; -struct _CamelArgGet { - guint32 tag; - union { - gpointer *ca_object; - gint *ca_int; - gdouble *ca_double; - gchar **ca_str; - gpointer *ca_ptr; - } u; -}; - -#define ca_object u.ca_object -#define ca_int u.ca_int -#define ca_double u.ca_double -#define ca_str u.ca_str -#define ca_ptr u.ca_ptr - -#define CAMEL_ARGV_MAX (20) - -struct _CamelArgV { - va_list ap; - gint argc; - CamelArg argv[CAMEL_ARGV_MAX]; -}; - -struct _CamelArgGetV { - va_list ap; - gint argc; - CamelArgGet argv[CAMEL_ARGV_MAX]; -}; - -#define camel_argv_start(tv, last) va_start((tv)->ap, last) -#define camel_argv_end(tv) va_end((tv)->ap) -gint camel_argv_build(CamelArgV *tv); -gint camel_arggetv_build(CamelArgGetV *tv); - -/* set an arg ignored */ -#define camel_argv_ignore(tv, i) ((tv)->argv[i].tag = ((tv)->argv[i].tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE) - -/* 'self-describing' property list */ -typedef struct _CamelProperty CamelProperty; - -struct _CamelProperty { - guint32 tag; - const gchar *name; - const gchar *description; -}; - -G_END_DECLS - -#endif /* CAMEL_ARG_H */ diff --git a/camel/camel-certdb.h b/camel/camel-certdb.h index 2f578d0..4f3c0ee 100644 --- a/camel/camel-certdb.h +++ b/camel/camel-certdb.h @@ -86,7 +86,12 @@ typedef struct { GByteArray *rawcert; } CamelCert; -typedef enum _CamelCertDBLock { +/** + * CamelCertDBLock: + * + * Since: 3.0 + **/ +typedef enum { CCD_DB_LOCK, CCD_IO_LOCK, CCD_ALLOC_LOCK, diff --git a/camel/camel-data-cache.c b/camel/camel-data-cache.c index dbc3a56..2f27a51 100644 --- a/camel/camel-data-cache.c +++ b/camel/camel-data-cache.c @@ -188,6 +188,16 @@ camel_data_cache_new (const gchar *path, return g_object_new (CAMEL_TYPE_DATA_CACHE, "path", path, NULL); } +/** + * camel_data_cache_get_path: + * @cdc: a #CamelDataCache + * + * Returns the path to the data cache. + * + * Returns: the path to the data cache + * + * Since: 3.0 + **/ const gchar * camel_data_cache_get_path (CamelDataCache *cdc) { @@ -196,6 +206,15 @@ camel_data_cache_get_path (CamelDataCache *cdc) return cdc->priv->path; } +/** + * camel_data_cache_set_path: + * @cdc: a #CamelDataCache + * @path: path to the data cache + * + * Sets the path to the data cache. + * + * Since: 3.0 + **/ void camel_data_cache_set_path (CamelDataCache *cdc, const gchar *path) diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c index c5d3284..2fb2f2e 100644 --- a/camel/camel-data-wrapper.c +++ b/camel/camel-data-wrapper.c @@ -453,7 +453,8 @@ camel_data_wrapper_lock (CamelDataWrapper *data_wrapper, * @data_wrapper: a #CamelDataWrapper * @lock: lock type to unlock * - * Unlocks #data_wrapper's #lock, previously locked with camel_data_wrapper_lock(). + * Unlocks #data_wrapper's #lock, previously locked with + * camel_data_wrapper_lock(). * * Since: 3.0 **/ diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h index 2310797..9924b29 100644 --- a/camel/camel-data-wrapper.h +++ b/camel/camel-data-wrapper.h @@ -59,7 +59,12 @@ typedef struct _CamelDataWrapper CamelDataWrapper; typedef struct _CamelDataWrapperClass CamelDataWrapperClass; typedef struct _CamelDataWrapperPrivate CamelDataWrapperPrivate; -typedef enum _CamelDataWrapperLock { +/** + * CamelDataWrapperLock: + * + * Since: 3.0 + **/ +typedef enum { CDW_STREAM_LOCK } CamelDataWrapperLock; diff --git a/camel/camel-db.c b/camel/camel-db.c index 3374857..1f5f275 100644 --- a/camel/camel-db.c +++ b/camel/camel-db.c @@ -1153,7 +1153,7 @@ camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, CamelException * * Since: 2.24 **/ GPtrArray * -camel_db_get_folder_deleted_uids (CamelDB *db, gchar *folder_name, CamelException *ex) +camel_db_get_folder_deleted_uids (CamelDB *db, const gchar *folder_name, CamelException *ex) { gchar *sel_query; gint ret; @@ -1198,7 +1198,7 @@ read_preview_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name) * Since: 2.28 **/ GHashTable * -camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex) +camel_db_get_folder_preview (CamelDB *db, const gchar *folder_name, CamelException *ex) { gchar *sel_query; gint ret; @@ -1223,7 +1223,7 @@ camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex * Since: 2.28 **/ gint -camel_db_write_preview_record (CamelDB *db, gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex) +camel_db_write_preview_record (CamelDB *db, const gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex) { gchar *query; gint ret; @@ -1261,7 +1261,7 @@ read_vuids_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name) * Since: 2.24 **/ GPtrArray * -camel_db_get_vuids_from_vfolder (CamelDB *db, gchar *folder_name, gchar *filter, CamelException *ex) +camel_db_get_vuids_from_vfolder (CamelDB *db, const gchar *folder_name, gchar *filter, CamelException *ex) { gchar *sel_query; gchar *cond = NULL; @@ -1954,7 +1954,7 @@ camel_db_delete_vuids (CamelDB *cdb, const gchar * folder_name, const gchar *has * Since: 2.24 **/ gint -camel_db_clear_folder_summary (CamelDB *cdb, gchar *folder, CamelException *ex) +camel_db_clear_folder_summary (CamelDB *cdb, const gchar *folder, CamelException *ex) { gint ret; diff --git a/camel/camel-db.h b/camel/camel-db.h index 9465f06..254c13e 100644 --- a/camel/camel-db.h +++ b/camel/camel-db.h @@ -218,7 +218,7 @@ gint camel_db_begin_transaction (CamelDB *cdb, CamelException *ex); gint camel_db_add_to_transaction (CamelDB *cdb, const gchar *query, CamelException *ex); gint camel_db_end_transaction (CamelDB *cdb, CamelException *ex); gint camel_db_abort_transaction (CamelDB *cdb, CamelException *ex); -gint camel_db_clear_folder_summary (CamelDB *cdb, gchar *folder, CamelException *ex); +gint camel_db_clear_folder_summary (CamelDB *cdb, const gchar *folder, CamelException *ex); gint camel_db_rename_folder (CamelDB *cdb, const gchar *old_folder, const gchar *new_folder, CamelException *ex); gint camel_db_delete_folder (CamelDB *cdb, const gchar *folder, CamelException *ex); @@ -256,7 +256,7 @@ gint camel_db_create_vfolder (CamelDB *db, const gchar *folder_name, CamelExcept gint camel_db_recreate_vfolder (CamelDB *db, const gchar *folder_name, CamelException *ex); gint camel_db_delete_uid_from_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex); gint camel_db_delete_uid_from_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex); -GPtrArray * camel_db_get_vuids_from_vfolder (CamelDB *db, gchar *folder_name, gchar *filter, CamelException *ex); +GPtrArray * camel_db_get_vuids_from_vfolder (CamelDB *db, const gchar *folder_name, gchar *filter, CamelException *ex); gint camel_db_add_to_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex); gint camel_db_add_to_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex); @@ -264,7 +264,7 @@ gint camel_db_get_folder_uids (CamelDB *db, const gchar *folder_name, const gcha gint camel_db_get_folder_uids_flags (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *summary, GHashTable *table, CamelException *ex); GPtrArray * camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, CamelException *ex); -GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, gchar *folder_name, CamelException *ex); +GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, const gchar *folder_name, CamelException *ex); gchar * camel_db_sqlize_string (const gchar *string); void camel_db_free_sqlized_string (gchar *string); @@ -278,8 +278,8 @@ gint camel_db_start_in_memory_transactions (CamelDB *cdb, CamelException *ex); gint camel_db_flush_in_memory_transactions (CamelDB *cdb, const gchar * folder_name, CamelException *ex); GHashTable * -camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex); -gint camel_db_write_preview_record (CamelDB *db, gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex); +camel_db_get_folder_preview (CamelDB *db, const gchar *folder_name, CamelException *ex); +gint camel_db_write_preview_record (CamelDB *db, const gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex); gint camel_db_reset_folder_version (CamelDB *cdb, const gchar *folder_name, gint reset_version, CamelException *ex); diff --git a/camel/camel-disco-diary.c b/camel/camel-disco-diary.c index 2b9e03f..882c1a0 100644 --- a/camel/camel-disco-diary.c +++ b/camel/camel-disco-diary.c @@ -130,10 +130,12 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action, { CamelFolder *folder = va_arg (ap, CamelFolder *); GPtrArray *uids = va_arg (ap, GPtrArray *); + const gchar *full_name; d(printf(" folder expunge '%s'\n", folder->full_name)); - status = camel_file_util_encode_string (diary->file, folder->full_name); + full_name = camel_folder_get_full_name (folder); + status = camel_file_util_encode_string (diary->file, full_name); if (status != -1) status = diary_encode_uids (diary, uids); break; @@ -143,10 +145,12 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action, { CamelFolder *folder = va_arg (ap, CamelFolder *); gchar *uid = va_arg (ap, gchar *); + const gchar *full_name; d(printf(" folder append '%s'\n", folder->full_name)); - status = camel_file_util_encode_string (diary->file, folder->full_name); + full_name = camel_folder_get_full_name (folder); + status = camel_file_util_encode_string (diary->file, full_name); if (status != -1) status = camel_file_util_encode_string (diary->file, uid); break; @@ -158,15 +162,18 @@ camel_disco_diary_log (CamelDiscoDiary *diary, CamelDiscoDiaryAction action, CamelFolder *destination = va_arg (ap, CamelFolder *); GPtrArray *uids = va_arg (ap, GPtrArray *); gboolean delete_originals = va_arg (ap, gboolean); + const gchar *full_name; - d(printf(" folder transfer '%s' to '%s'\n", source->full_name, destination->full_name)); - - status = camel_file_util_encode_string (diary->file, source->full_name); + full_name = camel_folder_get_full_name (source); + status = camel_file_util_encode_string (diary->file, full_name); if (status == -1) break; - status = camel_file_util_encode_string (diary->file, destination->full_name); + + full_name = camel_folder_get_full_name (destination); + status = camel_file_util_encode_string (diary->file, full_name); if (status == -1) break; + status = diary_encode_uids (diary, uids); if (status == -1) break; diff --git a/camel/camel-disco-diary.h b/camel/camel-disco-diary.h index 91dc285..8f12183 100644 --- a/camel/camel-disco-diary.h +++ b/camel/camel-disco-diary.h @@ -67,14 +67,6 @@ typedef enum { CAMEL_DISCO_DIARY_FOLDER_TRANSFER } CamelDiscoDiaryAction; -typedef enum { - CAMEL_DISCO_DIARY_ARG_NONE = 0, - - CAMEL_DISCO_DIARY_ARG_FOLDER, - CAMEL_DISCO_DIARY_ARG_UID, - CAMEL_DISCO_DIARY_ARG_UID_LIST -} CamelDiscoDiaryArgType; - struct _CamelDiscoDiary { CamelObject parent; diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c index 1095312..19d9b70 100644 --- a/camel/camel-disco-folder.c +++ b/camel/camel-disco-folder.c @@ -32,15 +32,14 @@ #include "camel-exception.h" #include "camel-session.h" -static GSList *disco_folder_properties; +#define CAMEL_DISCO_FOLDER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), CAMEL_TYPE_DISCO_FOLDER, CamelDiscoFolderPrivate)) -static CamelProperty disco_property_list[] = { - { CAMEL_DISCO_FOLDER_OFFLINE_SYNC, "offline_sync", N_("Copy folder content locally for offline operation") }, +struct _CamelDiscoFolderPrivate { + gboolean offline_sync; }; -/* Forward Declarations */ -static gboolean disco_expunge (CamelFolder *folder, CamelException *ex); - struct _cdf_sync_msg { CamelSessionThreadMsg msg; @@ -48,8 +47,18 @@ struct _cdf_sync_msg { CamelFolderChangeInfo *changes; }; +/* The custom property ID is a CamelArg artifact. + * It still identifies the property in state files. */ +enum { + PROP_0, + PROP_OFFLINE_SYNC = 0x2400 +}; + G_DEFINE_TYPE (CamelDiscoFolder, camel_disco_folder, CAMEL_TYPE_FOLDER) +/* Forward Declarations */ +static gboolean disco_expunge (CamelFolder *folder, CamelException *ex); + static void cdf_sync_offline(CamelSession *session, CamelSessionThreadMsg *mm) { @@ -94,10 +103,17 @@ static CamelSessionThreadOps cdf_sync_ops = { static void cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer dummy) { - if (changes->uid_added->len > 0 - && (((CamelDiscoFolder *)folder)->offline_sync - || camel_url_get_param(((CamelService *)folder->parent_store)->url, "offline_sync"))) { - CamelSession *session = ((CamelService *)folder->parent_store)->session; + CamelStore *parent_store; + gboolean offline_sync; + + parent_store = camel_folder_get_parent_store (folder); + + offline_sync = camel_disco_folder_get_offline_sync ( + CAMEL_DISCO_FOLDER (folder)); + + if (changes->uid_added->len > 0 && (offline_sync + || camel_url_get_param (CAMEL_SERVICE (parent_store)->url, "offline_sync"))) { + CamelSession *session = CAMEL_SERVICE (parent_store)->session; struct _cdf_sync_msg *m; m = camel_session_thread_msg_new(session, &cdf_sync_ops, sizeof(*m)); @@ -108,79 +124,38 @@ cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer } } -static gint -disco_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) +static void +disco_folder_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - gint i, count=0; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES: - case CAMEL_FOLDER_ARG_PROPERTIES: { - CamelArgGetV props; - - props.argc = 1; - props.argv[0] = *arg; - CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, ex, &props); - *arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(disco_folder_properties)); - break; } - /* disco args */ - case CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC: - *arg->ca_int = ((CamelDiscoFolder *)object)->offline_sync; - break; - default: - count++; - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; + switch (property_id) { + case PROP_OFFLINE_SYNC: + camel_disco_folder_set_offline_sync ( + CAMEL_DISCO_FOLDER (object), + g_value_get_boolean (value)); + return; } - if (count) - return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, ex, args); - - return 0; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } -static gint -disco_setv (CamelObject *object, - CamelException *ex, - CamelArgV *args) +static void +disco_folder_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { - gint save = 0; - gint i; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArg *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC: - if (((CamelDiscoFolder *)object)->offline_sync != arg->ca_int) { - ((CamelDiscoFolder *)object)->offline_sync = arg->ca_int; - save = 1; - } - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; + switch (property_id) { + case PROP_OFFLINE_SYNC: + g_value_set_boolean ( + value, camel_disco_folder_get_offline_sync ( + CAMEL_DISCO_FOLDER (object))); + return; } - if (save) - camel_object_state_write(object); - - return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->setv(object, ex, args); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static gboolean @@ -188,8 +163,11 @@ disco_refresh_info (CamelFolder *folder, CamelException *ex) { CamelDiscoFolderClass *disco_folder_class; + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); - if (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store)) != CAMEL_DISCO_STORE_ONLINE) + if (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store)) != CAMEL_DISCO_STORE_ONLINE) return TRUE; disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder); @@ -203,17 +181,19 @@ disco_sync (CamelFolder *folder, CamelException *ex) { CamelDiscoFolderClass *disco_folder_class; + CamelStore *parent_store; if (expunge && !disco_expunge (folder, ex)) { if (camel_exception_is_set (ex)) return FALSE; } - camel_object_state_write(folder); + camel_object_state_write (CAMEL_OBJECT (folder)); + parent_store = camel_folder_get_parent_store (folder); disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder); - switch (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store))) { + switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) { case CAMEL_DISCO_STORE_ONLINE: return disco_folder_class->sync_online (folder, ex); @@ -232,15 +212,16 @@ disco_expunge_uids (CamelFolder *folder, GPtrArray *uids, CamelException *ex) { - CamelDiscoStore *disco = CAMEL_DISCO_STORE (folder->parent_store); CamelDiscoFolderClass *disco_folder_class; + CamelStore *parent_store; if (uids->len == 0) return TRUE; + parent_store = camel_folder_get_parent_store (folder); disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder); - switch (camel_disco_store_status (disco)) { + switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) { case CAMEL_DISCO_STORE_ONLINE: return disco_folder_class->expunge_uids_online ( folder, uids, ex); @@ -293,12 +274,13 @@ disco_append_message (CamelFolder *folder, gchar **appended_uid, CamelException *ex) { - CamelDiscoStore *disco = CAMEL_DISCO_STORE (folder->parent_store); CamelDiscoFolderClass *disco_folder_class; + CamelStore *parent_store; + parent_store = camel_folder_get_parent_store (folder); disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (folder); - switch (camel_disco_store_status (disco)) { + switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) { case CAMEL_DISCO_STORE_ONLINE: return disco_folder_class->append_online ( folder, message, info, appended_uid, ex); @@ -323,12 +305,13 @@ disco_transfer_messages_to (CamelFolder *source, gboolean delete_originals, CamelException *ex) { - CamelDiscoStore *disco = CAMEL_DISCO_STORE (source->parent_store); CamelDiscoFolderClass *disco_folder_class; + CamelStore *parent_store; + parent_store = camel_folder_get_parent_store (source); disco_folder_class = CAMEL_DISCO_FOLDER_GET_CLASS (source); - switch (camel_disco_store_status (disco)) { + switch (camel_disco_store_status (CAMEL_DISCO_STORE (parent_store))) { case CAMEL_DISCO_STORE_ONLINE: return disco_folder_class->transfer_online ( source, uids, dest, transferred_uids, @@ -358,7 +341,9 @@ disco_prepare_for_offline (CamelDiscoFolder *disco_folder, gint i; gboolean success = TRUE; - camel_operation_start(NULL, _("Preparing folder '%s' for offline"), folder->full_name); + camel_operation_start ( + NULL, _("Preparing folder '%s' for offline"), + camel_folder_get_full_name (folder)); if (expression) uids = camel_folder_search_by_expression (folder, expression, ex); @@ -398,13 +383,14 @@ disco_refresh_info_online (CamelFolder *folder, static void camel_disco_folder_class_init (CamelDiscoFolderClass *class) { - CamelObjectClass *camel_object_class; + GObjectClass *object_class; CamelFolderClass *folder_class; - gint ii; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = disco_getv; - camel_object_class->setv = disco_setv; + g_type_class_add_private (class, sizeof (CamelDiscoFolderPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = disco_folder_set_property; + object_class->get_property = disco_folder_get_property; folder_class = CAMEL_FOLDER_CLASS (class); folder_class->refresh_info = disco_refresh_info; @@ -416,23 +402,61 @@ camel_disco_folder_class_init (CamelDiscoFolderClass *class) class->prepare_for_offline = disco_prepare_for_offline; class->refresh_info_online = disco_refresh_info_online; - for (ii = 0; ii < G_N_ELEMENTS (disco_property_list); ii++) { - disco_property_list[ii].description = - _(disco_property_list[ii].description); - disco_folder_properties = g_slist_prepend ( - disco_folder_properties, &disco_property_list[ii]); - } + g_object_class_install_property ( + object_class, + PROP_OFFLINE_SYNC, + g_param_spec_boolean ( + "offline-sync", + "Offline Sync", + N_("Copy folder content locally for offline operation"), + FALSE, + G_PARAM_READWRITE | + CAMEL_PARAM_PERSISTENT)); } static void camel_disco_folder_init (CamelDiscoFolder *disco_folder) { + disco_folder->priv = CAMEL_DISCO_FOLDER_GET_PRIVATE (disco_folder); + camel_object_hook_event ( disco_folder, "folder_changed", (CamelObjectEventHookFunc) cdf_folder_changed, NULL); } /** + * camel_disco_folder_get_offline_sync: + * @disco_folder: a #CamelDiscoFolder + * + * Since: 3.0 + **/ +gboolean +camel_disco_folder_get_offline_sync (CamelDiscoFolder *disco_folder) +{ + g_return_val_if_fail (CAMEL_IS_DISCO_FOLDER (disco_folder), FALSE); + + return disco_folder->priv->offline_sync; +} + +/** + * camel_disco_folder_set_offline_sync: + * @disco_folder: a #CamelDiscoFolder + * @offline_sync: whether to synchronize for offline use + * + * Since: 3.0 + **/ +void +camel_disco_folder_set_offline_sync (CamelDiscoFolder *disco_folder, + gboolean offline_sync) +{ + g_return_if_fail (CAMEL_IS_DISCO_FOLDER (disco_folder)); + + disco_folder->priv->offline_sync = offline_sync; + + g_object_notify (G_OBJECT (disco_folder), "offline-sync"); +} + +/** * camel_disco_folder_expunge_uids: * @folder: a (disconnectable) folder * @uids: array of UIDs to expunge diff --git a/camel/camel-disco-folder.h b/camel/camel-disco-folder.h index e2b34d7..56ee026 100644 --- a/camel/camel-disco-folder.h +++ b/camel/camel-disco-folder.h @@ -55,20 +55,11 @@ G_BEGIN_DECLS typedef struct _CamelDiscoFolder CamelDiscoFolder; typedef struct _CamelDiscoFolderClass CamelDiscoFolderClass; - -enum { - CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC = CAMEL_FOLDER_ARG_LAST, - CAMEL_DISCO_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100 -}; - -enum { - CAMEL_DISCO_FOLDER_OFFLINE_SYNC = CAMEL_DISCO_FOLDER_ARG_OFFLINE_SYNC | CAMEL_ARG_BOO -}; +typedef struct _CamelDiscoFolderPrivate CamelDiscoFolderPrivate; struct _CamelDiscoFolder { CamelFolder parent; - - guint offline_sync:1; + CamelDiscoFolderPrivate *priv; }; struct _CamelDiscoFolderClass { @@ -137,6 +128,11 @@ struct _CamelDiscoFolderClass { }; GType camel_disco_folder_get_type (void); +gboolean camel_disco_folder_get_offline_sync + (CamelDiscoFolder *disco_folder); +void camel_disco_folder_set_offline_sync + (CamelDiscoFolder *disco_folder, + gboolean offline_sync); gboolean camel_disco_folder_expunge_uids (CamelFolder *folder, GPtrArray *uids, CamelException *ex); diff --git a/camel/camel-disco-store.c b/camel/camel-disco-store.c index 4a29c2c..fe315d1 100644 --- a/camel/camel-disco-store.c +++ b/camel/camel-disco-store.c @@ -239,7 +239,7 @@ disco_store_set_status (CamelDiscoStore *disco_store, for (i=0;ilen;i++) { folder = folders->pdata[i]; if (G_TYPE_CHECK_INSTANCE_TYPE(folder, CAMEL_TYPE_DISCO_FOLDER) - && (sync || ((CamelDiscoFolder *)folder)->offline_sync)) { + && (sync || camel_disco_folder_get_offline_sync (CAMEL_DISCO_FOLDER (folder)))) { camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder, "", &x); camel_exception_clear(&x); } @@ -402,7 +402,7 @@ camel_disco_store_prepare_for_offline (CamelDiscoStore *disco_store, for (i=0;ilen;i++) { folder = folders->pdata[i]; if (G_TYPE_CHECK_INSTANCE_TYPE(folder, CAMEL_TYPE_DISCO_FOLDER) - && (sync || ((CamelDiscoFolder *)folder)->offline_sync)) { + && (sync || camel_disco_folder_get_offline_sync (CAMEL_DISCO_FOLDER (folder)))) { camel_disco_folder_prepare_for_offline((CamelDiscoFolder *)folder, "(match-all)", &x); camel_exception_clear(&x); } diff --git a/camel/camel-disco-store.h b/camel/camel-disco-store.h index 66ebc2a..609c02e 100644 --- a/camel/camel-disco-store.h +++ b/camel/camel-disco-store.h @@ -58,10 +58,6 @@ struct _CamelDiscoDiary; typedef struct _CamelDiscoStore CamelDiscoStore; typedef struct _CamelDiscoStoreClass CamelDiscoStoreClass; -enum { - CAMEL_DISCO_STORE_ARG_FIRST = CAMEL_STORE_ARG_FIRST + 100 -}; - typedef enum { CAMEL_DISCO_STORE_ONLINE, CAMEL_DISCO_STORE_OFFLINE, diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c index bfca34b..09f9daf 100644 --- a/camel/camel-folder-search.c +++ b/camel/camel-folder-search.c @@ -495,6 +495,12 @@ camel_folder_search_count (CamelFolderSearch *search, e_sexp_result_free(search->sexp, r); } else { + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (search->folder); + parent_store = camel_folder_get_parent_store (search->folder); + /* Sync the db, so that we search the db for changes */ camel_folder_summary_save_to_db (search->folder->summary, ex); @@ -503,13 +509,13 @@ camel_folder_search_count (CamelFolderSearch *search, sql_query = camel_sexp_to_sql (expr); else sql_query = camel_sexp_to_sql_sexp (expr); - tmp1 = camel_db_sqlize_string(search->folder->full_name); + tmp1 = camel_db_sqlize_string (full_name); tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query?sql_query:""); camel_db_free_sqlized_string (tmp1); g_free (sql_query); dd(printf("Equivalent sql %s\n", tmp)); - cdb = (CamelDB *) (search->folder->parent_store->cdb_r); + cdb = (CamelDB *) (parent_store->cdb_r); camel_db_count_message_info (cdb, tmp, &count, ex); if (ex && camel_exception_is_set(ex)) { const gchar *exception = camel_exception_get_description (ex); @@ -661,6 +667,12 @@ camel_folder_search_search (CamelFolderSearch *search, e_sexp_result_free(search->sexp, r); } else { + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (search->folder); + parent_store = camel_folder_get_parent_store (search->folder); + /* Sync the db, so that we search the db for changes */ camel_folder_summary_save_to_db (search->folder->summary, ex); @@ -669,14 +681,14 @@ camel_folder_search_search (CamelFolderSearch *search, sql_query = camel_sexp_to_sql (expr); else sql_query = camel_sexp_to_sql_sexp (expr); - tmp1 = camel_db_sqlize_string(search->folder->full_name); + tmp1 = camel_db_sqlize_string (full_name); tmp = g_strdup_printf ("SELECT uid FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query?sql_query:""); camel_db_free_sqlized_string (tmp1); g_free (sql_query); dd(printf("Equivalent sql %s\n", tmp)); matches = g_ptr_array_new(); - cdb = (CamelDB *) (search->folder->parent_store->cdb_r); + cdb = (CamelDB *) (parent_store->cdb_r); camel_db_select (cdb, tmp, (CamelDBSelectCB) read_uid_callback, matches, ex); if (ex && camel_exception_is_set(ex)) { const gchar *exception = camel_exception_get_description (ex); @@ -1816,16 +1828,19 @@ read_uid_callback (gpointer ref, gint ncol, gchar ** cols, gchar **name) static ESExpResult * search_message_location (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search) { + CamelStore *parent_store; ESExpResult *r; gboolean same = FALSE; + parent_store = camel_folder_get_parent_store (search->folder); + if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) { - if (argv[0]->value.string && search->folder && search->folder->parent_store && camel_folder_get_full_name (search->folder)) { - CamelFolderInfo *fi = camel_store_get_folder_info (search->folder->parent_store, camel_folder_get_full_name (search->folder), 0, NULL); + if (argv[0]->value.string && search->folder && parent_store && camel_folder_get_full_name (search->folder)) { + CamelFolderInfo *fi = camel_store_get_folder_info (parent_store, camel_folder_get_full_name (search->folder), 0, NULL); if (fi) { same = g_str_equal (fi->uri ? fi->uri : "", argv[0]->value.string); - camel_store_free_folder_info (search->folder->parent_store, fi); + camel_store_free_folder_info (parent_store, fi); } } } diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index 550b108..5a60dbc 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -292,16 +292,19 @@ summary_header_to_db (CamelFolderSummary *s, CamelException *ex) { CamelFIRecord * record = g_new0 (CamelFIRecord, 1); + CamelStore *parent_store; CamelDB *db; - gchar *table_name; + const gchar *table_name; - /* Though we are going to read, we do this during write, so lets use it that way */ - db = s->folder->parent_store->cdb_w; - table_name = s->folder->full_name; + /* Though we are going to read, we do this during write, + * so lets use it that way. */ + table_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + db = parent_store->cdb_w; io(printf("Savining header to db\n")); - record->folder_name = table_name; + record->folder_name = g_strdup (table_name); /* we always write out the current version */ record->version = CAMEL_FOLDER_SUMMARY_VERSION; @@ -1278,15 +1281,17 @@ message_info_from_uid (CamelFolderSummary *s, const gchar *uid) if (!info) { CamelDB *cdb; CamelException ex; - gchar *folder_name; + CamelStore *parent_store; + const gchar *folder_name; struct _db_pass_data data; d(printf ("\ncamel_folder_summary_uid called \n")); camel_exception_init (&ex); s->flags &= ~CAMEL_SUMMARY_DIRTY; - folder_name = s->folder->full_name; - cdb = s->folder->parent_store->cdb_r; + folder_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_r; data.summary = s; data.add = FALSE; @@ -1561,7 +1566,6 @@ remove_cache (CamelSession *session, CamelSessionThreadMsg *msg) if (time(NULL) - s->cache_load_time < SUMMARY_CACHE_DROP) return; - dd(printf("removing cache for %s %d %p ", s->folder ? s->folder->full_name : s->summary_path, g_hash_table_size (s->loaded_infos), (gpointer) s->loaded_infos)); /* FIXME[disk-summary] hack. fix it */ camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); @@ -1596,6 +1600,7 @@ static gboolean cfs_try_release_memory (CamelFolderSummary *s) { struct _folder_summary_free_msg *m; + CamelStore *parent_store; CamelSession *session; /* If folder is freed or if the cache is nil then clean up */ @@ -1605,7 +1610,8 @@ cfs_try_release_memory (CamelFolderSummary *s) return FALSE; } - session = ((CamelService *)((CamelFolder *)s->folder)->parent_store)->session; + parent_store = camel_folder_get_parent_store (s->folder); + session = CAMEL_SERVICE (parent_store)->session; if (time(NULL) - s->cache_load_time < SUMMARY_CACHE_DROP) return TRUE; @@ -1663,7 +1669,12 @@ msg_update_preview (const gchar *uid, gpointer value, CamelFolder *folder) { CamelMessageInfoBase *info = (CamelMessageInfoBase *)camel_folder_summary_uid (folder->summary, uid); CamelMimeMessage *msg; + CamelStore *parent_store; CamelException ex; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); camel_exception_init(&ex); msg = camel_folder_get_message (folder, uid, &ex); @@ -1671,7 +1682,7 @@ msg_update_preview (const gchar *uid, gpointer value, CamelFolder *folder) g_warning ("Error fetching message: %s", camel_exception_get_description(&ex)); else { if (camel_mime_message_build_preview ((CamelMimePart *)msg, (CamelMessageInfo *)info) && info->preview) - camel_db_write_preview_record (folder->parent_store->cdb_w, folder->full_name, info->uid, info->preview, NULL); + camel_db_write_preview_record (parent_store->cdb_w, full_name, info->uid, info->preview, NULL); } camel_exception_clear(&ex); camel_message_info_free(info); @@ -1705,9 +1716,13 @@ preview_update_exec (CamelSession *session, CamelSessionThreadMsg *msg) GPtrArray *uids_uncached= camel_folder_get_uncached_uids (m->folder, m->folder->summary->uids, NULL); GHashTable *hash = camel_folder_summary_get_hashtable (m->folder->summary); GHashTable *preview_data; + CamelStore *parent_store; + const gchar *full_name; gint i; - preview_data = camel_db_get_folder_preview (m->folder->parent_store->cdb_r, m->folder->full_name, NULL); + full_name = camel_folder_get_full_name (m->folder); + parent_store = camel_folder_get_parent_store (m->folder); + preview_data = camel_db_get_folder_preview (parent_store->cdb_r, full_name, NULL); if (preview_data) { g_hash_table_foreach_remove (preview_data, (GHRFunc)fill_mi, m->folder); g_hash_table_destroy (preview_data); @@ -1723,9 +1738,9 @@ preview_update_exec (CamelSession *session, CamelSessionThreadMsg *msg) } camel_folder_lock (m->folder, CF_REC_LOCK); - camel_db_begin_transaction (m->folder->parent_store->cdb_w, NULL); + camel_db_begin_transaction (parent_store->cdb_w, NULL); g_hash_table_foreach (hash, (GHFunc)msg_update_preview, m->folder); - camel_db_end_transaction (m->folder->parent_store->cdb_w, NULL); + camel_db_end_transaction (parent_store->cdb_w, NULL); camel_folder_unlock (m->folder, CF_REC_LOCK); camel_folder_free_uids(m->folder, uids_uncached); camel_folder_summary_free_hashtable (hash); @@ -1749,7 +1764,8 @@ static gint cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex) { CamelDB *cdb; - gchar *folder_name; + CamelStore *parent_store; + const gchar *folder_name; gint ret = 0; struct _db_pass_data data; @@ -1757,8 +1773,9 @@ cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex) * load better. */ d(printf ("\ncamel_folder_summary_reload_from_db called \n")); - folder_name = s->folder->full_name; - cdb = s->folder->parent_store->cdb_r; + folder_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_r; /* FIXME FOR SANKAR: No need to pass the address of summary here. */ data.summary = s; @@ -1770,10 +1787,10 @@ cfs_reload_from_db (CamelFolderSummary *s, CamelException *ex) if (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->need_preview) { struct _preview_update_msg *m; - m = camel_session_thread_msg_new(((CamelService *)s->folder->parent_store)->session, &preview_update_ops, sizeof(*m)); + m = camel_session_thread_msg_new(((CamelService *)parent_store)->session, &preview_update_ops, sizeof(*m)); m->folder = s->folder; camel_exception_init(&m->ex); - camel_session_thread_queue(((CamelService *)s->folder->parent_store)->session, &m->msg, 0); + camel_session_thread_queue(((CamelService *)parent_store)->session, &m->msg, 0); } return ret == 0 ? 0 : -1; @@ -1802,7 +1819,7 @@ camel_folder_summary_add_preview (CamelFolderSummary *s, CamelMessageInfo *info) * before any mass operation or when all message infos will be needed, * for better performance. * - * Since: 2.31 + * Since: 3.0 **/ void camel_folder_summary_prepare_fetch_all (CamelFolderSummary *s, CamelException *ex) @@ -1821,19 +1838,6 @@ camel_folder_summary_prepare_fetch_all (CamelFolderSummary *s, CamelException *e s->cache_load_time = time (NULL); } -#if 0 -static void -camel_folder_summary_dump (CamelFolderSummary *s) -{ - gint i; - - printf("Dumping %s\n", s->folder ? s->folder->full_name:"nil"); - for (i=0; iuids->len; i++) - printf("%s\t", (gchar *)s->uids->pdata[i]); - printf("\n"); -} -#endif - /** * camel_folder_summary_get_flag_cache: * @@ -1857,7 +1861,8 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s, CamelException *ex) { CamelDB *cdb; - gchar *folder_name; + CamelStore *parent_store; + const gchar *full_name; gint ret = 0; CamelException ex2; struct _CamelFolderSummaryPrivate *p = CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s); @@ -1866,32 +1871,31 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s, d(printf ("\ncamel_folder_summary_load_from_db called \n")); s->flags &= ~CAMEL_SUMMARY_DIRTY; - ret = camel_folder_summary_header_load_from_db (s, s->folder->parent_store, s->folder->full_name, ex); + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + ret = camel_folder_summary_header_load_from_db (s, parent_store, full_name, ex); if (ret) return ret; - folder_name = s->folder->full_name; - cdb = s->folder->parent_store->cdb_r; + cdb = parent_store->cdb_r; camel_exception_init (&ex2); ret = camel_db_get_folder_uids_flags ( - cdb, folder_name, s->sort_by, s->collate, + cdb, full_name, s->sort_by, s->collate, s->uids, p->flag_cache, &ex2); if (camel_exception_is_set (&ex2) && camel_exception_get_description (&ex2) && strstr (camel_exception_get_description (&ex2), "no such table") != NULL) { /* create table the first time it is accessed and missing */ - ret = camel_db_prepare_message_info_table (cdb, folder_name, ex); + ret = camel_db_prepare_message_info_table (cdb, full_name, ex); } else if (ex) { camel_exception_xfer (ex, &ex2); } camel_exception_clear (&ex2); - /* camel_folder_summary_dump (s); */ - #if 0 data.summary = s; data.add = TRUE; @@ -2105,11 +2109,15 @@ camel_folder_summary_migrate_infos(CamelFolderSummary *s) gint i; CamelMessageInfo *mi; CamelMessageInfoBase *info; + CamelStore *parent_store; gint ret = 0; - CamelDB *cdb = s->folder->parent_store->cdb_w; + CamelDB *cdb; CamelFIRecord *record; CamelException ex; + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; + /* Kick off the gc thread cycle. */ if (s->timeout_handle) g_source_remove (s->timeout_handle); @@ -2259,10 +2267,15 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data) CamelException *ex = args->ex; CamelMessageInfoBase *mi = (CamelMessageInfoBase *)value; CamelFolderSummary *s = (CamelFolderSummary *)mi->summary; - gchar *folder_name = s->folder->full_name; - CamelDB *cdb = s->folder->parent_store->cdb_w; + CamelStore *parent_store; + const gchar *full_name; + CamelDB *cdb; CamelMIRecord *mir; + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; + if (!args->migration && !mi->dirty) return; @@ -2278,7 +2291,7 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data) } if (!args->migration) { - if (camel_db_write_message_info_record (cdb, folder_name, mir, ex) != 0) { + if (camel_db_write_message_info_record (cdb, full_name, mir, ex) != 0) { camel_db_camel_mir_free (mir); return; } @@ -2290,7 +2303,7 @@ save_to_db_cb (gpointer key, gpointer value, gpointer data) if (args->progress > CAMEL_DB_IN_MEMORY_TABLE_LIMIT) { g_print ("BULK INsert limit reached \n"); - camel_db_flush_in_memory_transactions (cdb, folder_name, ex); + camel_db_flush_in_memory_transactions (cdb, full_name, ex); camel_db_start_in_memory_transactions (cdb, ex); args->progress = 0; } else { @@ -2311,18 +2324,22 @@ save_message_infos_to_db (CamelFolderSummary *s, gboolean fresh_mirs, CamelException *ex) { - CamelDB *cdb = s->folder->parent_store->cdb_w; - gchar *folder_name; + CamelStore *parent_store; + CamelDB *cdb; + const gchar *full_name; SaveToDBArgs args; args.ex = ex; args.migration = fresh_mirs; args.progress = 0; - folder_name = s->folder->full_name; - if (camel_db_prepare_message_info_table (cdb, folder_name, ex) != 0) { + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; + + if (camel_db_prepare_message_info_table (cdb, full_name, ex) != 0) return -1; - } + camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); /* Push MessageInfo-es */ g_hash_table_foreach (s->loaded_infos, save_to_db_cb, &args); @@ -2336,7 +2353,14 @@ save_message_infos_to_db (CamelFolderSummary *s, static void msg_save_preview (const gchar *uid, gpointer value, CamelFolder *folder) { - camel_db_write_preview_record (folder->parent_store->cdb_w, folder->full_name, uid, (gchar *)value, NULL); + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + camel_db_write_preview_record ( + parent_store->cdb_w, full_name, uid, (gchar *)value, NULL); } /** @@ -2348,18 +2372,22 @@ gint camel_folder_summary_save_to_db (CamelFolderSummary *s, CamelException *ex) { - CamelDB *cdb = s->folder->parent_store->cdb_w; + CamelStore *parent_store; + CamelDB *cdb; CamelFIRecord *record; gint ret, count; + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; + d(printf ("\ncamel_folder_summary_save_to_db called \n")); if (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->need_preview && g_hash_table_size(CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates)) { - camel_db_begin_transaction (s->folder->parent_store->cdb_w, NULL); + camel_db_begin_transaction (parent_store->cdb_w, NULL); camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); g_hash_table_foreach (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates, (GHFunc)msg_save_preview, s->folder); g_hash_table_remove_all (CAMEL_FOLDER_SUMMARY_GET_PRIVATE(s)->preview_updates); camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); - camel_db_end_transaction (s->folder->parent_store->cdb_w, NULL); + camel_db_end_transaction (parent_store->cdb_w, NULL); } if (!(s->flags & CAMEL_SUMMARY_DIRTY)) @@ -2371,8 +2399,6 @@ camel_folder_summary_save_to_db (CamelFolderSummary *s, if (!count) return camel_folder_summary_header_save_to_db (s, ex); - dd(printf("Saving %d/%d dirty records of %s\n", count, g_hash_table_size (s->loaded_infos), s->folder->full_name)); - camel_db_begin_transaction (cdb, ex); ret = save_message_infos_to_db (s, FALSE, ex); @@ -2384,10 +2410,13 @@ camel_folder_summary_save_to_db (CamelFolderSummary *s, } if (ex && camel_exception_is_set (ex) && strstr (camel_exception_get_description (ex), "26 columns but 28 values") != NULL) { + const gchar *full_name; + /* This is an error is previous migration. Let remigrate this folder alone. */ camel_db_abort_transaction (cdb, ex); - camel_db_reset_folder_version (cdb, s->folder->full_name, 0, ex); - g_warning ("Fixing up a broken summary migration on %s\n", s->folder->full_name); + full_name = camel_folder_get_full_name (s->folder); + camel_db_reset_folder_version (cdb, full_name, 0, ex); + g_warning ("Fixing up a broken summary migration on %s\n", full_name); /* Begin everything again. */ camel_db_begin_transaction (cdb, ex); @@ -2433,10 +2462,14 @@ gint camel_folder_summary_header_save_to_db (CamelFolderSummary *s, CamelException *ex) { - CamelDB *cdb = s->folder->parent_store->cdb_w; + CamelStore *parent_store; CamelFIRecord *record; + CamelDB *cdb; gint ret; + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; + d(printf ("\ncamel_folder_summary_header_save_to_db called \n")); record = CAMEL_FOLDER_SUMMARY_GET_CLASS (s)->summary_header_to_db (s, ex); @@ -3123,8 +3156,9 @@ camel_folder_summary_clear(CamelFolderSummary *s) void camel_folder_summary_clear_db (CamelFolderSummary *s) { + CamelStore *parent_store; CamelDB *cdb; - gchar *folder_name; + const gchar *folder_name; /* FIXME: This is non-sense. Neither an exception is passed, nor a value returned. How is the caller supposed to know, @@ -3133,8 +3167,9 @@ camel_folder_summary_clear_db (CamelFolderSummary *s) d(printf ("\ncamel_folder_summary_load_from_db called \n")); s->flags &= ~CAMEL_SUMMARY_DIRTY; - folder_name = s->folder->full_name; - cdb = s->folder->parent_store->cdb_w; + folder_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); if (camel_folder_summary_count(s) == 0) { @@ -3188,6 +3223,8 @@ summary_remove_uid (CamelFolderSummary *s, const gchar *uid) void camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info) { + CamelStore *parent_store; + const gchar *full_name; gboolean found; gint ret; @@ -3201,7 +3238,10 @@ camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info) s->meta_summary->msg_expunged = TRUE; camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); - if (!ret && camel_db_delete_uid (s->folder->parent_store->cdb_w, s->folder->full_name, camel_message_info_uid(info), NULL) != 0) + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + + if (!ret && camel_db_delete_uid (parent_store->cdb_w, full_name, camel_message_info_uid(info), NULL) != 0) return; if (found) @@ -3218,32 +3258,36 @@ camel_folder_summary_remove (CamelFolderSummary *s, CamelMessageInfo *info) void camel_folder_summary_remove_uid(CamelFolderSummary *s, const gchar *uid) { - CamelMessageInfo *oldinfo; - gchar *olduid; + CamelMessageInfo *oldinfo; + gchar *olduid; - camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); - camel_folder_summary_lock (s, CFS_REF_LOCK); - if (g_hash_table_lookup_extended(s->loaded_infos, uid, (gpointer)&olduid, (gpointer)&oldinfo)) { - /* make sure it doesn't vanish while we're removing it */ - camel_message_info_ref (oldinfo); - camel_folder_summary_unlock (s, CFS_REF_LOCK); - camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); - camel_folder_summary_remove(s, oldinfo); - camel_message_info_free(oldinfo); - } else { - gchar *tmpid = g_strdup (uid); - gint ret; - /* Info isn't loaded into the memory. We must just remove the UID*/ - ret = summary_remove_uid (s, uid); - camel_folder_summary_unlock (s, CFS_REF_LOCK); - camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); + camel_folder_summary_lock (s, CFS_SUMMARY_LOCK); + camel_folder_summary_lock (s, CFS_REF_LOCK); + if (g_hash_table_lookup_extended(s->loaded_infos, uid, (gpointer)&olduid, (gpointer)&oldinfo)) { + /* make sure it doesn't vanish while we're removing it */ + camel_message_info_ref (oldinfo); + camel_folder_summary_unlock (s, CFS_REF_LOCK); + camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); + camel_folder_summary_remove(s, oldinfo); + camel_message_info_free(oldinfo); + } else { + CamelStore *parent_store; + const gchar *full_name; + gchar *tmpid = g_strdup (uid); + gint ret; + /* Info isn't loaded into the memory. We must just remove the UID*/ + ret = summary_remove_uid (s, uid); + camel_folder_summary_unlock (s, CFS_REF_LOCK); + camel_folder_summary_unlock (s, CFS_SUMMARY_LOCK); - if (!ret && camel_db_delete_uid (s->folder->parent_store->cdb_w, s->folder->full_name, tmpid, NULL) != 0) { - g_free(tmpid); - return; - } - g_free (tmpid); + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + if (!ret && camel_db_delete_uid (parent_store->cdb_w, full_name, tmpid, NULL) != 0) { + g_free(tmpid); + return; } + g_free (tmpid); + } } /* _fast doesn't deal with db and leaves it to the caller. */ @@ -3350,8 +3394,9 @@ camel_folder_summary_remove_range (CamelFolderSummary *s, gint start, gint end) gint i; CamelDB *cdb; + CamelStore *parent_store; CamelException ex; /* May be this should come from the caller */ - gchar *folder_name; + const gchar *folder_name; GSList *uids = NULL; end = MIN(end+1, s->uids->len); @@ -3370,8 +3415,9 @@ camel_folder_summary_remove_range (CamelFolderSummary *s, gint start, gint end) } camel_exception_init (&ex); - folder_name = s->folder->full_name; - cdb = s->folder->parent_store->cdb_w; + folder_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + cdb = parent_store->cdb_w; /* FIXME[disk-summary] lifecycle of infos should be checked. * Add should add to db and del should del to db. Sync only diff --git a/camel/camel-folder.c b/camel/camel-folder.c index 776a6ed..c0f6070 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -57,6 +57,20 @@ struct _CamelFolderPrivate { gint frozen; struct _CamelFolderChangeInfo *changed_frozen; /* queues changed events */ gboolean skip_folder_lock; + + CamelStore *parent_store; + + gchar *name; + gchar *full_name; + gchar *description; +}; + +enum { + PROP_0, + PROP_DESCRIPTION, + PROP_FULL_NAME, + PROP_NAME, + PROP_PARENT_STORE }; G_DEFINE_ABSTRACT_TYPE (CamelFolder, camel_folder, CAMEL_TYPE_OBJECT) @@ -116,15 +130,95 @@ folder_transfer_message_to (CamelFolder *source, } static void +folder_set_parent_store (CamelFolder *folder, + CamelStore *parent_store) +{ + g_return_if_fail (CAMEL_IS_STORE (parent_store)); + g_return_if_fail (folder->priv->parent_store == NULL); + + folder->priv->parent_store = g_object_ref (parent_store); +} + +static void +folder_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_DESCRIPTION: + camel_folder_set_description ( + CAMEL_FOLDER (object), + g_value_get_string (value)); + return; + + case PROP_FULL_NAME: + camel_folder_set_full_name ( + CAMEL_FOLDER (object), + g_value_get_string (value)); + return; + + case PROP_NAME: + camel_folder_set_name ( + CAMEL_FOLDER (object), + g_value_get_string (value)); + return; + + case PROP_PARENT_STORE: + folder_set_parent_store ( + CAMEL_FOLDER (object), + g_value_get_object (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +folder_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_DESCRIPTION: + g_value_set_string ( + value, camel_folder_get_description ( + CAMEL_FOLDER (object))); + return; + + case PROP_FULL_NAME: + g_value_set_string ( + value, camel_folder_get_full_name ( + CAMEL_FOLDER (object))); + return; + + case PROP_NAME: + g_value_set_string ( + value, camel_folder_get_name ( + CAMEL_FOLDER (object))); + return; + + case PROP_PARENT_STORE: + g_value_set_object ( + value, camel_folder_get_parent_store ( + CAMEL_FOLDER (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void folder_dispose (GObject *object) { CamelFolder *folder; folder = CAMEL_FOLDER (object); - if (folder->parent_store != NULL) { - g_object_unref (folder->parent_store); - folder->parent_store = NULL; + if (folder->priv->parent_store != NULL) { + g_object_unref (folder->priv->parent_store); + folder->priv->parent_store = NULL; } if (folder->summary) { @@ -146,9 +240,9 @@ folder_finalize (GObject *object) folder = CAMEL_FOLDER (object); priv = CAMEL_FOLDER_GET_PRIVATE (object); - g_free (folder->name); - g_free (folder->full_name); - g_free (folder->description); + g_free (priv->name); + g_free (priv->full_name); + g_free (priv->description); camel_folder_change_info_free (priv->changed_frozen); @@ -159,180 +253,6 @@ folder_finalize (GObject *object) G_OBJECT_CLASS (camel_folder_parent_class)->finalize (object); } -static gint -folder_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i; - guint32 tag; - gint unread = -1, deleted = 0, junked = 0, junked_not_deleted = 0, visible = 0, count = -1; - - for (i = 0; i < args->argc; i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - /* CamelObject args */ - case CAMEL_OBJECT_ARG_DESCRIPTION: - if (folder->description == NULL) - folder->description = g_strdup_printf ("%s", folder->full_name); - *arg->ca_str = folder->description; - break; - - /* CamelFolder args */ - case CAMEL_FOLDER_ARG_NAME: - *arg->ca_str = folder->name; - break; - case CAMEL_FOLDER_ARG_FULL_NAME: - *arg->ca_str = folder->full_name; - break; - case CAMEL_FOLDER_ARG_STORE: - *arg->ca_object = folder->parent_store; - break; - case CAMEL_FOLDER_ARG_PERMANENTFLAGS: - *arg->ca_int = folder->permanent_flags; - break; - case CAMEL_FOLDER_ARG_TOTAL: - *arg->ca_int = camel_folder_summary_count (folder->summary); - break; - case CAMEL_FOLDER_ARG_UNREAD: - case CAMEL_FOLDER_ARG_DELETED: - case CAMEL_FOLDER_ARG_JUNKED: - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - case CAMEL_FOLDER_ARG_VISIBLE: - /* This is so we can get the values atomically, and also so we can calculate them only once */ - - /* FIXME[disk-summary] Add a better base class - * function to get counts specific to normal/vee - * folder. */ - if (unread == -1) { - - if (1) { - unread = folder->summary->unread_count; - deleted = folder->summary->deleted_count; - junked = folder->summary->junk_count; - junked_not_deleted = folder->summary->junk_not_deleted_count; - visible = folder->summary->visible_count; - } else { - /* count = camel_folder_summary_count (folder->summary); - for (j = 0; j < count; j++) { - if ((info = camel_folder_summary_index (folder->summary, j))) { - guint32 flags = camel_message_info_flags (info); - - if ((flags & (CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0) - unread++; - if (flags & CAMEL_MESSAGE_DELETED) - deleted++; - if (flags & CAMEL_MESSAGE_JUNK) { - junked++; - if (!(flags & CAMEL_MESSAGE_DELETED)) - junked_not_deleted++; - } - if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0) - visible++; - camel_message_info_free (info); - } - - }*/ - /* FIXME[disk-summary] I added it for - * vfolders summary storage, does it - * harm ? */ - if (unread == -1) { - /*unread = folder->summary->unread_count;*/ - /* - folder->summary->junk_count = junked; - folder->summary->deleted_count = deleted; - printf ("*************************** %s %d %d %d\n", folder->full_name, folder->summary->unread_count, unread, count); - folder->summary->unread_count = unread; */ - } - } - - } - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UNREAD: - count = unread == -1 ? 0 : unread; - break; - case CAMEL_FOLDER_ARG_DELETED: - count = deleted == -1 ? 0 : deleted; - break; - case CAMEL_FOLDER_ARG_JUNKED: - count = junked == -1 ? 0 : junked; - break; - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - count = junked_not_deleted == -1 ? 0 : junked_not_deleted; - break; - case CAMEL_FOLDER_ARG_VISIBLE: - count = visible == -1 ? 0 : visible; - break; - } - - *arg->ca_int = count; - break; - case CAMEL_FOLDER_ARG_UID_ARRAY: { -/* gint j; - CamelMessageInfo *info; - GPtrArray *array; - - count = camel_folder_summary_count (folder->summary); - array = g_ptr_array_new (); - g_ptr_array_set_size (array, count); - for (j=0; jsummary, j))) { - array->pdata[i] = g_strdup (camel_message_info_uid (info)); - camel_message_info_free (info); - } - } - *arg->ca_ptr = array;*/ - /* WTH this is reqd ?, let it crash to find out who uses this */ - g_assert_not_reached (); - break; } - case CAMEL_FOLDER_ARG_INFO_ARRAY: - *arg->ca_ptr = camel_folder_summary_array (folder->summary); - break; - case CAMEL_FOLDER_ARG_PROPERTIES: - *arg->ca_ptr = NULL; - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return CAMEL_OBJECT_CLASS (camel_folder_parent_class)->getv (object, ex, args); -} - -static void -folder_free (CamelObject *object, - guint32 tag, - gpointer val) -{ - CamelFolder *folder = (CamelFolder *)object; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UID_ARRAY: { - GPtrArray *array = val; - gint i; - - for (i=0; ilen; i++) - g_free (array->pdata[i]); - g_ptr_array_free (array, TRUE); - break; } - case CAMEL_FOLDER_ARG_INFO_ARRAY: - camel_folder_free_summary (folder, val); - break; - case CAMEL_FOLDER_ARG_PROPERTIES: - g_slist_free (val); - break; - default: - CAMEL_OBJECT_CLASS (camel_folder_parent_class)->free (object, tag, val); - } -} - static gboolean folder_refresh_info (CamelFolder *folder, CamelException *ex) @@ -340,24 +260,6 @@ folder_refresh_info (CamelFolder *folder, return TRUE; } -static const gchar * -folder_get_name (CamelFolder *folder) -{ - return folder->name; -} - -static const gchar * -folder_get_full_name (CamelFolder *folder) -{ - return folder->full_name; -} - -static CamelStore * -folder_get_parent_store (CamelFolder * folder) -{ - return folder->parent_store; -} - static gint folder_get_message_count (CamelFolder *folder) { @@ -666,11 +568,10 @@ folder_rename (CamelFolder *folder, d (printf ("CamelFolder:rename ('%s')\n", new)); - g_free (folder->full_name); - folder->full_name = g_strdup (new); - g_free (folder->name); + camel_folder_set_full_name (folder, new); + tmp = strrchr (new, '/'); - folder->name = g_strdup (tmp?tmp+1:new); + camel_folder_set_name (folder, (tmp != NULL) ? tmp + 1 : new); } static void @@ -734,17 +635,12 @@ camel_folder_class_init (CamelFolderClass *class) g_type_class_add_private (class, sizeof (CamelFolderPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = folder_set_property; + object_class->get_property = folder_get_property; object_class->dispose = folder_dispose; object_class->finalize = folder_finalize; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = folder_getv; - camel_object_class->free = folder_free; - class->refresh_info = folder_refresh_info; - class->get_name = folder_get_name; - class->get_full_name = folder_get_full_name; - class->get_parent_store = folder_get_parent_store; class->get_message_count = folder_get_message_count; class->get_permanent_flags = folder_get_permanent_flags; class->get_message_flags = folder_get_message_flags; @@ -772,12 +668,77 @@ camel_folder_class_init (CamelFolderClass *class) class->is_frozen = folder_is_frozen; class->get_quota_info = folder_get_quota_info; + camel_object_class = CAMEL_OBJECT_CLASS (class); camel_object_class_add_event ( camel_object_class, "folder_changed", folder_changed); camel_object_class_add_event ( camel_object_class, "deleted", NULL); camel_object_class_add_event ( camel_object_class, "renamed", NULL); + + /** + * CamelFolder:description + * + * The folder's description. + **/ + g_object_class_install_property ( + object_class, + PROP_DESCRIPTION, + g_param_spec_string ( + "description", + "Description", + "The folder's description", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + /** + * CamelFolder:full-name + * + * The folder's fully qualified name. + **/ + g_object_class_install_property ( + object_class, + PROP_FULL_NAME, + g_param_spec_string ( + "full-name", + "Full Name", + "The folder's fully qualified name", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + /** + * CamelFolder:name + * + * The folder's short name. + **/ + g_object_class_install_property ( + object_class, + PROP_NAME, + g_param_spec_string ( + "name", + "Name", + "The folder's short name", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + /** + * CamelFolder:parent-store + * + * The #CamelStore to which the folder belongs. + **/ + g_object_class_install_property ( + object_class, + PROP_PARENT_STORE, + g_param_spec_object ( + "parent-store", + "Parent Store", + "The store to which the folder belongs", + CAMEL_TYPE_STORE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); } static void @@ -832,34 +793,6 @@ camel_folder_get_filename (CamelFolder *folder, } /** - * camel_folder_construct: - * @folder: a #CamelFolder to construct - * @parent_store: parent #CamelStore object of the folder - * @full_name: full name of the folder - * @name: short name of the folder - * - * Initalizes the folder by setting the parent store and name. - **/ -void -camel_folder_construct (CamelFolder *folder, - CamelStore *parent_store, - const gchar *full_name, - const gchar *name) -{ - g_return_if_fail (CAMEL_IS_FOLDER (folder)); - g_return_if_fail (CAMEL_IS_STORE (parent_store)); - g_return_if_fail (folder->parent_store == NULL); - g_return_if_fail (folder->name == NULL); - - folder->parent_store = parent_store; - if (parent_store) - g_object_ref (parent_store); - - folder->name = g_strdup (name); - folder->full_name = g_strdup (full_name); -} - -/** * camel_folder_sync: * @folder: a #CamelFolder * @expunge: whether or not to expunge deleted messages @@ -927,43 +860,114 @@ camel_folder_refresh_info (CamelFolder *folder, * camel_folder_get_name: * @folder: a #CamelFolder * - * Get the (short) name of the folder. The fully qualified name - * can be obtained with the #camel_folder_get_full_name method. + * Returns the short name of the folder. The fully qualified name + * can be obtained with camel_folder_get_full_name(). * * Returns: the short name of the folder **/ const gchar * camel_folder_get_name (CamelFolder *folder) { - CamelFolderClass *class; - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - class = CAMEL_FOLDER_GET_CLASS (folder); - g_return_val_if_fail (class->get_name != NULL, NULL); + return folder->priv->name; +} + +/** + * camel_folder_set_name: + * @folder: a #CamelFolder + * @name: a name for the folder + * + * Sets the short name of the folder. + * + * Since: 3.0 + **/ +void +camel_folder_set_name (CamelFolder *folder, + const gchar *name) +{ + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - return class->get_name (folder); + g_free (folder->priv->name); + folder->priv->name = g_strdup (name); + + g_object_notify (G_OBJECT (folder), "name"); } /** * camel_folder_get_full_name: * @folder: a #CamelFolder * - * Get the full name of the folder. + * Returns the fully qualified name of the folder. * - * Returns: the full name of the folder + * Returns: the fully qualified name of the folder **/ const gchar * camel_folder_get_full_name (CamelFolder *folder) { - CamelFolderClass *class; + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); + + return folder->priv->full_name; +} +/** + * camel_folder_set_full_name: + * @folder: a #CamelFolder + * @full_name: a fully qualified name for the folder + * + * Sets the fully qualified name of the folder. + * + * Since: 3.0 + **/ +void +camel_folder_set_full_name (CamelFolder *folder, + const gchar *full_name) +{ + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + + g_free (folder->priv->full_name); + folder->priv->full_name = g_strdup (full_name); + + g_object_notify (G_OBJECT (folder), "full-name"); +} + +/** + * camel_folder_get_description: + * @folder: a #CamelFolder + * + * Returns a description of the folder suitable for displaying to the user. + * + * Returns: a description of the folder + * + * Since: 3.0 + **/ +const gchar * +camel_folder_get_description (CamelFolder *folder) +{ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - class = CAMEL_FOLDER_GET_CLASS (folder); - g_return_val_if_fail (class->get_full_name != NULL, NULL); + return folder->priv->description; +} + +/** + * camel_folder_set_description: + * @folder: a #CamelFolder + * @description: a description of the folder + * + * Sets a description of the folder suitable for displaying to the user. + * + * Since: 3.0 + **/ +void +camel_folder_set_description (CamelFolder *folder, + const gchar *description) +{ + g_return_if_fail (CAMEL_IS_FOLDER (folder)); - return class->get_full_name (folder); + g_free (folder->priv->description); + folder->priv->description = g_strdup (description); + + g_object_notify (G_OBJECT (folder), "description"); } /** @@ -975,14 +979,9 @@ camel_folder_get_full_name (CamelFolder *folder) CamelStore * camel_folder_get_parent_store (CamelFolder *folder) { - CamelFolderClass *class; - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - class = CAMEL_FOLDER_GET_CLASS (folder); - g_return_val_if_fail (class->get_parent_store != NULL, NULL); - - return class->get_parent_store (folder); + return folder->priv->parent_store; } /** @@ -1047,13 +1046,10 @@ camel_folder_get_message_count (CamelFolder *folder) gint camel_folder_get_unread_message_count (CamelFolder *folder) { - gint count = -1; - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); + g_return_val_if_fail (folder->summary != NULL, -1); - camel_object_get (folder, NULL, CAMEL_FOLDER_UNREAD, &count, 0); - - return count; + return folder->summary->unread_count; } /** @@ -1066,13 +1062,10 @@ camel_folder_get_unread_message_count (CamelFolder *folder) gint camel_folder_get_deleted_message_count (CamelFolder *folder) { - gint count = -1; - g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1); + g_return_val_if_fail (folder->summary != NULL, -1); - camel_object_get (folder, NULL, CAMEL_FOLDER_DELETED, &count, 0); - - return count; + return folder->summary->deleted_count; } /** @@ -1450,7 +1443,8 @@ camel_folder_get_message (CamelFolder *folder, camel_folder_unlock (folder, CF_REC_LOCK); if (ret && camel_debug_start (":folder")) { - printf ("CamelFolder:get_message ('%s', '%s') =\n", folder->full_name, uid); + printf ("CamelFolder:get_message ('%s', '%s') =\n", + camel_folder_get_full_name (folder), uid); camel_mime_message_dump (ret, FALSE); camel_debug_end (); } @@ -1846,7 +1840,7 @@ camel_folder_transfer_messages_to (CamelFolder *source, return TRUE; } - if (source->parent_store == dest->parent_store) { + if (source->priv->parent_store == dest->priv->parent_store) { /* If either folder is a vtrash, we need to use the * vtrash transfer method. */ if (CAMEL_IS_VTRASH_FOLDER (dest)) @@ -1874,6 +1868,8 @@ void camel_folder_delete (CamelFolder *folder) { CamelFolderClass *class; + CamelStore *parent_store; + const gchar *full_name; g_return_if_fail (CAMEL_IS_FOLDER (folder)); @@ -1893,7 +1889,9 @@ camel_folder_delete (CamelFolder *folder) camel_folder_unlock (folder, CF_REC_LOCK); /* Delete the references of the folder from the DB.*/ - camel_db_delete_folder (folder->parent_store->cdb_w, folder->full_name, NULL); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + camel_db_delete_folder (parent_store->cdb_w, full_name, NULL); camel_object_trigger_event (folder, "deleted", NULL); } @@ -1913,6 +1911,7 @@ camel_folder_rename (CamelFolder *folder, const gchar *new) { CamelFolderClass *class; + CamelStore *parent_store; gchar *old; g_return_if_fail (CAMEL_IS_FOLDER (folder)); @@ -1921,10 +1920,13 @@ camel_folder_rename (CamelFolder *folder, class = CAMEL_FOLDER_GET_CLASS (folder); g_return_if_fail (class->rename != NULL); - old = g_strdup (folder->full_name); + old = g_strdup (camel_folder_get_full_name (folder)); class->rename (folder, new); - camel_db_rename_folder (folder->parent_store->cdb_w, old, new, NULL); + + parent_store = camel_folder_get_parent_store (folder); + camel_db_rename_folder (parent_store->cdb_w, old, new, NULL); + camel_object_trigger_event (folder, "renamed", old); g_free (old); @@ -1992,10 +1994,17 @@ camel_folder_is_frozen (CamelFolder *folder) return class->is_frozen (folder); } -/* FIXME: This function shouldn't be needed, but it's used in CamelVeeFolder */ +/** + * camel_folder_get_frozen_count: + * @folder: a #CamelFolder + * + * Since: 3.0 + **/ gint camel_folder_get_frozen_count (CamelFolder *folder) { + /* FIXME This function shouldn't be needed, + * but it's used in CamelVeeFolder */ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), 0); return folder->priv->frozen; @@ -2115,15 +2124,25 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg) { struct _folder_filter_msg *m = (struct _folder_filter_msg *) tmsg; CamelMessageInfo *info; + CamelStore *parent_store; gint i, status = 0; CamelURL *uri; gchar *source_url; CamelException ex = CAMEL_EXCEPTION_INITIALISER; - CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin; + CamelJunkPlugin *csp; + const gchar *full_name; + + full_name = camel_folder_get_full_name (m->folder); + parent_store = camel_folder_get_parent_store (m->folder); + csp = CAMEL_SERVICE (parent_store)->session->junk_plugin; if (m->junk) { /* Translators: The %s is replaced with a folder name where the operation is running. */ - camel_operation_start (NULL, ngettext ("Learning new spam message in '%s'", "Learning new spam messages in '%s'", m->junk->len), m->folder->full_name); + camel_operation_start ( + NULL, ngettext ( + "Learning new spam message in '%s'", + "Learning new spam messages in '%s'", + m->junk->len), full_name); for (i = 0; i < m->junk->len; i ++) { CamelMimeMessage *msg = camel_folder_get_message (m->folder, m->junk->pdata[i], &ex); @@ -2142,7 +2161,11 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg) if (m->notjunk) { /* Translators: The %s is replaced with a folder name where the operation is running. */ - camel_operation_start (NULL, ngettext ("Learning new ham message in '%s'", "Learning new ham messages in '%s'", m->notjunk->len), m->folder->full_name); + camel_operation_start ( + NULL, ngettext ( + "Learning new ham message in '%s'", + "Learning new ham messages in '%s'", + m->notjunk->len), full_name); for (i = 0; i < m->notjunk->len; i ++) { CamelMimeMessage *msg = camel_folder_get_message (m->folder, m->notjunk->pdata[i], &ex); gint pc = 100 * i / m->notjunk->len; @@ -2163,18 +2186,24 @@ filter_filter (CamelSession *session, CamelSessionThreadMsg *tmsg) if (m->driver && m->recents) { /* Translators: The %s is replaced with a folder name where the operation is running. */ - camel_operation_start (NULL, ngettext ("Filtering new message in '%s'", "Filtering new messages in '%s'", m->recents->len), m->folder->full_name); + camel_operation_start ( + NULL, ngettext ( + "Filtering new message in '%s'", + "Filtering new messages in '%s'", + m->recents->len), full_name); - source_url = camel_service_get_url ((CamelService *)m->folder->parent_store); + source_url = camel_service_get_url (CAMEL_SERVICE (parent_store)); uri = camel_url_new (source_url, NULL); g_free (source_url); - if (m->folder->full_name && m->folder->full_name[0] != '/') { - gchar *tmp = alloca (strlen (m->folder->full_name)+2); - sprintf (tmp, "/%s", m->folder->full_name); + if (full_name != NULL && *full_name != '/') { + gchar *tmp; + + tmp = alloca (strlen (full_name) + 2); + sprintf (tmp, "/%s", full_name); camel_url_set_path (uri, tmp); } else - camel_url_set_path (uri, m->folder->full_name); + camel_url_set_path (uri, full_name); source_url = camel_url_to_string (uri, CAMEL_URL_HIDE_ALL); camel_url_free (uri); @@ -2241,15 +2270,19 @@ static gboolean folder_changed (CamelObject *obj, gpointer event_data) { CamelFolder *folder = (CamelFolder *)obj; + CamelStore *parent_store; CamelFolderChangeInfo *changed = event_data; struct _CamelFolderChangeInfoPrivate *p = changed->priv; - CamelSession *session = ((CamelService *)folder->parent_store)->session; + CamelSession *session; CamelFilterDriver *driver = NULL; GPtrArray *junk = NULL; GPtrArray *notjunk = NULL; GPtrArray *recents = NULL; gint i; + parent_store = camel_folder_get_parent_store (folder); + session = CAMEL_SERVICE (parent_store)->session; + d (printf ("folder_changed (%p:'%s', %p), frozen=%d\n", obj, folder->full_name, event_data, folder->priv->frozen)); d (printf (" added %d removed %d changed %d recent %d filter %d\n", changed->uid_added->len, changed->uid_removed->len, diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 7e210ea..3f0f377 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -61,43 +61,11 @@ typedef struct _CamelFolder CamelFolder; typedef struct _CamelFolderClass CamelFolderClass; typedef struct _CamelFolderPrivate CamelFolderPrivate; -enum { - CAMEL_FOLDER_ARG_FIRST = CAMEL_ARG_FIRST + 0x1000, - CAMEL_FOLDER_ARG_NAME = CAMEL_FOLDER_ARG_FIRST, - CAMEL_FOLDER_ARG_FULL_NAME, - CAMEL_FOLDER_ARG_STORE, - CAMEL_FOLDER_ARG_PERMANENTFLAGS, - CAMEL_FOLDER_ARG_TOTAL, - CAMEL_FOLDER_ARG_UNREAD, /* unread messages */ - CAMEL_FOLDER_ARG_DELETED, /* deleted messages */ - CAMEL_FOLDER_ARG_JUNKED, /* junked messages */ - CAMEL_FOLDER_ARG_VISIBLE, /* visible !(deleted or junked) */ - CAMEL_FOLDER_ARG_UID_ARRAY, - CAMEL_FOLDER_ARG_INFO_ARRAY, - CAMEL_FOLDER_ARG_PROPERTIES, - CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED, /* junked, but not deleted messages */ - CAMEL_FOLDER_ARG_LAST = CAMEL_ARG_FIRST + 0x2000 -}; - -enum { - CAMEL_FOLDER_NAME = CAMEL_FOLDER_ARG_NAME | CAMEL_ARG_STR, - CAMEL_FOLDER_FULL_NAME = CAMEL_FOLDER_ARG_FULL_NAME | CAMEL_ARG_STR, - CAMEL_FOLDER_STORE = CAMEL_FOLDER_ARG_STORE | CAMEL_ARG_OBJ, - CAMEL_FOLDER_PERMANENTFLAGS = CAMEL_FOLDER_ARG_PERMANENTFLAGS | CAMEL_ARG_INT, - CAMEL_FOLDER_TOTAL = CAMEL_FOLDER_ARG_TOTAL | CAMEL_ARG_INT, - CAMEL_FOLDER_UNREAD = CAMEL_FOLDER_ARG_UNREAD | CAMEL_ARG_INT, - CAMEL_FOLDER_DELETED = CAMEL_FOLDER_ARG_DELETED | CAMEL_ARG_INT, - CAMEL_FOLDER_JUNKED = CAMEL_FOLDER_ARG_JUNKED | CAMEL_ARG_INT, - CAMEL_FOLDER_JUNKED_NOT_DELETED = CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED | CAMEL_ARG_INT, - CAMEL_FOLDER_VISIBLE = CAMEL_FOLDER_ARG_VISIBLE | CAMEL_ARG_INT, - - CAMEL_FOLDER_UID_ARRAY = CAMEL_FOLDER_ARG_UID_ARRAY | CAMEL_ARG_PTR, - CAMEL_FOLDER_INFO_ARRAY = CAMEL_FOLDER_ARG_INFO_ARRAY | CAMEL_ARG_PTR, - - /* GSList of settable folder properties */ - CAMEL_FOLDER_PROPERTIES = CAMEL_FOLDER_ARG_PROPERTIES | CAMEL_ARG_PTR -}; - +/** + * CamelFolderLock: + * + * Since: 3.0 + **/ typedef enum { CF_CHANGE_LOCK, CF_REC_LOCK @@ -131,12 +99,6 @@ struct _CamelFolder { CamelObject parent; CamelFolderPrivate *priv; - /* get these via the :get() method, they might not be set otherwise */ - gchar *name; - gchar *full_name; - gchar *description; - - struct _CamelStore *parent_store; CamelFolderSummary *summary; guint32 folder_flags; @@ -162,10 +124,6 @@ struct _CamelFolderClass { gboolean (*sync) (CamelFolder *folder, gboolean expunge, CamelException *ex); - const gchar * (*get_name) (CamelFolder *folder); - const gchar * (*get_full_name) (CamelFolder *folder); - struct _CamelStore * - (*get_parent_store) (CamelFolder *folder); gboolean (*expunge) (CamelFolder *folder, CamelException *ex); gint (*get_message_count) (CamelFolder *folder); @@ -255,10 +213,6 @@ struct _CamelFolderClass { }; GType camel_folder_get_type (void); -void camel_folder_construct (CamelFolder *folder, - struct _CamelStore *parent_store, - const gchar *full_name, - const gchar *name); gboolean camel_folder_refresh_info (CamelFolder *folder, CamelException *ex); gboolean camel_folder_sync (CamelFolder *folder, @@ -276,7 +230,14 @@ gboolean camel_folder_expunge (CamelFolder *folder, /* folder name operations */ const gchar * camel_folder_get_name (CamelFolder *folder); +void camel_folder_set_name (CamelFolder *folder, + const gchar *name); const gchar * camel_folder_get_full_name (CamelFolder *folder); +void camel_folder_set_full_name (CamelFolder *folder, + const gchar *full_name); +const gchar * camel_folder_get_description (CamelFolder *folder); +void camel_folder_set_description (CamelFolder *folder, + const gchar *description); /* various properties accessors */ guint32 camel_folder_get_permanent_flags(CamelFolder *folder); diff --git a/camel/camel-gpg-context.c b/camel/camel-gpg-context.c index 0f7cc41..18d1430 100644 --- a/camel/camel-gpg-context.c +++ b/camel/camel-gpg-context.c @@ -2199,6 +2199,12 @@ camel_gpg_context_new (CamelSession *session) "session", session, NULL); } +/** + * camel_gpg_context_get_always_trust: + * @context: a #CamelGpgContext + * + * Since: 3.0 + **/ gboolean camel_gpg_context_get_always_trust (CamelGpgContext *context) { diff --git a/camel/camel-index.c b/camel/camel-index.c index f65d0a3..b323bce 100644 --- a/camel/camel-index.c +++ b/camel/camel-index.c @@ -119,6 +119,14 @@ camel_index_rename (CamelIndex *idx, const gchar *path) } } +/** + * camel_index_set_normalize: + * @idx: a #CamelIndex + * @func: normalization function + * @data: user data for @func + * + * Since: 3.0 + **/ void camel_index_set_normalize (CamelIndex *idx, CamelIndexNorm func, gpointer data) { diff --git a/camel/camel-object.c b/camel/camel-object.c index 978d0a7..020f9d1 100644 --- a/camel/camel-object.c +++ b/camel/camel-object.c @@ -34,9 +34,21 @@ #include "camel-object.h" #define d(x) -#define b(x) /* object bag */ #define h(x) /* hooks */ +#define CAMEL_OBJECT_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), CAMEL_TYPE_OBJECT, CamelObjectPrivate)) + +struct _CamelObjectPrivate { + gchar *state_filename; +}; + +enum { + PROP_0, + PROP_STATE_FILENAME +}; + G_DEFINE_ABSTRACT_TYPE (CamelObject, camel_object, G_TYPE_OBJECT) /* ** Quickie type system ************************************************* */ @@ -76,10 +88,6 @@ typedef struct _CamelHookPair gpointer data; } CamelHookPair; -/* meta-data stuff */ -static CamelHookPair *co_metadata_pair(CamelObject *obj, gint create); - -static const gchar meta_name[] = "object:meta"; #define CAMEL_OBJECT_STATE_FILE_MAGIC "CLMD" /* ********************************************************************** */ @@ -92,13 +100,6 @@ static void camel_object_free_hooks(CamelObject *o); /* ********************************************************************** */ -#define CLASS_LOCK(k) (g_mutex_lock((((CamelObjectClass *)k)->lock))) -#define CLASS_UNLOCK(k) (g_mutex_unlock((((CamelObjectClass *)k)->lock))) -#define REF_LOCK() (g_mutex_lock(ref_lock)) -#define REF_UNLOCK() (g_mutex_unlock(ref_lock)) -#define TYPE_LOCK() (g_static_rec_mutex_lock(&type_lock)) -#define TYPE_UNLOCK() (g_static_rec_mutex_unlock(&type_lock)) - static struct _CamelHookPair * pair_alloc(void) { @@ -137,83 +138,6 @@ hooks_free(CamelHookList *hooks) /* ************************************************************************ */ -/* CamelObject base methods */ - -static gint -cobject_getv (CamelObject *o, - CamelException *ex, - CamelArgGetV *args) -{ - CamelObjectClass *class; - gint i; - guint32 tag; - - class = CAMEL_OBJECT_GET_CLASS (o); - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_DESCRIPTION: - *arg->ca_str = (gchar *) G_OBJECT_CLASS_NAME (class); - break; - case CAMEL_OBJECT_ARG_STATE_FILE: { - CamelHookPair *pair = co_metadata_pair(o, FALSE); - - if (pair) { - *arg->ca_str = g_strdup(pair->func.filename); - camel_object_unget_hooks(o); - } - break; } - } - } - - /* could have flags or stuff here? */ - return 0; -} - -static gint -cobject_setv (CamelObject *o, - CamelException *ex, - CamelArgV *args) -{ - gint i; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArg *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_STATE_FILE: { - CamelHookPair *pair; - - /* We store the filename on the meta-data hook-pair */ - pair = co_metadata_pair(o, TRUE); - g_free(pair->func.filename); - pair->func.filename = g_strdup(arg->ca_str); - camel_object_unget_hooks(o); - break; } - } - } - - /* could have flags or stuff here? */ - return 0; -} - -static void -cobject_free(CamelObject *o, guint32 tag, gpointer value) -{ - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_STATE_FILE: - g_free(value); - break; - } -} - /* State file for CamelObject data. Any later versions should only append data. version:uint32 @@ -230,170 +154,248 @@ cobject_free(CamelObject *o, guint32 tag, gpointer value) */ +/* XXX This is a holdover from Camel's old homegrown type system. + * CamelArg was a kind of primitive version of GObject properties. + * The argument ID and data type were encoded into a 32-bit integer. + * Unfortunately the encoding was also used in the binary state file + * format, so we still need the secret decoder ring. */ +enum camel_arg_t { + CAMEL_ARG_END = 0, + CAMEL_ARG_IGNORE = 1, /* override/ignore an arg in-place */ + + CAMEL_ARG_FIRST = 1024, /* 1024 args reserved for arg system */ + + CAMEL_ARG_TYPE = 0xf0000000, /* type field for tags */ + CAMEL_ARG_TAG = 0x0fffffff, /* tag field for args */ + + CAMEL_ARG_OBJ = 0x00000000, /* object */ + CAMEL_ARG_INT = 0x10000000, /* gint */ + CAMEL_ARG_DBL = 0x20000000, /* gdouble */ + CAMEL_ARG_STR = 0x30000000, /* c string */ + CAMEL_ARG_PTR = 0x40000000, /* ptr */ + CAMEL_ARG_BOO = 0x50000000 /* bool */ +}; + +#define CAMEL_ARGV_MAX (20) + static gint -cobject_state_read(CamelObject *obj, FILE *fp) +cobject_state_read (CamelObject *object, FILE *fp) { - guint32 i, count, version; + GValue value; + GObjectClass *class; + GParamSpec **properties; + guint32 count, version; + guint ii, jj, n_properties; - /* NB: for later versions, just check the version is 1 .. known version */ - if (camel_file_util_decode_uint32(fp, &version) == -1 - || version > 1 - || camel_file_util_decode_uint32(fp, &count) == -1) + if (camel_file_util_decode_uint32 (fp, &version) == -1) return -1; - for (i=0;i 1) + return -1; - if (camel_file_util_decode_string(fp, &name) == 0 - && camel_file_util_decode_string(fp, &value) == 0) { - /* XXX This no longer does anything. - * We're just eating dead data. */ - g_free(name); - g_free(value); - } else { - g_free(name); - g_free(value); + if (camel_file_util_decode_uint32 (fp, &count) == -1) + return -1; + /* XXX Camel no longer supports meta-data in state + * files, so we're just eating dead data here. */ + for (ii = 0; ii < count; ii++) { + gchar *name = NULL; + gchar *value = NULL; + gboolean success; + + success = + camel_file_util_decode_string (fp, &name) == 0 && + camel_file_util_decode_string (fp, &value) == 0; + + g_free (name); + g_free (value); + + if (!success) return -1; - } } - if (version > 0) { - CamelArgV *argv; + if (version == 0) + return 0; - if (camel_file_util_decode_uint32(fp, &count) == -1 - || count == 0 || count > 1024) { - /* maybe it was just version 0 afterall */ - return 0; - } + if (camel_file_util_decode_uint32 (fp, &count) == -1) + return 0; - count = MIN(count, CAMEL_ARGV_MAX); + if (count == 0 || count > 1024) + /* Maybe it was just version 0 afterall. */ + return 0; - /* we batch up the properties and set them in one go */ - argv = g_try_malloc(sizeof(CamelArgV) - - ((CAMEL_ARGV_MAX - count) * sizeof(CamelArg))); - if (argv == NULL) - return -1; + count = MIN (count, CAMEL_ARGV_MAX); + memset (&value, 0, sizeof (GValue)); - argv->argc = 0; - for (i=0;iargv[argv->argc].tag) == -1) - goto cleanup; + class = G_OBJECT_GET_CLASS (object); + properties = g_object_class_list_properties (class, &n_properties); - /* so far,only do strings and ints, doubles could be added, - object's would require a serialisation interface */ + for (ii = 0; ii < count; ii++) { + gboolean property_set = FALSE; + guint32 tag, v_uint32; - switch (argv->argv[argv->argc].tag & CAMEL_ARG_TYPE) { - case CAMEL_ARG_INT: + if (camel_file_util_decode_uint32 (fp, &tag) == -1) + goto exit; + + /* Record state file values into GValues. + * XXX We currently only support booleans. */ + switch (tag & CAMEL_ARG_TYPE) { case CAMEL_ARG_BOO: - if (camel_file_util_decode_uint32(fp, (guint32 *) &argv->argv[argv->argc].ca_int) == -1) - goto cleanup; - break; - case CAMEL_ARG_STR: - if (camel_file_util_decode_string(fp, &argv->argv[argv->argc].ca_str) == -1) - goto cleanup; + if (camel_file_util_decode_uint32 (fp, &v_uint32) == -1) + goto exit; + g_value_init (&value, G_TYPE_BOOLEAN); + g_value_set_boolean (&value, (gboolean) v_uint32); break; default: - goto cleanup; - } - - argv->argc++; + g_warn_if_reached (); + goto exit; } - camel_object_setv(obj, NULL, argv); - cleanup: - for (i=0;iargc;i++) { - if ((argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR) - g_free(argv->argv[i].ca_str); + /* Now we have to match the legacy numeric CamelArg tag + * value with a GObject property. The GObject property + * IDs have been set to the same legacy tag values, but + * we have to access a private GParamSpec field to get + * to them (pspec->param_id). */ + + tag &= CAMEL_ARG_TAG; /* filter out the type code */ + + for (jj = 0; jj < n_properties; jj++) { + GParamSpec *pspec = properties[jj]; + + if (pspec->param_id != tag) + continue; + + /* Sanity check. */ + g_warn_if_fail (pspec->flags & CAMEL_PARAM_PERSISTENT); + + g_object_set_property ( + G_OBJECT (object), pspec->name, &value); + + property_set = TRUE; + break; } - g_free(argv); + + if (!property_set) + g_warning ( + "Could not find a corresponding %s " + "property for state file tag 0x%x", + G_OBJECT_TYPE_NAME (object), tag); + + g_value_unset (&value); } +exit: + g_free (properties); + return 0; } -/* TODO: should pass exception around */ static gint -cobject_state_write(CamelObject *obj, FILE *fp) +cobject_state_write (CamelObject *object, FILE *fp) { - gint32 count, i; - gint res = -1; - GSList *props = NULL, *l; - CamelArgGetV *arggetv = NULL; - CamelArgV *argv = NULL; - - /* current version is 1 */ - if (camel_file_util_encode_uint32(fp, 1) == -1 - || camel_file_util_encode_uint32(fp, 0) == -1) - goto abort; - - camel_object_get(obj, NULL, CAMEL_OBJECT_PERSISTENT_PROPERTIES, &props, NULL); - - /* we build an arggetv to query the object atomically, - we also need an argv to store the results - bit messy */ - - count = g_slist_length(props); - count = MIN(count, CAMEL_ARGV_MAX); - - arggetv = g_malloc0(sizeof(CamelArgGetV) - - ((CAMEL_ARGV_MAX - count) * sizeof(CamelArgGet))); - argv = g_malloc0(sizeof(CamelArgV) - - ((CAMEL_ARGV_MAX - count) * sizeof(CamelArg))); - l = props; - i = 0; - while (l) { - CamelProperty *prop = l->data; - - argv->argv[i].tag = prop->tag; - arggetv->argv[i].tag = prop->tag; - arggetv->argv[i].ca_ptr = &argv->argv[i].ca_ptr; - - i++; - l = l->next; - } - arggetv->argc = i; - argv->argc = i; - - camel_object_getv(obj, NULL, arggetv); + GValue value; + GObjectClass *class; + GParamSpec **properties; + guint ii, n_properties; + guint32 n_persistent = 0; + + memset (&value, 0, sizeof (GValue)); + + class = G_OBJECT_GET_CLASS (object); + properties = g_object_class_list_properties (class, &n_properties); + + /* Version = 1 */ + if (camel_file_util_encode_uint32 (fp, 1) == -1) + goto exit; + + /* No meta-data items. */ + if (camel_file_util_encode_uint32 (fp, 0) == -1) + goto exit; + + /* Count persistent properties. */ + for (ii = 0; ii < n_properties; ii++) + if (properties[ii]->flags & CAMEL_PARAM_PERSISTENT) + n_persistent++; + + if (camel_file_util_encode_uint32 (fp, n_persistent) == -1) + goto exit; + + /* Write a tag + value pair for each persistent property. + * Tags identify the property ID and data type; they're an + * artifact of CamelArgs. The persistent GObject property + * IDs are set to match the legacy CamelArg tag values. */ + + for (ii = 0; ii < n_properties; ii++) { + GParamSpec *pspec = properties[ii]; + guint32 tag, v_uint32; + + if ((pspec->flags & CAMEL_PARAM_PERSISTENT) == 0) + continue; + + g_value_init (&value, pspec->value_type); + + g_object_get_property ( + G_OBJECT (object), pspec->name, &value); + + tag = pspec->param_id; + + /* Record the GValue to the state file. + * XXX We currently only support booleans. */ + switch (pspec->value_type) { + case G_TYPE_BOOLEAN: + tag |= CAMEL_ARG_BOO; + v_uint32 = g_value_get_boolean (&value); + if (camel_file_util_encode_uint32 (fp, tag) == -1) + goto exit; + if (camel_file_util_encode_uint32 (fp, v_uint32) == -1) + goto exit; + break; + default: + g_warn_if_reached (); + goto exit; + } - if (camel_file_util_encode_uint32(fp, count) == -1) - goto abort; + g_value_unset (&value); + } - for (i=0;iargc;i++) { - CamelArg *arg = &argv->argv[i]; +exit: + g_free (properties); - if (camel_file_util_encode_uint32(fp, arg->tag) == -1) - goto abort; + return 0; +} - switch (arg->tag & CAMEL_ARG_TYPE) { - case CAMEL_ARG_INT: - case CAMEL_ARG_BOO: - if (camel_file_util_encode_uint32(fp, arg->ca_int) == -1) - goto abort; - break; - case CAMEL_ARG_STR: - if (camel_file_util_encode_string(fp, arg->ca_str) == -1) - goto abort; - break; - } +static void +object_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_STATE_FILENAME: + camel_object_set_state_filename ( + CAMEL_OBJECT (object), + g_value_get_string (value)); + return; } - res = 0; -abort: - for (i=0;iargc;i++) { - CamelArg *arg = &argv->argv[i]; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} - if ((argv->argv[i].tag & CAMEL_ARG_TYPE) == CAMEL_ARG_STR) - camel_object_free(obj, arg->tag, arg->ca_str); +static void +object_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_STATE_FILENAME: + g_value_set_string ( + value, camel_object_get_state_filename ( + CAMEL_OBJECT (object))); + return; } - g_free(argv); - g_free(arggetv); - - if (props) - camel_object_free(obj, CAMEL_OBJECT_PERSISTENT_PROPERTIES, props); - - return res; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void @@ -411,28 +413,60 @@ object_dispose (GObject *object) } static void +object_finalize (GObject *object) +{ + CamelObjectPrivate *priv; + + priv = CAMEL_OBJECT_GET_PRIVATE (object); + + g_free (priv->state_filename); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (camel_object_parent_class)->finalize (object); +} + +static void camel_object_class_init (CamelObjectClass *class) { GObjectClass *object_class; + g_type_class_add_private (class, sizeof (CamelObjectPrivate)); + object_class = G_OBJECT_CLASS (class); + object_class->set_property = object_set_property; + object_class->get_property = object_get_property; object_class->dispose = object_dispose; + object_class->finalize = object_finalize; class->hooks = NULL; - class->getv = cobject_getv; - class->setv = cobject_setv; - class->free = cobject_free; - class->state_read = cobject_state_read; class->state_write = cobject_state_write; camel_object_class_add_event (class, "finalize", NULL); + + /** + * CamelObject:state-filename + * + * The file in which to store persistent property values for this + * instance. + **/ + g_object_class_install_property ( + object_class, + PROP_STATE_FILENAME, + g_param_spec_string ( + "state-filename", + "State Filename", + "File containing persistent property values", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); } static void camel_object_init (CamelObject *object) { + object->priv = CAMEL_OBJECT_GET_PRIVATE (object); } static CamelHookPair * @@ -758,191 +792,80 @@ trigger: g_object_unref(obj); } -/* get/set arg methods */ -gint -camel_object_set (gpointer vo, - CamelException *ex, - ...) -{ - CamelObjectClass *class; - CamelArgV args; - CamelObject *o = vo; - gint ret = 0; - - g_return_val_if_fail(CAMEL_IS_OBJECT(o), -1); - - camel_argv_start(&args, ex); - - class = CAMEL_OBJECT_GET_CLASS (o); - g_return_val_if_fail (class->setv != NULL, -1); - - while (camel_argv_build(&args) && ret == 0) - ret = class->setv(o, ex, &args); - if (ret == 0) - ret = class->setv(o, ex, &args); - - camel_argv_end(&args); - - return ret; -} - -gint -camel_object_setv (gpointer vo, - CamelException *ex, - CamelArgV *args) -{ - CamelObjectClass *class; - - g_return_val_if_fail(CAMEL_IS_OBJECT(vo), -1); - - class = CAMEL_OBJECT_GET_CLASS (vo); - g_return_val_if_fail (class->setv != NULL, -1); - - return class->setv (vo, ex, args); -} - -gint -camel_object_get (gpointer vo, - CamelException *ex, - ...) -{ - CamelObjectClass *class; - CamelObject *o = vo; - CamelArgGetV args; - gint ret = 0; - - g_return_val_if_fail(CAMEL_IS_OBJECT(o), -1); - - camel_argv_start(&args, ex); - - class = CAMEL_OBJECT_GET_CLASS (o); - g_return_val_if_fail (class->getv != NULL, -1); - - while (camel_arggetv_build(&args) && ret == 0) - ret = class->getv(o, ex, &args); - if (ret == 0) - ret = class->getv(o, ex, &args); - - camel_argv_end(&args); - - return ret; -} - -gint -camel_object_getv (gpointer vo, - CamelException *ex, - CamelArgGetV *args) -{ - CamelObjectClass *class; - - g_return_val_if_fail(CAMEL_IS_OBJECT(vo), -1); - - class = CAMEL_OBJECT_GET_CLASS (vo); - g_return_val_if_fail (class->getv != NULL, -1); - - return class->getv (vo, ex, args); -} - -/* NB: If this doesn't return NULL, then you must unget_hooks when done */ -static CamelHookPair * -co_metadata_pair(CamelObject *obj, gint create) -{ - CamelHookPair *pair; - CamelHookList *hooks; - - if (obj->hooks == NULL && !create) - return NULL; - - hooks = camel_object_get_hooks(obj); - pair = hooks->list; - while (pair) { - if (pair->name == meta_name) - return pair; - - pair = pair->next; - } - - if (create) { - pair = pair_alloc(); - pair->name = meta_name; - pair->data = NULL; - pair->flags = 0; - pair->func.filename = NULL; - pair->next = hooks->list; - hooks->list = pair; - hooks->list_length++; - } else { - camel_object_unget_hooks(obj); - } - - return pair; -} - /** * camel_object_state_read: - * @vo: + * @object: a #CamelObject * - * Read persistent object state from object_set(CAMEL_OBJECT_STATE_FILE). + * Read persistent object state from #CamelObject:state-filename. * * Returns: -1 on error. **/ -gint camel_object_state_read(gpointer vo) +gint +camel_object_state_read (CamelObject *object) { - CamelObject *obj = vo; + CamelObjectClass *class; + const gchar *state_filename; gint res = -1; - gchar *file; FILE *fp; gchar magic[4]; - camel_object_get(vo, NULL, CAMEL_OBJECT_STATE_FILE, &file, NULL); - if (file == NULL) + g_return_val_if_fail (CAMEL_IS_OBJECT (object), -1); + + class = CAMEL_OBJECT_GET_CLASS (object); + + state_filename = camel_object_get_state_filename (object); + if (state_filename == NULL) return 0; - fp = g_fopen(file, "rb"); + fp = g_fopen (state_filename, "rb"); if (fp != NULL) { - if (fread(magic, 4, 1, fp) == 1 - && memcmp(magic, CAMEL_OBJECT_STATE_FILE_MAGIC, 4) == 0) - res = CAMEL_OBJECT_GET_CLASS (obj)->state_read(obj, fp); - else - res = -1; - fclose(fp); + if (fread (magic, 4, 1, fp) == 1 + && memcmp (magic, CAMEL_OBJECT_STATE_FILE_MAGIC, 4) == 0) + res = class->state_read (object, fp); + fclose (fp); } - camel_object_free(vo, CAMEL_OBJECT_STATE_FILE, file); - return res; } /** * camel_object_state_write: - * @vo: + * @object: a #CamelObject * - * Write persistent state to the file as set by object_set(CAMEL_OBJECT_STATE_FILE). + * Write persistent object state #CamelObject:state-filename. * * Returns: -1 on error. **/ -gint camel_object_state_write(gpointer vo) +gint +camel_object_state_write (CamelObject *object) { - CamelObject *obj = vo; + CamelObjectClass *class; + const gchar *state_filename; + gchar *savename, *dirname; gint res = -1; - gchar *file, *savename, *dirname; FILE *fp; - camel_object_get(vo, NULL, CAMEL_OBJECT_STATE_FILE, &file, NULL); - if (file == NULL) + g_return_val_if_fail (CAMEL_IS_OBJECT (object), -1); + + class = CAMEL_OBJECT_GET_CLASS (object); + + state_filename = camel_object_get_state_filename (object); + if (state_filename == NULL) return 0; - savename = camel_file_util_savename(file); - dirname = g_path_get_dirname(savename); - g_mkdir_with_parents(dirname, 0700); - g_free(dirname); - fp = g_fopen(savename, "wb"); + savename = camel_file_util_savename (state_filename); + + dirname = g_path_get_dirname (savename); + g_mkdir_with_parents (dirname, 0700); + g_free (dirname); + + fp = g_fopen (savename, "wb"); if (fp != NULL) { - if (fwrite(CAMEL_OBJECT_STATE_FILE_MAGIC, 4, 1, fp) == 1 - && CAMEL_OBJECT_GET_CLASS (obj)->state_write(obj, fp) == 0) { - if (fclose(fp) == 0) { + if (fwrite (CAMEL_OBJECT_STATE_FILE_MAGIC, 4, 1, fp) == 1 + && class->state_write (object, fp) == 0) { + if (fclose (fp) == 0) { res = 0; - g_rename(savename, file); + g_rename (savename, state_filename); } } else { fclose(fp); @@ -951,32 +874,50 @@ gint camel_object_state_write(gpointer vo) g_warning("Could not save object state file to '%s': %s", savename, g_strerror(errno)); } - g_free(savename); - camel_object_free(vo, CAMEL_OBJECT_STATE_FILE, file); + g_free (savename); return res; } -/* free an arg object, you can only free objects 1 at a time */ -void camel_object_free(gpointer vo, guint32 tag, gpointer value) +/** + * camel_object_get_state_filename: + * @object: a #CamelObject + * + * Returns the name of the file in which persistent property values for + * @object are stored. The file is used by camel_object_state_write() + * and camel_object_state_read() to save and restore object state. + * + * Returns: the name of the persistent property file + * + * Since: 3.0 + **/ +const gchar * +camel_object_get_state_filename (CamelObject *object) { - g_return_if_fail(CAMEL_IS_OBJECT(vo)); - - /* We could also handle freeing of args differently + g_return_val_if_fail (CAMEL_IS_OBJECT (object), NULL); - Add a 'const' bit to the arg type field, - specifying that the object should not be freed. - - And, add free handlers for any pointer objects which are - not const. The free handlers would be hookpairs off of the - class. + return object->priv->state_filename; +} - Then we handle the basic types OBJ,STR here, and pass PTR - types to their appropriate handler, without having to pass - through the invocation heirarchy of the free method. +/** + * camel_object_set_state_filename: + * @object: a #CamelObject + * @state_filename: path to a local file + * + * Sets the name of the file in which persistent property values for + * @object are stored. The file is used by camel_object_state_write() + * and camel_object_state_read() to save and restore object state. + * + * Since: 3.0 + **/ +void +camel_object_set_state_filename (CamelObject *object, + const gchar *state_filename) +{ + g_return_if_fail (CAMEL_IS_OBJECT (object)); - This would also let us copy and do other things with args - we can't do, but i can't see a use for that yet ... */ + g_free (object->priv->state_filename); + object->priv->state_filename = g_strdup (state_filename); - CAMEL_OBJECT_GET_CLASS (vo)->free (vo, tag, value); + g_object_notify (G_OBJECT (object), "state-filename"); } diff --git a/camel/camel-object.h b/camel/camel-object.h index 30eb955..d90a224 100644 --- a/camel/camel-object.h +++ b/camel/camel-object.h @@ -34,7 +34,6 @@ #include /* gsize */ #include -#include #include /* Standard GObject macros */ @@ -60,29 +59,32 @@ G_BEGIN_DECLS typedef struct _CamelObject CamelObject; typedef struct _CamelObjectClass CamelObjectClass; +typedef struct _CamelObjectPrivate CamelObjectPrivate; + typedef guint CamelObjectHookID; typedef gboolean (*CamelObjectEventPrepFunc) (CamelObject *, gpointer); typedef void (*CamelObjectEventHookFunc) (CamelObject *, gpointer, gpointer); -/* camel object args. */ -enum { - /* Get a description of the object. */ - CAMEL_OBJECT_ARG_DESCRIPTION = CAMEL_ARG_FIRST, - CAMEL_OBJECT_ARG_STATE_FILE, - CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES -}; - -enum { - CAMEL_OBJECT_DESCRIPTION = CAMEL_OBJECT_ARG_DESCRIPTION | CAMEL_ARG_STR, - /* sets where the persistent data should reside, otherwise it isn't persistent */ - CAMEL_OBJECT_STATE_FILE = CAMEL_OBJECT_ARG_STATE_FILE | CAMEL_ARG_STR, - /* returns a GSList CamelProperties of persistent properties */ - CAMEL_OBJECT_PERSISTENT_PROPERTIES = CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES -}; +/** + * CamelParamFlags: + * @CAMEL_PARAM_PERSISTENT: + * The parameter is persistent, which means its value is saved to + * #CamelObject:state-filename during camel_object_state_write(), + * and restored during camel_object_state_read(). + * + * These flags extend #GParamFlags. Most of the time you will use them + * in conjunction with g_object_class_install_property(). + * + * Since: 3.0 + **/ +typedef enum { + CAMEL_PARAM_PERSISTENT = 1 << (G_PARAM_USER_SHIFT + 0) +} CamelParamFlags; struct _CamelObject { GObject parent; + CamelObjectPrivate *priv; /* current hooks on this object */ struct _CamelHookList *hooks; @@ -94,12 +96,6 @@ struct _CamelObjectClass { /* available hooks for this class */ struct _CamelHookPair *hooks; - /* get/set interface */ - gint (*setv)(CamelObject *, CamelException *ex, CamelArgV *args); - gint (*getv)(CamelObject *, CamelException *ex, CamelArgGetV *args); - /* we only free 1 at a time, and only pointer types, obviously */ - void (*free)(CamelObject *, guint32 tag, gpointer ptr); - /* persistence stuff */ gint (*state_read)(CamelObject *, FILE *fp); gint (*state_write)(CamelObject *, FILE *fp); @@ -115,18 +111,13 @@ void camel_object_remove_event(gpointer obj, CamelObjectHookID id); void camel_object_unhook_event(gpointer obj, const gchar *name, CamelObjectEventHookFunc hook, gpointer data); void camel_object_trigger_event(gpointer obj, const gchar *name, gpointer event_data); -/* get/set methods */ -gint camel_object_set(gpointer obj, CamelException *ex, ...); -gint camel_object_setv(gpointer obj, CamelException *ex, CamelArgV *); -gint camel_object_get(gpointer obj, CamelException *ex, ...); -gint camel_object_getv(gpointer obj, CamelException *ex, CamelArgGetV *); - /* reads/writes the state from/to the CAMEL_OBJECT_STATE_FILE */ -gint camel_object_state_read(gpointer vo); -gint camel_object_state_write(gpointer vo); +gint camel_object_state_read (CamelObject *object); +gint camel_object_state_write (CamelObject *object); -/* free a retrieved object. May be a noop for static data. */ -void camel_object_free(gpointer vo, guint32 tag, gpointer value); +const gchar * camel_object_get_state_filename (CamelObject *object); +void camel_object_set_state_filename (CamelObject *object, + const gchar *state_filename); G_END_DECLS diff --git a/camel/camel-offline-folder.c b/camel/camel-offline-folder.c index 53c812c..6918ad3 100644 --- a/camel/camel-offline-folder.c +++ b/camel/camel-offline-folder.c @@ -30,11 +30,14 @@ #include "camel-operation.h" #include "camel-service.h" #include "camel-session.h" +#include "camel-store.h" -static GSList *offline_folder_props = NULL; +#define CAMEL_OFFLINE_FOLDER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), CAMEL_TYPE_OFFLINE_FOLDER, CamelOfflineFolderPrivate)) -static CamelProperty offline_prop_list[] = { - { CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE, "sync_offline", N_("Copy folder content locally for offline operation") }, +struct _CamelOfflineFolderPrivate { + gboolean offline_sync; }; struct _offline_downsync_msg { @@ -44,6 +47,13 @@ struct _offline_downsync_msg { CamelFolderChangeInfo *changes; }; +/* The custom property ID is a CamelArg artifact. + * It still identifies the property in state files. */ +enum { + PROP_0, + PROP_OFFLINE_SYNC = 0x2400 +}; + G_DEFINE_TYPE (CamelOfflineFolder, camel_offline_folder, CAMEL_TYPE_FOLDER) static void @@ -89,10 +99,17 @@ static CamelSessionThreadOps offline_downsync_ops = { static void offline_folder_changed (CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer dummy) { - CamelOfflineFolder *offline = (CamelOfflineFolder *) folder; - CamelService *service = (CamelService *) folder->parent_store; + CamelStore *parent_store; + CamelService *service; + gboolean offline_sync; + + parent_store = camel_folder_get_parent_store (folder); + service = CAMEL_SERVICE (parent_store); - if (changes->uid_added->len > 0 && (offline->sync_offline || camel_url_get_param (service->url, "sync_offline"))) { + offline_sync = camel_offline_folder_get_offline_sync ( + CAMEL_OFFLINE_FOLDER (folder)); + + if (changes->uid_added->len > 0 && (offline_sync || camel_url_get_param (service->url, "sync_offline"))) { CamelSession *session = service->session; struct _offline_downsync_msg *m; @@ -105,78 +122,38 @@ offline_folder_changed (CamelFolder *folder, CamelFolderChangeInfo *changes, gpo } } -static gint -offline_folder_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) +static void +offline_folder_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - CamelArgGetV props; - gint i, count = 0; - guint32 tag; - - for (i = 0; i < args->argc; i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES: - case CAMEL_FOLDER_ARG_PROPERTIES: - props.argc = 1; - props.argv[0] = *arg; - ((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, ex, &props); - *arg->ca_ptr = g_slist_concat (*arg->ca_ptr, g_slist_copy (offline_folder_props)); - break; - case CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE: - *arg->ca_int = ((CamelOfflineFolder *) object)->sync_offline; - break; - default: - count++; - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; + switch (property_id) { + case PROP_OFFLINE_SYNC: + camel_offline_folder_set_offline_sync ( + CAMEL_OFFLINE_FOLDER (object), + g_value_get_boolean (value)); + return; } - if (count) - return ((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, ex, args); - - return 0; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } -static gint -offline_folder_setv (CamelObject *object, - CamelException *ex, - CamelArgV *args) +static void +offline_folder_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { - CamelOfflineFolder *folder = (CamelOfflineFolder *) object; - gboolean save = FALSE; - guint32 tag; - gint i; - - for (i = 0; i < args->argc; i++) { - CamelArg *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE: - if (folder->sync_offline != arg->ca_int) { - folder->sync_offline = arg->ca_int; - save = TRUE; - } - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; + switch (property_id) { + case PROP_OFFLINE_SYNC: + g_value_set_boolean ( + value, camel_offline_folder_get_offline_sync ( + CAMEL_OFFLINE_FOLDER (object))); + return; } - if (save) - camel_object_state_write (object); - - return ((CamelObjectClass *) camel_offline_folder_parent_class)->setv (object, ex, args); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static gboolean @@ -188,7 +165,9 @@ offline_folder_downsync (CamelOfflineFolder *offline, GPtrArray *uids, *uncached_uids = NULL; gint i; - camel_operation_start (NULL, _("Syncing messages in folder '%s' to disk"), folder->full_name); + camel_operation_start ( + NULL, _("Syncing messages in folder '%s' to disk"), + camel_folder_get_full_name (folder)); if (expression) uids = camel_folder_search_by_expression (folder, expression, ex); @@ -226,32 +205,71 @@ done: static void camel_offline_folder_class_init (CamelOfflineFolderClass *class) { - CamelObjectClass *camel_object_class; - gint ii; + GObjectClass *object_class; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = offline_folder_getv; - camel_object_class->setv = offline_folder_setv; + g_type_class_add_private (class, sizeof (CamelOfflineFolderPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = offline_folder_set_property; + object_class->get_property = offline_folder_get_property; class->downsync = offline_folder_downsync; - for (ii = 0; ii < G_N_ELEMENTS (offline_prop_list); ii++) { - offline_prop_list[ii].description = - _(offline_prop_list[ii].description); - offline_folder_props = g_slist_prepend ( - offline_folder_props, &offline_prop_list[ii]); - } + g_object_class_install_property ( + object_class, + PROP_OFFLINE_SYNC, + g_param_spec_boolean ( + "offline-sync", + "Offline Sync", + N_("Copy folder content locally for offline operation"), + FALSE, + G_PARAM_READWRITE | + CAMEL_PARAM_PERSISTENT)); } static void camel_offline_folder_init (CamelOfflineFolder *folder) { + folder->priv = CAMEL_OFFLINE_FOLDER_GET_PRIVATE (folder); + camel_object_hook_event ( folder, "folder_changed", (CamelObjectEventHookFunc) offline_folder_changed, NULL); } /** + * camel_offline_folder_get_offline_sync: + * @offline_folder: a #CamelOfflineFolder + * + * Since: 3.0 + **/ +gboolean +camel_offline_folder_get_offline_sync (CamelOfflineFolder *offline_folder) +{ + g_return_val_if_fail (CAMEL_IS_OFFLINE_FOLDER (offline_folder), FALSE); + + return offline_folder->priv->offline_sync; +} + +/** + * camel_offline_folder_set_offline_sync: + * @offline_folder: a #CamelOfflineFolder + * @offline_sync: whether to synchronize for offline use + * + * Since: 3.0 + **/ +void +camel_offline_folder_set_offline_sync (CamelOfflineFolder *offline_folder, + gboolean offline_sync) +{ + g_return_if_fail (CAMEL_IS_OFFLINE_FOLDER (offline_folder)); + + offline_folder->priv->offline_sync = offline_sync; + + g_object_notify (G_OBJECT (offline_folder), "offline-sync"); +} + +/** * camel_offline_folder_downsync: * @offline: a #CamelOfflineFolder object * @expression: search expression describing which set of messages to downsync (%NULL for all) diff --git a/camel/camel-offline-folder.h b/camel/camel-offline-folder.h index 51de524..7afece9 100644 --- a/camel/camel-offline-folder.h +++ b/camel/camel-offline-folder.h @@ -52,31 +52,30 @@ G_BEGIN_DECLS typedef struct _CamelOfflineFolder CamelOfflineFolder; typedef struct _CamelOfflineFolderClass CamelOfflineFolderClass; - -enum { - CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE = CAMEL_FOLDER_ARG_LAST, - CAMEL_OFFLINE_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100 -}; - -enum { - CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE = CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE | CAMEL_ARG_BOO -}; +typedef struct _CamelOfflineFolderPrivate CamelOfflineFolderPrivate; struct _CamelOfflineFolder { CamelFolder parent; - - guint sync_offline:1; + CamelOfflineFolderPrivate *priv; }; struct _CamelOfflineFolderClass { CamelFolderClass parent_class; - gboolean (* downsync) (CamelOfflineFolder *folder, const gchar *expression, CamelException *ex); + gboolean (*downsync) (CamelOfflineFolder *folder, + const gchar *expression, + CamelException *ex); }; -GType camel_offline_folder_get_type (void); - -gboolean camel_offline_folder_downsync (CamelOfflineFolder *offline, const gchar *expression, CamelException *ex); +GType camel_offline_folder_get_type (void); +gboolean camel_offline_folder_get_offline_sync + (CamelOfflineFolder *offline); +void camel_offline_folder_set_offline_sync + (CamelOfflineFolder *offline, + gboolean offline_sync); +gboolean camel_offline_folder_downsync (CamelOfflineFolder *offline, + const gchar *expression, + CamelException *ex); G_END_DECLS diff --git a/camel/camel-offline-journal.c b/camel/camel-offline-journal.c index 810f1a4..b232c06 100644 --- a/camel/camel-offline-journal.c +++ b/camel/camel-offline-journal.c @@ -141,7 +141,8 @@ camel_offline_journal_write (CamelOfflineJournal *journal, camel_exception_setv ( ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot write offline journal for folder '%s': %s"), - journal->folder->full_name, g_strerror (errno)); + camel_folder_get_full_name (journal->folder), + g_strerror (errno)); return -1; } @@ -165,7 +166,8 @@ camel_offline_journal_write (CamelOfflineJournal *journal, camel_exception_setv ( ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot write offline journal for folder '%s': %s"), - journal->folder->full_name, g_strerror (errno)); + camel_folder_get_full_name (journal->folder), + g_strerror (errno)); fclose (fp); diff --git a/camel/camel-offline-store.c b/camel/camel-offline-store.c index d9cf25d..bb0a892 100644 --- a/camel/camel-offline-store.c +++ b/camel/camel-offline-store.c @@ -124,7 +124,7 @@ camel_offline_store_set_network_state (CamelOfflineStore *store, folder = folders->pdata[i]; if (G_TYPE_CHECK_INSTANCE_TYPE (folder, CAMEL_TYPE_OFFLINE_FOLDER) - && (sync || ((CamelOfflineFolder *) folder)->sync_offline)) { + && (sync || camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (folder)))) { camel_offline_folder_downsync ((CamelOfflineFolder *) folder, NULL, &lex); camel_exception_clear (&lex); } @@ -183,7 +183,7 @@ camel_offline_store_prepare_for_offline (CamelOfflineStore *store, folder = folders->pdata[i]; if (G_TYPE_CHECK_INSTANCE_TYPE (folder, CAMEL_TYPE_OFFLINE_FOLDER) - && (sync || ((CamelOfflineFolder *) folder)->sync_offline)) { + && (sync || camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (folder)))) { camel_offline_folder_downsync ((CamelOfflineFolder *) folder, NULL, &lex); camel_exception_clear (&lex); } diff --git a/camel/camel-offline-store.h b/camel/camel-offline-store.h index 148b645..43b0f63 100644 --- a/camel/camel-offline-store.h +++ b/camel/camel-offline-store.h @@ -54,10 +54,6 @@ typedef struct _CamelOfflineStore CamelOfflineStore; typedef struct _CamelOfflineStoreClass CamelOfflineStoreClass; enum { - CAMEL_OFFLINE_STORE_ARG_FIRST = CAMEL_STORE_ARG_FIRST + 100 -}; - -enum { CAMEL_OFFLINE_STORE_NETWORK_AVAIL, CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL }; diff --git a/camel/camel-sasl.c b/camel/camel-sasl.c index 76846ca..f1ae5f3 100644 --- a/camel/camel-sasl.c +++ b/camel/camel-sasl.c @@ -393,6 +393,13 @@ camel_sasl_get_authenticated (CamelSasl *sasl) return sasl->priv->authenticated; } +/** + * camel_sasl_set_authenticated: + * @sasl: a #CamelSasl + * @authenticated: whether we have successfully authenticated + * + * Since: 3.0 + **/ void camel_sasl_set_authenticated (CamelSasl *sasl, gboolean authenticated) @@ -404,6 +411,12 @@ camel_sasl_set_authenticated (CamelSasl *sasl, g_object_notify (G_OBJECT (sasl), "authenticated"); } +/** + * camel_sasl_get_mechanism: + * @sasl: a #CamelSasl + * + * Since: 3.0 + **/ const gchar * camel_sasl_get_mechanism (CamelSasl *sasl) { @@ -412,6 +425,12 @@ camel_sasl_get_mechanism (CamelSasl *sasl) return sasl->priv->mechanism; } +/** + * camel_sasl_get_service: + * @sasl: a #CamelSasl + * + * Since: 3.0 + **/ CamelService * camel_sasl_get_service (CamelSasl *sasl) { @@ -420,6 +439,12 @@ camel_sasl_get_service (CamelSasl *sasl) return sasl->priv->service; } +/** + * camel_sasl_get_service_name: + * @sasl: a #CamelSasl + * + * Since: 3.0 + **/ const gchar * camel_sasl_get_service_name (CamelSasl *sasl) { diff --git a/camel/camel-service.c b/camel/camel-service.c index cc2986c..bab7359 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -83,124 +83,6 @@ service_finalize (GObject *object) G_OBJECT_CLASS (camel_service_parent_class)->finalize (object); } -static gint -service_setv (CamelObject *object, - CamelException *ex, - CamelArgV *args) -{ - CamelService *service = (CamelService *) object; - CamelURL *url = service->url; - gboolean reconnect = FALSE; - guint32 tag; - gint i; - - for (i = 0; i < args->argc; i++) { - tag = args->argv[i].tag; - - /* make sure this is an arg we're supposed to handle */ - if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST || - (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100) - continue; - - if (tag == CAMEL_SERVICE_USERNAME) { - /* set the username */ - if (strcmp (url->user, args->argv[i].ca_str) != 0) { - camel_url_set_user (url, args->argv[i].ca_str); - reconnect = TRUE; - } - } else if (tag == CAMEL_SERVICE_AUTH) { - /* set the auth mechanism */ - if (strcmp (url->authmech, args->argv[i].ca_str) != 0) { - camel_url_set_authmech (url, args->argv[i].ca_str); - reconnect = TRUE; - } - } else if (tag == CAMEL_SERVICE_HOSTNAME) { - /* set the hostname */ - if (strcmp (url->host, args->argv[i].ca_str) != 0) { - camel_url_set_host (url, args->argv[i].ca_str); - reconnect = TRUE; - } - } else if (tag == CAMEL_SERVICE_PORT) { - /* set the port */ - if (url->port != args->argv[i].ca_int) { - camel_url_set_port (url, args->argv[i].ca_int); - reconnect = TRUE; - } - } else if (tag == CAMEL_SERVICE_PATH) { - /* set the path */ - if (strcmp (url->path, args->argv[i].ca_str) != 0) { - camel_url_set_path (url, args->argv[i].ca_str); - reconnect = TRUE; - } - } else { - /* error? */ - continue; - } - - /* let our parent know that we've handled this arg */ - camel_argv_ignore (args, i); - } - - /* FIXME: what if we are in the process of connecting? */ - if (reconnect && service->status == CAMEL_SERVICE_CONNECTED) { - /* reconnect the service using the new URL */ - if (camel_service_disconnect (service, TRUE, ex)) - camel_service_connect (service, ex); - } - - /* Chain up to parent's setv() method. */ - return CAMEL_OBJECT_CLASS (camel_service_parent_class)->setv (object, ex, args); -} - -static gint -service_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) -{ - CamelService *service = (CamelService *) object; - CamelURL *url = service->url; - guint32 tag; - gint i; - - for (i = 0; i < args->argc; i++) { - tag = args->argv[i].tag; - - /* make sure this is an arg we're supposed to handle */ - if ((tag & CAMEL_ARG_TAG) <= CAMEL_SERVICE_ARG_FIRST || - (tag & CAMEL_ARG_TAG) >= CAMEL_SERVICE_ARG_FIRST + 100) - continue; - - switch (tag) { - case CAMEL_SERVICE_USERNAME: - /* get the username */ - *args->argv[i].ca_str = url->user; - break; - case CAMEL_SERVICE_AUTH: - /* get the auth mechanism */ - *args->argv[i].ca_str = url->authmech; - break; - case CAMEL_SERVICE_HOSTNAME: - /* get the hostname */ - *args->argv[i].ca_str = url->host; - break; - case CAMEL_SERVICE_PORT: - /* get the port */ - *args->argv[i].ca_int = url->port; - break; - case CAMEL_SERVICE_PATH: - /* get the path */ - *args->argv[i].ca_str = url->path; - break; - default: - /* error? */ - break; - } - } - - /* Chain up to parent's getv() method. */ - return CAMEL_OBJECT_CLASS (camel_service_parent_class)->getv (object, ex, args); -} - static gboolean service_construct (CamelService *service, CamelSession *session, @@ -332,17 +214,12 @@ static void camel_service_class_init (CamelServiceClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; g_type_class_add_private (class, sizeof (CamelServicePrivate)); object_class = G_OBJECT_CLASS (class); object_class->finalize = service_finalize; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->setv = service_setv; - camel_object_class->getv = service_getv; - class->construct = service_construct; class->connect = service_connect; class->disconnect = service_disconnect; diff --git a/camel/camel-service.h b/camel/camel-service.h index aadd3a7..6817055 100644 --- a/camel/camel-service.h +++ b/camel/camel-service.h @@ -61,21 +61,6 @@ typedef struct _CamelService CamelService; typedef struct _CamelServiceClass CamelServiceClass; typedef struct _CamelServicePrivate CamelServicePrivate; -enum { - CAMEL_SERVICE_ARG_FIRST = CAMEL_ARG_FIRST + 100, - CAMEL_SERVICE_ARG_USERNAME, - CAMEL_SERVICE_ARG_AUTH, - CAMEL_SERVICE_ARG_HOSTNAME, - CAMEL_SERVICE_ARG_PORT, - CAMEL_SERVICE_ARG_PATH -}; - -#define CAMEL_SERVICE_USERNAME (CAMEL_SERVICE_ARG_USERNAME | CAMEL_ARG_STR) -#define CAMEL_SERVICE_AUTH (CAMEL_SERVICE_ARG_AUTH | CAMEL_ARG_STR) -#define CAMEL_SERVICE_HOSTNAME (CAMEL_SERVICE_ARG_HOSTNAME | CAMEL_ARG_STR) -#define CAMEL_SERVICE_PORT (CAMEL_SERVICE_ARG_PORT | CAMEL_ARG_INT) -#define CAMEL_SERVICE_PATH (CAMEL_SERVICE_ARG_PATH | CAMEL_ARG_STR) - typedef enum { CAMEL_SERVICE_DISCONNECTED, CAMEL_SERVICE_CONNECTING, @@ -83,7 +68,12 @@ typedef enum { CAMEL_SERVICE_DISCONNECTING } CamelServiceConnectionStatus; -typedef enum _CamelServiceLock { +/** + * CamelServiceLock: + * + * Since: 3.0 + **/ +typedef enum { CS_REC_CONNECT_LOCK, CS_CONNECT_OP_LOCK } CamelServiceLock; diff --git a/camel/camel-session.h b/camel/camel-session.h index 7c8c02a..628f647 100644 --- a/camel/camel-session.h +++ b/camel/camel-session.h @@ -75,6 +75,11 @@ enum { CAMEL_SESSION_PASSPHRASE = 1 << 4 }; +/** + * CamelSessionLock: + * + * Since: 3.0 + **/ typedef enum { CS_SESSION_LOCK, CS_THREAD_LOCK diff --git a/camel/camel-store-summary.h b/camel/camel-store-summary.h index 9070264..6f68ef1 100644 --- a/camel/camel-store-summary.h +++ b/camel/camel-store-summary.h @@ -102,6 +102,11 @@ typedef enum _CamelStoreSummaryFlags { CAMEL_STORE_SUMMARY_FRAGMENT = 1<<1 /* path name is stored in fragment rather than path */ } CamelStoreSummaryFlags; +/** + * CamelStoreSummaryLock: + * + * Since: 3.0 + **/ typedef enum { CSS_SUMMARY_LOCK, CSS_IO_LOCK, diff --git a/camel/camel-store.c b/camel/camel-store.c index 6b3dfb5..f4d2e92 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -603,14 +603,17 @@ camel_store_rename_folder (CamelStore *store, if (store->folders) { folders = camel_object_bag_list(store->folders); for (i=0;ilen;i++) { + const gchar *full_name; + folder = folders->pdata[i]; - namelen = strlen(folder->full_name); + full_name = camel_folder_get_full_name (folder); + + namelen = strlen (full_name); if ((namelen == oldlen && - strcmp(folder->full_name, old_name) == 0) + strcmp (full_name, old_name) == 0) || ((namelen > oldlen) - && strncmp(folder->full_name, old_name, oldlen) == 0 - && folder->full_name[oldlen] == '/')) { - d(printf("Found subfolder of '%s' == '%s'\n", old_name, folder->full_name)); + && strncmp (full_name, old_name, oldlen) == 0 + && full_name[oldlen] == '/')) { camel_folder_lock (folder, CF_REC_LOCK); } else { g_ptr_array_remove_index_fast(folders, i); @@ -630,11 +633,13 @@ camel_store_rename_folder (CamelStore *store, CamelRenameInfo reninfo; for (i=0;ilen;i++) { + const gchar *full_name; gchar *new; folder = folders->pdata[i]; + full_name = camel_folder_get_full_name (folder); - new = g_strdup_printf("%s%s", new_name, folder->full_name+strlen(old_name)); + new = g_strdup_printf("%s%s", new_name, full_name+strlen(old_name)); camel_object_bag_rekey(store->folders, folder, new); camel_folder_rename(folder, new); g_free(new); diff --git a/camel/camel-store.h b/camel/camel-store.h index 14bc6e3..65bc51f 100644 --- a/camel/camel-store.h +++ b/camel/camel-store.h @@ -58,10 +58,11 @@ G_BEGIN_DECLS -enum { - CAMEL_STORE_ARG_FIRST = CAMEL_SERVICE_ARG_FIRST + 100 -}; - +/** + * CamelStoreLock: + * + * Since: 3.0 + **/ typedef enum { CS_FOLDER_LOCK } CamelStoreLock; diff --git a/camel/camel-stream-filter.c b/camel/camel-stream-filter.c index c781240..d501e92 100644 --- a/camel/camel-stream-filter.c +++ b/camel/camel-stream-filter.c @@ -339,6 +339,8 @@ camel_stream_filter_init (CamelStreamFilter *stream) * Create a new #CamelStreamFilter object. * * Returns: a new #CamelStreamFilter object. + * + * Since: 3.0 **/ CamelStream * camel_stream_filter_new (CamelStream *source) @@ -356,6 +358,12 @@ camel_stream_filter_new (CamelStream *source) return stream; } +/** + * camel_stream_filter_get_source: + * @stream: a #CamelStreamFilter + * + * Since: 3.0 + **/ CamelStream * camel_stream_filter_get_source (CamelStreamFilter *stream) { diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c index 9920374..ab46e4d 100644 --- a/camel/camel-stream-fs.c +++ b/camel/camel-stream-fs.c @@ -324,6 +324,12 @@ camel_stream_fs_new_with_name_and_bounds (const gchar *name, return stream; } +/** + * camel_stream_fs_get_fd: + * @stream: a #CamelStream + * + * Since: 3.0 + **/ gint camel_stream_fs_get_fd (CamelStreamFs *stream) { diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c index 59a036f..0372098 100644 --- a/camel/camel-stream-mem.c +++ b/camel/camel-stream-mem.c @@ -303,6 +303,12 @@ camel_stream_mem_set_secure(CamelStreamMem *mem) /* note: with these functions the caller is the 'owner' of the buffer */ +/** + * camel_stream_mem_get_byte_array: + * @mem: a #CamelStreamMem + * + * Since: 3.0 + **/ GByteArray * camel_stream_mem_get_byte_array (CamelStreamMem *mem) { diff --git a/camel/camel-transport.h b/camel/camel-transport.h index f1b6e8d..654c642 100644 --- a/camel/camel-transport.h +++ b/camel/camel-transport.h @@ -59,10 +59,11 @@ typedef struct _CamelTransport CamelTransport; typedef struct _CamelTransportClass CamelTransportClass; typedef struct _CamelTransportPrivate CamelTransportPrivate; -enum { - CAMEL_TRANSPORT_ARG_FIRST = CAMEL_SERVICE_ARG_FIRST + 100 -}; - +/** + * CamelTransportLock: + * + * Since: 3.0 + **/ typedef enum { CT_SEND_LOCK } CamelTransportLock; diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c index 937d34c..6f9b8fd 100644 --- a/camel/camel-vee-folder.c +++ b/camel/camel-vee-folder.c @@ -128,8 +128,10 @@ expression_is_correlating (const gchar *expr) static void folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], CamelVeeFolder *vf, gboolean use_db) { - CamelFolder *folder = (CamelFolder *)vf; + CamelFolder *folder = CAMEL_FOLDER (vf); + CamelStore *parent_store; CamelVeeMessageInfo *vinfo; + const gchar *full_name; const gchar *vuid; gchar *oldkey; gpointer oldval; @@ -137,6 +139,8 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], CamelVeeFolder *folder_unmatched = vf->parent_vee_store ? vf->parent_vee_store->folder_unmatched : NULL; GHashTable *unmatched_uids = vf->parent_vee_store ? vf->parent_vee_store->unmatched_uids : NULL; + parent_store = camel_folder_get_parent_store (folder); + vinfo = vee_folder_add_uid (vf, sub, uid, hash); if (vinfo == NULL) return; @@ -145,7 +149,10 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], camel_message_info_free ((CamelMessageInfo *) vinfo); if (use_db) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; - camel_db_add_to_vfolder_transaction (folder->parent_store->cdb_w, folder->full_name, vuid, &ex); + + full_name = camel_folder_get_full_name (folder); + camel_db_add_to_vfolder_transaction ( + parent_store->cdb_w, full_name, vuid, &ex); camel_exception_clear (&ex); } camel_folder_change_info_add_uid (vf->changes, vuid); @@ -159,10 +166,18 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid); if (vinfo) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; - camel_folder_change_info_remove_uid (folder_unmatched->changes, vuid); - camel_db_delete_uid_from_vfolder_transaction (folder->parent_store->cdb_w, ((CamelFolder *)folder_unmatched)->full_name, vuid, &ex); - camel_folder_summary_remove_uid_fast (((CamelFolder *)folder_unmatched)->summary, vuid); - camel_folder_free_message_info ((CamelFolder *)folder_unmatched, (CamelMessageInfo *)vinfo); + + full_name = camel_folder_get_full_name ( + CAMEL_FOLDER (folder_unmatched)); + camel_folder_change_info_remove_uid ( + folder_unmatched->changes, vuid); + camel_db_delete_uid_from_vfolder_transaction ( + parent_store->cdb_w, full_name, vuid, &ex); + camel_folder_summary_remove_uid_fast ( + CAMEL_FOLDER (folder_unmatched)->summary, vuid); + camel_folder_free_message_info ( + CAMEL_FOLDER (folder_unmatched), + (CamelMessageInfo *) vinfo); camel_exception_clear (&ex); } } @@ -174,6 +189,8 @@ static void folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], gint keep, CamelVeeFolder *vf, gboolean use_db) { CamelFolder *folder = (CamelFolder *)vf; + CamelStore *parent_store; + const gchar *full_name; gchar *vuid, *oldkey; gpointer oldval; gint n; @@ -185,13 +202,16 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[ memcpy (vuid, hash, 8); strcpy (vuid+8, uid); + parent_store = camel_folder_get_parent_store (folder); + camel_folder_change_info_remove_uid (vf->changes, vuid); if (use_db) { /* FIXME[disk-summary] Handle exception */ CamelException ex = CAMEL_EXCEPTION_INITIALISER; + + full_name = camel_folder_get_full_name (folder); camel_db_delete_uid_from_vfolder_transaction ( - folder->parent_store->cdb_w, - folder->full_name, vuid, &ex); + parent_store->cdb_w, full_name, vuid, &ex); camel_exception_clear (&ex); } camel_folder_summary_remove_uid_fast (folder->summary, vuid); @@ -221,10 +241,18 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[ vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid); if (vinfo) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; - camel_folder_change_info_remove_uid (folder_unmatched->changes, vuid); - camel_db_delete_uid_from_vfolder_transaction (folder->parent_store->cdb_w, ((CamelFolder *)folder_unmatched)->full_name, vuid, &ex); - camel_folder_summary_remove_uid_fast (((CamelFolder *)folder_unmatched)->summary, vuid); - camel_folder_free_message_info ((CamelFolder *)folder_unmatched, (CamelMessageInfo *)vinfo); + + full_name = camel_folder_get_full_name ( + CAMEL_FOLDER (folder_unmatched)); + camel_folder_change_info_remove_uid ( + folder_unmatched->changes, vuid); + camel_db_delete_uid_from_vfolder_transaction ( + parent_store->cdb_w, full_name, vuid, &ex); + camel_folder_summary_remove_uid_fast ( + CAMEL_FOLDER (folder_unmatched)->summary, vuid); + camel_folder_free_message_info ( + CAMEL_FOLDER (folder_unmatched), + (CamelMessageInfo *) vinfo); camel_exception_clear (&ex); } } @@ -280,6 +308,7 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg) CamelFolder *folder = (CamelFolder *)m->vee_folder; CamelVeeFolder *vf = m->vee_folder; CamelFolderChangeInfo *changes = m->changes; + CamelStore *parent_store; gchar *vuid = NULL, hash[8]; const gchar *uid; CamelVeeMessageInfo *vinfo; @@ -362,10 +391,11 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg) if (folder_unmatched != NULL) camel_vee_folder_lock (folder_unmatched, CVF_SUMMARY_LOCK); - if (matches_changed || matches_added || changes->uid_removed->len||present) - camel_db_begin_transaction (folder->parent_store->cdb_w, NULL); + if (matches_changed || matches_added || changes->uid_removed->len||present) { + parent_store = camel_folder_get_parent_store (folder); + camel_db_begin_transaction (parent_store->cdb_w, NULL); + } - dd (printf ("Vfolder '%s' subfolder changed '%s'\n", folder->full_name, sub->full_name)); dd (printf (" changed %u added %u removed %u\n", changes->uid_changed->len, changes->uid_added->len, changes->uid_removed->len)); /* Always remove removed uid's, in any case */ @@ -503,8 +533,10 @@ folder_changed_change (CamelSession *session, CamelSessionThreadMsg *msg) vf->changes = camel_folder_change_info_new (); } - if (matches_changed || matches_added || changes->uid_removed->len || present) - camel_db_end_transaction (folder->parent_store->cdb_w, NULL); + if (matches_changed || matches_added || changes->uid_removed->len || present) { + parent_store = camel_folder_get_parent_store (folder); + camel_db_end_transaction (parent_store->cdb_w, NULL); + } camel_vee_folder_unlock (vf, CVF_SUMMARY_LOCK); /* Cleanup stuff on our folder */ @@ -655,9 +687,20 @@ unmatched_check_uid (gchar *uidin, gpointer value, struct _update_data *u) CamelVeeMessageInfo *mi = (CamelVeeMessageInfo *)camel_folder_summary_uid (((CamelFolder *)u->folder_unmatched)->summary, uid); if (mi) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; - camel_db_delete_uid_from_vfolder_transaction (((CamelFolder *)u->folder_unmatched)->parent_store->cdb_w, ((CamelFolder *)u->folder_unmatched)->full_name, uid, &ex); - camel_folder_summary_remove_uid_fast (((CamelFolder *)u->folder_unmatched)->summary, uid); - camel_folder_change_info_remove_uid (u->folder_unmatched->changes, uid); + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name ( + CAMEL_FOLDER (u->folder_unmatched)); + parent_store = camel_folder_get_parent_store ( + CAMEL_FOLDER (u->folder_unmatched)); + + camel_db_delete_uid_from_vfolder_transaction ( + parent_store->cdb_w, full_name, uid, &ex); + camel_folder_summary_remove_uid_fast ( + ((CamelFolder *)u->folder_unmatched)->summary, uid); + camel_folder_change_info_remove_uid ( + u->folder_unmatched->changes, uid); camel_message_info_free ((CamelMessageInfo *)mi); camel_exception_clear (&ex); } @@ -679,7 +722,16 @@ folder_added_uid (gchar *uidin, gpointer value, struct _update_data *u) * testing atm */ if (u->rebuilt && !u->correlating) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; - camel_db_add_to_vfolder_transaction (((CamelFolder *) u->vee_folder)->parent_store->cdb_w, ((CamelFolder *) u->vee_folder)->full_name, camel_message_info_uid (mi), &ex); + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name ( + CAMEL_FOLDER (u->vee_folder)); + parent_store = camel_folder_get_parent_store ( + CAMEL_FOLDER (u->vee_folder)); + camel_db_add_to_vfolder_transaction ( + parent_store->cdb_w, full_name, + camel_message_info_uid (mi), &ex); camel_exception_clear (&ex); } if (!CAMEL_IS_VEE_FOLDER (u->source) && u->unmatched_uids != NULL) { @@ -723,15 +775,17 @@ summary_header_to_db (CamelFolderSummary *s, CamelException *ex) { CamelFIRecord * record = g_new0 (CamelFIRecord, 1); + CamelStore *parent_store; CamelDB *db; - gchar *table_name; + const gchar *full_name; guint32 visible, unread, deleted, junked, junked_not_deleted; /* We do this during write, so lets use write handle, though we gonna read */ - db = s->folder->parent_store->cdb_w; - table_name = s->folder->full_name; + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + db = parent_store->cdb_w; - record->folder_name = table_name; + record->folder_name = g_strdup (full_name); /* we always write out the current version */ record->version = 13; /* FIXME: CAMEL_FOLDER_SUMMARY_VERSION; */ @@ -740,12 +794,13 @@ summary_header_to_db (CamelFolderSummary *s, record->time = s->time; record->saved_count = s->uids->len; - camel_object_get (s->folder, NULL, - CAMEL_FOLDER_DELETED, &deleted, - CAMEL_FOLDER_VISIBLE, &visible, - CAMEL_FOLDER_JUNKED, &junked, - CAMEL_FOLDER_JUNKED_NOT_DELETED, &junked_not_deleted, - CAMEL_FOLDER_UNREAD, &unread, NULL); + + unread = s->unread_count; + deleted = s->deleted_count; + junked = s->junk_count; + junked_not_deleted = s->junk_not_deleted_count; + visible = s->visible_count; + if (1) { /* We always would do this. Just refactor the code again. */ /*!(((CamelVeeSummary *) s)->force_counts) && !g_getenv ("FORCE_VFOLDER_COUNT")) {*/ /* We should be in sync always. so use the count. Don't search.*/ @@ -775,7 +830,6 @@ summary_header_to_db (CamelFolderSummary *s, record->jnd_count = s->junk_not_deleted_count; } - d (printf ("%s %d %d %d %d %d\n", s->folder->full_name, record->junk_count, record->deleted_count, record->unread_count, record->visible_count, record->jnd_count)); return record; } @@ -894,9 +948,14 @@ vee_folder_finalize (GObject *object) /* Save the counts to DB */ if (!vf->deleted) { + CamelFolder *folder; + CamelStore *parent_store; CamelException ex = CAMEL_EXCEPTION_INITIALISER; - record = summary_header_to_db (((CamelFolder *)vf)->summary, NULL); - camel_db_write_folder_info_record (((CamelFolder *) vf)->parent_store->cdb_w, record, &ex); + + folder = CAMEL_FOLDER (vf); + parent_store = camel_folder_get_parent_store (folder); + record = summary_header_to_db (folder->summary, NULL); + camel_db_write_folder_info_record (parent_store->cdb_w, record, &ex); g_free (record); camel_exception_clear (&ex); } @@ -932,108 +991,6 @@ vee_folder_finalize (GObject *object) G_OBJECT_CLASS (camel_vee_folder_parent_class)->finalize (object); } -/* This entire code will be useless, since we sync the counts always. */ -static gint -vee_folder_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - CamelVeeFolder *vf = (CamelVeeFolder *)folder; - gint i; - guint32 tag; - gint unread = -1, deleted = 0, junked = 0, visible = 0, count = -1, junked_not_deleted = -1; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - /* NB: this is a copy of camel-folder.c with the unread count logic altered. - makes sure its still atomically calculated */ - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UNREAD: - case CAMEL_FOLDER_ARG_DELETED: - case CAMEL_FOLDER_ARG_JUNKED: - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - case CAMEL_FOLDER_ARG_VISIBLE: - - if (vf->expression && vf->priv->unread_vfolder == -1) - camel_vee_summary_load_check_unread_vfolder ((CamelVeeSummary *)folder->summary); - - /* This is so we can get the values atomically, and also so we can calculate them only once */ - if (unread == -1) { - gint j; - CamelMessageInfoBase *info; - CamelVeeMessageInfo *vinfo; - - unread = deleted = visible = junked = junked_not_deleted = 0; - camel_folder_summary_prepare_fetch_all (folder->summary, ex); - count = camel_folder_summary_count (folder->summary); - for (j=0; jsummary, j))) { - guint32 flags; - - vinfo = (CamelVeeMessageInfo *) info; - flags = vinfo->old_flags; /* ? vinfo->old_flags : camel_message_info_flags (info); */ - - if ((flags & (CAMEL_MESSAGE_SEEN)) == 0) - unread++; - if (flags & CAMEL_MESSAGE_DELETED) - deleted++; - if (flags & CAMEL_MESSAGE_JUNK) { - junked++; - if (!(flags & CAMEL_MESSAGE_DELETED)) - junked_not_deleted++; - } - if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0) - visible++; - camel_message_info_free (info); - } - } - } - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UNREAD: - if (vf->priv->unread_vfolder == 1) - count = unread == -1 ? 0 : unread - junked_not_deleted; - else - count = unread == -1 ? 0 : unread; - break; - case CAMEL_FOLDER_ARG_DELETED: - count = deleted == -1 ? 0 : deleted; - break; - case CAMEL_FOLDER_ARG_JUNKED: - count = junked == -1 ? 0 : junked; - break; - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - count = junked_not_deleted == -1 ? 0 : junked_not_deleted; - break; - case CAMEL_FOLDER_ARG_VISIBLE: - if (vf->priv->unread_vfolder == 1) - count = unread == -1 ? 0 : unread - junked_not_deleted; - else - count = visible == -1 ? 0 : visible; - - break; - } - folder->summary->unread_count = unread == -1 ? 0 : unread; - folder->summary->deleted_count = deleted == -1 ? 0 : deleted; - junked = folder->summary->junk_count = junked == -1 ? 0 : junked; - folder->summary->junk_not_deleted_count = junked_not_deleted == -1 ? 0 : junked_not_deleted; - folder->summary->visible_count = visible == -1 ? 0 : visible; - *arg->ca_int = count; - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return ((CamelObjectClass *)camel_vee_folder_parent_class)->getv (object, ex, args); -} - static gboolean vee_folder_refresh_info (CamelFolder *folder, CamelException *ex) @@ -1088,7 +1045,7 @@ vee_folder_sync (CamelFolder *folder, if (strncmp (camel_exception_get_description (ex), "no such table", 13)) { const gchar *desc; - camel_object_get (f, NULL, CAMEL_OBJECT_DESCRIPTION, &desc, NULL); + desc = camel_folder_get_description (f); camel_exception_setv (ex, ex->id, _("Error storing '%s': %s"), desc, ex->desc); g_warning ("%s", camel_exception_get_description (ex)); } else @@ -1103,26 +1060,10 @@ vee_folder_sync (CamelFolder *folder, node = node->next; } -#if 0 - /* Seems like we are doing something wrong with this, as folder_changed happens after this, the counts are misleading. - * Anyways we do a force sync on exit, it should be all fine. - */ - record = summary_header_to_db (folder->summary, ex); - camel_db_write_folder_info_record (folder->parent_store->cdb, record, ex); - g_free (record); -#endif - /* It makes no sense to clear the folders_changed list without - * actually rebuilding. */ -#if 0 - if (node == NULL) { - camel_vee_folder_lock (vf, CVF_CHANGED_LOCK); - g_list_free (p->folders_changed); - p->folders_changed = NULL; - camel_vee_folder_unlock (vf, CVF_CHANGED_LOCK); - } -#endif if (vf->priv->unread_vfolder == 1) { /* Cleanup Junk/Trash uids */ + CamelStore *parent_store; + const gchar *full_name; GSList *del = NULL; gint i, count; @@ -1139,13 +1080,16 @@ vee_folder_sync (CamelFolder *folder, } camel_message_info_free (mi); } - camel_db_delete_vuids (folder->parent_store->cdb_w, folder->full_name, "", del, ex); + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + camel_db_delete_vuids (parent_store->cdb_w, full_name, "", del, ex); g_slist_foreach (del, (GFunc) camel_pstring_free, NULL); g_slist_free (del); } camel_vee_folder_unlock (vf, CVF_SUBFOLDER_LOCK); - camel_object_state_write (vf); + camel_object_state_write (CAMEL_OBJECT (vf)); return TRUE; } @@ -1176,7 +1120,7 @@ vee_folder_get_message (CamelFolder *folder, camel_exception_setv ( ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, _("No such message %s in %s"), uid, - folder->name); + camel_folder_get_name (folder)); } return msg; @@ -1457,15 +1401,24 @@ vee_folder_set_expression (CamelVeeFolder *vee_folder, /* Recreate the table when the query changes, only if we are not setting it first */ if (vee_folder->expression) { - CamelFolderSummary *s = ((CamelFolder *)vee_folder)->summary; - camel_folder_summary_clear (s); - camel_db_recreate_vfolder (((CamelFolder *) vee_folder)->parent_store->cdb_w, ((CamelFolder *) vee_folder)->full_name, &ex); + CamelFolderSummary *summary; + CamelStore *parent_store; + CamelFolder *folder; + const gchar *full_name; + + folder = CAMEL_FOLDER (vee_folder); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + summary = folder->summary; + + camel_folder_summary_clear (summary); + camel_db_recreate_vfolder (parent_store->cdb_w, full_name, &ex); camel_exception_clear (&ex); - s->junk_count = 0; - s->deleted_count = 0; - s->unread_count = 0; - s->visible_count = 0; - s->junk_not_deleted_count = 0; + summary->junk_count = 0; + summary->deleted_count = 0; + summary->unread_count = 0; + summary->visible_count = 0; + summary->junk_not_deleted_count = 0; } g_free (vee_folder->expression); @@ -1724,8 +1677,6 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder, } } - dd (printf ("vee_folder_rebuild_folder (%s <- %s %s): match %d, correlating %d, rebuilded %d\n", - folder->full_name, source->full_name, shash, match->len, correlating, rebuilded)); u.source = source; u.vee_folder = vee_folder; @@ -1816,13 +1767,20 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder, /* now matchhash contains any new uid's, add them, etc */ if (rebuilded && !correlating) { - camel_db_begin_transaction (folder->parent_store->cdb_w, NULL); + CamelStore *parent_store; + parent_store = camel_folder_get_parent_store (folder); + camel_db_begin_transaction (parent_store->cdb_w, NULL); } + g_hash_table_foreach (matchhash, (GHFunc)folder_added_uid, &u); - if (rebuilded && !correlating) - camel_db_end_transaction (folder->parent_store->cdb_w, NULL); + if (rebuilded && !correlating) { + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + camel_db_end_transaction (parent_store->cdb_w, NULL); + } if (folder_unmatched != NULL) { /* scan unmatched, remove any that have vanished, etc */ @@ -1869,9 +1827,14 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder, if (del_list) { if (!correlating) { CamelException ex = CAMEL_EXCEPTION_INITIALISER; + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); camel_db_delete_vuids ( - folder->parent_store->cdb_w, - folder->full_name, shash, del_list, &ex); + parent_store->cdb_w, + full_name, shash, del_list, &ex); camel_exception_clear (&ex); } ((CamelVeeSummary *)folder->summary)->force_counts = TRUE; @@ -1912,11 +1875,15 @@ vee_folder_folder_changed (CamelVeeFolder *vee_folder, { CamelVeeFolderPrivate *p = CAMEL_VEE_FOLDER_GET_PRIVATE (vee_folder); struct _folder_changed_msg *m; - CamelSession *session = ((CamelService *)((CamelFolder *)vee_folder)->parent_store)->session; + CamelStore *parent_store; + CamelSession *session; if (p->destroyed) return; + parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (vee_folder)); + session = CAMEL_SERVICE (parent_store)->session; + m = camel_session_thread_msg_new (session, &folder_changed_ops, sizeof (*m)); m->changes = camel_folder_change_info_new (); camel_folder_change_info_cat (m->changes, changes); @@ -1949,7 +1916,6 @@ static void camel_vee_folder_class_init (CamelVeeFolderClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; g_type_class_add_private (class, sizeof (CamelVeeFolderPrivate)); @@ -1957,9 +1923,6 @@ camel_vee_folder_class_init (CamelVeeFolderClass *class) object_class = G_OBJECT_CLASS (class); object_class->finalize = vee_folder_finalize; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = vee_folder_getv; - folder_class = CAMEL_FOLDER_CLASS (class); folder_class->refresh_info = vee_folder_refresh_info; folder_class->sync = vee_folder_sync; @@ -2014,17 +1977,19 @@ camel_vee_folder_init (CamelVeeFolder *vee_folder) } void -camel_vee_folder_construct (CamelVeeFolder *vf, CamelStore *parent_store, const gchar *full, const gchar *name, guint32 flags) +camel_vee_folder_construct (CamelVeeFolder *vf, guint32 flags) { CamelFolder *folder = (CamelFolder *)vf; + CamelStore *parent_store; vf->flags = flags; - camel_folder_construct (folder, parent_store, full, name); folder->summary = camel_vee_summary_new (folder); + parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (vf)); + if (CAMEL_IS_VEE_STORE (parent_store)) - vf->parent_vee_store = (CamelVeeStore *)parent_store; + vf->parent_vee_store = CAMEL_VEE_STORE (parent_store); } /** @@ -2053,17 +2018,22 @@ camel_vee_folder_new (CamelStore *parent_store, const gchar *full, guint32 flags name = full; else name++; - vf = g_object_new (CAMEL_TYPE_VEE_FOLDER, NULL); - camel_vee_folder_construct (vf, parent_store, full, name, flags); + vf = g_object_new ( + CAMEL_TYPE_VEE_FOLDER, + "name", name, "full-name", full, + "parent-store", parent_store, NULL); + camel_vee_folder_construct (vf, flags); } d (printf ("returning folder %s %p, count = %d\n", full, vf, camel_folder_get_message_count ((CamelFolder *)vf))); if (vf) { + CamelObject *object = CAMEL_OBJECT (vf); + tmp = g_strdup_printf ("%s/%s.cmeta", ((CamelService *)parent_store)->url->path, full); - camel_object_set (vf, NULL, CAMEL_OBJECT_STATE_FILE, tmp, NULL); + camel_object_set_state_filename (object, tmp); g_free (tmp); - if (camel_object_state_read (vf) == -1) { + if (camel_object_state_read (object) == -1) { /* setup defaults: we have none currently */ } } @@ -2126,8 +2096,6 @@ camel_vee_folder_add_folder (CamelVeeFolder *vf, CamelFolder *sub) camel_vee_folder_unlock (vf, CVF_SUBFOLDER_LOCK); - d (printf ("camel_vee_folder_add_folder (%s, %s)\n", ((CamelFolder *)vf)->full_name, sub->full_name)); - camel_object_hook_event ((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc)folder_changed, vf); camel_object_hook_event ((CamelObject *)sub, "deleted", (CamelObjectEventHookFunc)subfolder_deleted, vf); camel_object_hook_event ((CamelObject *)sub, "renamed", (CamelObjectEventHookFunc)folder_renamed, vf); @@ -2289,10 +2257,12 @@ camel_vee_folder_set_folders (CamelVeeFolder *vf, GList *folders) void camel_vee_folder_hash_folder (CamelFolder *folder, gchar buffer[8]) { + CamelStore *parent_store; GChecksum *checksum; guint8 *digest; gsize length; gint state = 0, save = 0; + const gchar *full_name; gchar *tmp; gint i; @@ -2300,11 +2270,13 @@ camel_vee_folder_hash_folder (CamelFolder *folder, gchar buffer[8]) digest = g_alloca (length); checksum = g_checksum_new (G_CHECKSUM_MD5); - tmp = camel_service_get_url ((CamelService *)folder->parent_store); + parent_store = camel_folder_get_parent_store (folder); + tmp = camel_service_get_url (CAMEL_SERVICE (parent_store)); g_checksum_update (checksum, (guchar *) tmp, -1); g_free (tmp); - tmp = folder->full_name; - g_checksum_update (checksum, (guchar *) tmp, -1); + + full_name = camel_folder_get_full_name (folder); + g_checksum_update (checksum, (guchar *) full_name, -1); g_checksum_get_digest (checksum, digest, &length); g_checksum_free (checksum); @@ -2388,34 +2360,46 @@ camel_vee_folder_sync_headers (CamelFolder *vf, CamelException *ex) { CamelFIRecord * record; + CamelStore *parent_store; time_t start, end; /* Save the counts to DB */ start = time (NULL); record = summary_header_to_db (vf->summary, ex); - camel_db_write_folder_info_record (vf->parent_store->cdb_w, record, ex); + parent_store = camel_folder_get_parent_store (vf); + camel_db_write_folder_info_record (parent_store->cdb_w, record, ex); end = time (NULL); - dd (printf ("Sync for vfolder '%s': %ld secs\n", vf->full_name, end-start)); g_free (record); } -/* FIXME: This shouldn't be needed */ +/** + * camel_vee_folder_get_unread_vfolder: + * @folder: a #CamelVeeFolder + * + * Since: 3.0 + **/ gint camel_vee_folder_get_unread_vfolder (CamelVeeFolder *folder) { - g_return_val_if_fail (folder != NULL, 0); + /* FIXME: This shouldn't be needed */ g_return_val_if_fail (CAMEL_IS_VEE_FOLDER (folder), 0); return folder->priv->unread_vfolder; } -/* FIXME: This shouldn't be needed */ +/** + * camel_vee_folder_set_unread_vfolder: + * @folder: a #CamelVeeFolder + * @unread_vfolder: %TRUE if %folder is for unread messages + * + * Since: 3.0 + **/ void camel_vee_folder_set_unread_vfolder (CamelVeeFolder *folder, gint unread_vfolder) { - g_return_if_fail (folder != NULL); + /* FIXME: This shouldn't be needed */ g_return_if_fail (CAMEL_IS_VEE_FOLDER (folder)); folder->priv->unread_vfolder = unread_vfolder; diff --git a/camel/camel-vee-folder.h b/camel/camel-vee-folder.h index da0e2c9..90f0bec 100644 --- a/camel/camel-vee-folder.h +++ b/camel/camel-vee-folder.h @@ -56,6 +56,11 @@ typedef struct _CamelVeeFolder CamelVeeFolder; typedef struct _CamelVeeFolderClass CamelVeeFolderClass; typedef struct _CamelVeeFolderPrivate CamelVeeFolderPrivate; +/** + * CamelVeeFolderLock: + * + * Since: 3.0 + **/ typedef enum { CVF_SUMMARY_LOCK, CVF_SUBFOLDER_LOCK, @@ -102,7 +107,7 @@ struct _CamelVeeFolderClass { GType camel_vee_folder_get_type (void); CamelFolder *camel_vee_folder_new (CamelStore *parent_store, const gchar *full, guint32 flags); -void camel_vee_folder_construct (CamelVeeFolder *vf, CamelStore *parent_store, const gchar *full, const gchar *name, guint32 flags); +void camel_vee_folder_construct (CamelVeeFolder *vf, guint32 flags); CamelFolder *camel_vee_folder_get_location(CamelVeeFolder *vf, const struct _CamelVeeMessageInfo *vinfo, gchar **realuid); diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c index 53b385a..71ae5bd 100644 --- a/camel/camel-vee-store.c +++ b/camel/camel-vee-store.c @@ -49,7 +49,13 @@ static gint vee_folder_cmp (gconstpointer ap, gconstpointer bp) { - return strcmp (((CamelFolder **)ap)[0]->full_name, ((CamelFolder **)bp)[0]->full_name); + const gchar *full_name_a; + const gchar *full_name_b; + + full_name_a = camel_folder_get_full_name (((CamelFolder **) ap)[0]); + full_name_b = camel_folder_get_full_name (((CamelFolder **) bp)[0]); + + return g_strcmp0 (full_name_a, full_name_b); } static void @@ -127,8 +133,11 @@ vee_store_construct (CamelService *service, /* Set up unmatched folder */ #ifndef VEE_UNMATCHED_ENABLE vee_store->unmatched_uids = g_hash_table_new (g_str_hash, g_str_equal); - vee_store->folder_unmatched = g_object_new (CAMEL_TYPE_VEE_FOLDER, NULL); - camel_vee_folder_construct (vee_store->folder_unmatched, store, CAMEL_UNMATCHED_NAME, _("Unmatched"), CAMEL_STORE_FOLDER_PRIVATE); + vee_store->folder_unmatched = g_object_new ( + CAMEL_TYPE_VEE_FOLDER, + "full-name", CAMEL_UNMATCHED_NAME, + "name", _("Unmatched"), "parent-store", store, NULL); + camel_vee_folder_construct (vee_store->folder_unmatched, CAMEL_STORE_FOLDER_PRIVATE); camel_db_create_vfolder (store->cdb_r, _("Unmatched"), NULL); #endif @@ -154,9 +163,13 @@ vee_store_get_folder (CamelStore *store, vf = (CamelVeeFolder *)camel_vee_folder_new (store, folder_name, flags); if (vf && ((vf->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0)) { + const gchar *full_name; + + full_name = camel_folder_get_full_name (CAMEL_FOLDER (vf)); + /* Check that parents exist, if not, create dummy ones */ - name = alloca (strlen (((CamelFolder *)vf)->full_name)+1); - strcpy (name, ((CamelFolder *)vf)->full_name); + name = alloca (strlen (full_name) + 1); + strcpy (name, full_name); p = name; while ( (p = strchr (p, '/'))) { *p = 0; @@ -174,7 +187,7 @@ vee_store_get_folder (CamelStore *store, *p++='/'; } - change_folder (store, ((CamelFolder *)vf)->full_name, CHANGE_ADD, camel_folder_get_message_count ((CamelFolder *)vf)); + change_folder (store, full_name, CHANGE_ADD, camel_folder_get_message_count ((CamelFolder *)vf)); } return (CamelFolder *)vf; @@ -249,13 +262,13 @@ vee_store_delete_folder (CamelStore *store, folder = camel_object_bag_get (store->folders, folder_name); if (folder) { - gchar *statefile; + CamelObject *object = CAMEL_OBJECT (folder); + const gchar *state_filename; - camel_object_get (folder, NULL, CAMEL_OBJECT_STATE_FILE, &statefile, NULL); - if (statefile) { - g_unlink (statefile); - camel_object_free (folder, CAMEL_OBJECT_STATE_FILE, statefile); - camel_object_set (folder, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL); + state_filename = camel_object_get_state_filename (object); + if (state_filename != NULL) { + g_unlink (state_filename); + camel_object_set_state_filename (object, NULL); } if ((((CamelVeeFolder *)folder)->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0) { @@ -294,47 +307,51 @@ vee_store_get_folder_info (CamelStore *store, qsort (folders->pdata, folders->len, sizeof (folders->pdata[0]), vee_folder_cmp); for (i=0;ilen;i++) { CamelVeeFolder *folder = folders->pdata[i]; + const gchar *full_name; + const gchar *name; gint add = FALSE; - gchar *name = ((CamelFolder *)folder)->full_name, *pname, *tmp; + gchar *pname, *tmp; CamelFolderInfo *pinfo; - d (printf ("folder '%s'\n", name)); + name = camel_folder_get_name (CAMEL_FOLDER (folder)); + full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder)); /* check we have to include this one */ if (top) { - gint namelen = strlen (name); + gint namelen = strlen (full_name); gint toplen = strlen (top); add = ((namelen == toplen - && strcmp (name, top) == 0) + && strcmp (full_name, top) == 0) || ((namelen > toplen) - && strncmp (name, top, toplen) == 0 - && name[toplen] == '/' + && strncmp (full_name, top, toplen) == 0 + && full_name[toplen] == '/' && ((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) - || strchr (name+toplen+1, '/') == NULL))); + || strchr (full_name+toplen+1, '/') == NULL))); } else { add = (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) - || strchr (name, '/') == NULL; + || strchr (full_name, '/') == NULL; } d (printf ("%sadding '%s'\n", add?"":"not ", name)); if (add) { + CamelStore *parent_store; + /* ensures unread is correct */ if ((flags & CAMEL_STORE_FOLDER_INFO_FAST) == 0) camel_folder_refresh_info ((CamelFolder *)folder, NULL); + parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (folder)); + info = camel_folder_info_new (); url = camel_url_new ("vfolder:", NULL); - camel_url_set_path (url, ((CamelService *)((CamelFolder *)folder)->parent_store)->url->path); - camel_url_set_fragment (url, ((CamelFolder *)folder)->full_name); + camel_url_set_path (url, ((CamelService *) parent_store)->url->path); + camel_url_set_fragment (url, full_name); info->uri = camel_url_to_string (url, 0); camel_url_free (url); -/* - info->url = g_strdup_printf ("vfolder:%s#%s", ((CamelService *)((CamelFolder *)folder)->parent_store)->url->path, - ((CamelFolder *)folder)->full_name);*/ - info->full_name = g_strdup (((CamelFolder *)folder)->full_name); - info->name = g_strdup (((CamelFolder *)folder)->name); + info->full_name = g_strdup (full_name); + info->name = g_strdup (name); info->unread = camel_folder_get_unread_message_count ((CamelFolder *)folder); info->flags = CAMEL_FOLDER_NOCHILDREN|CAMEL_FOLDER_VIRTUAL; g_hash_table_insert (infos_hash, info->full_name, info); @@ -346,7 +363,7 @@ vee_store_get_folder_info (CamelStore *store, } /* check for parent, if present, update flags and if adding, update parent linkage */ - pname = g_strdup (((CamelFolder *)folder)->full_name); + pname = g_strdup (full_name); d (printf ("looking up parent of '%s'\n", pname)); tmp = strrchr (pname, '/'); if (tmp) { diff --git a/camel/camel-vee-summary.c b/camel/camel-vee-summary.c index d2ba26f..a1675bd 100644 --- a/camel/camel-vee-summary.c +++ b/camel/camel-vee-summary.c @@ -148,7 +148,10 @@ vee_info_set_user_flag(CamelMessageInfo *mi, const gchar *name, gboolean value) CamelVeeFolder *vf = (CamelVeeFolder *)mi->summary->folder; if (camel_debug("vfolderexp")) - printf("Expression for vfolder '%s' is '%s'\n", mi->summary->folder->full_name, g_strescape(vf->expression, "")); + printf ( + "Expression for vfolder '%s' is '%s'\n", + camel_folder_get_full_name (mi->summary->folder), + g_strescape (vf->expression, "")); if (camel_vee_folder_get_unread_vfolder (vf) == -1) camel_vee_summary_load_check_unread_vfolder (CAMEL_VEE_SUMMARY (mi->summary)); @@ -234,7 +237,10 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set) gboolean hacked_unread_folder = FALSE; if (camel_debug("vfolderexp")) - printf("Expression for vfolder '%s' is '%s'\n", mi->summary->folder->full_name, g_strescape(vf->expression, "")); + printf ( + "Expression for vfolder '%s' is '%s'\n", + camel_folder_get_full_name (mi->summary->folder), + g_strescape (vf->expression, "")); if (camel_vee_folder_get_unread_vfolder (vf) == -1) camel_vee_summary_load_check_unread_vfolder (CAMEL_VEE_SUMMARY (mi->summary)); @@ -249,12 +255,12 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set) CamelVeeSummary *vsummary = (CamelVeeSummary *)mi->summary; HANDLE_NULL_INFO(FALSE); - camel_object_get(rmi->summary->folder, NULL, - CAMEL_FOLDER_DELETED, &old_deleted, - CAMEL_FOLDER_VISIBLE, &old_visible, - CAMEL_FOLDER_JUNKED, &old_junked, - CAMEL_FOLDER_JUNKED_NOT_DELETED, &old_junked_not_deleted, - CAMEL_FOLDER_UNREAD, &old_unread, NULL); + + old_unread = rmi->summary->unread_count; + old_deleted = rmi->summary->deleted_count; + old_junked = rmi->summary->junk_count; + old_junked_not_deleted = rmi->summary->junk_not_deleted_count; + old_visible = rmi->summary->visible_count; if (hacked_unread_folder) camel_vee_folder_mask_event_folder_changed ((CamelVeeFolder *)mi->summary->folder, rmi->summary->folder); @@ -267,12 +273,12 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set) if (hacked_unread_folder) camel_vee_folder_unmask_event_folder_changed ((CamelVeeFolder *)mi->summary->folder, rmi->summary->folder); - camel_object_get(rmi->summary->folder, NULL, - CAMEL_FOLDER_DELETED, &deleted, - CAMEL_FOLDER_VISIBLE, &visible, - CAMEL_FOLDER_JUNKED, &junked, - CAMEL_FOLDER_JUNKED_NOT_DELETED, &junked_not_deleted, - CAMEL_FOLDER_UNREAD, &unread, NULL); + unread = rmi->summary->unread_count; + deleted = rmi->summary->deleted_count; + junked = rmi->summary->junk_count; + junked_not_deleted = rmi->summary->junk_not_deleted_count; + visible = rmi->summary->visible_count; + if (hacked_unread_folder && !vsummary->fake_visible_count) vsummary->fake_visible_count = mi->summary->visible_count; @@ -404,6 +410,8 @@ CamelFolderSummary * camel_vee_summary_new(CamelFolder *parent) { CamelVeeSummary *s; + CamelStore *parent_store; + const gchar *full_name; s = g_object_new (CAMEL_TYPE_VEE_SUMMARY, NULL); s->summary.folder = parent; @@ -413,10 +421,13 @@ camel_vee_summary_new(CamelFolder *parent) /* FIXME[disk-summary] fix exceptions and note return values */ /* FIXME[disk-summary] if Evo's junk/trash vfolders make it VJunk * VTrash instead of .#evolution/Junk-or-whatever */ - camel_db_create_vfolder (parent->parent_store->cdb_w, parent->full_name, NULL); + full_name = camel_folder_get_full_name (parent); + parent_store = camel_folder_get_parent_store (parent); + camel_db_create_vfolder (parent_store->cdb_w, full_name, NULL); /* FIXME[disk-summary] handle excep and ret */ - camel_folder_summary_header_load_from_db ((CamelFolderSummary *)s, parent->parent_store, parent->full_name, NULL); + camel_folder_summary_header_load_from_db ((CamelFolderSummary *)s, parent_store, full_name, NULL); + return &s->summary; } @@ -430,10 +441,14 @@ camel_vee_summary_get_ids (CamelVeeSummary *summary, gchar hash[8]) { gchar *shash = g_strdup_printf("%c%c%c%c%c%c%c%c", hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7]); CamelFolderSummary *cfs = (CamelFolderSummary *)summary; + CamelStore *parent_store; GPtrArray *array; + const gchar *full_name; /* FIXME[disk-summary] fix exception passing */ - array = camel_db_get_vuids_from_vfolder(cfs->folder->parent_store->cdb_r, cfs->folder->full_name, shash, NULL); + full_name = camel_folder_get_full_name (cfs->folder); + parent_store = camel_folder_get_parent_store (cfs->folder); + array = camel_db_get_vuids_from_vfolder (parent_store->cdb_r, full_name, shash, NULL); g_free(shash); diff --git a/camel/camel-vtrash-folder.c b/camel/camel-vtrash-folder.c index 0337603..94e61bc 100644 --- a/camel/camel-vtrash-folder.c +++ b/camel/camel-vtrash-folder.c @@ -79,97 +79,6 @@ transfer_messages (CamelFolder *folder, g_free(md); } -/* This entire code will be useless, since we sync the counts always. */ -static gint -vtrash_folder_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i; - guint32 tag; - gint unread = -1, deleted = 0, junked = 0, visible = 0, count = -1, junked_not_deleted = -1; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - /* NB: this is a copy of camel-folder.c with the unread count logic altered. - makes sure its still atomically calculated */ - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UNREAD: - case CAMEL_FOLDER_ARG_DELETED: - case CAMEL_FOLDER_ARG_JUNKED: - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - case CAMEL_FOLDER_ARG_VISIBLE: - - /* This is so we can get the values atomically, and also so we can calculate them only once */ - if (unread == -1) { - gint j; - CamelMessageInfoBase *info; - CamelVeeMessageInfo *vinfo; - - unread = deleted = visible = junked = junked_not_deleted = 0; - camel_folder_summary_prepare_fetch_all (folder->summary, ex); - count = camel_folder_summary_count(folder->summary); - for (j=0; jsummary, j))) { - guint32 flags; - - vinfo = (CamelVeeMessageInfo *) info; - flags = vinfo->old_flags;/* ? vinfo->old_flags : camel_message_info_flags(info); */ - - if ((flags & (CAMEL_MESSAGE_SEEN)) == 0) - unread++; - if (flags & CAMEL_MESSAGE_DELETED) - deleted++; - if (flags & CAMEL_MESSAGE_JUNK) { - junked++; - if (!(flags & CAMEL_MESSAGE_DELETED)) - junked_not_deleted++; - } - if ((flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0) - visible++; - camel_message_info_free(info); - } - } - } - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_UNREAD: - count = unread == -1 ? 0 : unread; - break; - case CAMEL_FOLDER_ARG_DELETED: - count = deleted == -1 ? 0 : deleted; - break; - case CAMEL_FOLDER_ARG_JUNKED: - count = junked == -1 ? 0 : junked; - break; - case CAMEL_FOLDER_ARG_JUNKED_NOT_DELETED: - count = junked_not_deleted == -1 ? 0 : junked_not_deleted; - break; - case CAMEL_FOLDER_ARG_VISIBLE: - count = visible == -1 ? 0 : visible; - break; - } - folder->summary->unread_count = unread == -1 ? 0 : unread; - folder->summary->deleted_count = deleted == -1 ? 0 : deleted; - junked = folder->summary->junk_count = junked == -1 ? 0 : junked; - folder->summary->junk_not_deleted_count = junked_not_deleted == -1 ? 0 : junked_not_deleted; - folder->summary->visible_count = visible == -1 ? 0 : visible; - *arg->ca_int = count; - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return CAMEL_OBJECT_CLASS (camel_vtrash_folder_parent_class)->getv (object, ex, args); -} - static gboolean vtrash_folder_append_message (CamelFolder *folder, CamelMimeMessage *message, @@ -269,13 +178,8 @@ vtrash_folder_transfer_messages_to (CamelFolder *source, static void camel_vtrash_folder_class_init (CamelVTrashFolderClass *class) { - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; - /* Not required from here on. We don't count */ - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = vtrash_folder_getv; - folder_class = CAMEL_FOLDER_CLASS (class); folder_class->append_message = vtrash_folder_append_message; folder_class->transfer_messages_to = vtrash_folder_transfer_messages_to; @@ -303,9 +207,18 @@ camel_vtrash_folder_new (CamelStore *parent_store, camel_vtrash_folder_t type) g_assert(type < CAMEL_VTRASH_FOLDER_LAST); - vtrash = g_object_new (CAMEL_TYPE_VTRASH_FOLDER, NULL); - camel_vee_folder_construct(CAMEL_VEE_FOLDER (vtrash), parent_store, vdata[type].full_name, _(vdata[type].name), - CAMEL_STORE_FOLDER_PRIVATE|CAMEL_STORE_FOLDER_CREATE|CAMEL_STORE_VEE_FOLDER_AUTO|CAMEL_STORE_VEE_FOLDER_SPECIAL); + vtrash = g_object_new ( + CAMEL_TYPE_VTRASH_FOLDER, + "full-name", vdata[type].full_name, + "name", gettext (vdata[type].name), + "parent-store", parent_store, NULL); + + camel_vee_folder_construct ( + CAMEL_VEE_FOLDER (vtrash), + CAMEL_STORE_FOLDER_PRIVATE | + CAMEL_STORE_FOLDER_CREATE | + CAMEL_STORE_VEE_FOLDER_AUTO | + CAMEL_STORE_VEE_FOLDER_SPECIAL); ((CamelFolder *)vtrash)->folder_flags |= vdata[type].flags; camel_vee_folder_set_expression((CamelVeeFolder *)vtrash, vdata[type].expr); diff --git a/camel/camel.h b/camel/camel.h index 3465e86..0c74c3d 100644 --- a/camel/camel.h +++ b/camel/camel.h @@ -27,7 +27,6 @@ #define __CAMEL_H_INSIDE__ #include -#include #include #include #include diff --git a/camel/providers/groupwise/camel-groupwise-folder.c b/camel/providers/groupwise/camel-groupwise-folder.c index 0b642d0..d30c29c 100644 --- a/camel/providers/groupwise/camel-groupwise-folder.c +++ b/camel/providers/groupwise/camel-groupwise-folder.c @@ -78,7 +78,6 @@ extern gint camel_application_is_exiting; /*prototypes*/ static gboolean groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *destination, GPtrArray **transferred_uids, gboolean delete_originals, CamelException *ex); -static gint gw_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args); void convert_to_calendar (EGwItem *item, gchar **str, gint *len); static void convert_to_task (EGwItem *item, gchar **str, gint *len); static void convert_to_note (EGwItem *item, gchar **str, gint *len); @@ -113,15 +112,22 @@ static CamelMimeMessage * groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelException *ex ) { CamelMimeMessage *msg = NULL; - CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder); - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE(folder->parent_store); - CamelGroupwiseStorePrivate *priv = gw_store->priv; + CamelGroupwiseFolder *gw_folder; + CamelGroupwiseStore *gw_store; CamelGroupwiseMessageInfo *mi = NULL; + CamelStore *parent_store; gchar *container_id; EGwConnectionStatus status; EGwConnection *cnc; EGwItem *item; CamelStream *stream, *cache_stream; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); /* see if it is there in cache */ @@ -184,9 +190,9 @@ groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelExcept return NULL; } - container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name)); + container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name)); - cnc = cnc_lookup (priv); + cnc = cnc_lookup (gw_store->priv); status = e_gw_connection_get_item (cnc, container_id, uid, GET_ITEM_VIEW_WITH_CACHE, &item); if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION) @@ -212,7 +218,7 @@ groupwise_folder_get_message( CamelFolder *folder, const gchar *uid, CamelExcept } if (msg) { - camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (priv)); + camel_medium_set_header (CAMEL_MEDIUM (msg), "X-Evolution-Source", groupwise_base_url_lookup (gw_store->priv)); mi->info.dirty = TRUE; camel_folder_summary_touch (folder->summary); } @@ -453,13 +459,19 @@ groupwise_msg_set_recipient_list (CamelMimeMessage *msg, EGwItem *item) static void groupwise_folder_rename (CamelFolder *folder, const gchar *new) { - CamelGroupwiseFolder *gw_folder = (CamelGroupwiseFolder *)folder; - CamelGroupwiseStore *gw_store = (CamelGroupwiseStore *) folder->parent_store; - CamelGroupwiseStorePrivate *priv = gw_store->priv; - - gchar *folder_dir, *summary_path, *state_file, *storage_path = storage_path_lookup (priv); + CamelGroupwiseFolder *gw_folder; + CamelGroupwiseStore *gw_store; + CamelStore *parent_store; + gchar *folder_dir, *summary_path, *state_file, *storage_path; gchar *folders; + parent_store = camel_folder_get_parent_store (folder); + + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + + storage_path = storage_path_lookup (gw_store->priv); + folders = g_strconcat (storage_path, "/folders", NULL); folder_dir = e_path_to_physical (folders, new); g_free (folders); @@ -474,7 +486,7 @@ groupwise_folder_rename (CamelFolder *folder, const gchar *new) camel_folder_summary_set_filename (folder->summary, summary_path); state_file = g_strdup_printf ("%s/cmeta", folder_dir); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); g_free (state_file); g_free (summary_path); @@ -617,20 +629,23 @@ static void move_to_mailbox (CamelFolder *folder, CamelMessageInfo *info, CamelException *ex) { CamelFolder *dest; + CamelStore *parent_store; GPtrArray *uids; const gchar *uid = camel_message_info_uid (info); + parent_store = camel_folder_get_parent_store (folder); + uids = g_ptr_array_new (); g_ptr_array_add (uids, (gpointer) uid); - dest = camel_store_get_folder (folder->parent_store, "Mailbox", 0, ex); + dest = camel_store_get_folder (parent_store, "Mailbox", 0, ex); camel_message_info_set_flags (info, CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK|CAMEL_MESSAGE_JUNK_LEARN|CAMEL_GW_MESSAGE_NOJUNK|CAMEL_GW_MESSAGE_JUNK, 0); if (dest) groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex); else g_warning ("No Mailbox folder found"); - update_junk_list (folder->parent_store, info, REMOVE_JUNK_ENTRY); + update_junk_list (parent_store, info, REMOVE_JUNK_ENTRY); } static void @@ -638,25 +653,28 @@ move_to_junk (CamelFolder *folder, CamelMessageInfo *info, CamelException *ex) { CamelFolder *dest; CamelFolderInfo *fi; + CamelStore *parent_store; GPtrArray *uids; const gchar *uid = camel_message_info_uid (info); + parent_store = camel_folder_get_parent_store (folder); + uids = g_ptr_array_new (); g_ptr_array_add (uids, (gpointer) uid); - dest = camel_store_get_folder (folder->parent_store, JUNK_FOLDER, 0, ex); + dest = camel_store_get_folder (parent_store, JUNK_FOLDER, 0, ex); if (dest) groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex); else { - fi = create_junk_folder (folder->parent_store); - dest = camel_store_get_folder (folder->parent_store, JUNK_FOLDER, 0, ex); + fi = create_junk_folder (parent_store); + dest = camel_store_get_folder (parent_store, JUNK_FOLDER, 0, ex); if (!dest) g_warning ("Could not get JunkFolder:Message not moved"); else groupwise_transfer_messages_to (folder, uids, dest, NULL, TRUE, ex); } - update_junk_list (folder->parent_store, info, ADD_JUNK_ENTRY); + update_junk_list (parent_store, info, ADD_JUNK_ENTRY); } /********************* back to folder functions*************************/ @@ -665,20 +683,27 @@ static gboolean groupwise_sync_summary (CamelFolder *folder, CamelException *ex) { CamelStoreInfo *si; + CamelStore *parent_store; guint32 unread, total; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); camel_folder_summary_save_to_db (folder->summary, ex); - si = camel_store_summary_path ((CamelStoreSummary *) ((CamelGroupwiseStore *) folder->parent_store)->summary, folder->full_name); - camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL); + si = camel_store_summary_path ((CamelStoreSummary *) ((CamelGroupwiseStore *) parent_store)->summary, full_name); + + total = camel_folder_summary_count (folder->summary); + unread = folder->summary->unread_count; if (si) { si->unread = unread; si->total = total; } - camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary); - camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary); + camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary); + camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary); return TRUE; } @@ -746,22 +771,28 @@ groupwise_sync_all (CamelFolder *folder, gboolean expunge, CamelException *ex) static gboolean groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_single, CamelException *ex) { - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); - CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder); - CamelGroupwiseStorePrivate *priv = gw_store->priv; + CamelGroupwiseStore *gw_store; + CamelGroupwiseFolder *gw_folder; CamelMessageInfo *info = NULL; CamelGroupwiseMessageInfo *gw_info; + CamelStore *parent_store; GList *read_items = NULL, *deleted_read_items = NULL, *unread_items = NULL; flags_diff_t diff, unset_flags; const gchar *container_id; CamelFolderChangeInfo *changes; EGwConnectionStatus status; EGwConnection *cnc; + const gchar *full_name; gint count, i; gboolean success; - GList *deleted_items, *deleted_head; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + deleted_items = deleted_head = NULL; if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) @@ -775,8 +806,8 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_ } camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); - cnc = cnc_lookup (priv); - container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name); + cnc = cnc_lookup (gw_store->priv); + container_id = camel_groupwise_store_container_id_lookup (gw_store, full_name); if (folder->folder_flags & CAMEL_FOLDER_HAS_BEEN_DELETED) return TRUE; @@ -925,7 +956,7 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_ if (deleted_items) { camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); - if (!strcmp (folder->full_name, "Trash")) { + if (!strcmp (full_name, "Trash")) { status = e_gw_connection_purge_selected_items (cnc, deleted_items); if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION) status = e_gw_connection_purge_selected_items (cnc, deleted_items); @@ -967,7 +998,7 @@ groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMessageInfo *update_ camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); status = e_gw_connection_purge_deleted_items (cnc); if (status == E_GW_CONNECTION_STATUS_OK) { - g_message ("Purged deleted items in %s", folder->name); + g_message ("Purged deleted items in %s", camel_folder_get_name (folder)); } camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); } @@ -990,15 +1021,18 @@ camel_gw_folder_new(CamelStore *store, const gchar *folder_name, const gchar *fo gchar *summary_file, *state_file, *journal_file; gchar *short_name; - folder = g_object_new (CAMEL_TYPE_GROUPWISE_FOLDER, NULL); - - gw_folder = CAMEL_GROUPWISE_FOLDER(folder); short_name = strrchr (folder_name, '/'); if (short_name) short_name++; else short_name = (gchar *) folder_name; - camel_folder_construct (folder, store, folder_name, short_name); + + folder = g_object_new ( + CAMEL_TYPE_GROUPWISE_FOLDER, + "name", short_name, "full-name", folder_name, + "parent_store", store, NULL); + + gw_folder = CAMEL_GROUPWISE_FOLDER(folder); summary_file = g_strdup_printf ("%s/summary",folder_dir); folder->summary = camel_groupwise_summary_new(folder, summary_file); @@ -1013,9 +1047,9 @@ camel_gw_folder_new(CamelStore *store, const gchar *folder_name, const gchar *fo /* set/load persistent state */ state_file = g_strdup_printf ("%s/cmeta", folder_dir); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); g_free(state_file); - camel_object_state_read(folder); + camel_object_state_read (CAMEL_OBJECT (folder)); gw_folder->cache = camel_data_cache_new (folder_dir ,ex); if (!gw_folder->cache) { @@ -1061,13 +1095,16 @@ update_update (CamelSession *session, CamelSessionThreadMsg *msg) struct _folder_update_msg *m = (struct _folder_update_msg *)msg; EGwConnectionStatus status; CamelException *ex = NULL; - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (m->folder->parent_store); - + CamelGroupwiseStore *gw_store; + CamelStore *parent_store; GList *item_list, *items_full_list = NULL, *last_element=NULL; gint cursor = 0; const gchar *position = E_GW_CURSOR_POSITION_END; gboolean done; + parent_store = camel_folder_get_parent_store (m->folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + /* Hold the connect_lock. In case if user went offline, don't do anything. m->cnc would have become invalid, as the store disconnect unrefs it. @@ -1078,7 +1115,9 @@ update_update (CamelSession *session, CamelSessionThreadMsg *msg) goto end1; } - camel_operation_start (NULL, _("Checking for deleted messages %s"), m->folder->name); + camel_operation_start ( + NULL, _("Checking for deleted messages %s"), + camel_folder_get_name (m->folder)); status = e_gw_connection_create_cursor (m->cnc, m->container_id, "id", NULL, &cursor); if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION) @@ -1184,7 +1223,15 @@ groupwise_refresh_info(CamelFolder *folder, CamelException *ex) { CamelGroupwiseSummary *summary = (CamelGroupwiseSummary *) folder->summary; CamelStoreInfo *si; - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); + CamelGroupwiseStore *gw_store; + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + /* * Checking for the summary->time_string here since the first the a * user views a folder, the read cursor is in progress, and the getQM @@ -1192,19 +1239,22 @@ groupwise_refresh_info(CamelFolder *folder, CamelException *ex) */ if (summary->time_string && (strlen (summary->time_string) > 0)) { groupwise_refresh_folder(folder, ex); - si = camel_store_summary_path ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary, folder->full_name); + si = camel_store_summary_path ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary, full_name); if (si) { guint32 unread, total; - camel_object_get (folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL); + + total = camel_folder_summary_count (folder->summary); + unread = folder->summary->unread_count; + if (si->total != total || si->unread != unread) { si->total = total; si->unread = unread; - camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary); + camel_store_summary_touch ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary); } - camel_store_summary_info_free ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary, si); + camel_store_summary_info_free ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary, si); } /* camel_folder_summary_save_to_db (folder->summary, ex); */ - camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)folder->parent_store)->summary); + camel_store_summary_save ((CamelStoreSummary *)((CamelGroupwiseStore *)parent_store)->summary); } else { /* We probably could not get the messages the first time. (get_folder) failed???! * so do a get_folder again. And hope that it works @@ -1302,17 +1352,18 @@ update_summary_string (CamelFolder *folder, const gchar *time_string, CamelExcep static void groupwise_refresh_folder(CamelFolder *folder, CamelException *ex) { - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); - CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder); - CamelGroupwiseStorePrivate *priv = gw_store->priv; + CamelGroupwiseStore *gw_store; + CamelGroupwiseFolder *gw_folder; CamelGroupwiseSummary *summary = (CamelGroupwiseSummary *)folder->summary; - EGwConnection *cnc = cnc_lookup (priv); - CamelSession *session = ((CamelService *)folder->parent_store)->session; - gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_PROXY; + EGwConnection *cnc; + CamelSession *session; + CamelStore *parent_store; + gboolean is_proxy; gboolean is_locked = TRUE; gint status; GList *list = NULL; GSList *new_items = NULL, *modified_items = NULL, *merged = NULL; + const gchar *full_name; gchar *container_id = NULL; gchar *old_sync_time = NULL, *new_sync_time = NULL, *modified_sync_time = NULL; struct _folder_update_msg *msg; @@ -1320,6 +1371,17 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex) EGwContainer *container; gint new_item_count = 0; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + session = CAMEL_SERVICE (parent_store)->session; + is_proxy = (parent_store->flags & CAMEL_STORE_PROXY); + + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + + cnc = cnc_lookup (gw_store->priv); + /* Sync-up the (un)read changes before getting updates, so that the getFolderList will reflect the most recent changes too */ groupwise_sync_all (folder, FALSE, ex); @@ -1329,10 +1391,10 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex) return; } - container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name)); + container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name)); if (!container_id) { - d (printf ("\nERROR - Container id not present. Cannot refresh info for %s\n", folder->full_name)); + d (printf ("\nERROR - Container id not present. Cannot refresh info for %s\n", full_name)); return; } @@ -1348,7 +1410,7 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex) if (!camel_groupwise_store_connected (gw_store, ex)) goto end1; - if (!strcmp (folder->full_name, "Trash")) { + if (!strcmp (full_name, "Trash")) { #if 0 status = e_gw_connection_get_items (cnc, container_id, "peek recipient distribution created delivered attachments subject status size", NULL, &list); if (status != E_GW_CONNECTION_STATUS_OK) { @@ -1377,7 +1439,7 @@ groupwise_refresh_folder(CamelFolder *folder, CamelException *ex) if (!is_proxy) { const gchar *source; - if (!strcmp (folder->full_name, RECEIVED) || !strcmp(folder->full_name, SENT)) { + if (!strcmp (full_name, RECEIVED) || !strcmp(full_name, SENT)) { source = NULL; } else { source = "sent received"; @@ -1555,10 +1617,11 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean { CamelGroupwiseMessageInfo *mi = NULL; CamelMessageInfo *pmi = NULL; - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); - CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER(folder); - CamelGroupwiseStorePrivate *priv = gw_store->priv; - EGwConnection *cnc = cnc_lookup (priv); + CamelGroupwiseStore *gw_store; + CamelGroupwiseFolder *gw_folder; + CamelOfflineFolder *offline_folder; + CamelStore *parent_store; + EGwConnection *cnc; guint32 item_status, status_flags = 0; CamelFolderChangeInfo *changes = NULL; gboolean exists = FALSE; @@ -1569,26 +1632,39 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean EGwConnectionStatus status; GList *item_list = list; gint total_items = g_list_length (item_list), i=0; + gboolean is_proxy; + const gchar *full_name; + + gboolean folder_needs_caching; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); - gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_WRITE; + is_proxy = (parent_store->flags & CAMEL_STORE_WRITE); - gint folder_needs_caching; + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); - camel_object_get (folder, NULL, CAMEL_OFFLINE_FOLDER_SYNC_OFFLINE, &folder_needs_caching, NULL); + cnc = cnc_lookup (gw_store->priv); + + offline_folder = CAMEL_OFFLINE_FOLDER (folder); + folder_needs_caching = camel_offline_folder_get_offline_sync (offline_folder); changes = camel_folder_change_info_new (); - container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name)); + container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name)); if (!container_id) { d (printf("\nERROR - Container id not present. Cannot refresh info\n")); camel_folder_change_info_free (changes); return; } - if (!strcmp (folder->full_name, JUNK_FOLDER)) { + if (!strcmp (full_name, JUNK_FOLDER)) { is_junk = TRUE; } - camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); for (; item_list != NULL; item_list = g_list_next (item_list) ) { EGwItem *temp_item; @@ -1630,7 +1706,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean item_status = e_gw_item_get_item_status (item); /* skip the deleted items */ - if (item_status & E_GW_ITEM_STAT_DELETED && strcmp (folder->full_name, "Trash")) { + if (item_status & E_GW_ITEM_STAT_DELETED && strcmp (full_name, "Trash")) { i++; continue; } @@ -1757,7 +1833,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean } /********************* Summary ends *************************/ - if (!strcmp (folder->full_name, "Junk Mail")) + if (!strcmp (full_name, "Junk Mail")) continue; if (folder_needs_caching) { @@ -1769,7 +1845,7 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean mail_msg = groupwise_folder_item_to_msg (folder, item, ex); if (mail_msg) - camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (priv)); + camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (gw_store->priv)); CAMEL_GROUPWISE_FOLDER_REC_LOCK (folder, cache_lock); if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", id, NULL))) { @@ -1832,28 +1908,36 @@ void gw_update_summary (CamelFolder *folder, GList *list,CamelException *ex) { CamelGroupwiseMessageInfo *mi = NULL; - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); + CamelGroupwiseStore *gw_store; guint32 item_status, status_flags = 0; CamelFolderChangeInfo *changes = NULL; + CamelStore *parent_store; gboolean exists = FALSE; GString *str = g_string_new (NULL); const gchar *priority = NULL; gchar *container_id = NULL; gboolean is_junk = FALSE; GList *item_list = list; + const gchar *full_name; + gboolean is_proxy; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); - gboolean is_proxy = folder->parent_store->flags & CAMEL_STORE_WRITE; + is_proxy = (parent_store->flags & CAMEL_STORE_WRITE); + + gw_store = CAMEL_GROUPWISE_STORE (parent_store); /*Assert lock???*/ changes = camel_folder_change_info_new (); - container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, folder->full_name)); + container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name)); if (!container_id) { d (printf("\nERROR - Container id not present. Cannot refresh info\n")); camel_folder_change_info_free (changes); return; } - if (!strcmp (folder->full_name, JUNK_FOLDER)) { + if (!strcmp (full_name, JUNK_FOLDER)) { is_junk = TRUE; } @@ -1907,7 +1991,7 @@ gw_update_summary (CamelFolder *folder, GList *list,CamelException *ex) if (item_status & E_GW_ITEM_STAT_REPLIED) status_flags |= CAMEL_MESSAGE_ANSWERED; - if (!strcmp (folder->full_name, "Trash")) + if (!strcmp (full_name, "Trash")) status_flags |= CAMEL_MESSAGE_SEEN; mi->info.flags |= status_flags; @@ -2000,14 +2084,14 @@ groupwise_folder_item_to_msg( CamelFolder *folder, CamelException *ex ) { CamelMimeMessage *msg = NULL; - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE(folder->parent_store); - CamelGroupwiseStorePrivate *priv = gw_store->priv; + CamelGroupwiseStore *gw_store; const gchar *container_id = NULL; GSList *attach_list = NULL; EGwItemType type; EGwConnectionStatus status; EGwConnection *cnc; CamelMultipart *multipart = NULL; + CamelStore *parent_store; gchar *body = NULL; gint body_len = 0; const gchar *uid = NULL, *message_id, *parent_threads; @@ -2016,10 +2100,16 @@ groupwise_folder_item_to_msg( CamelFolder *folder, gboolean is_text_html_embed = FALSE; gboolean is_base64_encoded = FALSE; CamelStream *temp_stream; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + gw_store = CAMEL_GROUPWISE_STORE (parent_store); uid = e_gw_item_get_id(item); - cnc = cnc_lookup (priv); - container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name); + cnc = cnc_lookup (gw_store->priv); + container_id = camel_groupwise_store_container_id_lookup (gw_store, full_name); /* The item is already in calendar. We need to ignore the mime 822 since it would not have the item id of the appointmnet in calendar */ @@ -2364,11 +2454,13 @@ gw_update_all_items (CamelFolder *folder, GList *item_list, CamelException *ex) camel_object_trigger_event (folder, "folder_changed", changes); if (item_list) { - CamelGroupwiseStore *gw_store = CAMEL_GROUPWISE_STORE (folder->parent_store); + CamelStore *parent_store; - camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); + parent_store = camel_folder_get_parent_store (folder); + + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); gw_update_cache (folder, item_list, ex, TRUE); - camel_service_unlock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); g_list_foreach (item_list, (GFunc)g_free, NULL); g_list_free (item_list); @@ -2383,48 +2475,57 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) { const gchar *container_id = NULL; - CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(folder->parent_store); - CamelGroupwiseStorePrivate *priv = gw_store->priv; - CamelOfflineStore *offline = (CamelOfflineStore *) folder->parent_store; + CamelGroupwiseStore *gw_store; + CamelOfflineStore *offline; + CamelStore *parent_store; EGwConnectionStatus status = { 0, }; EGwConnection *cnc; EGwItem *item; + const gchar *full_name; + const gchar *name; gchar *id; gboolean is_ok = FALSE; - if (!strcmp (folder->name, RECEIVED)) + name = camel_folder_get_name (folder); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + if (!strcmp (name, RECEIVED)) is_ok = TRUE; - if (!strcmp (folder->name, SENT)) + if (!strcmp (name, SENT)) is_ok = TRUE; if (!is_ok) { camel_exception_setv ( ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot append message to folder '%s': %s"), - folder->full_name, e_gw_connection_get_error_message (status)); + full_name, e_gw_connection_get_error_message (status)); return FALSE; } + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + offline = CAMEL_OFFLINE_STORE (parent_store); + if (offline->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { camel_groupwise_journal_append ((CamelGroupwiseJournal *) ((CamelGroupwiseFolder *)folder)->journal, message, info, appended_uid, ex); return FALSE; } - cnc = cnc_lookup (priv); + cnc = cnc_lookup (gw_store->priv); - camel_service_lock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); /*Get the container id*/ - container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name); + container_id = camel_groupwise_store_container_id_lookup (gw_store, full_name); item = camel_groupwise_util_item_from_message (cnc, message, CAMEL_ADDRESS (message->from)); /*Set the source*/ /* FIXME: use flags and avoid such name comparisons in future */ - if (!strcmp (folder->name, RECEIVED)) + if (!strcmp (name, RECEIVED)) e_gw_item_set_source (item, "received"); - if (!strcmp (folder->name, SENT)) + if (!strcmp (name, SENT)) e_gw_item_set_source (item, "sent"); - if (!strcmp (folder->name, DRAFT)) + if (!strcmp (name, DRAFT)) e_gw_item_set_source (item, "draft"); - if (!strcmp (folder->name, PERSONAL)) + if (!strcmp (name, PERSONAL)) e_gw_item_set_source (item, "personal"); /*set container id*/ e_gw_item_set_container_id (item, container_id); @@ -2437,7 +2538,7 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message, if (appended_uid) *appended_uid = NULL; - camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); return FALSE; } @@ -2447,19 +2548,19 @@ groupwise_append_message (CamelFolder *folder, CamelMimeMessage *message, camel_exception_setv ( ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot append message to folder '%s': %s"), - folder->full_name, e_gw_connection_get_error_message (status)); + full_name, e_gw_connection_get_error_message (status)); if (appended_uid) *appended_uid = NULL; - camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); return FALSE; } if (appended_uid) *appended_uid = g_strdup (id); g_free (id); - camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); return TRUE; } @@ -2491,15 +2592,27 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, gint count, index = 0; GList *item_ids = NULL; const gchar *source_container_id = NULL, *dest_container_id = NULL; - CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(source->parent_store); - CamelOfflineStore *offline = (CamelOfflineStore *) destination->parent_store; - CamelGroupwiseStorePrivate *priv = gw_store->priv; + CamelGroupwiseStore *gw_store; + CamelOfflineStore *offline; + CamelStore *source_parent_store; + CamelStore *destination_parent_store; EGwConnectionStatus status = E_GW_CONNECTION_STATUS_OK; EGwConnection *cnc; CamelFolderChangeInfo *changes = NULL; gboolean destination_is_trash; + const gchar *source_full_name; + const gchar *destination_full_name; + + source_full_name = camel_folder_get_full_name (source); + source_parent_store = camel_folder_get_parent_store (source); - if (destination == camel_store_get_trash (source->parent_store, NULL)) + destination_full_name = camel_folder_get_full_name (destination); + destination_parent_store = camel_folder_get_parent_store (destination); + + gw_store = CAMEL_GROUPWISE_STORE (source_parent_store); + offline = CAMEL_OFFLINE_STORE (destination_parent_store); + + if (destination == camel_store_get_trash (source_parent_store, NULL)) destination_is_trash = TRUE; else destination_is_trash = FALSE; @@ -2517,12 +2630,12 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, *transferred_uids = NULL; if (delete_originals) - source_container_id = camel_groupwise_store_container_id_lookup (gw_store, source->full_name); + source_container_id = camel_groupwise_store_container_id_lookup (gw_store, source_full_name); else source_container_id = NULL; - dest_container_id = camel_groupwise_store_container_id_lookup (gw_store, destination->full_name); + dest_container_id = camel_groupwise_store_container_id_lookup (gw_store, destination_full_name); - camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); /* check for offline operation */ if (offline->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { CamelGroupwiseJournal *journal = (CamelGroupwiseJournal *) ((CamelGroupwiseFolder *) destination)->journal; @@ -2549,7 +2662,7 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, break; if (delete_originals) { - if (!strcmp(source->full_name, SENT)) { + if (!strcmp(source_full_name, SENT)) { camel_exception_set ( ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, _("This message is not available in offline mode.")); @@ -2561,11 +2674,11 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, } } - camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); return TRUE; } - cnc = cnc_lookup (priv); + cnc = cnc_lookup (gw_store->priv); index = 0; while (index < uids->len) { CamelMessageInfo *info = NULL; @@ -2603,9 +2716,9 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, */ wrapper = g_list_prepend (wrapper, (gchar *)uid); - camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); e_gw_connection_mark_read (cnc, wrapper); - camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); g_list_free (wrapper); wrapper = NULL; } @@ -2619,9 +2732,9 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, if (unset_flags.bits & CAMEL_MESSAGE_SEEN) { wrapper = g_list_prepend (wrapper, (gchar *)uid); - camel_service_lock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); e_gw_connection_mark_unread (cnc, wrapper); - camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); g_list_free (wrapper); wrapper = NULL; } @@ -2634,16 +2747,16 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, camel_folder_change_info_remove_uid (changes, uids->pdata[index]); } else { if (delete_originals) { - if (strcmp(source->full_name, "Sent Items")) { - status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index], - dest_container_id, source_container_id); - } else { - gchar *container_id = NULL; - container_id = e_gw_connection_get_container_id (cnc, "Mailbox"); - status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index], - dest_container_id, container_id); - g_free (container_id); - } + if (strcmp(source_full_name, "Sent Items")) { + status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index], + dest_container_id, source_container_id); + } else { + gchar *container_id = NULL; + container_id = e_gw_connection_get_container_id (cnc, "Mailbox"); + status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index], + dest_container_id, container_id); + g_free (container_id); + } } else status = e_gw_connection_move_item (cnc, (const gchar *)uids->pdata[index], @@ -2651,10 +2764,6 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, if (status == E_GW_CONNECTION_STATUS_OK) { if (delete_originals) { - /*if ( !strcmp(source->full_name, SENT) ) { - camel_folder_delete_message(source, uids->pdata[index]); - } else {*/ - if (!(gw_info->info.flags & CAMEL_MESSAGE_SEEN)) source->summary->unread_count --; @@ -2682,7 +2791,7 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, groupwise_store_set_current_folder (gw_store, source); - camel_service_unlock (CAMEL_SERVICE (source->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (source_parent_store), CS_REC_CONNECT_LOCK); return TRUE; } @@ -2690,11 +2799,11 @@ groupwise_transfer_messages_to (CamelFolder *source, GPtrArray *uids, static gboolean groupwise_expunge (CamelFolder *folder, CamelException *ex) { - CamelGroupwiseStore *groupwise_store = CAMEL_GROUPWISE_STORE(folder->parent_store); - CamelGroupwiseFolder *gw_folder = CAMEL_GROUPWISE_FOLDER (folder); - CamelGroupwiseStorePrivate *priv = groupwise_store->priv; + CamelGroupwiseStore *gw_store; + CamelGroupwiseFolder *gw_folder; CamelGroupwiseMessageInfo *ginfo; CamelMessageInfo *info; + CamelStore *parent_store; gchar *container_id; EGwConnection *cnc; EGwConnectionStatus status; @@ -2702,14 +2811,21 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex) gint i, max; gboolean delete = FALSE; GList *deleted_items, *deleted_head; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + gw_folder = CAMEL_GROUPWISE_FOLDER (folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); deleted_items = deleted_head = NULL; - cnc = cnc_lookup (priv); + cnc = cnc_lookup (gw_store->priv); if (!cnc) return TRUE; - if (!strcmp (folder->full_name, "Trash")) { - camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + if (!strcmp (full_name, "Trash")) { + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); status = e_gw_connection_purge_deleted_items (cnc); if (status == E_GW_CONNECTION_STATUS_OK) { camel_folder_freeze (folder); @@ -2717,13 +2833,13 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex) camel_folder_thaw (folder); } else g_warning ("Could not Empty Trash\n"); - camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); return TRUE; } changes = camel_folder_change_info_new (); - container_id = g_strdup (camel_groupwise_store_container_id_lookup (groupwise_store, folder->full_name)); + container_id = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, full_name)); camel_folder_summary_prepare_fetch_all (folder->summary, ex); max = camel_folder_summary_count (folder->summary); @@ -2741,9 +2857,9 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex) } if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) { /* Read the FIXME below */ - camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); status = e_gw_connection_remove_items (cnc, container_id, deleted_items); - camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); if (status == E_GW_CONNECTION_STATUS_OK) { gchar *uid; while (deleted_items) { @@ -2766,9 +2882,9 @@ groupwise_expunge (CamelFolder *folder, CamelException *ex) if (deleted_items) { /* FIXME: Put these in a function and reuse it inside the above loop, here and in groupwise_sync*/ - camel_service_lock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); status = e_gw_connection_remove_items (cnc, container_id, deleted_items); - camel_service_unlock (CAMEL_SERVICE (groupwise_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); if (status == E_GW_CONNECTION_STATUS_OK) { gchar *uid; while (deleted_items) { @@ -2823,19 +2939,36 @@ groupwise_folder_dispose (GObject *object) } static void +groupwise_folder_constructed (GObject *object) +{ + CamelFolder *folder; + CamelStore *parent_store; + CamelURL *url; + const gchar *full_name; + gchar *description; + + folder = CAMEL_FOLDER (object); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + url = CAMEL_SERVICE (parent_store)->url; + + description = g_strdup_printf ( + "%s@%s:%s", url->user, url->host, full_name); + camel_folder_set_description (folder, description); + g_free (description); +} + +static void camel_groupwise_folder_class_init (CamelGroupwiseFolderClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; g_type_class_add_private (class, sizeof (CamelGroupwiseFolderPrivate)); object_class = G_OBJECT_CLASS (class); object_class->dispose = groupwise_folder_dispose; - - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = gw_getv; + object_class->constructed = groupwise_folder_constructed; folder_class = CAMEL_FOLDER_CLASS (class); folder_class->get_message = groupwise_folder_get_message; @@ -2874,43 +3007,6 @@ camel_groupwise_folder_init (CamelGroupwiseFolder *gw_folder) gw_folder->need_rescan = TRUE; } -static gint -gw_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i, count = 0; - guint32 tag; - - for (i=0; iargc; i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - - case CAMEL_OBJECT_ARG_DESCRIPTION: - if (folder->description == NULL) { - CamelURL *uri = ((CamelService *)folder->parent_store)->url; - - folder->description = g_strdup_printf("%s@%s:%s", uri->user, uri->host, folder->full_name); - } - *arg->ca_str = folder->description; - break; - default: - count++; - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - if (count) - return ((CamelObjectClass *)camel_groupwise_folder_parent_class)->getv(object, ex, args); - - return 0; - -} - void convert_to_calendar (EGwItem *item, gchar **str, gint *len) { diff --git a/camel/providers/groupwise/camel-groupwise-folder.h b/camel/providers/groupwise/camel-groupwise-folder.h index 937818e..53ad62e 100644 --- a/camel/providers/groupwise/camel-groupwise-folder.h +++ b/camel/providers/groupwise/camel-groupwise-folder.h @@ -73,10 +73,7 @@ struct _CamelGroupwiseFolder { struct _CamelGroupwiseFolderClass { CamelOfflineFolderClass parent_class; - - /* Virtual methods */ - -} ; +}; GType camel_groupwise_folder_get_type (void); diff --git a/camel/providers/groupwise/camel-groupwise-journal.c b/camel/providers/groupwise/camel-groupwise-journal.c index a854978..9f1cb2c 100644 --- a/camel/providers/groupwise/camel-groupwise-journal.c +++ b/camel/providers/groupwise/camel-groupwise-journal.c @@ -207,15 +207,18 @@ groupwise_entry_play_transfer (CamelOfflineJournal *journal, CamelGroupwiseJourn CamelMessageInfoBase *info; GPtrArray *xuids, *uids; CamelFolder *src; + CamelStore *parent_store; const gchar *name; + parent_store = camel_folder_get_parent_store (folder); + if (!(info = (CamelMessageInfoBase *) camel_folder_summary_uid (folder->summary, entry->uid))) { /* Note: this should never happen, but rather than crash lets make a new info */ info = camel_message_info_new (NULL); } - name = camel_groupwise_store_folder_lookup ((CamelGroupwiseStore *) folder->parent_store, entry->source_container); - if (name && (src = camel_store_get_folder (folder->parent_store, name, 0, ex))) { + name = camel_groupwise_store_folder_lookup ((CamelGroupwiseStore *) parent_store, entry->source_container); + if (name && (src = camel_store_get_folder (parent_store, name, 0, ex))) { uids = g_ptr_array_sized_new (1); g_ptr_array_add (uids, entry->original_uid); @@ -370,10 +373,14 @@ camel_groupwise_journal_transfer (CamelGroupwiseJournal *groupwise_journal, Came CamelException *ex) { CamelOfflineJournal *journal = (CamelOfflineJournal *) groupwise_journal; - CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(journal->folder->parent_store); + CamelGroupwiseStore *gw_store; CamelGroupwiseJournalEntry *entry; + CamelStore *parent_store; gchar *uid; + parent_store = camel_folder_get_parent_store (journal->folder); + gw_store = CAMEL_GROUPWISE_STORE (parent_store); + if (!update_cache (groupwise_journal, message, mi, &uid, ex)) return; @@ -381,7 +388,7 @@ camel_groupwise_journal_transfer (CamelGroupwiseJournal *groupwise_journal, Came entry->type = CAMEL_GROUPWISE_JOURNAL_ENTRY_APPEND; entry->uid = uid; entry->original_uid = g_strdup (original_uid); - entry->source_container = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, ((CamelFolder *)source_folder)->name)); + entry->source_container = g_strdup (camel_groupwise_store_container_id_lookup (gw_store, camel_folder_get_name (((CamelFolder *)source_folder)))); camel_dlist_addtail (&journal->queue, (CamelDListNode *) entry); diff --git a/camel/providers/groupwise/camel-groupwise-store.c b/camel/providers/groupwise/camel-groupwise-store.c index b152258..25b78e8 100644 --- a/camel/providers/groupwise/camel-groupwise-store.c +++ b/camel/providers/groupwise/camel-groupwise-store.c @@ -635,7 +635,9 @@ groupwise_get_folder (CamelStore *store, const gchar *folder_name, guint32 flags return NULL; } - camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); camel_folder_summary_clear (folder->summary); while (!done) { @@ -716,8 +718,13 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin const gchar *position = E_GW_CURSOR_POSITION_END; gint count = 0, cursor, summary_count = 0; CamelStoreInfo *si = NULL; + const gchar *full_name; + const gchar *name; guint total = 0; + name = camel_folder_get_name (folder); + full_name = camel_folder_get_full_name (folder); + camel_exception_clear (ex); camel_service_lock (CAMEL_SERVICE (gw_store), CS_REC_CONNECT_LOCK); @@ -734,9 +741,9 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin } } - container_id = g_strdup (g_hash_table_lookup (priv->name_hash, folder->full_name)); + container_id = g_strdup (g_hash_table_lookup (priv->name_hash, full_name)); - si = camel_store_summary_path ((CamelStoreSummary *)gw_store->summary, folder->name); + si = camel_store_summary_path ((CamelStoreSummary *)gw_store->summary, name); if (si) { total = si->total; camel_store_summary_info_free ((CamelStoreSummary *)(gw_store)->summary, si); @@ -748,7 +755,7 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin summary_count = camel_folder_summary_count (folder->summary); if (!summary_count || !summary->time_string) { - d(g_print ("\n\n** %s **: Summary missing???? Reloading summary....\n\n", folder->name);) + d(g_print ("\n\n** %s **: Summary missing???? Reloading summary....\n\n", name);) status = e_gw_connection_create_cursor (priv->cnc, container_id, CREATE_CURSOR_VIEW, @@ -765,7 +772,9 @@ gw_store_reload_folder (CamelGroupwiseStore *gw_store, CamelFolder *folder, guin return; } - camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); while (!done) { status = e_gw_connection_read_cursor (priv->cnc, container_id, @@ -919,7 +928,7 @@ convert_to_folder_info (CamelGroupwiseStore *store, EGwContainer *container, con si->info.flags = fi->flags; /*refresh info*/ if (store->current_folder - && !strcmp (store->current_folder->full_name, fi->full_name) + && !strcmp (camel_folder_get_full_name (store->current_folder), fi->full_name) && type != E_GW_CONTAINER_TYPE_INBOX) { CAMEL_FOLDER_GET_CLASS (store->current_folder)->refresh_info (store->current_folder, ex); } @@ -1421,11 +1430,12 @@ groupwise_get_trash (CamelStore *store, CamelException *ex) { CamelFolder *folder = camel_store_get_folder(store, "Trash", 0, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = g_build_filename((CAMEL_GROUPWISE_STORE(store))->priv->storage_path, "folders", "Trash", "cmeta", NULL); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); - camel_object_state_read(folder); + camel_object_state_read (object); return folder; } else diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c index fba6122..8c98e9f 100644 --- a/camel/providers/imap/camel-imap-command.c +++ b/camel/providers/imap/camel-imap-command.c @@ -97,11 +97,15 @@ camel_imap_command (CamelImapStore *store, cmd = imap_command_strdup_vprintf (store, fmt, ap); va_end (ap); } else { + const gchar *full_name; + g_object_ref (folder); if (store->current_folder) g_object_unref (store->current_folder); store->current_folder = folder; - cmd = imap_command_strdup_printf (store, "SELECT %F", folder->full_name); + + full_name = camel_folder_get_full_name (folder); + cmd = imap_command_strdup_printf (store, "SELECT %F", full_name); } if (!imap_command_start (store, folder, cmd, ex)) { diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index fce9a39..007b869 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -62,14 +62,14 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), CAMEL_TYPE_IMAP_FOLDER, CamelImapFolderPrivate)) -extern gint camel_application_is_exiting; - -static CamelProperty imap_property_list[] = { - { CAMEL_IMAP_FOLDER_CHECK_FOLDER, "check_folder", N_("Always check for new mail in this folder") }, +/* The custom property ID is a CamelArg artifact. + * It still identifies the property in state files. */ +enum { + PROP_0, + PROP_CHECK_FOLDER = 0x2500 }; -static gint imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args); -static gint imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args); +extern gint camel_application_is_exiting; static gboolean imap_rescan (CamelFolder *folder, gint exists, CamelException *ex); static gboolean imap_refresh_info (CamelFolder *folder, CamelException *ex); @@ -132,6 +132,40 @@ static CamelImapMessageInfo * imap_folder_summary_uid_or_error( G_DEFINE_TYPE (CamelImapFolder, camel_imap_folder, CAMEL_TYPE_OFFLINE_FOLDER) static void +imap_folder_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_CHECK_FOLDER: + camel_imap_folder_set_check_folder ( + CAMEL_IMAP_FOLDER (object), + g_value_get_boolean (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +imap_folder_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_CHECK_FOLDER: + g_value_set_boolean ( + value, camel_imap_folder_get_check_folder ( + CAMEL_IMAP_FOLDER (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void imap_folder_dispose (GObject *object) { CamelImapFolder *imap_folder; @@ -180,22 +214,39 @@ imap_folder_finalize (GObject *object) } static void +imap_folder_constructed (GObject *object) +{ + CamelFolder *folder; + CamelStore *parent_store; + CamelURL *url; + const gchar *full_name; + gchar *description; + + folder = CAMEL_FOLDER (object); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + url = CAMEL_SERVICE (parent_store)->url; + + description = g_strdup_printf ( + "%s@%s:%s", url->user, url->host, full_name); + camel_folder_set_description (folder, description); + g_free (description); +} + +static void camel_imap_folder_class_init (CamelImapFolderClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; - gint i; g_type_class_add_private (class, sizeof (CamelImapFolderPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = imap_folder_set_property; + object_class->get_property = imap_folder_get_property; object_class->dispose = imap_folder_dispose; object_class->finalize = imap_folder_finalize; - - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = imap_getv; - camel_object_class->setv = imap_setv; + object_class->constructed = imap_folder_constructed; folder_class = CAMEL_FOLDER_CLASS (class); folder_class->get_message = imap_get_message; @@ -215,10 +266,16 @@ camel_imap_folder_class_init (CamelImapFolderClass *class) folder_class->get_uncached_uids = imap_get_uncached_uids; folder_class->get_filename = imap_get_filename; - /* only localize here, do not create GSList, we do not want to leak */ - for (i = 0; i < G_N_ELEMENTS (imap_property_list); i++) - imap_property_list[i].description = - _(imap_property_list[i].description); + g_object_class_install_property ( + object_class, + PROP_CHECK_FOLDER, + g_param_spec_boolean ( + "check-folder", + "Check Folder", + N_("Always check for new mail in this folder"), + FALSE, + G_PARAM_READWRITE | + CAMEL_PARAM_PERSISTENT)); } static void @@ -291,13 +348,16 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name, return NULL; } - folder = g_object_new (CAMEL_TYPE_IMAP_FOLDER, NULL); short_name = strrchr (folder_name, '/'); if (short_name) short_name++; else short_name = folder_name; - camel_folder_construct (folder, parent, folder_name, short_name); + folder = g_object_new ( + CAMEL_TYPE_IMAP_FOLDER, + "full-name", folder_name, + "name", short_name, + "parent-store", parent, NULL); summary_file = g_strdup_printf ("%s/summary", folder_dir); folder->summary = camel_imap_summary_new (folder, summary_file); @@ -317,9 +377,9 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name, /* set/load persistent state */ state_file = g_strdup_printf ("%s/cmeta", folder_dir); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); g_free(state_file); - camel_object_state_read(folder); + camel_object_state_read (CAMEL_OBJECT (folder)); imap_folder->cache = camel_imap_message_cache_new (folder_dir, folder->summary, ex); if (!imap_folder->cache) { @@ -345,6 +405,59 @@ camel_imap_folder_new (CamelStore *parent, const gchar *folder_name, return folder; } +gboolean +camel_imap_folder_get_check_folder (CamelImapFolder *imap_folder) +{ + g_return_val_if_fail (CAMEL_IS_IMAP_FOLDER (imap_folder), FALSE); + + return imap_folder->priv->check_folder; +} + +void +camel_imap_folder_set_check_folder (CamelImapFolder *imap_folder, + gboolean check_folder) +{ + CamelFolder *folder; + CamelStore *parent_store; + const gchar *full_name; + + g_return_if_fail (CAMEL_IS_IMAP_FOLDER (imap_folder)); + + imap_folder->priv->check_folder = check_folder; + + folder = CAMEL_FOLDER (imap_folder); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + /* Update the summary so the value is restored + * correctly the next time the folder is loaded. */ + if (CAMEL_IS_IMAP_STORE (parent_store)) { + CamelImapStore *imap_store; + CamelStoreSummary *summary; + CamelStoreInfo *si; + + imap_store = CAMEL_IMAP_STORE (parent_store); + summary = CAMEL_STORE_SUMMARY (imap_store->summary); + + si = camel_store_summary_path (summary, full_name); + if (si != NULL) { + guint32 old_flags = si->flags; + + si->flags &= ~CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW; + si->flags |= check_folder ? CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW : 0; + + if (si->flags != old_flags) { + camel_store_summary_touch (summary); + camel_store_summary_save (summary); + } + + camel_store_summary_info_free (summary, si); + } + } + + g_object_notify (G_OBJECT (imap_folder), "check-folder"); +} + /* Called with the store's connect_lock locked */ gboolean camel_imap_folder_selected (CamelFolder *folder, @@ -395,18 +508,6 @@ camel_imap_folder_selected (CamelFolder *folder, if (camel_strstrcase (response->status, "OK [READ-ONLY]")) imap_folder->read_only = TRUE; -/*FIXME what to do here. - if (camel_disco_store_status (CAMEL_DISCO_STORE (folder->parent_store)) == CAMEL_DISCO_STORE_RESYNCING) { - if (validity != imap_summary->validity) { - camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_SUMMARY_INVALID, - _("Folder was destroyed and recreated on server.")); - return; - } - - FIXME: find missing UIDs ? - return; - } */ - if (!imap_summary->validity) imap_summary->validity = validity; else if (validity != imap_summary->validity) { @@ -423,7 +524,11 @@ camel_imap_folder_selected (CamelFolder *folder, if (exists < count) imap_folder->need_rescan = TRUE; else if (count != 0 && !imap_folder->need_rescan) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; + + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); /* Similarly, if the UID of the highest message we * know about has changed, then that indicates that @@ -490,119 +595,18 @@ imap_get_filename (CamelFolder *folder, return camel_imap_message_cache_get_filename (imap_folder->cache, uid, "", ex); } -static gint -imap_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i, count=0; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES: - case CAMEL_FOLDER_ARG_PROPERTIES: { - CamelArgGetV props; - gint i; - - props.argc = 1; - props.argv[0] = *arg; - ((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, ex, &props); - - for (i = 0; i < G_N_ELEMENTS (imap_property_list); i++) - *arg->ca_ptr = g_slist_append (*arg->ca_ptr, &imap_property_list[i]); - break; } - /* imap args */ - case CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER: - /* The internal value has precedence before the one stored in the summary. */ - *arg->ca_int = ((CamelImapFolder *)object)->check_folder; - break; - /* CamelObject args */ - case CAMEL_OBJECT_ARG_DESCRIPTION: - if (folder->description == NULL) { - CamelURL *uri = ((CamelService *)folder->parent_store)->url; - - /* what if the full name doesn't incclude /'s? does it matter? */ - folder->description = g_strdup_printf("%s@%s:%s", uri->user, uri->host, folder->full_name); - } - *arg->ca_str = folder->description; - break; - default: - count++; - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - if (count) - return ((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, ex, args); - - return 0; -} - -static gint -imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args) -{ - gint save = 0; - gint i; - guint32 tag; - - for (i = 0; i < args->argc; i++) { - CamelArg *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER: - if (((CamelImapFolder *)object)->check_folder != arg->ca_int) { - CamelFolder *folder = (CamelFolder *)object; - - ((CamelImapFolder *)object)->check_folder = arg->ca_int; - save = 1; - - /* store both to the summary and to folder cmeta, to have this value restored correctly next time folder is fully loaded */ - if (folder->parent_store && CAMEL_IS_IMAP_STORE (folder->parent_store)) { - CamelStoreInfo *si; - CamelStoreSummary *sm = CAMEL_STORE_SUMMARY (((CamelImapStore *)(folder->parent_store))->summary); - - si = camel_store_summary_path (sm, folder->full_name); - if (si) { - if ((si->flags & CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW) != 0 ? 1 : 0 != (arg->ca_int) ? 1 : 0) { - si->flags = (si->flags & (~CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW)) | ((arg->ca_int) ? CAMEL_STORE_INFO_FOLDER_CHECK_FOR_NEW : 0); - camel_store_summary_touch (sm); - camel_store_summary_save (sm); - } - - camel_store_summary_info_free (sm, si); - } - } - } - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - if (save) - camel_object_state_write (object); - - return ((CamelObjectClass *)camel_imap_folder_parent_class)->setv (object, ex, args); -} - static void imap_rename (CamelFolder *folder, const gchar *new) { + CamelStore *parent_store; CamelImapFolder *imap_folder = (CamelImapFolder *)folder; - CamelImapStore *imap_store = (CamelImapStore *)folder->parent_store; + CamelImapStore *imap_store; gchar *folder_dir, *summary_path, *state_file; gchar *folders; + parent_store = camel_folder_get_parent_store (folder); + imap_store = CAMEL_IMAP_STORE (parent_store); + folders = g_strconcat (imap_store->storage_path, "/folders", NULL); folder_dir = imap_path_to_physical (folders, new); g_free (folders); @@ -615,7 +619,7 @@ imap_rename (CamelFolder *folder, const gchar *new) camel_folder_summary_set_filename(folder->summary, summary_path); state_file = g_strdup_printf ("%s/cmeta", folder_dir); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); g_free(state_file); g_free(summary_path); @@ -628,13 +632,20 @@ imap_rename (CamelFolder *folder, const gchar *new) static gboolean get_folder_status (CamelFolder *folder, guint32 *total, guint32 *unread, CamelException *ex) { - CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *imap_store; CamelImapResponse *response; + const gchar *full_name; gboolean res = FALSE; g_return_val_if_fail (folder != NULL, FALSE); - response = camel_imap_command (imap_store, folder, ex, "STATUS %F (MESSAGES UNSEEN)", folder->full_name); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + imap_store = CAMEL_IMAP_STORE (parent_store); + + response = camel_imap_command (imap_store, folder, ex, "STATUS %F (MESSAGES UNSEEN)", full_name); if (response) { gint i; @@ -700,12 +711,17 @@ static gboolean imap_refresh_info (CamelFolder *folder, CamelException *ex) { - CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *imap_store; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); CamelImapResponse *response; CamelStoreInfo *si; + const gchar *full_name; gint check_rescan = -1; + parent_store = camel_folder_get_parent_store (folder); + imap_store = CAMEL_IMAP_STORE (parent_store); + if (CAMEL_OFFLINE_STORE (imap_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -727,8 +743,10 @@ imap_refresh_info (CamelFolder *folder, /* try to store local changes first, as the summary contains new local messages */ replay_offline_journal (imap_store, imap_folder, ex); + full_name = camel_folder_get_full_name (folder); + if (imap_store->current_folder != folder - || g_ascii_strcasecmp(folder->full_name, "INBOX") == 0) { + || g_ascii_strcasecmp (full_name, "INBOX") == 0) { response = camel_imap_command (imap_store, folder, ex, NULL); if (response) { camel_imap_folder_selected (folder, response, ex); @@ -745,7 +763,7 @@ imap_refresh_info (CamelFolder *folder, #if 0 /* on some servers need to CHECKpoint INBOX to recieve new messages?? */ /* rfc2060 suggests this, but havent seen a server that requires it */ - if (g_ascii_strcasecmp(folder->full_name, "INBOX") == 0) { + if (g_ascii_strcasecmp (full_name, "INBOX") == 0) { response = camel_imap_command (imap_store, folder, ex, "CHECK"); camel_imap_response_free (imap_store, response); } @@ -754,19 +772,21 @@ imap_refresh_info (CamelFolder *folder, camel_imap_response_free (imap_store, response); } - si = camel_store_summary_path((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, folder->full_name); + si = camel_store_summary_path((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, full_name); if (si) { guint32 unread, total; - camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL); + total = camel_folder_summary_count (folder->summary); + unread = folder->summary->unread_count; + if (si->total != total || si->unread != unread) { si->total = total; si->unread = unread; - camel_store_summary_touch((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary); + camel_store_summary_touch((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary); check_rescan = 0; } - camel_store_summary_info_free((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, si); + camel_store_summary_info_free((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, si); } if (check_rescan && !camel_application_is_exiting && !camel_exception_is_set (ex)) { @@ -778,7 +798,9 @@ imap_refresh_info (CamelFolder *folder, /* Check whether there are changes in total/unread messages in the folders and if so, then rescan whole summary */ if (get_folder_status (folder, &server_total, &server_unread, ex)) { - camel_object_get (folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL); + + total = camel_folder_summary_count (folder->summary); + unread = folder->summary->unread_count; if (total != server_total || unread != server_unread) check_rescan = 1; @@ -792,7 +814,7 @@ done: camel_service_unlock (CAMEL_SERVICE (imap_store), CS_REC_CONNECT_LOCK); camel_folder_summary_save_to_db (folder->summary, ex); - camel_store_summary_save ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary); + camel_store_summary_save ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary); return TRUE; } @@ -878,8 +900,9 @@ merge_custom_flags (CamelMessageInfo *mi, const gchar *custom_flags) static gboolean imap_rescan (CamelFolder *folder, gint exists, CamelException *ex) { + CamelStore *parent_store; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelImapStore *store; struct { gchar *uid; guint32 flags; @@ -896,6 +919,9 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex) CamelFolderChangeInfo *changes = NULL; gboolean success; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (camel_application_is_exiting) return TRUE; @@ -909,7 +935,9 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex) } /* Check UIDs and flags of all messages we already know of. */ - camel_operation_start (NULL, _("Scanning for changed messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Scanning for changed messages in %s"), + camel_folder_get_name (folder)); uid = camel_folder_summary_uid_from_index (folder->summary, summary_len - 1); if (!uid) { @@ -999,7 +1027,8 @@ imap_rescan (CamelFolder *folder, gint exists, CamelException *ex) info = camel_folder_summary_uid (folder->summary, uid); if (!info) { if (g_getenv("CRASH_IMAP")) { /* Debug logs to tackle on hard to get imap crasher */ - printf("CRASH: %s: %s", folder->full_name, uid); + printf ("CRASH: %s: %s", + camel_folder_get_full_name (folder), uid); g_assert(0); } else continue; @@ -1357,24 +1386,30 @@ static gboolean imap_sync_offline (CamelFolder *folder, CamelException *ex) { + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + if (folder->summary && (folder->summary->flags & CAMEL_SUMMARY_DIRTY) != 0) { CamelStoreInfo *si; + const gchar *full_name; /* ... and store's summary when folder's summary is dirty */ - si = camel_store_summary_path ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, folder->full_name); + full_name = camel_folder_get_full_name (folder); + si = camel_store_summary_path ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, full_name); if (si) { if (si->total != folder->summary->saved_count || si->unread != folder->summary->unread_count) { si->total = folder->summary->saved_count; si->unread = folder->summary->unread_count; - camel_store_summary_touch ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary); + camel_store_summary_touch ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary); } - camel_store_summary_info_free ((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary, si); + camel_store_summary_info_free ((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary, si); } } camel_folder_summary_save_to_db (folder->summary, ex); - camel_store_summary_save((CamelStoreSummary *)((CamelImapStore *)folder->parent_store)->summary); + camel_store_summary_save((CamelStoreSummary *)((CamelImapStore *)parent_store)->summary); return TRUE; } @@ -1384,7 +1419,8 @@ imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapMessageInfo *info; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); gboolean success; @@ -1394,6 +1430,9 @@ imap_sync (CamelFolder *folder, gchar *set, *flaglist, *uid; gint i, j, max; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (folder->permanent_flags == 0 || CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { if (expunge) { if (!imap_expunge (folder, ex)) @@ -1564,9 +1603,14 @@ imap_expunge_uids_offline (CamelFolder *folder, CamelException *ex) { CamelFolderChangeInfo *changes; + CamelStore *parent_store; GSList *list = NULL; + const gchar *full_name; gint i; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + qsort (uids->pdata, uids->len, sizeof (gpointer), uid_compar); changes = camel_folder_change_info_new (); @@ -1579,7 +1623,8 @@ imap_expunge_uids_offline (CamelFolder *folder, * the cached data may be useful in replaying a COPY later. */ } - camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, list, ex); + + camel_db_delete_uids (parent_store->cdb_w, full_name, list, ex); g_slist_free(list); camel_folder_summary_save_to_db (folder->summary, ex); @@ -1597,15 +1642,23 @@ imap_expunge_uids_online (CamelFolder *folder, GPtrArray *uids, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelImapStore *store; CamelImapResponse *response; gint uid = 0; gchar *set; - gboolean full_expunge = (store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0; + gboolean full_expunge; CamelFolderChangeInfo *changes; + CamelStore *parent_store; + const gchar *full_name; gint i; GSList *list=NULL; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + store = CAMEL_IMAP_STORE (parent_store); + full_expunge = (store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0; + camel_service_lock (CAMEL_SERVICE (store), CS_REC_CONNECT_LOCK); if ((store->capabilities & IMAP_CAPABILITY_UIDPLUS) == 0) { @@ -1667,7 +1720,8 @@ imap_expunge_uids_online (CamelFolder *folder, * the cached data may be useful in replaying a COPY later. */ } - camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, list, ex); + + camel_db_delete_uids (parent_store->cdb_w, full_name, list, ex); g_slist_free (list); camel_folder_summary_save_to_db (folder->summary, ex); camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes); @@ -1680,16 +1734,20 @@ static gboolean imap_expunge (CamelFolder *folder, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; GPtrArray *uids; + const gchar *full_name; gboolean success; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + camel_folder_summary_save_to_db (folder->summary, ex); - uids = camel_db_get_folder_deleted_uids (folder->parent_store->cdb_r, folder->full_name, ex); + uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, ex); if (!uids) return TRUE; - if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_AVAIL) + if (CAMEL_OFFLINE_STORE (parent_store)->state == CAMEL_OFFLINE_STORE_NETWORK_AVAIL) success = imap_expunge_uids_online (folder, uids, ex); else success = imap_expunge_uids_offline (folder, uids, ex); @@ -1701,16 +1759,20 @@ imap_expunge (CamelFolder *folder, } gboolean -imap_expunge_uids_resyncing (CamelFolder *folder, - GPtrArray *uids, - CamelException *ex) +camel_imap_expunge_uids_resyncing (CamelFolder *folder, + GPtrArray *uids, + CamelException *ex) { + CamelStore *parent_store; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelImapStore *store; GPtrArray *keep_uids, *mark_uids; CamelImapResponse *response; gchar *result; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (imap_folder->read_only) return TRUE; @@ -1947,15 +2009,20 @@ do_append (CamelFolder *folder, gchar **uid, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapResponse *response, *response2; CamelStream *memstream; CamelMimeFilter *crlf_filter; CamelStream *streamfilter; GByteArray *ba; + const gchar *full_name; gchar *flagstr, *end; guint32 flags = 0; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + /* encode any 8bit parts so we avoid sending embedded nul-chars and such */ camel_mime_message_encode_8bit_parts (message); @@ -1989,9 +2056,11 @@ retry: else flagstr = NULL; - response = camel_imap_command (store, NULL, ex, "APPEND %F%s%s {%d}", - folder->full_name, flagstr ? " " : "", - flagstr ? flagstr : "", ba->len); + full_name = camel_folder_get_full_name (folder); + response = camel_imap_command ( + store, NULL, ex, "APPEND %F%s%s {%d}", + full_name, flagstr ? " " : "", + flagstr ? flagstr : "", ba->len); g_free (flagstr); if (!response) { @@ -2059,12 +2128,16 @@ imap_append_online (CamelFolder *folder, gchar **appended_uid, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapResponse *response; gboolean success = TRUE; gchar *uid; gint count; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) { return imap_append_offline (folder, message, info, appended_uid, ex); } @@ -2108,16 +2181,20 @@ imap_append_online (CamelFolder *folder, } gboolean -imap_append_resyncing (CamelFolder *folder, - CamelMimeMessage *message, - const CamelMessageInfo *info, - gchar **appended_uid, - CamelException *ex) +camel_imap_append_resyncing (CamelFolder *folder, + CamelMimeMessage *message, + const CamelMessageInfo *info, + gchar **appended_uid, + CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapResponse *response; gchar *uid; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + response = do_append (folder, message, info, &uid, ex); if (!response) return FALSE; @@ -2151,7 +2228,8 @@ imap_transfer_offline (CamelFolder *source, gboolean delete_originals, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapMessageCache *sc = CAMEL_IMAP_FOLDER (source)->cache; CamelImapMessageCache *dc = CAMEL_IMAP_FOLDER (dest)->cache; CamelFolderChangeInfo *changes; @@ -2160,6 +2238,9 @@ imap_transfer_offline (CamelFolder *source, gchar *uid, *destuid; gint i; + parent_store = camel_folder_get_parent_store (source); + store = CAMEL_IMAP_STORE (parent_store); + /* We grab the store's command lock first, and then grab the * source and destination cache_locks. This way we can't * deadlock in the case where we're simultaneously also trying @@ -2283,6 +2364,7 @@ handle_copyuid_copy_user_tags (CamelImapResponse *response, CamelFolder *source, CamelFolder *destination) { + CamelStore *parent_store; gchar *validity, *srcset, *destset; GPtrArray *src, *dest; gint i; @@ -2304,8 +2386,10 @@ handle_copyuid_copy_user_tags (CamelImapResponse *response, goto lose; /* first do NOOP on the destination folder, so server has enough time to propagate our copy command there */ - camel_imap_response_free (CAMEL_IMAP_STORE (destination->parent_store), - camel_imap_command (CAMEL_IMAP_STORE (destination->parent_store), destination, NULL, "NOOP")); + parent_store = camel_folder_get_parent_store (destination); + camel_imap_response_free ( + CAMEL_IMAP_STORE (parent_store), camel_imap_command ( + CAMEL_IMAP_STORE (parent_store), destination, NULL, "NOOP")); camel_exception_init (&ex); /* refresh folder's summary first, we copied messages there on the server, @@ -2398,11 +2482,18 @@ do_copy (CamelFolder *source, gint delete_originals, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapResponse *response; + const gchar *full_name; gchar *uidset; gint uid = 0, last=0, i; + parent_store = camel_folder_get_parent_store (source); + store = CAMEL_IMAP_STORE (parent_store); + + full_name = camel_folder_get_full_name (destination); + while (uid < uids->len && !camel_exception_is_set (ex)) { uidset = imap_uid_array_to_set (source->summary, uids, uid, UID_SET_LIMIT, &uid); @@ -2411,14 +2502,14 @@ do_copy (CamelFolder *source, response = camel_imap_command ( store, source, ex, "UID XGWMOVE %s %F", uidset, - destination->full_name); + full_name); /* returns only 'A00012 OK UID XGWMOVE completed' '* 2 XGWMOVE' so nothing useful */ camel_imap_response_free (store, response); } else { response = camel_imap_command ( store, source, ex, "UID COPY %s %F", uidset, - destination->full_name); + full_name); if (response && (store->capabilities & IMAP_CAPABILITY_UIDPLUS)) handle_copyuid (response, source, destination); if (response) @@ -2445,10 +2536,14 @@ imap_transfer_online (CamelFolder *source, gboolean delete_originals, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (source->parent_store); + CamelStore *parent_store; + CamelImapStore *store; gboolean success = TRUE; gint count; + parent_store = camel_folder_get_parent_store (source); + store = CAMEL_IMAP_STORE (parent_store); + if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return imap_transfer_offline ( source, uids, dest, transferred_uids, @@ -2479,12 +2574,12 @@ imap_transfer_online (CamelFolder *source, } gboolean -imap_transfer_resyncing (CamelFolder *source, - GPtrArray *uids, - CamelFolder *dest, - GPtrArray **transferred_uids, - gboolean delete_originals, - CamelException *ex) +camel_imap_transfer_resyncing (CamelFolder *source, + GPtrArray *uids, + CamelFolder *dest, + GPtrArray **transferred_uids, + gboolean delete_originals, + CamelException *ex) { GPtrArray *realuids; gint first, i; @@ -2880,13 +2975,19 @@ get_message (CamelImapFolder *imap_folder, const gchar *uid, CamelMessageContentInfo *ci, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (CAMEL_FOLDER (imap_folder)->parent_store); + CamelFolder *folder; + CamelStore *parent_store; + CamelImapStore *store; CamelDataWrapper *content; CamelMimeMessage *msg; CamelStream *stream; gchar *section_text, *part_spec; gint ret; + folder = CAMEL_FOLDER (imap_folder); + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + part_spec = content_info_get_part_spec(ci); d(printf("get message '%s'\n", part_spec)); section_text = g_strdup_printf ("%s%s%s", part_spec, *part_spec ? "." : "", @@ -2998,13 +3099,17 @@ imap_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) { + CamelStore *parent_store; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelImapStore *store; CamelImapMessageInfo *mi; CamelMimeMessage *msg = NULL; CamelStream *stream = NULL; gint retry; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + mi = imap_folder_summary_uid_or_error(folder->summary, uid, ex); if (!mi) return NULL; @@ -3455,7 +3560,8 @@ imap_update_summary (CamelFolder *folder, CamelFolderChangeInfo *changes, CamelException *ex) { - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); GPtrArray *fetch_data = NULL, *messages = NULL, *needheaders; guint32 flags, uidval; @@ -3468,6 +3574,9 @@ imap_update_summary (CamelFolder *folder, GData *data; gint k = 0, ct; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (store->server_level >= IMAP_LEVEL_IMAP4REV1) { if (store->headers == IMAP_FETCH_ALL_HEADERS) header_spec = g_string_new ("HEADER"); @@ -3516,7 +3625,9 @@ imap_update_summary (CamelFolder *folder, g_string_free (header_spec, TRUE); return FALSE; } - camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); /* Parse the responses. We can't add a message to the summary * until we've gotten its headers, and there's no guarantee @@ -3592,7 +3703,9 @@ imap_update_summary (CamelFolder *folder, qsort (needheaders->pdata, needheaders->len, sizeof (gpointer), uid_compar); - camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + NULL, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); while (uid < needheaders->len && !camel_application_is_exiting) { uidset = imap_uid_array_to_set (folder->summary, needheaders, uid, UID_SET_LIMIT, &uid); @@ -3816,8 +3929,10 @@ camel_imap_folder_changed (CamelFolder *folder, gint exists, changes = camel_folder_change_info_new (); if (expunged) { + CamelStore *parent_store; gint i, id; GSList *deleted = NULL; + const gchar *full_name; for (i = 0; i < expunged->len; i++) { id = g_array_index (expunged, int, i); @@ -3837,7 +3952,9 @@ camel_imap_folder_changed (CamelFolder *folder, gint exists, } /* Delete all in one transaction */ - camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, deleted, ex); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + camel_db_delete_uids (parent_store->cdb_w, full_name, deleted, ex); g_slist_foreach (deleted, (GFunc) g_free, NULL); g_slist_free (deleted); } @@ -3880,13 +3997,17 @@ camel_imap_folder_fetch_data (CamelImapFolder *imap_folder, const gchar *uid, CamelException *ex) { CamelFolder *folder = CAMEL_FOLDER (imap_folder); - CamelImapStore *store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapResponse *response; CamelStream *stream; GData *fetch_data; gchar *found_uid; gint i; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + /* EXPUNGE responses have to modify the cache, which means * they have to grab the cache_lock while holding the * connect_lock. @@ -4119,10 +4240,14 @@ parse_fetch_response (CamelImapFolder *imap_folder, gchar *response) static CamelFolderQuotaInfo * imap_get_quota_info (CamelFolder *folder) { - CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store); + CamelStore *parent_store; + CamelImapStore *imap_store; CamelImapResponse *response; CamelFolderQuotaInfo *res = NULL, *last = NULL; + parent_store = camel_folder_get_parent_store (folder); + imap_store = CAMEL_IMAP_STORE (parent_store); + if (CAMEL_OFFLINE_STORE (imap_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return NULL; diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h index c47959d..60ce871 100644 --- a/camel/providers/imap/camel-imap-folder.h +++ b/camel/providers/imap/camel-imap-folder.h @@ -54,22 +54,12 @@ G_BEGIN_DECLS struct _CamelIMAP4Journal; -enum { - CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER = CAMEL_OFFLINE_FOLDER_ARG_LAST, - CAMEL_IMAP_FOLDER_ARG_LAST = CAMEL_OFFLINE_FOLDER_ARG_LAST + 0x100 -}; - -enum { - CAMEL_IMAP_FOLDER_CHECK_FOLDER = CAMEL_IMAP_FOLDER_ARG_CHECK_FOLDER | CAMEL_ARG_BOO -}; - typedef struct _CamelImapFolder CamelImapFolder; typedef struct _CamelImapFolderClass CamelImapFolderClass; typedef struct _CamelImapFolderPrivate CamelImapFolderPrivate; struct _CamelImapFolder { CamelOfflineFolder parent; - CamelImapFolderPrivate *priv; CamelFolderSearch *search; @@ -79,43 +69,49 @@ struct _CamelImapFolder { guint need_rescan:1; guint need_refresh:1; guint read_only:1; - guint check_folder:1; }; struct _CamelImapFolderClass { CamelOfflineFolderClass parent_class; }; -/* public methods */ -CamelFolder *camel_imap_folder_new (CamelStore *parent, - const gchar *folder_name, - const gchar *folder_dir, - CamelException *ex); - -gboolean camel_imap_folder_selected (CamelFolder *folder, - CamelImapResponse *response, - CamelException *ex); - -gboolean camel_imap_folder_changed (CamelFolder *folder, gint exists, - GArray *expunged, CamelException *ex); - -CamelStream *camel_imap_folder_fetch_data (CamelImapFolder *imap_folder, - const gchar *uid, - const gchar *section_text, - gboolean cache_only, - CamelException *ex); -gboolean -imap_append_resyncing (CamelFolder *folder, CamelMimeMessage *message, - const CamelMessageInfo *info, gchar **appended_uid, - CamelException *ex); -gboolean -imap_transfer_resyncing (CamelFolder *source, GPtrArray *uids, - CamelFolder *dest, GPtrArray **transferred_uids, - gboolean delete_originals, CamelException *ex); -gboolean -imap_expunge_uids_resyncing (CamelFolder *folder, GPtrArray *uids, CamelException *ex); - -GType camel_imap_folder_get_type (void); +GType camel_imap_folder_get_type (void); +CamelFolder * camel_imap_folder_new (CamelStore *parent, + const gchar *folder_name, + const gchar *folder_dir, + CamelException *ex); +gboolean camel_imap_folder_get_check_folder + (CamelImapFolder *imap_folder); +void camel_imap_folder_set_check_folder + (CamelImapFolder *imap_folder, + gboolean check_folder); +gboolean camel_imap_folder_selected (CamelFolder *folder, + CamelImapResponse *response, + CamelException *ex); +gboolean camel_imap_folder_changed (CamelFolder *folder, + gint exists, + GArray *expunged, + CamelException *ex); +CamelStream * camel_imap_folder_fetch_data (CamelImapFolder *imap_folder, + const gchar *uid, + const gchar *section_text, + gboolean cache_only, + CamelException *ex); +gboolean camel_imap_append_resyncing (CamelFolder *folder, + CamelMimeMessage *message, + const CamelMessageInfo *info, + gchar **appended_uid, + CamelException *ex); +gboolean camel_imap_transfer_resyncing (CamelFolder *source, + GPtrArray *uids, + CamelFolder *dest, + GPtrArray **transferred_uids, + gboolean delete_originals, + CamelException *ex); +gboolean camel_imap_expunge_uids_resyncing + (CamelFolder *folder, + GPtrArray *uids, + CamelException *ex); G_END_DECLS diff --git a/camel/providers/imap/camel-imap-journal.c b/camel/providers/imap/camel-imap-journal.c index 340aa02..3421098 100644 --- a/camel/providers/imap/camel-imap-journal.c +++ b/camel/providers/imap/camel-imap-journal.c @@ -281,25 +281,28 @@ journal_decode_folder (CamelIMAPJournal *journal, const gchar *name) CamelOfflineJournal *offline = CAMEL_OFFLINE_JOURNAL (journal); folder = g_hash_table_lookup (journal->folders, name); - if (!folder && offline->folder && g_str_equal (offline->folder->full_name, name)) { + if (!folder && offline->folder && g_str_equal (camel_folder_get_full_name (offline->folder), name)) { folder = offline->folder; } if (!folder) { + CamelStore *parent_store; CamelException ex; gchar *msg; camel_exception_init (&ex); - folder = camel_store_get_folder (CAMEL_STORE (CAMEL_OFFLINE_JOURNAL (journal)->folder->parent_store), - name, 0, &ex); + parent_store = camel_folder_get_parent_store ( + CAMEL_OFFLINE_JOURNAL (journal)->folder); + folder = camel_store_get_folder (parent_store, name, 0, &ex); if (folder) g_hash_table_insert (journal->folders, (gchar *) name, folder); else { msg = g_strdup_printf (_("Could not open '%s':\n%s\nChanges made to this folder will not be resynchronized."), name, camel_exception_get_description (&ex)); camel_exception_clear (&ex); - camel_session_alert_user (camel_service_get_session (CAMEL_SERVICE (CAMEL_OFFLINE_JOURNAL (journal)->folder->parent_store)), - CAMEL_SESSION_ALERT_WARNING, - msg, FALSE); + camel_session_alert_user ( + camel_service_get_session (CAMEL_SERVICE (parent_store)), + CAMEL_SESSION_ALERT_WARNING, + msg, FALSE); g_free (msg); } } @@ -316,7 +319,8 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep switch (imap_entry->type) { case CAMEL_IMAP_JOURNAL_ENTRY_EXPUNGE: - imap_expunge_uids_resyncing (journal->folder, imap_entry->uids, ex); + camel_imap_expunge_uids_resyncing ( + journal->folder, imap_entry->uids, ex); return 0; case CAMEL_IMAP_JOURNAL_ENTRY_APPEND: { @@ -329,7 +333,8 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep return -1; info = camel_folder_get_message_info (journal->folder, imap_entry->append_uid); - imap_append_resyncing (journal->folder, message, info, &ret_uid, ex); + camel_imap_append_resyncing ( + journal->folder, message, info, &ret_uid, ex); camel_folder_free_message_info (journal->folder, info); if (ret_uid) { @@ -352,7 +357,9 @@ imap_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, CamelExcep } camel_exception_clear (ex); - if (!imap_transfer_resyncing (journal->folder, imap_entry->uids, destination, &ret_uids, imap_entry->move, ex)) + if (!camel_imap_transfer_resyncing ( + journal->folder, imap_entry->uids, destination, + &ret_uids, imap_entry->move, ex)) return -1; if (ret_uids) { @@ -419,10 +426,12 @@ camel_imap_journal_log (CamelOfflineJournal *journal, CamelOfflineAction action, case CAMEL_IMAP_JOURNAL_ENTRY_TRANSFER: { CamelFolder *dest = va_arg (ap, CamelFolder *); + const gchar *full_name; + full_name = camel_folder_get_full_name (dest); entry->uids = copy_uids_array (va_arg (ap, GPtrArray *)); entry->move = va_arg (ap, gboolean); - entry->dest_folder_name = g_strdup (dest->full_name); + entry->dest_folder_name = g_strdup (full_name); break; } } diff --git a/camel/providers/imap/camel-imap-private.h b/camel/providers/imap/camel-imap-private.h index c2a4901..82de48a 100644 --- a/camel/providers/imap/camel-imap-private.h +++ b/camel/providers/imap/camel-imap-private.h @@ -16,6 +16,7 @@ struct _CamelImapFolderPrivate { GStaticRecMutex cache_lock; /* for locking the cache object */ #endif GHashTable *ignore_recent; /* hash table of UIDs to ignore as recent when updating folder */ + gboolean check_folder; /* persistent property */ }; #ifdef ENABLE_THREADS diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c index ea9b967..b64b4c0 100644 --- a/camel/providers/imap/camel-imap-search.c +++ b/camel/providers/imap/camel-imap-search.c @@ -319,11 +319,15 @@ sync_match(CamelImapSearch *is, struct _match_record *mr) CamelImapResponse *response = NULL; guint32 uid; CamelFolder *folder = ((CamelFolderSearch *)is)->folder; - CamelImapStore *store = (CamelImapStore *)folder->parent_store; + CamelStore *parent_store; + CamelImapStore *store; struct _camel_search_words *words; GString *search; gint i; + parent_store = camel_folder_get_parent_store (folder); + store = CAMEL_IMAP_STORE (parent_store); + if (mr->lastuid >= is->lastuid && mr->validity == is->validity) return 0; @@ -421,7 +425,8 @@ get_match(CamelImapSearch *is, gint argc, struct _ESExpResult **argv) static ESExpResult * imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s) { - CamelImapStore *store = CAMEL_IMAP_STORE (s->folder->parent_store); + CamelStore *parent_store; + CamelImapStore *store; CamelImapSearch *is = (CamelImapSearch *)s; gchar *uid; ESExpResult *r; @@ -431,6 +436,9 @@ imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, Cam struct _match_record *mr; guint32 uidn, *uidp; + parent_store = camel_folder_get_parent_store (s->folder); + store = CAMEL_IMAP_STORE (parent_store); + d(printf("Performing body search '%s'\n", argv[0]->value.string)); /* TODO: Cache offline searches too? */ diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 4ad0ca1..60c4441 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -70,9 +70,6 @@ static gboolean construct (CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex); -static gint imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args); -static gint imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args); - static gchar *imap_get_name (CamelService *service, gboolean brief); static gboolean imap_noop (CamelStore *store, CamelException *ex); @@ -152,7 +149,6 @@ static void camel_imap_store_class_init (CamelImapStoreClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; CamelServiceClass *service_class; CamelStoreClass *store_class; @@ -160,10 +156,6 @@ camel_imap_store_class_init (CamelImapStoreClass *class) object_class->dispose = imap_store_dispose; object_class->finalize = imap_store_finalize; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->setv = imap_setv; - camel_object_class->getv = imap_getv; - service_class = CAMEL_SERVICE_CLASS (class); service_class->construct = construct; service_class->query_auth_types = query_auth_types; @@ -288,126 +280,6 @@ construct (CamelService *service, CamelSession *session, return TRUE; } -static gint -imap_setv (CamelObject *object, CamelException *ex, CamelArgV *args) -{ - CamelImapStore *store = (CamelImapStore *) object; - guint32 tag, flags; - gint i; - - for (i = 0; i < args->argc; i++) { - tag = args->argv[i].tag; - - /* make sure this is an arg we're supposed to handle */ - if ((tag & CAMEL_ARG_TAG) <= CAMEL_IMAP_STORE_ARG_FIRST || - (tag & CAMEL_ARG_TAG) >= CAMEL_IMAP_STORE_ARG_FIRST + 100) - continue; - - switch (tag) { - case CAMEL_IMAP_STORE_NAMESPACE: - if (strcmp (store->users_namespace, args->argv[i].ca_str) != 0) { - g_free (store->users_namespace); - store->users_namespace = g_strdup (args->argv[i].ca_str); - /* the current imap code will need to do a reconnect for this to take effect */ - /*reconnect = TRUE;*/ - } - break; - case CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE: - flags = args->argv[i].ca_int ? IMAP_PARAM_OVERRIDE_NAMESPACE : 0; - flags |= (store->parameters & ~IMAP_PARAM_OVERRIDE_NAMESPACE); - - if (store->parameters != flags) { - store->parameters = flags; - /* the current imap code will need to do a reconnect for this to take effect */ - /*reconnect = TRUE;*/ - } - break; - case CAMEL_IMAP_STORE_CHECK_ALL: - flags = args->argv[i].ca_int ? IMAP_PARAM_CHECK_ALL : 0; - flags |= (store->parameters & ~IMAP_PARAM_CHECK_ALL); - store->parameters = flags; - /* no need to reconnect for this option to take effect... */ - break; - case CAMEL_IMAP_STORE_CHECK_LSUB: - flags = args->argv[i].ca_int ? IMAP_PARAM_CHECK_LSUB : 0; - store->parameters = flags | (store->parameters & ~IMAP_PARAM_CHECK_LSUB); - break; - case CAMEL_IMAP_STORE_FILTER_INBOX: - flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_INBOX : 0; - flags |= (store->parameters & ~IMAP_PARAM_FILTER_INBOX); - store->parameters = flags; - /* no need to reconnect for this option to take effect... */ - break; - case CAMEL_IMAP_STORE_FILTER_JUNK: - flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_JUNK : 0; - store->parameters = flags | (store->parameters & ~IMAP_PARAM_FILTER_JUNK); - break; - case CAMEL_IMAP_STORE_FILTER_JUNK_INBOX: - flags = args->argv[i].ca_int ? IMAP_PARAM_FILTER_JUNK_INBOX : 0; - store->parameters = flags | (store->parameters & ~IMAP_PARAM_FILTER_JUNK_INBOX); - break; - default: - /* error?? */ - continue; - } - - /* let our parent know that we've handled this arg */ - camel_argv_ignore (args, i); - } - - /* FIXME: if we need to reconnect for a change to take affect, - we need to do it here... or, better yet, somehow chain it - up to CamelService's setv implementation. */ - - return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->setv (object, ex, args); -} - -static gint -imap_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args) -{ - CamelImapStore *store = (CamelImapStore *) object; - guint32 tag; - gint i; - - for (i = 0; i < args->argc; i++) { - tag = args->argv[i].tag; - - /* make sure this is an arg we're supposed to handle */ - if ((tag & CAMEL_ARG_TAG) <= CAMEL_IMAP_STORE_ARG_FIRST || - (tag & CAMEL_ARG_TAG) >= CAMEL_IMAP_STORE_ARG_FIRST + 100) - continue; - - switch (tag) { - case CAMEL_IMAP_STORE_NAMESPACE: - *args->argv[i].ca_str = store->users_namespace; - break; - case CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_OVERRIDE_NAMESPACE ? TRUE : FALSE; - break; - case CAMEL_IMAP_STORE_CHECK_ALL: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_CHECK_ALL ? TRUE : FALSE; - break; - case CAMEL_IMAP_STORE_CHECK_LSUB: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_CHECK_LSUB ? TRUE : FALSE; - break; - case CAMEL_IMAP_STORE_FILTER_INBOX: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_INBOX ? TRUE : FALSE; - break; - case CAMEL_IMAP_STORE_FILTER_JUNK: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_JUNK ? TRUE : FALSE; - break; - case CAMEL_IMAP_STORE_FILTER_JUNK_INBOX: - *args->argv[i].ca_int = store->parameters & IMAP_PARAM_FILTER_JUNK_INBOX ? TRUE : FALSE; - break; - default: - /* error? */ - break; - } - } - - return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->getv (object, ex, args); -} - static gchar * imap_get_name (CamelService *service, gboolean brief) { @@ -1667,12 +1539,13 @@ imap_get_trash(CamelStore *store, CamelException *ex) CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_trash(store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Trash.cmeta", NULL); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; @@ -1684,12 +1557,13 @@ imap_get_junk(CamelStore *store, CamelException *ex) CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_junk(store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Junk.cmeta", NULL); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h index e24c244..a8b18a2 100644 --- a/camel/providers/imap/camel-imap-store.h +++ b/camel/providers/imap/camel-imap-store.h @@ -73,7 +73,7 @@ G_END_DECLS G_BEGIN_DECLS -enum { +/*enum { CAMEL_IMAP_STORE_ARG_FIRST = CAMEL_OFFLINE_STORE_ARG_FIRST + 100, CAMEL_IMAP_STORE_ARG_NAMESPACE, CAMEL_IMAP_STORE_ARG_OVERRIDE_NAMESPACE, @@ -82,7 +82,7 @@ enum { CAMEL_IMAP_STORE_ARG_FILTER_JUNK, CAMEL_IMAP_STORE_ARG_FILTER_JUNK_INBOX, CAMEL_IMAP_STORE_ARG_CHECK_LSUB -}; +};*/ #define CAMEL_IMAP_STORE_NAMESPACE (CAMEL_IMAP_STORE_ARG_NAMESPACE | CAMEL_ARG_STR) #define CAMEL_IMAP_STORE_OVERRIDE_NAMESPACE (CAMEL_IMAP_STORE_ARG_OVERRIDE_NAMESPACE | CAMEL_ARG_INT) diff --git a/camel/providers/imap/camel-imap-summary.c b/camel/providers/imap/camel-imap-summary.c index afc22e7..d05e058 100644 --- a/camel/providers/imap/camel-imap-summary.c +++ b/camel/providers/imap/camel-imap-summary.c @@ -154,17 +154,22 @@ uid_compare (gconstpointer va, gconstpointer vb) * Returns: A new CamelImapSummary object. **/ CamelFolderSummary * -camel_imap_summary_new (struct _CamelFolder *folder, const gchar *filename) +camel_imap_summary_new (CamelFolder *folder, const gchar *filename) { + CamelStore *parent_store; CamelFolderSummary *summary; CamelException ex; camel_exception_init (&ex); + parent_store = camel_folder_get_parent_store (folder); + summary = g_object_new (CAMEL_TYPE_IMAP_SUMMARY, NULL); summary->folder = folder; /* Don't do DB sort. Its pretty slow to load */ if (folder && 0) { - camel_db_set_collate (folder->parent_store->cdb_r, "uid", "imap_uid_sort", (CamelDBCollate)sort_uid_cmp); + camel_db_set_collate ( + parent_store->cdb_r, "uid", "imap_uid_sort", + (CamelDBCollate) sort_uid_cmp); summary->sort_by = "uid"; summary->collate = "imap_uid_sort"; } diff --git a/camel/providers/imap/camel-imap-wrapper.c b/camel/providers/imap/camel-imap-wrapper.c index ce42c85..cb32cb5 100644 --- a/camel/providers/imap/camel-imap-wrapper.c +++ b/camel/providers/imap/camel-imap-wrapper.c @@ -160,9 +160,10 @@ camel_imap_wrapper_new (CamelImapFolder *imap_folder, CamelStream *stream; gboolean sync_offline = FALSE; - store = CAMEL_FOLDER (imap_folder)->parent_store; - sync_offline = (camel_url_get_param (((CamelService *) store)->url, "sync_offline") != NULL || - ((CamelOfflineFolder *)imap_folder)->sync_offline); + store = camel_folder_get_parent_store (CAMEL_FOLDER (imap_folder)); + sync_offline = + camel_url_get_param (((CamelService *) store)->url, "sync_offline") != NULL || + camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (imap_folder)); imap_wrapper = g_object_new (CAMEL_TYPE_IMAP_WRAPPER, NULL); camel_data_wrapper_set_mime_type_field (CAMEL_DATA_WRAPPER (imap_wrapper), type); diff --git a/camel/providers/imapx/camel-imapx-folder.c b/camel/providers/imapx/camel-imapx-folder.c index 1390485..24ee68a 100644 --- a/camel/providers/imapx/camel-imapx-folder.c +++ b/camel/providers/imapx/camel-imapx-folder.c @@ -58,8 +58,11 @@ camel_imapx_folder_new(CamelStore *store, const gchar *folder_dir, const gchar * else short_name = folder_name; - folder = g_object_new (CAMEL_TYPE_IMAPX_FOLDER, NULL); - camel_folder_construct(folder, store, folder_name, short_name); + folder = g_object_new ( + CAMEL_TYPE_IMAPX_FOLDER, + "name", short_name, + "full_name", folder_name, + "parent-store", store, NULL); ifolder = (CamelIMAPXFolder *) folder; ((CamelIMAPXFolder *)folder)->raw_name = g_strdup(folder_name); @@ -82,9 +85,9 @@ camel_imapx_folder_new(CamelStore *store, const gchar *folder_dir, const gchar * } state_file = g_strdup_printf ("%s/cmeta", folder_dir); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state_file, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); g_free(state_file); - camel_object_state_read(folder); + camel_object_state_read (CAMEL_OBJECT (folder)); ifolder->search = camel_folder_search_new (); ifolder->search_lock = g_mutex_new (); @@ -144,7 +147,11 @@ imapx_folder_finalize (GObject *object) static gboolean imapx_refresh_info (CamelFolder *folder, CamelException *ex) { - CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *istore; + + parent_store = camel_folder_get_parent_store (folder); + istore = CAMEL_IMAPX_STORE (parent_store); if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -159,7 +166,11 @@ imapx_refresh_info (CamelFolder *folder, CamelException *ex) static gboolean imapx_expunge (CamelFolder *folder, CamelException *ex) { - CamelIMAPXStore *is = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *is; + + parent_store = camel_folder_get_parent_store (folder); + is = CAMEL_IMAPX_STORE (parent_store); if (CAMEL_OFFLINE_STORE (is)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -173,9 +184,13 @@ imapx_expunge (CamelFolder *folder, CamelException *ex) static gboolean imapx_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { - CamelIMAPXStore *is = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *is; CamelException eex = CAMEL_EXCEPTION_INITIALISER; + parent_store = camel_folder_get_parent_store (folder); + is = CAMEL_IMAPX_STORE (parent_store); + if (CAMEL_OFFLINE_STORE (is)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -202,11 +217,15 @@ imapx_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) { CamelMimeMessage *msg = NULL; CamelStream *stream = NULL; - CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *istore; CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder; const gchar *path = NULL; gboolean offline_message = FALSE; + parent_store = camel_folder_get_parent_store (folder); + istore = CAMEL_IMAPX_STORE (parent_store); + if (!strchr (uid, '-')) path = "cur"; else { @@ -250,7 +269,11 @@ imapx_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) static gboolean imapx_sync_message (CamelFolder *folder, const gchar *uid, CamelException *ex) { - CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *istore; + + parent_store = camel_folder_get_parent_store (folder); + istore = CAMEL_IMAPX_STORE (parent_store); if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -266,7 +289,11 @@ imapx_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, GPtrArray **transferred_uids, gboolean delete_originals, CamelException *ex) { - CamelIMAPXStore *istore = (CamelIMAPXStore *) source->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *istore; + + parent_store = camel_folder_get_parent_store (source); + istore = CAMEL_IMAPX_STORE (parent_store); if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; @@ -282,7 +309,11 @@ imapx_transfer_messages_to (CamelFolder *source, GPtrArray *uids, static gboolean imapx_append_message(CamelFolder *folder, CamelMimeMessage *message, const CamelMessageInfo *info, gchar **appended_uid, CamelException *ex) { - CamelIMAPXStore *istore = (CamelIMAPXStore *)folder->parent_store; + CamelStore *parent_store; + CamelIMAPXStore *istore; + + parent_store = camel_folder_get_parent_store (folder); + istore = CAMEL_IMAPX_STORE (parent_store); if (CAMEL_OFFLINE_STORE (istore)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) return TRUE; diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c index bc068df..ec5159d 100644 --- a/camel/providers/imapx/camel-imapx-server.c +++ b/camel/providers/imapx/camel-imapx-server.c @@ -500,7 +500,9 @@ imapx_command_addv(CamelIMAPXCommand *ic, const gchar *fmt, va_list ap) CamelSasl *A; gchar buffer[16]; CamelFolder *folder; + CamelStore *parent_store; gchar *fname = NULL, *encoded = NULL; + const gchar *full_name; CamelException ex = CAMEL_EXCEPTION_INITIALISER; c(printf("adding command, fmt = '%s'\n", fmt)); @@ -603,12 +605,14 @@ imapx_command_addv(CamelIMAPXCommand *ic, const gchar *fmt, va_list ap) case 'f': /* imap folder name */ folder = va_arg(ap, CamelFolder *); c(printf("got folder '%s'\n", s)); - fname = camel_imapx_store_summary_full_from_path(((CamelIMAPXStore *) folder->parent_store)->summary, folder->full_name); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + fname = camel_imapx_store_summary_full_from_path(((CamelIMAPXStore *) parent_store)->summary, full_name); if (fname) { encoded = camel_utf8_utf7(fname); g_free (fname); } else - encoded = camel_utf8_utf7 (folder->full_name); + encoded = camel_utf8_utf7 (full_name); camel_stream_printf((CamelStream *)ic->mem, "\"%s\"", encoded?encoded:""); @@ -811,7 +815,7 @@ imapx_command_start_next(CamelIMAPXServer *is, CamelException *ex) c(printf("** Starting next command\n")); if (is->literal != NULL || is->select_pending != NULL) { c(if (is->select_pending)) - c(printf("* no, waiting for literal/pending select '%s'\n", is->select_pending->full_name)); + c(printf("* no, waiting for literal/pending select '%s'\n", camel_folder_get_full_name (is->select_pending))); /* TODO prolly start the store operations which do not require any folder to be selected */ return; @@ -974,9 +978,13 @@ found: static gboolean imapx_job_matches (const gchar *folder_name, CamelIMAPXJob *job, guint32 type, const gchar *uid) { + const gchar *full_name; + + full_name = camel_folder_get_full_name (job->folder); + switch (job->type) { case IMAPX_JOB_GET_MESSAGE: - if (folder_name && strcmp(job->folder->full_name, folder_name) == 0 + if (folder_name && strcmp(full_name, folder_name) == 0 && strcmp(job->u.get_message.uid, uid) == 0) return TRUE; break; @@ -985,7 +993,7 @@ imapx_job_matches (const gchar *folder_name, CamelIMAPXJob *job, guint32 type, c case IMAPX_JOB_SYNC_CHANGES: case IMAPX_JOB_EXPUNGE: if (folder_name - && strcmp(job->folder->full_name, folder_name) == 0) + && strcmp(full_name, folder_name) == 0) return TRUE; break; case IMAPX_JOB_LIST: @@ -1117,7 +1125,10 @@ imapx_untagged(CamelIMAPXServer *imap, CamelException *ex) camel_folder_change_info_remove_uid (imap->changes, uid); if (imapx_idle_supported (imap) && imapx_in_idle (imap)) { - camel_db_delete_uids (imap->store->cdb_w, imap->select_folder->full_name, imap->expunged, NULL); + const gchar *full_name; + + full_name = camel_folder_get_full_name (imap->select_folder); + camel_db_delete_uids (imap->store->cdb_w, full_name, imap->expunged, NULL); imapx_update_store_summary (imap->select_folder); camel_object_trigger_event(imap->select_folder, "folder_changed", imap->changes); @@ -1568,8 +1579,12 @@ imapx_completion(CamelIMAPXServer *imap, guchar *token, gint len, CamelException if (camel_folder_change_info_changed (imap->changes)) { if (imap->changes->uid_changed->len) camel_folder_summary_save_to_db (imap->select_folder->summary, NULL); - else - camel_db_delete_uids (imap->store->cdb_w, imap->select_folder->full_name, imap->expunged, NULL); + else { + const gchar *full_name; + + full_name = camel_folder_get_full_name (imap->select_folder); + camel_db_delete_uids (imap->store->cdb_w, full_name, imap->expunged, NULL); + } if (imap->expunged) { g_slist_foreach (imap->expunged, (GFunc) g_free, NULL); @@ -1796,8 +1811,11 @@ imapx_job_idle_start(CamelIMAPXServer *is, CamelIMAPXJob *job) { CamelIMAPXCommand *ic; CamelIMAPXCommandPart *cp; + const gchar *full_name; - ic = camel_imapx_command_new ("IDLE", job->folder->full_name, "IDLE"); + full_name = camel_folder_get_full_name (job->folder); + + ic = camel_imapx_command_new ("IDLE", full_name, "IDLE"); ic->job = job; ic->pri = job->pri; ic->complete = imapx_command_idle_done; @@ -1977,6 +1995,7 @@ imapx_idle_supported (CamelIMAPXServer *is) static void imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) { + const gchar *full_name; if (camel_exception_is_set (ic->ex) || ic->status->result != IMAPX_OK) { CamelDList failed; @@ -1991,7 +2010,8 @@ imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) if (is->select_pending) { while (cn) { - if (cw->select && strcmp(cw->select, is->select_pending->full_name) == 0) { + full_name = camel_folder_get_full_name (is->select_pending); + if (cw->select && strcmp(cw->select, full_name) == 0) { camel_dlist_remove((CamelDListNode *)cw); camel_dlist_addtail(&failed, (CamelDListNode *)cw); } @@ -2021,8 +2041,10 @@ imapx_command_select_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) is->select_pending; c(printf("Select ok!\n")); + full_name = camel_folder_get_full_name (is->select_folder); + is->select_folder = is->select_pending; - is->select = g_strdup(is->select_folder->full_name); + is->select = g_strdup(full_name); is->state = IMAPX_SELECTED; ifolder->exists_on_server = is->exists; #if 0 @@ -2047,6 +2069,9 @@ static void imapx_select (CamelIMAPXServer *is, CamelFolder *folder, gboolean forced, CamelException *ex) { CamelIMAPXCommand *ic; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); /* Select is complicated by the fact we may have commands active on the server for a different selection. @@ -2063,7 +2088,7 @@ imapx_select (CamelIMAPXServer *is, CamelFolder *folder, gboolean forced, CamelE if (is->select_pending) return; - if (is->select && strcmp(is->select, folder->full_name) == 0 && !forced) + if (is->select && strcmp(is->select, full_name) == 0 && !forced) return; if (!camel_dlist_empty(&is->active)) @@ -2403,6 +2428,7 @@ static void imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) { CamelIMAPXJob *job = ic->job; + const gchar *full_name; gboolean failed = FALSE; /* We either have more to fetch (partial mode?), we are complete, @@ -2411,6 +2437,8 @@ imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) job->commands--; + full_name = camel_folder_get_full_name (job->folder); + if (camel_exception_is_set (ic->ex) || ic->status->result != IMAPX_OK) { failed = TRUE; job->u.get_message.body_len = -1; @@ -2421,7 +2449,7 @@ imapx_command_fetch_message_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) if (job->op) camel_operation_progress (job->op, (job->u.get_message.fetch_offset *100)/job->u.get_message.size); - ic = camel_imapx_command_new("FETCH", job->folder->full_name, + ic = camel_imapx_command_new("FETCH", full_name, "UID FETCH %t (BODY.PEEK[]", job->u.get_message.uid); camel_imapx_command_add(ic, "<%u.%u>", job->u.get_message.fetch_offset, MULTI_SIZE); camel_imapx_command_add(ic, ")"); @@ -2483,11 +2511,14 @@ static void imapx_job_get_message_start (CamelIMAPXServer *is, CamelIMAPXJob *job) { CamelIMAPXCommand *ic; + const gchar *full_name; gint i; + full_name = camel_folder_get_full_name (job->folder); + if (job->u.get_message.use_multi_fetch) { for (i=0; i < 3 && job->u.get_message.fetch_offset < job->u.get_message.size;i++) { - ic = camel_imapx_command_new("FETCH", job->folder->full_name, + ic = camel_imapx_command_new("FETCH", full_name, "UID FETCH %t (BODY.PEEK[]", job->u.get_message.uid); camel_imapx_command_add(ic, "<%u.%u>", job->u.get_message.fetch_offset, MULTI_SIZE); camel_imapx_command_add(ic, ")"); @@ -2499,7 +2530,7 @@ imapx_job_get_message_start (CamelIMAPXServer *is, CamelIMAPXJob *job) imapx_command_queue(is, ic); } } else { - ic = camel_imapx_command_new("FETCH", job->folder->full_name, + ic = camel_imapx_command_new("FETCH", full_name, "UID FETCH %t (BODY.PEEK[])", job->u.get_message.uid); ic->complete = imapx_command_fetch_message_done; ic->job = job; @@ -2516,9 +2547,12 @@ imapx_command_copy_messages_step_start (CamelIMAPXServer *is, CamelIMAPXJob *job { CamelIMAPXCommand *ic; GPtrArray *uids = job->u.copy_messages.uids; + const gchar *full_name; gint i = index; - ic = camel_imapx_command_new ("COPY", job->folder->full_name, "UID COPY "); + full_name = camel_folder_get_full_name (job->folder); + + ic = camel_imapx_command_new ("COPY", full_name, "UID COPY "); ic->complete = imapx_command_copy_messages_step_done; ic->job = job; ic->pri = job->pri; @@ -2777,9 +2811,12 @@ imapx_command_step_fetch_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) camel_folder_change_info_clear(job->u.refresh_info.changes); if (ilen) { + const gchar *full_name; + camel_imapx_command_free (ic); - ic = camel_imapx_command_new("FETCH", job->folder->full_name, "UID FETCH "); + full_name = camel_folder_get_full_name (job->folder); + ic = camel_imapx_command_new("FETCH", full_name, "UID FETCH "); ic->complete = imapx_command_step_fetch_done; ic->job = job; ic->pri = job->pri - 1; @@ -2950,7 +2987,10 @@ imapx_job_scan_changes_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) } if (removed) { - camel_db_delete_uids (is->store->cdb_w, s->folder->full_name, removed, NULL); + const gchar *full_name; + + full_name = camel_folder_get_full_name (s->folder); + camel_db_delete_uids (is->store->cdb_w, full_name, removed, NULL); g_slist_foreach (removed, (GFunc) g_free, NULL); g_slist_free (removed); } @@ -2965,7 +3005,9 @@ imapx_job_scan_changes_done(CamelIMAPXServer *is, CamelIMAPXCommand *ic) /* If we have any new messages, download their headers, but only a few (100?) at a time */ if (fetch_new) { - camel_operation_start (job->op, _("Fetching summary information for new messages in %s"), job->folder->name); + camel_operation_start ( + job->op, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (job->folder)); imapx_uidset_init(&job->u.refresh_info.uidset, BATCH_FETCH_COUNT, 0); /* command will be free'ed in step_fetch_done */ imapx_command_step_fetch_done(is, ic); @@ -2993,10 +3035,15 @@ static void imapx_job_scan_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job) { CamelIMAPXCommand *ic; + const gchar *full_name; + + full_name = camel_folder_get_full_name (job->folder); - camel_operation_start (job->op, _("Scanning for changed messages in %s"), job->folder->name); + camel_operation_start ( + job->op, _("Scanning for changed messages in %s"), + camel_folder_get_name (job->folder)); - ic = camel_imapx_command_new ("FETCH", job->folder->full_name, + ic = camel_imapx_command_new ("FETCH", full_name, "FETCH 1:* (UID FLAGS)"); ic->job = job; ic->complete = imapx_job_scan_changes_done; @@ -3040,9 +3087,12 @@ imapx_job_fetch_new_messages_start (CamelIMAPXServer *is, CamelIMAPXJob *job) CamelIMAPXCommand *ic; CamelFolder *folder = job->folder; CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder; + const gchar *full_name; guint32 total, diff; gchar *uid = NULL; + full_name = camel_folder_get_full_name (folder); + total = camel_folder_summary_count (folder->summary); diff = ifolder->exists_on_server - total; @@ -3051,17 +3101,19 @@ imapx_job_fetch_new_messages_start (CamelIMAPXServer *is, CamelIMAPXJob *job) else uid = g_strdup ("1"); - camel_operation_start (job->op, _("Fetching summary information for new messages in %s"), folder->name); + camel_operation_start ( + job->op, _("Fetching summary information for new messages in %s"), + camel_folder_get_name (folder)); if (diff > BATCH_FETCH_COUNT) { - ic = camel_imapx_command_new ("FETCH", job->folder->full_name, + ic = camel_imapx_command_new ("FETCH", full_name, "FETCH %s:* (UID FLAGS)", uid); imapx_uidset_init(&job->u.refresh_info.uidset, BATCH_FETCH_COUNT, 0); job->u.refresh_info.infos = g_array_new (0, 0, sizeof(struct _refresh_info)); ic->pri = job->pri; ic->complete = imapx_command_step_fetch_done; } else { - ic = camel_imapx_command_new ("FETCH", job->folder->full_name, + ic = camel_imapx_command_new ("FETCH", full_name, "UID FETCH %s:* (RFC822.SIZE RFC822.HEADER FLAGS)", uid); ic->pri = job->pri; ic->complete = imapx_command_fetch_new_messages_done; @@ -3079,6 +3131,9 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job) CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) job->folder; CamelFolder *folder = job->folder; CamelException *ex = job->ex; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); total = camel_folder_summary_count (folder->summary); /* Check if there are any new messages. The old imap doc says one needs to reselect in case of inbox to fetch @@ -3109,7 +3164,7 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job) guint32 unread; CamelIMAPXCommand *ic; - ic = camel_imapx_command_new ("STATUS", folder->full_name, "STATUS %f (MESSAGES UNSEEN)", folder); + ic = camel_imapx_command_new ("STATUS", full_name, "STATUS %f (MESSAGES UNSEEN)", folder); ic->job = job; ic->pri = job->pri; ic->complete = imapx_command_status_done; @@ -3126,7 +3181,7 @@ imapx_job_refresh_info_start (CamelIMAPXServer *is, CamelIMAPXJob *job) } camel_imapx_command_free (ic); - camel_object_get (folder, NULL, CAMEL_FOLDER_UNREAD, &unread, NULL); + unread = folder->summary->unread_count; if (ifolder->exists_on_server == total && unread == ifolder->unread_on_server) goto exception; } @@ -3151,9 +3206,14 @@ imapx_command_expunge_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) } else { GPtrArray *uids; CamelFolder *folder = ic->job->folder; + CamelStore *parent_store; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); camel_folder_summary_save_to_db (folder->summary, ic->job->ex); - uids = camel_db_get_folder_deleted_uids (folder->parent_store->cdb_r, folder->full_name, ic->job->ex); + uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, ic->job->ex); if (uids && uids->len) { CamelFolderChangeInfo *changes; @@ -3175,7 +3235,7 @@ imapx_command_expunge_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) removed = g_slist_prepend (removed, (gpointer) uids->pdata[i]); } - camel_db_delete_uids (folder->parent_store->cdb_w, folder->full_name, removed, ic->job->ex); + camel_db_delete_uids (parent_store->cdb_w, full_name, removed, ic->job->ex); camel_folder_summary_save_to_db (folder->summary, ic->job->ex); camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes); camel_folder_change_info_free (changes); @@ -3194,11 +3254,13 @@ static void imapx_job_expunge_start(CamelIMAPXServer *is, CamelIMAPXJob *job) { CamelIMAPXCommand *ic; + const gchar *full_name; imapx_server_sync_changes (is, job->folder, job->pri, job->ex); /* TODO handle UIDPLUS capability */ - ic = camel_imapx_command_new("EXPUNGE", job->folder->full_name, "EXPUNGE"); + full_name = camel_folder_get_full_name (job->folder); + ic = camel_imapx_command_new("EXPUNGE", full_name, "EXPUNGE"); ic->job = job; ic->pri = job->pri; ic->complete = imapx_command_expunge_done; @@ -3412,11 +3474,12 @@ static void imapx_job_noop_start(CamelIMAPXServer *is, CamelIMAPXJob *job) { CamelIMAPXCommand *ic; + const gchar *full_name = NULL; - if (job->folder) - ic = camel_imapx_command_new ("NOOP", job->folder->full_name, "NOOP"); - else - ic = camel_imapx_command_new ("NOOP", NULL, "NOOP"); + if (job->folder != NULL) + full_name = camel_folder_get_full_name (job->folder); + + ic = camel_imapx_command_new ("NOOP", full_name, "NOOP"); ic->job = job; ic->complete = imapx_command_noop_done; @@ -3456,10 +3519,15 @@ static void imapx_command_sync_changes_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) { CamelIMAPXJob *job = ic->job; + CamelStore *parent_store; + const gchar *full_name; gboolean failed = FALSE; job->commands--; + full_name = camel_folder_get_full_name (job->folder); + parent_store = camel_folder_get_parent_store (job->folder); + /* If this worked, we should really just update the changes that we sucessfully stored, so we dont have to worry about sending them again ... But then we'd have to track which uid's we actually updated, so its easier @@ -3505,20 +3573,20 @@ imapx_command_sync_changes_done (CamelIMAPXServer *is, CamelIMAPXCommand *ic) CamelStoreInfo *si; /* ... and store's summary when folder's summary is dirty */ - si = camel_store_summary_path ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary, job->folder->full_name); + si = camel_store_summary_path ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary, full_name); if (si) { if (si->total != job->folder->summary->saved_count || si->unread != job->folder->summary->unread_count) { si->total = job->folder->summary->saved_count; si->unread = job->folder->summary->unread_count; - camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary); + camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary); } - camel_store_summary_info_free ((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary, si); + camel_store_summary_info_free ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary, si); } } camel_folder_summary_save_to_db (job->folder->summary, job->ex); - camel_store_summary_save((CamelStoreSummary *)((CamelIMAPXStore *) job->folder->parent_store)->summary); + camel_store_summary_save((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary); imapx_job_done (is, job); } @@ -3531,8 +3599,11 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job) guint32 i, j; struct _uidset_state ss; GPtrArray *uids = job->u.sync_changes.changed_uids; + const gchar *full_name; gint on; + full_name = camel_folder_get_full_name (job->folder); + for (on=0;on<2;on++) { guint32 orset = on?job->u.sync_changes.on_set:job->u.sync_changes.off_set; GArray *user_set = on?job->u.sync_changes.on_user:job->u.sync_changes.off_user; @@ -3563,7 +3634,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job) if ( (on && (((flags ^ sflags) & flags) & flag)) || (!on && (((flags ^ sflags) & ~flags) & flag))) { if (ic == NULL) { - ic = camel_imapx_command_new("STORE", job->folder->full_name, "UID STORE "); + ic = camel_imapx_command_new("STORE", full_name, "UID STORE "); ic->complete = imapx_command_sync_changes_done; ic->job = job; ic->pri = job->pri; @@ -3591,7 +3662,7 @@ imapx_job_sync_changes_start(CamelIMAPXServer *is, CamelIMAPXJob *job) CamelIMAPXMessageInfo *info = c->infos->pdata[i]; if (ic == NULL) { - ic = camel_imapx_command_new("STORE", job->folder->full_name, "UID STORE "); + ic = camel_imapx_command_new("STORE", full_name, "UID STORE "); ic->complete = imapx_command_sync_changes_done; ic->job = job; ic->pri = job->pri; @@ -3946,8 +4017,11 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat gchar *cache_file = NULL; CamelMessageInfo *mi; gboolean registered; + const gchar *full_name; EFlag *flag = NULL; + full_name = camel_folder_get_full_name (folder); + cache_file = camel_data_cache_get_filename (ifolder->cache, "cur", uid, NULL); if (g_file_test (cache_file, G_FILE_TEST_EXISTS)) { g_free (cache_file); @@ -3957,7 +4031,7 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, CamelOperat QUEUE_LOCK (is); - if ((job = imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_GET_MESSAGE, uid))) { + if ((job = imapx_is_job_in_queue (is, full_name, IMAPX_JOB_GET_MESSAGE, uid))) { flag = g_hash_table_lookup (is->uid_eflags, uid); if (pri > job->pri) @@ -4163,10 +4237,13 @@ camel_imapx_server_refresh_info (CamelIMAPXServer *is, CamelFolder *folder, Came { CamelIMAPXJob *job; gboolean registered = TRUE; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); QUEUE_LOCK (is); - if (imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_REFRESH_INFO, NULL)) { + if (imapx_is_job_in_queue (is, full_name, IMAPX_JOB_REFRESH_INFO, NULL)) { QUEUE_UNLOCK (is); return; } @@ -4180,7 +4257,7 @@ camel_imapx_server_refresh_info (CamelIMAPXServer *is, CamelFolder *folder, Came job->u.refresh_info.changes = camel_folder_change_info_new(); job->pri = IMAPX_PRIORITY_REFRESH_INFO; - if (g_ascii_strcasecmp(folder->full_name, "INBOX") == 0) + if (g_ascii_strcasecmp(full_name, "INBOX") == 0) job->pri += 10; registered = imapx_register_job (is, job); @@ -4231,8 +4308,11 @@ imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, gint pri, C GArray *on_user = NULL, *off_user = NULL; CamelIMAPXMessageInfo *info; CamelIMAPXJob *job; + const gchar *full_name; gboolean registered; + full_name = camel_folder_get_full_name (folder); + /* We calculate two masks, a mask of all flags which have been turned off and a mask of all flags which have been turned on. If either of these aren't 0, then we have work to do, @@ -4338,7 +4418,7 @@ imapx_server_sync_changes(CamelIMAPXServer *is, CamelFolder *folder, gint pri, C QUEUE_LOCK (is); - if ((job = imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_SYNC_CHANGES, NULL))) { + if ((job = imapx_is_job_in_queue (is, full_name, IMAPX_JOB_SYNC_CHANGES, NULL))) { if (pri > job->pri) job->pri = pri; @@ -4386,11 +4466,14 @@ camel_imapx_server_expunge(CamelIMAPXServer *is, CamelFolder *folder, CamelExcep { CamelIMAPXJob *job; gboolean registered; + const gchar *full_name; + + full_name = camel_folder_get_full_name (folder); /* Do we really care to wait for this one to finish? */ QUEUE_LOCK (is); - if (imapx_is_job_in_queue (is, folder->full_name, IMAPX_JOB_EXPUNGE, NULL)) { + if (imapx_is_job_in_queue (is, full_name, IMAPX_JOB_EXPUNGE, NULL)) { QUEUE_UNLOCK (is); return; } diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c index b766778..007cfb4 100644 --- a/camel/providers/imapx/camel-imapx-store.c +++ b/camel/providers/imapx/camel-imapx-store.c @@ -246,12 +246,13 @@ imapx_get_junk(CamelStore *store, CamelException *ex) folder = store_class->get_junk (store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = g_build_filename(((CamelIMAPXStore *)store)->storage_path, "system", "Junk.cmeta", NULL); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; @@ -267,12 +268,13 @@ imapx_get_trash (CamelStore *store, CamelException *ex) folder = store_class->get_trash (store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = g_build_filename(((CamelIMAPXStore *)store)->storage_path, "system", "Trash.cmeta", NULL); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; diff --git a/camel/providers/imapx/camel-imapx-summary.c b/camel/providers/imapx/camel-imapx-summary.c index 5fd38f2..38e726c 100644 --- a/camel/providers/imapx/camel-imapx-summary.c +++ b/camel/providers/imapx/camel-imapx-summary.c @@ -158,18 +158,21 @@ uid_compare (gconstpointer va, gconstpointer vb) * Returns: A new CamelIMAPXSummary object. **/ CamelFolderSummary * -camel_imapx_summary_new (struct _CamelFolder *folder, const gchar *filename) +camel_imapx_summary_new (CamelFolder *folder, const gchar *filename) { + CamelStore *parent_store; CamelFolderSummary *summary; CamelException ex; camel_exception_init (&ex); + parent_store = camel_folder_get_parent_store (folder); + summary = g_object_new (CAMEL_TYPE_IMAPX_SUMMARY, NULL); summary->folder = folder; /* Don't do DB sort. Its pretty slow to load */ if (folder && 0) { - camel_db_set_collate (folder->parent_store->cdb_r, "uid", "imapx_uid_sort", (CamelDBCollate)sort_uid_cmp); + camel_db_set_collate (parent_store->cdb_r, "uid", "imapx_uid_sort", (CamelDBCollate)sort_uid_cmp); summary->sort_by = "uid"; summary->collate = "imapx_uid_sort"; } diff --git a/camel/providers/imapx/camel-imapx-utils.c b/camel/providers/imapx/camel-imapx-utils.c index 569ceab..386d97f 100644 --- a/camel/providers/imapx/camel-imapx-utils.c +++ b/camel/providers/imapx/camel-imapx-utils.c @@ -347,18 +347,25 @@ void imapx_update_store_summary (CamelFolder *folder) { CamelStoreInfo *si; + CamelStore *parent_store; + const gchar *full_name; - si = camel_store_summary_path ((CamelStoreSummary *) ((CamelIMAPXStore *) folder->parent_store)->summary, folder->full_name); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + si = camel_store_summary_path ((CamelStoreSummary *) ((CamelIMAPXStore *) parent_store)->summary, full_name); if (si) { guint32 unread, total; - camel_object_get(folder, NULL, CAMEL_FOLDER_TOTAL, &total, CAMEL_FOLDER_UNREAD, &unread, NULL); + total = camel_folder_summary_count (folder->summary); + unread = folder->summary->unread_count; + if (si->unread != unread || si->total != total) { si->unread = unread; si->total = total; - camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) folder->parent_store)->summary); - camel_store_summary_save ((CamelStoreSummary *)((CamelIMAPXStore *) folder->parent_store)->summary); + camel_store_summary_touch ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary); + camel_store_summary_save ((CamelStoreSummary *)((CamelIMAPXStore *) parent_store)->summary); } } } diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c index d9f903c..0884c19 100644 --- a/camel/providers/local/camel-local-folder.c +++ b/camel/providers/local/camel-local-folder.c @@ -55,10 +55,12 @@ (G_TYPE_INSTANCE_GET_PRIVATE \ ((obj), CAMEL_TYPE_LOCAL_FOLDER, CamelLocalFolderPrivate)) -static GSList *local_folder_properties; - -static gint local_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args); -static gint local_setv(CamelObject *object, CamelException *ex, CamelArgV *args); +/* The custom property ID is a CamelArg artifact. + * It still identifies the property in state files. */ +enum { + PROP_0, + PROP_INDEX_BODY = 0x2400 +}; static gint local_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex); static void local_unlock(CamelLocalFolder *lf); @@ -77,13 +79,43 @@ static GPtrArray * local_get_uncached_uids (CamelFolder *folder, GPtrArray * uid static void local_delete(CamelFolder *folder); static void local_rename(CamelFolder *folder, const gchar *newname); -static CamelProperty local_property_list[] = { - { CAMEL_LOCAL_FOLDER_INDEX_BODY, "index_body", N_("Index message body data") }, -}; - G_DEFINE_TYPE (CamelLocalFolder, camel_local_folder, CAMEL_TYPE_FOLDER) static void +local_folder_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_INDEX_BODY: + camel_local_folder_set_index_body ( + CAMEL_LOCAL_FOLDER (object), + g_value_get_boolean (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +local_folder_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_INDEX_BODY: + g_value_set_boolean ( + value, camel_local_folder_get_index_body ( + CAMEL_LOCAL_FOLDER (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void local_folder_dispose (GObject *object) { CamelFolder *folder; @@ -138,22 +170,83 @@ local_folder_finalize (GObject *object) } static void +local_folder_constructed (GObject *object) +{ + CamelFolder *folder; + CamelStore *parent_store; + CamelURL *url; + const gchar *full_name; + const gchar *tmp; + gchar *description; + gchar *path; + + folder = CAMEL_FOLDER (object); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + url = CAMEL_SERVICE (parent_store)->url; + if (url->path == NULL) + return; + + path = g_strdup_printf ("%s/%s", url->path, full_name); + + if ((tmp = getenv ("HOME")) && strncmp (tmp, path, strlen (tmp)) == 0) + /* Translators: This is used for a folder description, + * for folders being under $HOME. The first %s is replaced + * with a relative path under $HOME, the second %s is + * replaced with a protocol name, like mbox/maldir/... */ + description = g_strdup_printf ( + _("~%s (%s)"), + path + strlen (tmp), + url->protocol); + else if ((tmp = "/var/spool/mail") && strncmp (tmp, path, strlen (tmp)) == 0) + /* Translators: This is used for a folder description, for + * folders being under /var/spool/mail. The first %s is + * replaced with a relative path under /var/spool/mail, + * the second %s is replaced with a protocol name, like + * mbox/maldir/... */ + description = g_strdup_printf ( + _("mailbox: %s (%s)"), + path + strlen (tmp), + url->protocol); + else if ((tmp = "/var/mail") && strncmp (tmp, path, strlen (tmp)) == 0) + /* Translators: This is used for a folder description, for + * folders being under /var/mail. The first %s is replaced + * with a relative path under /var/mail, the second %s is + * replaced with a protocol name, like mbox/maldir/... */ + description = g_strdup_printf ( + _("mailbox: %s (%s)"), + path + strlen (tmp), + url->protocol); + else + /* Translators: This is used for a folder description. + * The first %s is replaced with a folder's full path, + * the second %s is replaced with a protocol name, like + * mbox/maldir/... */ + description = g_strdup_printf ( + _("%s (%s)"), path, + url->protocol); + + camel_folder_set_description (folder, description); + + g_free (description); + g_free (path); +} + +static void camel_local_folder_class_init (CamelLocalFolderClass *class) { GObjectClass *object_class; - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; - gint ii; g_type_class_add_private (class, sizeof (CamelLocalFolderPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = local_folder_set_property; + object_class->get_property = local_folder_get_property; object_class->dispose = local_folder_dispose; object_class->finalize = local_folder_finalize; - - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = local_getv; - camel_object_class->setv = local_setv; + object_class->constructed = local_folder_constructed; folder_class = CAMEL_FOLDER_CLASS (class); folder_class->refresh_info = local_refresh_info; @@ -170,12 +263,16 @@ camel_local_folder_class_init (CamelLocalFolderClass *class) class->lock = local_lock; class->unlock = local_unlock; - for (ii = 0; ii < G_N_ELEMENTS (local_property_list); ii++) { - local_property_list[ii].description = - _(local_property_list[ii].description); - local_folder_properties = g_slist_prepend ( - local_folder_properties, &local_property_list[ii]); - } + g_object_class_install_property ( + object_class, + PROP_INDEX_BODY, + g_param_spec_boolean ( + "index-body", + "Index Body", + N_("Index message body data"), + FALSE, + G_PARAM_READWRITE | + CAMEL_PARAM_PERSISTENT)); } static void @@ -199,12 +296,11 @@ camel_local_folder_init (CamelLocalFolder *local_folder) } CamelLocalFolder * -camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, const gchar *full_name, guint32 flags, CamelException *ex) +camel_local_folder_construct(CamelLocalFolder *lf, guint32 flags, CamelException *ex) { - CamelFolderInfo *fi; CamelFolder *folder; + CamelFolderInfo *fi; const gchar *root_dir_path; - gchar *name; gchar *tmp, *statepath; #ifndef G_OS_WIN32 gchar folder_path[PATH_MAX]; @@ -212,13 +308,17 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con #endif gint forceindex, len; CamelURL *url; - CamelLocalStore *ls = (CamelLocalStore *)parent_store; + CamelLocalStore *ls; + CamelStore *parent_store; + const gchar *full_name; + const gchar *name; - folder = (CamelFolder *)lf; + folder = CAMEL_FOLDER (lf); + name = camel_folder_get_name (folder); + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); - name = g_path_get_basename(full_name); - - camel_folder_construct(folder, parent_store, full_name, name); + ls = CAMEL_LOCAL_STORE (parent_store); root_dir_path = camel_local_store_get_toplevel_dir(ls); /* strip the trailing '/' which is always present */ @@ -235,15 +335,15 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con lf->index_path = camel_local_store_get_meta_path(ls, full_name, ".ibex"); statepath = camel_local_store_get_meta_path(ls, full_name, ".cmeta"); - camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, statepath, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (lf), statepath); g_free(statepath); lf->flags = flags; - if (camel_object_state_read(lf) == -1) { + if (camel_object_state_read (CAMEL_OBJECT (lf)) == -1) { /* No metadata - load defaults and persitify */ - camel_object_set(lf, NULL, CAMEL_LOCAL_FOLDER_INDEX_BODY, TRUE, 0); - camel_object_state_write(lf); + camel_local_folder_set_index_body (lf, TRUE); + camel_object_state_write (CAMEL_OBJECT (lf)); } #ifndef G_OS_WIN32 /* follow any symlinks to the mailbox */ @@ -291,7 +391,6 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con /* we sync here so that any hard work setting up the folder isn't lost */ if (camel_local_summary_sync((CamelLocalSummary *)folder->summary, FALSE, lf->changes, ex) == -1) { g_object_unref (CAMEL_OBJECT (folder)); - g_free(name); return NULL; } } @@ -325,10 +424,32 @@ camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, con camel_object_trigger_event(CAMEL_OBJECT (parent_store), "folder_created", fi); camel_folder_info_free(fi); } - g_free(name); + return lf; } +gboolean +camel_local_folder_get_index_body (CamelLocalFolder *local_folder) +{ + g_return_val_if_fail (CAMEL_IS_LOCAL_FOLDER (local_folder), FALSE); + + return (local_folder->flags & CAMEL_STORE_FOLDER_BODY_INDEX); +} + +void +camel_local_folder_set_index_body (CamelLocalFolder *local_folder, + gboolean index_body) +{ + g_return_if_fail (CAMEL_IS_LOCAL_FOLDER (local_folder)); + + if (index_body) + local_folder->flags |= CAMEL_STORE_FOLDER_BODY_INDEX; + else + local_folder->flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX; + + g_object_notify (G_OBJECT (local_folder), "index-body"); +} + /* lock the folder, may be called repeatedly (with matching unlock calls), with type the same or less than the first call */ gint camel_local_folder_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex) @@ -359,117 +480,6 @@ gint camel_local_folder_unlock(CamelLocalFolder *lf) } static gint -local_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_OBJECT_ARG_DESCRIPTION: - if (folder->description == NULL) { - const gchar *tmp; - gchar *path; - - /* check some common prefixes to shorten the name */ - tmp = ((CamelService *)folder->parent_store)->url->path; - if (tmp == NULL) - goto skip; - - path = g_alloca (strlen (tmp) + strlen (folder->full_name) + 1); - sprintf (path, "%s/%s", tmp, folder->full_name); - - if ((tmp = getenv("HOME")) && strncmp(tmp, path, strlen(tmp)) == 0) - /* Translators: This is used for a folder description, for folders being under $HOME. - The first %s is replaced with a relative path under $HOME, - the second %s is replaced with a protocol name, like mbox/maldir/... */ - folder->description = g_strdup_printf(_("~%s (%s)"), path+strlen(tmp), - ((CamelService *)folder->parent_store)->url->protocol); - else if ((tmp = "/var/spool/mail") && strncmp(tmp, path, strlen(tmp)) == 0) - /* Translators: This is used for a folder description, for folders being under /var/spool/mail. - The first %s is replaced with a relative path under /var/spool/mail, - the second %s is replaced with a protocol name, like mbox/maldir/... */ - folder->description = g_strdup_printf(_("mailbox: %s (%s)"), path+strlen(tmp), - ((CamelService *)folder->parent_store)->url->protocol); - else if ((tmp = "/var/mail") && strncmp(tmp, path, strlen(tmp)) == 0) - /* Translators: This is used for a folder description, for folders being under /var/mail. - The first %s is replaced with a relative path under /var/mail, - the second %s is replaced with a protocol name, like mbox/maldir/... */ - folder->description = g_strdup_printf(_("mailbox: %s (%s)"), path+strlen(tmp), - ((CamelService *)folder->parent_store)->url->protocol); - else - /* Translators: This is used for a folder description. - The first %s is replaced with a folder's full path, - the second %s is replaced with a protocol name, like mbox/maldir/... */ - folder->description = g_strdup_printf(_("%s (%s)"), path, - ((CamelService *)folder->parent_store)->url->protocol); - } - *arg->ca_str = folder->description; - break; - - case CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES: - case CAMEL_FOLDER_ARG_PROPERTIES: { - CamelArgGetV props; - - props.argc = 1; - props.argv[0] = *arg; - ((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, ex, &props); - *arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(local_folder_properties)); - - break; } - - case CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY: - /* FIXME: remove this from sotre flags */ - *arg->ca_int = (((CamelLocalFolder *)folder)->flags & CAMEL_STORE_FOLDER_BODY_INDEX) != 0; - break; - - default: skip: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return ((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, ex, args); -} - -static gint -local_setv(CamelObject *object, CamelException *ex, CamelArgV *args) -{ - gint i; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArg *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY: - /* FIXME: implement */ - /* TODO: When turning on (off?) the index, we want to launch a task for it, - and make sure we dont have multiple tasks doing the same job */ - if (arg->ca_int) - ((CamelLocalFolder *)object)->flags |= CAMEL_STORE_FOLDER_BODY_INDEX; - else - ((CamelLocalFolder *)object)->flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX; - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return ((CamelObjectClass *)camel_local_folder_parent_class)->setv(object, ex, args); -} - -static gint local_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex) { return 0; @@ -517,7 +527,7 @@ local_sync(CamelFolder *folder, gboolean expunge, CamelException *ex) if (camel_local_folder_lock(lf, CAMEL_LOCK_WRITE, ex) == -1) return FALSE; - camel_object_state_write(lf); + camel_object_state_write (CAMEL_OBJECT (lf)); /* if sync fails, we'll pass it up on exit through ex */ camel_local_summary_sync((CamelLocalSummary *)folder->summary, expunge, lf->changes, ex); @@ -557,7 +567,11 @@ local_rename(CamelFolder *folder, const gchar *newname) { CamelLocalFolder *lf = (CamelLocalFolder *)folder; gchar *statepath; - CamelLocalStore *ls = (CamelLocalStore *)folder->parent_store; + CamelLocalStore *ls; + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + ls = CAMEL_LOCAL_STORE (parent_store); d(printf("renaming local folder paths to '%s'\n", newname)); @@ -571,7 +585,7 @@ local_rename(CamelFolder *folder, const gchar *newname) lf->summary_path = camel_local_store_get_meta_path(ls, newname, ".ev-summary"); lf->index_path = camel_local_store_get_meta_path(ls, newname, ".ibex"); statepath = camel_local_store_get_meta_path(ls, newname, ".cmeta"); - camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, statepath, NULL); + camel_object_set_state_filename (CAMEL_OBJECT (lf), statepath); g_free(statepath); /* FIXME: Poke some internals, sigh */ diff --git a/camel/providers/local/camel-local-folder.h b/camel/providers/local/camel-local-folder.h index 4314854..19d405b 100644 --- a/camel/providers/local/camel-local-folder.h +++ b/camel/providers/local/camel-local-folder.h @@ -47,16 +47,6 @@ G_BEGIN_DECLS -enum { - CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY = CAMEL_FOLDER_ARG_LAST, - - CAMEL_LOCAL_FOLDER_ARG_LAST = CAMEL_FOLDER_ARG_LAST + 0x100 -}; - -enum { - CAMEL_LOCAL_FOLDER_INDEX_BODY = CAMEL_LOCAL_FOLDER_ARG_INDEX_BODY | CAMEL_ARG_BOO -}; - typedef struct _CamelLocalFolder CamelLocalFolder; typedef struct _CamelLocalFolderClass CamelLocalFolderClass; typedef struct _CamelLocalFolderPrivate CamelLocalFolderPrivate; @@ -95,19 +85,31 @@ struct _CamelLocalFolderClass { void (*unlock)(CamelLocalFolder *); }; -/* public methods */ -/* flags are taken from CAMEL_STORE_FOLDER_* flags */ -CamelLocalFolder *camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, - const gchar *full_name, guint32 flags, CamelException *ex); +GType camel_local_folder_get_type (void); -GType camel_local_folder_get_type(void); +/* flags are taken from CAMEL_STORE_FOLDER_* flags */ +CamelLocalFolder * + camel_local_folder_construct (CamelLocalFolder *local_folder, + guint32 flags, + CamelException *ex); +gboolean camel_local_folder_get_index_body + (CamelLocalFolder *local_folder); +void camel_local_folder_set_index_body + (CamelLocalFolder *local_folder, + gboolean index_body); /* Lock the folder for internal use. May be called repeatedly */ /* UNIMPLEMENTED */ -gint camel_local_folder_lock(CamelLocalFolder *lf, CamelLockType type, CamelException *ex); -gint camel_local_folder_unlock(CamelLocalFolder *lf); - -void set_cannot_get_message_ex (CamelException *ex, ExceptionId exId, const gchar *msgID, const gchar *folder_path, const gchar *detailErr); +gint camel_local_folder_lock (CamelLocalFolder *local_folder, + CamelLockType type, + CamelException *ex); +gint camel_local_folder_unlock (CamelLocalFolder *local_folder); + +void set_cannot_get_message_ex (CamelException *ex, + ExceptionId exId, + const gchar *msgID, + const gchar *folder_path, + const gchar *detailErr); G_END_DECLS diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c index 072407c..83476ee 100644 --- a/camel/providers/local/camel-local-store.c +++ b/camel/providers/local/camel-local-store.c @@ -200,12 +200,13 @@ local_get_trash (CamelStore *store, folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_trash (store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = camel_local_store_get_meta_path(store, CAMEL_VTRASH_NAME, ".cmeta"); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; @@ -221,12 +222,13 @@ local_get_junk (CamelStore *store, folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_junk (store, ex); if (folder) { + CamelObject *object = CAMEL_OBJECT (folder); gchar *state = camel_local_store_get_meta_path(store, CAMEL_VJUNK_NAME, ".cmeta"); - camel_object_set(folder, NULL, CAMEL_OBJECT_STATE_FILE, state, NULL); + camel_object_set_state_filename (object, state); g_free(state); /* no defaults? */ - camel_object_state_read(folder); + camel_object_state_read (object); } return folder; @@ -462,8 +464,14 @@ delete_folder (CamelStore *store, str = NULL; camel_exception_init (&lex); if ((lf = camel_store_get_folder (store, folder_name, 0, &lex))) { - camel_object_get (lf, NULL, CAMEL_OBJECT_STATE_FILE, &str, NULL); - camel_object_set (lf, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL); + CamelObject *object = CAMEL_OBJECT (lf); + const gchar *state_filename; + + state_filename = camel_object_get_state_filename (object); + str = g_strdup (state_filename); + + camel_object_set_state_filename (object, NULL); + g_object_unref (lf); } else { camel_exception_clear (&lex); diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c index ee070d7..dcab594 100644 --- a/camel/providers/local/camel-maildir-folder.c +++ b/camel/providers/local/camel-maildir-folder.c @@ -52,47 +52,12 @@ static gboolean maildir_transfer_messages_to (CamelFolder *source, GPtrArray *ui G_DEFINE_TYPE (CamelMaildirFolder, camel_maildir_folder, CAMEL_TYPE_LOCAL_FOLDER) -static gint -maildir_folder_getv (CamelObject *object, - CamelException *ex, - CamelArgGetV *args) -{ - CamelFolder *folder = (CamelFolder *)object; - gint i; - guint32 tag; - - for (i=0;iargc;i++) { - CamelArgGet *arg = &args->argv[i]; - - tag = arg->tag; - - switch (tag & CAMEL_ARG_TAG) { - case CAMEL_FOLDER_ARG_NAME: - if (!strcmp(folder->full_name, ".")) - *arg->ca_str = _("Inbox"); - else - *arg->ca_str = folder->name; - break; - default: - continue; - } - - arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE; - } - - return ((CamelObjectClass *)camel_maildir_folder_parent_class)->getv(object, ex, args); -} - static void camel_maildir_folder_class_init (CamelMaildirFolderClass *class) { - CamelObjectClass *camel_object_class; CamelFolderClass *folder_class; CamelLocalFolderClass *local_folder_class; - camel_object_class = CAMEL_OBJECT_CLASS (class); - camel_object_class->getv = maildir_folder_getv; - folder_class = CAMEL_FOLDER_CLASS (class); folder_class->append_message = maildir_append_message; folder_class->get_message = maildir_get_message; @@ -117,18 +82,28 @@ camel_maildir_folder_new (CamelStore *parent_store, CamelException *ex) { CamelFolder *folder; + gchar *basename; d(printf("Creating maildir folder: %s\n", full_name)); - folder = g_object_new (CAMEL_TYPE_MAILDIR_FOLDER, NULL); + if (g_strcmp0 (full_name, ".") == 0) + basename = g_strdup (_("Inbox")); + else + basename = g_path_get_basename (full_name); + + folder = g_object_new ( + CAMEL_TYPE_MAILDIR_FOLDER, + "name", basename, "full-name", full_name, + "parent-store", parent_store, NULL); if (parent_store->flags & CAMEL_STORE_FILTER_INBOX && strcmp(full_name, ".") == 0) folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT; folder = (CamelFolder *) camel_local_folder_construct ( - CAMEL_LOCAL_FOLDER (folder), - parent_store, full_name, flags, ex); + CAMEL_LOCAL_FOLDER (folder), flags, ex); + + g_free (basename); return folder; } diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c index faefcac..4bab05f 100644 --- a/camel/providers/local/camel-maildir-summary.c +++ b/camel/providers/local/camel-maildir-summary.c @@ -151,7 +151,10 @@ CamelMaildirSummary o = g_object_new (CAMEL_TYPE_MAILDIR_SUMMARY, NULL); ((CamelFolderSummary *)o)->folder = folder; if (folder) { - camel_db_set_collate (folder->parent_store->cdb_r, "dreceived", NULL, NULL); + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + camel_db_set_collate (parent_store->cdb_r, "dreceived", NULL, NULL); ((CamelFolderSummary *)o)->sort_by = "dreceived"; ((CamelFolderSummary *)o)->collate = NULL; } diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c index 6c9096e..2cf2656 100644 --- a/camel/providers/local/camel-mbox-folder.c +++ b/camel/providers/local/camel-mbox-folder.c @@ -87,12 +87,18 @@ CamelFolder * camel_mbox_folder_new(CamelStore *parent_store, const gchar *full_name, guint32 flags, CamelException *ex) { CamelFolder *folder; + gchar *basename; - d(printf("Creating mbox folder: %s in %s\n", full_name, camel_local_store_get_toplevel_dir((CamelLocalStore *)parent_store))); + basename = g_path_get_basename (full_name); - folder = g_object_new (CAMEL_TYPE_MBOX_FOLDER, NULL); - folder = (CamelFolder *)camel_local_folder_construct((CamelLocalFolder *)folder, - parent_store, full_name, flags, ex); + folder = g_object_new ( + CAMEL_TYPE_MBOX_FOLDER, + "name", basename, "full-name", full_name, + "parent-store", parent_store, NULL); + folder = (CamelFolder *)camel_local_folder_construct ( + (CamelLocalFolder *)folder, flags, ex); + + g_free (basename); return folder; } diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c index fde5b5f..be2e915 100644 --- a/camel/providers/local/camel-mbox-store.c +++ b/camel/providers/local/camel-mbox-store.c @@ -302,8 +302,14 @@ delete_folder(CamelStore *store, const gchar *folder_name, CamelException *ex) path = NULL; camel_exception_init(&lex); if ((lf = camel_store_get_folder(store, folder_name, 0, &lex))) { - camel_object_get(lf, NULL, CAMEL_OBJECT_STATE_FILE, &path, NULL); - camel_object_set(lf, NULL, CAMEL_OBJECT_STATE_FILE, NULL, NULL); + CamelObject *object = CAMEL_OBJECT (lf); + const gchar *state_filename; + + state_filename = camel_object_get_state_filename (object); + path = g_strdup (state_filename); + + camel_object_set_state_filename (object, NULL); + g_object_unref (lf); } else { camel_exception_clear(&lex); diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c index 72ebb32..eada970 100644 --- a/camel/providers/local/camel-mbox-summary.c +++ b/camel/providers/local/camel-mbox-summary.c @@ -187,9 +187,12 @@ camel_mbox_summary_new(struct _CamelFolder *folder, const gchar *filename, const ((CamelFolderSummary *)new)->folder = folder; if (folder) { CamelFolderSummary *summary = (CamelFolderSummary *)new; + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); /* Set the functions for db sorting */ - camel_db_set_collate (folder->parent_store->cdb_r, "bdata", "mbox_frompos_sort", (CamelDBCollate)camel_local_frompos_sort); + camel_db_set_collate (parent_store->cdb_r, "bdata", "mbox_frompos_sort", (CamelDBCollate)camel_local_frompos_sort); summary->sort_by = "bdata"; summary->collate = "mbox_frompos_sort"; @@ -476,6 +479,8 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan CamelMboxSummary *mbs = (CamelMboxSummary *)cls; CamelMimeParser *mp; CamelMboxMessageInfo *mi; + CamelStore *parent_store; + const gchar *full_name; gint fd; gint ok = 0; struct stat st; @@ -586,7 +591,9 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan } /* Delete all in one transaction */ - camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex); + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex); g_slist_foreach (del, (GFunc) camel_pstring_free, NULL); g_slist_free (del); @@ -965,6 +972,8 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf struct stat st; CamelMboxSummary *mbs = (CamelMboxSummary *)cls; CamelFolderSummary *s = (CamelFolderSummary *)cls; + CamelStore *parent_store; + const gchar *full_name; gint i; gint quick = TRUE, work=FALSE; gint ret; @@ -974,6 +983,9 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf if (camel_local_summary_check(cls, changeinfo, ex) == -1) return -1; + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + /* Sync only the changes */ summary = camel_folder_summary_get_changed ((CamelFolderSummary *)mbs); @@ -994,7 +1006,7 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf if (quick && expunge) { guint32 dcount =0; - if (camel_db_count_deleted_message_info (s->folder->parent_store->cdb_w, s->folder->full_name, &dcount, ex) == -1) + if (camel_db_count_deleted_message_info (parent_store->cdb_w, full_name, &dcount, ex) == -1) return -1; if (dcount) quick = FALSE; @@ -1041,6 +1053,8 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh CamelMboxSummary *mbs = (CamelMboxSummary *)cls; CamelFolderSummary *s = (CamelFolderSummary *)mbs; CamelMimeParser *mp = NULL; + CamelStore *parent_store; + const gchar *full_name; gint i, count; CamelMboxMessageInfo *info = NULL; gchar *buffer, *xevnew = NULL; @@ -1210,7 +1224,10 @@ camel_mbox_summary_sync_mbox(CamelMboxSummary *cls, guint32 flags, CamelFolderCh info = NULL; } } - camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex); + + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex); g_slist_foreach (del, (GFunc) camel_pstring_free, NULL); g_slist_free (del); diff --git a/camel/providers/local/camel-mh-folder.c b/camel/providers/local/camel-mh-folder.c index d016d09..4fdafee 100644 --- a/camel/providers/local/camel-mh-folder.c +++ b/camel/providers/local/camel-mh-folder.c @@ -75,13 +75,20 @@ camel_mh_folder_new (CamelStore *parent_store, CamelException *ex) { CamelFolder *folder; + gchar *basename; d(printf("Creating mh folder: %s\n", full_name)); - folder = g_object_new (CAMEL_TYPE_MH_FOLDER, NULL); + basename = g_path_get_basename (full_name); + + folder = g_object_new ( + CAMEL_TYPE_MH_FOLDER, + "name", basename, "full-name", full_name, + "parent-store", parent_store, NULL); folder = (CamelFolder *) camel_local_folder_construct ( - CAMEL_LOCAL_FOLDER (folder), - parent_store, full_name, flags, ex); + CAMEL_LOCAL_FOLDER (folder), flags, ex); + + g_free (basename); return folder; } diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c index f118007..33f3ed7 100644 --- a/camel/providers/local/camel-mh-summary.c +++ b/camel/providers/local/camel-mh-summary.c @@ -104,7 +104,10 @@ camel_mh_summary_new (CamelFolder *folder, o = g_object_new (CAMEL_TYPE_MH_SUMMARY, NULL); ((CamelFolderSummary *)o)->folder = folder; if (folder) { - camel_db_set_collate (folder->parent_store->cdb_r, "uid", "mh_uid_sort", (CamelDBCollate)camel_local_frompos_sort); + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + camel_db_set_collate (parent_store->cdb_r, "uid", "mh_uid_sort", (CamelDBCollate)camel_local_frompos_sort); ((CamelFolderSummary *)o)->sort_by = "uid"; ((CamelFolderSummary *)o)->collate = "mh_uid_sort"; } diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c index 2cae7d0..98511b5 100644 --- a/camel/providers/local/camel-spool-folder.c +++ b/camel/providers/local/camel-spool-folder.c @@ -71,22 +71,29 @@ camel_spool_folder_new (CamelStore *parent_store, CamelException *ex) { CamelFolder *folder; + gchar *basename; - d(printf("Creating spool folder: %s in %s\n", full_name, camel_local_store_get_toplevel_dir((CamelLocalStore *)parent_store))); + basename = g_path_get_basename (full_name); - folder = g_object_new (CAMEL_TYPE_SPOOL_FOLDER, NULL); + folder = g_object_new ( + CAMEL_TYPE_SPOOL_FOLDER, + "name", basename, "full-name", full_name, + "parent-store", parent_store, NULL); if (parent_store->flags & CAMEL_STORE_FILTER_INBOX && strcmp(full_name, "INBOX") == 0) folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT; flags &= ~CAMEL_STORE_FOLDER_BODY_INDEX; - folder = (CamelFolder *)camel_local_folder_construct((CamelLocalFolder *)folder, parent_store, full_name, flags, ex); + folder = (CamelFolder *)camel_local_folder_construct ( + (CamelLocalFolder *)folder, flags, ex); if (folder) { if (camel_url_get_param(((CamelService *)parent_store)->url, "xstatus")) camel_mbox_summary_xstatus((CamelMboxSummary *)folder->summary, TRUE); } + g_free (basename); + return folder; } diff --git a/camel/providers/local/camel-spool-summary.c b/camel/providers/local/camel-spool-summary.c index 098f76c..aa75427 100644 --- a/camel/providers/local/camel-spool-summary.c +++ b/camel/providers/local/camel-spool-summary.c @@ -88,7 +88,10 @@ camel_spool_summary_new (CamelFolder *folder, new = g_object_new (CAMEL_TYPE_SPOOL_SUMMARY, NULL); ((CamelFolderSummary *)new)->folder = folder; if (folder) { - camel_db_set_collate (folder->parent_store->cdb_r, "bdata", "spool_frompos_sort", (CamelDBCollate)camel_local_frompos_sort); + CamelStore *parent_store; + + parent_store = camel_folder_get_parent_store (folder); + camel_db_set_collate (parent_store->cdb_r, "bdata", "spool_frompos_sort", (CamelDBCollate)camel_local_frompos_sort); ((CamelFolderSummary *)new)->sort_by = "bdata"; ((CamelFolderSummary *)new)->collate = "spool_frompos_sort"; } diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index 8965048..d2c26c2 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -70,28 +70,37 @@ nntp_folder_finalize (GObject *object) } gboolean -camel_nntp_folder_selected (CamelNNTPFolder *folder, +camel_nntp_folder_selected (CamelNNTPFolder *nntp_folder, gchar *line, CamelException *ex) { + CamelFolder *folder; + CamelStore *parent_store; + + folder = CAMEL_FOLDER (nntp_folder); + parent_store = camel_folder_get_parent_store (folder); + return camel_nntp_summary_check ( - (CamelNNTPSummary *)((CamelFolder *)folder)->summary, - (CamelNNTPStore *)((CamelFolder *)folder)->parent_store, - line, folder->changes, ex); + CAMEL_NNTP_SUMMARY (folder->summary), + CAMEL_NNTP_STORE (parent_store), + line, nntp_folder->changes, ex); } static gboolean nntp_folder_refresh_info_online (CamelFolder *folder, CamelException *ex) { + CamelStore *parent_store; CamelNNTPStore *nntp_store; CamelFolderChangeInfo *changes = NULL; CamelNNTPFolder *nntp_folder; gchar *line; gboolean success; - nntp_store = (CamelNNTPStore *) folder->parent_store; - nntp_folder = (CamelNNTPFolder *) folder; + parent_store = camel_folder_get_parent_store (folder); + + nntp_folder = CAMEL_NNTP_FOLDER (folder); + nntp_store = CAMEL_NNTP_STORE (parent_store); camel_service_lock (CAMEL_SERVICE (nntp_store), CS_REC_CONNECT_LOCK); @@ -134,10 +143,13 @@ unset_flagged_flag (const gchar *uid, CamelFolderSummary *summary) static gboolean nntp_folder_sync (CamelFolder *folder, CamelException *ex) { + CamelStore *parent_store; GPtrArray *changed; gboolean success; - camel_service_lock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + parent_store = camel_folder_get_parent_store (folder); + + camel_service_lock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); changed = camel_folder_summary_get_changed (folder->summary); if (changed) { @@ -148,7 +160,7 @@ nntp_folder_sync (CamelFolder *folder, CamelException *ex) } success = camel_folder_summary_save_to_db (folder->summary, ex); - camel_service_unlock (CAMEL_SERVICE (folder->parent_store), CS_REC_CONNECT_LOCK); + camel_service_unlock (CAMEL_SERVICE (parent_store), CS_REC_CONNECT_LOCK); return success; } @@ -168,9 +180,13 @@ nntp_folder_sync_offline (CamelFolder *folder, CamelException *ex) static gchar * nntp_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex) { - CamelNNTPStore *nntp_store = (CamelNNTPStore *) folder->parent_store; + CamelStore *parent_store; + CamelNNTPStore *nntp_store; gchar *article, *msgid; + parent_store = camel_folder_get_parent_store (folder); + nntp_store = CAMEL_NNTP_STORE (parent_store); + article = alloca(strlen(uid)+1); strcpy(article, uid); msgid = strchr (article, ','); @@ -188,11 +204,17 @@ nntp_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex) static CamelStream * nntp_folder_download_message (CamelNNTPFolder *nntp_folder, const gchar *id, const gchar *msgid, CamelException *ex) { - CamelNNTPStore *nntp_store = (CamelNNTPStore *) ((CamelFolder *) nntp_folder)->parent_store; + CamelFolder *folder; + CamelStore *parent_store; + CamelNNTPStore *nntp_store; CamelStream *stream = NULL; gint ret; gchar *line; + folder = CAMEL_FOLDER (nntp_folder); + parent_store = camel_folder_get_parent_store (folder); + nntp_store = CAMEL_NNTP_STORE (parent_store); + ret = camel_nntp_command (nntp_store, ex, nntp_folder, &line, "article %s", id); if (ret == 220) { stream = camel_data_cache_add (nntp_store->cache, "cache", msgid, NULL); @@ -235,11 +257,17 @@ nntp_folder_cache_message (CamelDiscoFolder *disco_folder, const gchar *uid, CamelException *ex) { - CamelNNTPStore *nntp_store = (CamelNNTPStore *)((CamelFolder *) disco_folder)->parent_store; + CamelFolder *folder; + CamelStore *parent_store; + CamelNNTPStore *nntp_store; CamelStream *stream; gchar *article, *msgid; gboolean success = TRUE; + folder = CAMEL_FOLDER (disco_folder); + parent_store = camel_folder_get_parent_store (folder); + nntp_store = CAMEL_NNTP_STORE (parent_store); + article = alloca(strlen(uid)+1); strcpy(article, uid); msgid = strchr(article, ','); @@ -268,6 +296,7 @@ nntp_folder_cache_message (CamelDiscoFolder *disco_folder, static CamelMimeMessage * nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) { + CamelStore *parent_store; CamelMimeMessage *message = NULL; CamelNNTPStore *nntp_store; CamelFolderChangeInfo *changes; @@ -275,8 +304,10 @@ nntp_folder_get_message (CamelFolder *folder, const gchar *uid, CamelException * CamelStream *stream = NULL; gchar *article, *msgid; - nntp_store = (CamelNNTPStore *) folder->parent_store; - nntp_folder = (CamelNNTPFolder *) folder; + parent_store = camel_folder_get_parent_store (folder); + + nntp_folder = CAMEL_NNTP_FOLDER (folder); + nntp_store = CAMEL_NNTP_STORE (parent_store); article = alloca(strlen(uid)+1); strcpy(article, uid); @@ -417,16 +448,24 @@ nntp_folder_append_message_online (CamelFolder *folder, gchar **appended_uid, CamelException *ex) { - CamelNNTPStore *nntp_store = (CamelNNTPStore *) folder->parent_store; - CamelStream *stream = (CamelStream*)nntp_store->stream; + CamelStore *parent_store; + CamelNNTPStore *nntp_store; CamelStream *filtered_stream; + CamelStream *stream; CamelMimeFilter *crlffilter; gint ret; guint u; struct _camel_header_raw *header, *savedhdrs, *n, *tail; + const gchar *full_name; gchar *group, *line; gboolean success = TRUE; + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + + nntp_store = CAMEL_NNTP_STORE (parent_store); + stream = CAMEL_STREAM (nntp_store->stream); + camel_service_lock (CAMEL_SERVICE (nntp_store), CS_REC_CONNECT_LOCK); /* send 'POST' command */ @@ -448,7 +487,7 @@ nntp_folder_append_message_online (CamelFolder *folder, } /* the 'Newsgroups: ' header */ - group = g_strdup_printf ("Newsgroups: %s\r\n", folder->full_name); + group = g_strdup_printf ("Newsgroups: %s\r\n", full_name); /* setup stream filtering */ crlffilter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_ENCODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS); @@ -604,18 +643,21 @@ camel_nntp_folder_new (CamelStore *parent, /* If this doesn't work, stuff wont save, but let it continue anyway */ g_mkdir_with_parents (root, 0700); - folder = g_object_new (CAMEL_TYPE_NNTP_FOLDER, NULL); + folder = g_object_new ( + CAMEL_TYPE_NNTP_FOLDER, + "name", folder_name, + "full-name", folder_name, + "parent-store", parent, NULL); nntp_folder = (CamelNNTPFolder *)folder; - camel_folder_construct (folder, parent, folder_name, folder_name); folder->folder_flags |= CAMEL_FOLDER_HAS_SUMMARY_CAPABILITY|CAMEL_FOLDER_HAS_SEARCH_CAPABILITY; - nntp_folder->storage_path = g_build_filename (root, folder->full_name, NULL); + nntp_folder->storage_path = g_build_filename (root, folder_name, NULL); g_free (root); root = g_strdup_printf ("%s.cmeta", nntp_folder->storage_path); - camel_object_set(nntp_folder, NULL, CAMEL_OBJECT_STATE_FILE, root, NULL); - camel_object_state_read(nntp_folder); + camel_object_set_state_filename (CAMEL_OBJECT (nntp_folder), root); + camel_object_state_read (CAMEL_OBJECT (nntp_folder)); g_free(root); root = g_strdup_printf("%s.ev-summary", nntp_folder->storage_path); diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c index 0745af2..f572143 100644 --- a/camel/providers/nntp/camel-nntp-store.c +++ b/camel/providers/nntp/camel-nntp-store.c @@ -1382,6 +1382,7 @@ camel_nntp_raw_command_auth(CamelNNTPStore *store, CamelException *ex, gchar **l gint camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder *folder, gchar **line, const gchar *fmt, ...) { + const gchar *full_name = NULL; const guchar *p; va_list ap; gint ret, retry; @@ -1394,6 +1395,9 @@ camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder * return -1; } + if (folder != NULL) + full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder)); + retry = 0; do { retry ++; @@ -1411,11 +1415,11 @@ camel_nntp_command (CamelNNTPStore *store, CamelException *ex, CamelNNTPFolder * camel_nntp_stream_set_mode(store->stream, CAMEL_NNTP_STREAM_LINE); if (folder != NULL - && (store->current_folder == NULL || strcmp(store->current_folder, ((CamelFolder *)folder)->full_name) != 0)) { - ret = camel_nntp_raw_command_auth(store, ex, line, "group %s", ((CamelFolder *)folder)->full_name); + && (store->current_folder == NULL || strcmp(store->current_folder, full_name) != 0)) { + ret = camel_nntp_raw_command_auth(store, ex, line, "group %s", full_name); if (ret == 211) { g_free(store->current_folder); - store->current_folder = g_strdup(((CamelFolder *)folder)->full_name); + store->current_folder = g_strdup (full_name); camel_nntp_folder_selected(folder, *line, ex); if (camel_exception_is_set(ex)) { ret = -1; diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c index 03853fe..6012e48 100644 --- a/camel/providers/nntp/camel-nntp-summary.c +++ b/camel/providers/nntp/camel-nntp-summary.c @@ -424,10 +424,15 @@ camel_nntp_summary_check (CamelNNTPSummary *cns, CamelNNTPStore *store, gchar *l gint count; gchar *folder = NULL; CamelNNTPStoreInfo *si; + CamelStore *parent_store; GSList *del = NULL; + const gchar *full_name; s = (CamelFolderSummary *)cns; + full_name = camel_folder_get_full_name (s->folder); + parent_store = camel_folder_get_parent_store (s->folder); + line +=3; n = strtoul(line, &line, 10); f = strtoul(line, &line, 10); @@ -481,7 +486,7 @@ camel_nntp_summary_check (CamelNNTPSummary *cns, CamelNNTPStore *store, gchar *l cns->low = f; } - camel_db_delete_uids (s->folder->parent_store->cdb_w, s->folder->full_name, del, ex); + camel_db_delete_uids (parent_store->cdb_w, full_name, del, ex); g_slist_foreach (del, (GFunc) g_free, NULL); g_slist_free (del); @@ -507,7 +512,7 @@ update: guint32 unread = 0; count = camel_folder_summary_count (s); - camel_db_count_unread_message_info (s->folder->parent_store->cdb_r, s->folder->full_name, &unread, ex); + camel_db_count_unread_message_info (parent_store->cdb_r, full_name, &unread, ex); if (si->info.unread != unread || si->info.total != count diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c index 42c7e4b..a1d7d9c 100644 --- a/camel/providers/pop3/camel-pop3-folder.c +++ b/camel/providers/pop3/camel-pop3-folder.c @@ -53,9 +53,13 @@ pop3_folder_finalize (GObject *object) { CamelPOP3Folder *pop3_folder = CAMEL_POP3_FOLDER (object); CamelPOP3FolderInfo **fi = (CamelPOP3FolderInfo **)pop3_folder->uids->pdata; - CamelPOP3Store *pop3_store = (CamelPOP3Store *)((CamelFolder *)pop3_folder)->parent_store; + CamelPOP3Store *pop3_store; + CamelStore *parent_store; gint i; + parent_store = camel_folder_get_parent_store (CAMEL_FOLDER (object)); + pop3_store = CAMEL_POP3_STORE (parent_store); + if (pop3_folder->uids) { for (i=0;iuids->len;i++,fi++) { if (fi[0]->cmd) { @@ -108,8 +112,10 @@ camel_pop3_folder_new (CamelStore *parent, CamelException *ex) d(printf("opening pop3 INBOX folder\n")); - folder = g_object_new (CAMEL_TYPE_POP3_FOLDER, NULL); - camel_folder_construct (folder, parent, "inbox", "inbox"); + folder = g_object_new ( + CAMEL_TYPE_POP3_FOLDER, + "full-name", "inbox", "name", "inbox", + "parent-store", parent, NULL); /* mt-ok, since we dont have the folder-lock for new() */ if (!camel_folder_refresh_info (folder, ex)) { /* mt-ok */ @@ -173,9 +179,13 @@ cmd_list(CamelPOP3Engine *pe, CamelPOP3Stream *stream, gpointer data) guint len, id, size; guchar *line; CamelFolder *folder = data; - CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store); + CamelStore *parent_store; + CamelPOP3Store *pop3_store; CamelPOP3FolderInfo *fi; + parent_store = camel_folder_get_parent_store (folder); + pop3_store = CAMEL_POP3_STORE (parent_store); + do { ret = camel_pop3_stream_line(stream, &line, &len); if (ret>=0) { @@ -226,12 +236,16 @@ cmd_uidl(CamelPOP3Engine *pe, CamelPOP3Stream *stream, gpointer data) static gboolean pop3_refresh_info (CamelFolder *folder, CamelException *ex) { - CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store); + CamelStore *parent_store; + CamelPOP3Store *pop3_store; CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *) folder; CamelPOP3Command *pcl, *pcu = NULL; gboolean success = TRUE; gint i; + parent_store = camel_folder_get_parent_store (folder); + pop3_store = CAMEL_POP3_STORE (parent_store); + camel_operation_start (NULL, _("Retrieving POP summary")); pop3_folder->uids = g_ptr_array_new (); @@ -289,13 +303,16 @@ pop3_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) { + CamelStore *parent_store; CamelPOP3Folder *pop3_folder; CamelPOP3Store *pop3_store; gint i; CamelPOP3FolderInfo *fi; + parent_store = camel_folder_get_parent_store (folder); + pop3_folder = CAMEL_POP3_FOLDER (folder); - pop3_store = CAMEL_POP3_STORE (folder->parent_store); + pop3_store = CAMEL_POP3_STORE (parent_store); if (pop3_store->delete_after && !expunge) { d(printf("%s(%d): pop3_store->delete_after = [%d], expunge=[%d]\n", @@ -356,6 +373,7 @@ pop3_sync (CamelFolder *folder, static gboolean pop3_get_message_time_from_cache (CamelFolder *folder, const gchar *uid, time_t *message_time) { + CamelStore *parent_store; CamelPOP3Store *pop3_store; CamelStream *stream = NULL; gchar buffer[1]; @@ -365,7 +383,8 @@ pop3_get_message_time_from_cache (CamelFolder *folder, const gchar *uid, time_t g_return_val_if_fail (uid != NULL, FALSE); g_return_val_if_fail (message_time != NULL, FALSE); - pop3_store = CAMEL_POP3_STORE (folder->parent_store); + parent_store = camel_folder_get_parent_store (folder); + pop3_store = CAMEL_POP3_STORE (parent_store); g_return_val_if_fail (pop3_store->cache != NULL, FALSE); @@ -400,6 +419,7 @@ camel_pop3_delete_old (CamelFolder *folder, gint days_to_delete, CamelException *ex) { + CamelStore *parent_store; CamelPOP3Folder *pop3_folder; CamelPOP3FolderInfo *fi; gint i; @@ -407,8 +427,10 @@ camel_pop3_delete_old (CamelFolder *folder, CamelMimeMessage *message; time_t temp, message_time = 0; + parent_store = camel_folder_get_parent_store (folder); + pop3_folder = CAMEL_POP3_FOLDER (folder); - pop3_store = CAMEL_POP3_STORE (CAMEL_FOLDER(pop3_folder)->parent_store); + pop3_store = CAMEL_POP3_STORE (parent_store); temp = time(&temp); d(printf("%s(%d): pop3_folder->uids->len=[%d]\n", __FILE__, __LINE__, pop3_folder->uids->len)); @@ -522,10 +544,16 @@ done: static gchar * pop3_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex) { - CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *)folder; - CamelPOP3Store *pop3_store = (CamelPOP3Store *)((CamelFolder *)pop3_folder)->parent_store; + CamelStore *parent_store; + CamelPOP3Folder *pop3_folder; + CamelPOP3Store *pop3_store; CamelPOP3FolderInfo *fi; + parent_store = camel_folder_get_parent_store (folder); + + pop3_folder = CAMEL_POP3_FOLDER (folder); + pop3_store = CAMEL_POP3_STORE (parent_store); + fi = g_hash_table_lookup(pop3_folder->uids_uid, uid); if (fi == NULL) { camel_exception_setv ( @@ -540,15 +568,21 @@ pop3_get_filename (CamelFolder *folder, const gchar *uid, CamelException *ex) static CamelMimeMessage * pop3_get_message (CamelFolder *folder, const gchar *uid, CamelException *ex) { + CamelStore *parent_store; CamelMimeMessage *message = NULL; - CamelPOP3Store *pop3_store = CAMEL_POP3_STORE (folder->parent_store); - CamelPOP3Folder *pop3_folder = (CamelPOP3Folder *)folder; + CamelPOP3Store *pop3_store; + CamelPOP3Folder *pop3_folder; CamelPOP3Command *pcr; CamelPOP3FolderInfo *fi; gchar buffer[1]; gint i, last; CamelStream *stream = NULL; + parent_store = camel_folder_get_parent_store (folder); + + pop3_folder = CAMEL_POP3_FOLDER (folder); + pop3_store = CAMEL_POP3_STORE (parent_store); + fi = g_hash_table_lookup(pop3_folder->uids_uid, uid); if (fi == NULL) { camel_exception_setv ( diff --git a/docs/reference/camel/camel-docs.sgml b/docs/reference/camel/camel-docs.sgml index 79a8366..706ef6c 100644 --- a/docs/reference/camel/camel-docs.sgml +++ b/docs/reference/camel/camel-docs.sgml @@ -41,7 +41,6 @@ Fundamentals - diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt index 8bfdeba..88b3d2f 100644 --- a/docs/reference/camel/camel-sections.txt +++ b/docs/reference/camel/camel-sections.txt @@ -111,6 +111,9 @@ camel_cert_set_hostname camel_cert_set_fingerprint camel_cert_get_trust camel_cert_set_trust +CamelCertDBLock +camel_certdb_lock +camel_certdb_unlock CAMEL_CERTDB CAMEL_IS_CERTDB @@ -175,6 +178,8 @@ camel_cipher_context_get_type CamelDataCache CamelDataCache camel_data_cache_new +camel_data_cache_get_path +camel_data_cache_set_path camel_data_cache_set_expire_age camel_data_cache_set_expire_access camel_data_cache_add @@ -207,6 +212,9 @@ camel_data_wrapper_get_mime_type_field camel_data_wrapper_set_mime_type_field camel_data_wrapper_construct_from_stream camel_data_wrapper_is_offline +CamelDataWrapperLock +camel_data_wrapper_lock +camel_data_wrapper_unlock CAMEL_DATA_WRAPPER CAMEL_IS_DATA_WRAPPER @@ -299,7 +307,6 @@ CamelDBPrivate CamelDiscoDiary CamelDiscoDiary CamelDiscoDiaryAction -CamelDiscoDiaryArgType camel_disco_diary_new camel_disco_diary_empty camel_disco_diary_log @@ -322,6 +329,8 @@ camel_disco_diary_get_type camel-disco-folder CamelDiscoFolder CamelDiscoFolder +camel_disco_folder_get_offline_sync +camel_disco_folder_set_offline_sync camel_disco_folder_expunge_uids camel_disco_folder_cache_message camel_disco_folder_prepare_for_offline @@ -334,6 +343,7 @@ CAMEL_IS_DISCO_FOLDER_CLASS CAMEL_DISCO_FOLDER_GET_CLASS CamelDiscoFolderClass +CamelDiscoFolderPrivate camel_disco_folder_get_type @@ -404,14 +414,17 @@ CAMEL_FOLDER_HAS_BEEN_DELETED CAMEL_FOLDER_IS_TRASH CAMEL_FOLDER_IS_JUNK CAMEL_FOLDER_FILTER_JUNK -camel_folder_construct camel_folder_refresh_info camel_folder_sync camel_folder_set_lock_async camel_folder_get_parent_store camel_folder_expunge camel_folder_get_name +camel_folder_set_name camel_folder_get_full_name +camel_folder_set_full_name +camel_folder_get_description +camel_folder_set_description camel_folder_get_permanent_flags camel_folder_get_message_flags camel_folder_set_message_flags @@ -448,6 +461,7 @@ camel_folder_rename camel_folder_freeze camel_folder_thaw camel_folder_is_frozen +camel_folder_get_frozen_count camel_folder_get_quota_info camel_folder_quota_info_new camel_folder_quota_info_clone @@ -470,6 +484,9 @@ camel_folder_change_info_add_uid camel_folder_change_info_remove_uid camel_folder_change_info_change_uid camel_folder_change_info_recent_uid +CamelFolderLock +camel_folder_lock +camel_folder_unlock CAMEL_FOLDER CAMEL_IS_FOLDER @@ -480,6 +497,7 @@ CAMEL_FOLDER_GET_CLASS CamelFolderClass CamelFolderPrivate +CamelFolderChangeInfoPrivate camel_folder_get_type @@ -542,9 +560,7 @@ camel_folder_summary_touch camel_folder_summary_add camel_folder_summary_peek_info camel_folder_summary_get_changed -camel_folder_summary_cache_size -camel_folder_summary_reload_from_db -camel_folder_summary_ensure_infos_loaded +camel_folder_summary_prepare_fetch_all camel_folder_summary_insert camel_folder_summary_remove_index_fast camel_folder_summary_remove_uid_fast @@ -623,6 +639,9 @@ camel_folder_summary_guess_content_info camel_content_info_dump camel_message_info_dump camel_folder_summary_migrate_infos +CamelFolderSummaryLock +camel_folder_summary_lock +camel_folder_summary_unlock CAMEL_FOLDER_SUMMARY CAMEL_IS_FOLDER_SUMMARY @@ -641,6 +660,7 @@ camel_folder_summary_get_type CamelGpgContext CamelGpgContext camel_gpg_context_new +camel_gpg_context_get_always_trust camel_gpg_context_set_always_trust CAMEL_GPG_CONTEXT @@ -722,6 +742,7 @@ CAMEL_INDEX_DELETED camel_index_new camel_index_construct camel_index_rename +camel_index_set_normalize camel_index_sync camel_index_compress camel_index_delete @@ -1427,18 +1448,16 @@ CamelObject CamelObjectHookID CamelObjectEventPrepFunc CamelObjectEventHookFunc +CamelParamFlags camel_object_class_add_event camel_object_hook_event camel_object_remove_event camel_object_unhook_event camel_object_trigger_event -camel_object_set -camel_object_setv -camel_object_get -camel_object_getv camel_object_state_read camel_object_state_write -camel_object_free +camel_object_get_state_filename +camel_object_set_state_filename CamelObjectBag CamelCopyFunc camel_object_bag_new @@ -1460,6 +1479,7 @@ CAMEL_IS_OBJECT_CLASS CAMEL_OBJECT_GET_CLASS CamelObjectClass +CamelObjectPrivate camel_object_get_type @@ -1467,6 +1487,8 @@ camel_object_get_type camel-offline-folder CamelOfflineFolder CamelOfflineFolder +camel_offline_folder_get_offline_sync +camel_offline_folder_set_offline_sync camel_offline_folder_downsync CAMEL_OFFLINE_FOLDER @@ -1477,6 +1499,7 @@ CAMEL_IS_OFFLINE_FOLDER_CLASS CAMEL_OFFLINE_FOLDER_GET_CLASS CamelOfflineFolderClass +CamelOfflineFolderPrivate camel_offline_folder_get_type @@ -1786,6 +1809,11 @@ CamelSasl camel_sasl_challenge camel_sasl_challenge_base64 camel_sasl_new +camel_sasl_get_authenticated +camel_sasl_set_authenticated +camel_sasl_get_mechanism +camel_sasl_get_service +camel_sasl_get_service_name camel_sasl_authtype_list camel_sasl_authtype @@ -1853,11 +1881,6 @@ camel_seekable_substream_get_type camel-service CamelService CamelService -CAMEL_SERVICE_USERNAME -CAMEL_SERVICE_AUTH -CAMEL_SERVICE_HOSTNAME -CAMEL_SERVICE_PORT -CAMEL_SERVICE_PATH CamelServiceConnectionStatus CamelServiceAuthType camel_service_construct @@ -1870,6 +1893,9 @@ camel_service_get_path camel_service_get_session camel_service_get_provider camel_service_query_auth_types +CamelServiceLock +camel_service_lock +camel_service_unlock CAMEL_SERVICE CAMEL_IS_SERVICE @@ -1916,6 +1942,9 @@ camel_session_get_junk_headers camel_session_set_junk_headers camel_session_lookup_addressbook camel_session_forward_to +CamelSessionLock +camel_session_lock +camel_session_unlock CAMEL_SESSION CAMEL_IS_SESSION @@ -1987,6 +2016,9 @@ camel_store_info_set_string camel_store_info_path camel_store_info_uri camel_store_info_name +CamelStoreSummaryLock +camel_store_summary_lock +camel_store_summary_unlock CAMEL_STORE_SUMMARY CAMEL_IS_STORE_SUMMARY @@ -2066,6 +2098,9 @@ camel_store_unsubscribe_folder camel_store_noop camel_store_folder_uri_equal camel_store_can_refresh_folder +CamelStoreLock +camel_store_lock +camel_store_unlock CAMEL_STORE CAMEL_IS_STORE @@ -2132,6 +2167,8 @@ camel_stream_buffer_get_type camel-stream-filter CamelStreamFilter CamelStreamFilter +camel_stream_filter_new +camel_stream_filter_get_source camel_stream_filter_add camel_stream_filter_remove @@ -2155,6 +2192,7 @@ camel_stream_fs_new_with_name camel_stream_fs_new_with_name_and_bounds camel_stream_fs_new_with_fd camel_stream_fs_new_with_fd_and_bounds +camel_stream_fs_get_fd CAMEL_STREAM_FS CAMEL_IS_STREAM_FS @@ -2176,6 +2214,7 @@ camel_stream_mem_new camel_stream_mem_new_with_byte_array camel_stream_mem_new_with_buffer camel_stream_mem_set_secure +camel_stream_mem_get_byte_array camel_stream_mem_set_byte_array camel_stream_mem_set_buffer @@ -2260,6 +2299,9 @@ CAMEL_IS_TCP_STREAM_RAW_CLASS CAMEL_TCP_STREAM_RAW_GET_CLASS CamelTcpStreamRawClass +addrinfo +sockaddr +socklen_t camel_tcp_stream_raw_get_type @@ -2374,6 +2416,9 @@ camel_text_index_name_get_type CamelTransport CamelTransport camel_transport_send_to +CamelTransportLock +camel_transport_lock +camel_transport_unlock CAMEL_TRANSPORT CAMEL_IS_TRANSPORT @@ -2413,6 +2458,11 @@ camel_vee_folder_mask_event_folder_changed camel_vee_folder_unmask_event_folder_changed camel_vee_folder_hash_folder camel_vee_folder_sync_headers +camel_vee_folder_get_unread_vfolder +camel_vee_folder_set_unread_vfolder +CamelVeeFolderLock +camel_vee_folder_lock +camel_vee_folder_unlock CAMEL_VEE_FOLDER CAMEL_IS_VEE_FOLDER @@ -2487,26 +2537,6 @@ camel_vtrash_folder_get_type
-camel-arg -CamelArg -CamelArgV -CamelArgGet -CamelArgGetV -ca_object -ca_int -ca_double -ca_str -ca_ptr -CAMEL_ARGV_MAX -camel_argv_start -camel_argv_end -camel_argv_build -camel_arggetv_build -camel_argv_ignore -CamelProperty -
- -
camel-charset-map CamelCharset camel_charset_init diff --git a/docs/reference/camel/tmpl/camel-arg.sgml b/docs/reference/camel/tmpl/camel-arg.sgml index 9f413ef..d5184ae 100644 --- a/docs/reference/camel/tmpl/camel-arg.sgml +++ b/docs/reference/camel/tmpl/camel-arg.sgml @@ -20,130 +20,3 @@ camel-arg - - - - - -@tag: - - - - - - -@ap: -@argc: -@argv: - - - - - - -@tag: - - - - - - -@ap: -@argc: -@argv: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@tv: -@last: - - - - - - - -@tv: - - - - - - - -@tv: -@Returns: - - - - - - - -@tv: -@Returns: - - - - - - - -@tv: -@i: - - - - - - - -@tag: -@name: -@description: - diff --git a/docs/reference/camel/tmpl/camel-certdb.sgml b/docs/reference/camel/tmpl/camel-certdb.sgml index fc345dc..6ff021b 100644 --- a/docs/reference/camel/tmpl/camel-certdb.sgml +++ b/docs/reference/camel/tmpl/camel-certdb.sgml @@ -292,3 +292,31 @@ CamelCertDB @trust: + + + + + +@CCD_DB_LOCK: +@CCD_IO_LOCK: +@CCD_ALLOC_LOCK: +@CCD_REF_LOCK: + + + + + + +@certdb: +@lock: + + + + + + + +@certdb: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-cipher-context.sgml b/docs/reference/camel/tmpl/camel-cipher-context.sgml index 292f721..344d6d5 100644 --- a/docs/reference/camel/tmpl/camel-cipher-context.sgml +++ b/docs/reference/camel/tmpl/camel-cipher-context.sgml @@ -331,6 +331,20 @@ CamelCipherContext @gpointer cert_data: @gpointer cert_data: @gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: +@gpointer cert_data: @gpointer cert_data: diff --git a/docs/reference/camel/tmpl/camel-data-cache.sgml b/docs/reference/camel/tmpl/camel-data-cache.sgml index ad3fef1..0c2c3de 100644 --- a/docs/reference/camel/tmpl/camel-data-cache.sgml +++ b/docs/reference/camel/tmpl/camel-data-cache.sgml @@ -41,6 +41,24 @@ CamelDataCache @Returns: + + + + + +@cdc: +@Returns: + + + + + + + +@cdc: +@path: + + diff --git a/docs/reference/camel/tmpl/camel-data-wrapper.sgml b/docs/reference/camel/tmpl/camel-data-wrapper.sgml index f48475c..20426b8 100644 --- a/docs/reference/camel/tmpl/camel-data-wrapper.sgml +++ b/docs/reference/camel/tmpl/camel-data-wrapper.sgml @@ -110,3 +110,28 @@ CamelDataWrapper @Returns: + + + + + +@CDW_STREAM_LOCK: + + + + + + +@data_wrapper: +@lock: + + + + + + + +@data_wrapper: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-disco-diary.sgml b/docs/reference/camel/tmpl/camel-disco-diary.sgml index 15cccd7..d098b55 100644 --- a/docs/reference/camel/tmpl/camel-disco-diary.sgml +++ b/docs/reference/camel/tmpl/camel-disco-diary.sgml @@ -36,16 +36,6 @@ CamelDiscoDiary @CAMEL_DISCO_DIARY_FOLDER_APPEND: @CAMEL_DISCO_DIARY_FOLDER_TRANSFER: - - - - - -@CAMEL_DISCO_DIARY_ARG_NONE: -@CAMEL_DISCO_DIARY_ARG_FOLDER: -@CAMEL_DISCO_DIARY_ARG_UID: -@CAMEL_DISCO_DIARY_ARG_UID_LIST: - diff --git a/docs/reference/camel/tmpl/camel-disco-folder.sgml b/docs/reference/camel/tmpl/camel-disco-folder.sgml index f3cad62..468a4b0 100644 --- a/docs/reference/camel/tmpl/camel-disco-folder.sgml +++ b/docs/reference/camel/tmpl/camel-disco-folder.sgml @@ -26,6 +26,29 @@ CamelDiscoFolder + + + + + + + + + + +@disco_folder: +@Returns: + + + + + + + +@disco_folder: +@offline_sync: + + diff --git a/docs/reference/camel/tmpl/camel-folder-summary.sgml b/docs/reference/camel/tmpl/camel-folder-summary.sgml index 542349f..b5a4235 100644 --- a/docs/reference/camel/tmpl/camel-folder-summary.sgml +++ b/docs/reference/camel/tmpl/camel-folder-summary.sgml @@ -323,32 +323,12 @@ CamelFolderSummary @Returns: - + @s: -@Returns: - - - - - - - -@s: -@ex: -@Returns: - - - - - - - -@s: -@at_least: @ex: @@ -1067,3 +1047,32 @@ CamelFolderSummary @Returns: + + + + + +@CFS_SUMMARY_LOCK: +@CFS_IO_LOCK: +@CFS_FILTER_LOCK: +@CFS_ALLOC_LOCK: +@CFS_REF_LOCK: + + + + + + +@summary: +@lock: + + + + + + + +@summary: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-folder.sgml b/docs/reference/camel/tmpl/camel-folder.sgml index 0090695..3cc749e 100644 --- a/docs/reference/camel/tmpl/camel-folder.sgml +++ b/docs/reference/camel/tmpl/camel-folder.sgml @@ -26,6 +26,26 @@ CamelFolder + + + + + + + + + + + + + + + + + + + + @@ -96,17 +116,6 @@ CamelFolder - - - - - -@folder: -@parent_store: -@full_name: -@name: - - @@ -165,6 +174,15 @@ CamelFolder @Returns: + + + + + +@folder: +@name: + + @@ -174,6 +192,33 @@ CamelFolder @Returns: + + + + + +@folder: +@full_name: + + + + + + + +@folder: +@Returns: + + + + + + + +@folder: +@description: + + @@ -532,6 +577,15 @@ CamelFolder @Returns: + + + + + +@folder: +@Returns: + + @@ -730,3 +784,29 @@ CamelFolder @uid: + + + + + +@CF_CHANGE_LOCK: +@CF_REC_LOCK: + + + + + + +@folder: +@lock: + + + + + + + +@folder: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-gpg-context.sgml b/docs/reference/camel/tmpl/camel-gpg-context.sgml index 4593441..0f8b2c8 100644 --- a/docs/reference/camel/tmpl/camel-gpg-context.sgml +++ b/docs/reference/camel/tmpl/camel-gpg-context.sgml @@ -40,6 +40,15 @@ CamelGpgContext @Returns: + + + + + +@context: +@Returns: + + diff --git a/docs/reference/camel/tmpl/camel-index.sgml b/docs/reference/camel/tmpl/camel-index.sgml index 1a81adc..445689f 100644 --- a/docs/reference/camel/tmpl/camel-index.sgml +++ b/docs/reference/camel/tmpl/camel-index.sgml @@ -143,6 +143,16 @@ CamelIndex @Returns: + + + + + +@index: +@func: +@data: + + diff --git a/docs/reference/camel/tmpl/camel-object.sgml b/docs/reference/camel/tmpl/camel-object.sgml index c5c14e1..bde393b 100644 --- a/docs/reference/camel/tmpl/camel-object.sgml +++ b/docs/reference/camel/tmpl/camel-object.sgml @@ -26,6 +26,11 @@ CamelObject + + + + + @@ -52,6 +57,13 @@ CamelObject @Param3: + + + + + +@CAMEL_PARAM_PERSISTENT: + @@ -104,76 +116,40 @@ CamelObject @event_data: - - - - - -@obj: -@ex: -@Varargs: -@Returns: - - - - - - - -@obj: -@ex: -@Param3: -@Returns: - - - - - - - -@obj: -@ex: -@Varargs: -@Returns: - - - + -@obj: -@ex: -@Param3: +@object: @Returns: - + -@vo: +@object: @Returns: - + -@vo: +@object: @Returns: - + -@vo: -@tag: -@value: +@object: +@state_filename: diff --git a/docs/reference/camel/tmpl/camel-offline-folder.sgml b/docs/reference/camel/tmpl/camel-offline-folder.sgml index d7ddf1b..15bd22d 100644 --- a/docs/reference/camel/tmpl/camel-offline-folder.sgml +++ b/docs/reference/camel/tmpl/camel-offline-folder.sgml @@ -26,6 +26,29 @@ CamelOfflineFolder + + + + + + + + + + +@offline: +@Returns: + + + + + + + +@offline: +@offline_sync: + + diff --git a/docs/reference/camel/tmpl/camel-sasl.sgml b/docs/reference/camel/tmpl/camel-sasl.sgml index e6050d8..f44bc6b 100644 --- a/docs/reference/camel/tmpl/camel-sasl.sgml +++ b/docs/reference/camel/tmpl/camel-sasl.sgml @@ -79,6 +79,51 @@ CamelSasl @Returns: + + + + + +@sasl: +@Returns: + + + + + + + +@sasl: +@authenticated: + + + + + + + +@sasl: +@Returns: + + + + + + + +@sasl: +@Returns: + + + + + + + +@sasl: +@Returns: + + diff --git a/docs/reference/camel/tmpl/camel-service.sgml b/docs/reference/camel/tmpl/camel-service.sgml index 0720ac4..f625811 100644 --- a/docs/reference/camel/tmpl/camel-service.sgml +++ b/docs/reference/camel/tmpl/camel-service.sgml @@ -26,41 +26,6 @@ CamelService - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -179,3 +144,29 @@ CamelService @Returns: + + + + + +@CS_REC_CONNECT_LOCK: +@CS_CONNECT_OP_LOCK: + + + + + + +@service: +@lock: + + + + + + + +@service: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-session.sgml b/docs/reference/camel/tmpl/camel-session.sgml index 002c8a6..124429b 100644 --- a/docs/reference/camel/tmpl/camel-session.sgml +++ b/docs/reference/camel/tmpl/camel-session.sgml @@ -327,3 +327,29 @@ CamelSession @ex: + + + + + +@CS_SESSION_LOCK: +@CS_THREAD_LOCK: + + + + + + +@session: +@lock: + + + + + + + +@session: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-store-summary.sgml b/docs/reference/camel/tmpl/camel-store-summary.sgml index a59e8d8..f780a63 100644 --- a/docs/reference/camel/tmpl/camel-store-summary.sgml +++ b/docs/reference/camel/tmpl/camel-store-summary.sgml @@ -321,3 +321,30 @@ CamelStoreSummary @i: + + + + + +@CSS_SUMMARY_LOCK: +@CSS_IO_LOCK: +@CSS_REF_LOCK: + + + + + + +@summary: +@lock: + + + + + + + +@summary: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-store.sgml b/docs/reference/camel/tmpl/camel-store.sgml index 0ed8d91..1ad8b7a 100644 --- a/docs/reference/camel/tmpl/camel-store.sgml +++ b/docs/reference/camel/tmpl/camel-store.sgml @@ -546,3 +546,28 @@ CamelStore @Returns: + + + + + +@CS_FOLDER_LOCK: + + + + + + +@store: +@lock: + + + + + + + +@store: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-stream-filter.sgml b/docs/reference/camel/tmpl/camel-stream-filter.sgml index 4ca78d1..3eb7f93 100644 --- a/docs/reference/camel/tmpl/camel-stream-filter.sgml +++ b/docs/reference/camel/tmpl/camel-stream-filter.sgml @@ -26,6 +26,24 @@ CamelStreamFilter + + + + + +@source: +@Returns: + + + + + + + +@stream: +@Returns: + + diff --git a/docs/reference/camel/tmpl/camel-stream-fs.sgml b/docs/reference/camel/tmpl/camel-stream-fs.sgml index fc7c111..8d4a787 100644 --- a/docs/reference/camel/tmpl/camel-stream-fs.sgml +++ b/docs/reference/camel/tmpl/camel-stream-fs.sgml @@ -70,3 +70,12 @@ CamelStreamFs @Returns: + + + + + +@stream: +@Returns: + + diff --git a/docs/reference/camel/tmpl/camel-stream-mem.sgml b/docs/reference/camel/tmpl/camel-stream-mem.sgml index cc9b375..293d25a 100644 --- a/docs/reference/camel/tmpl/camel-stream-mem.sgml +++ b/docs/reference/camel/tmpl/camel-stream-mem.sgml @@ -62,6 +62,15 @@ CamelStreamMem @mem: + + + + + +@mem: +@Returns: + + diff --git a/docs/reference/camel/tmpl/camel-transport.sgml b/docs/reference/camel/tmpl/camel-transport.sgml index 79b89e9..cb8a6c8 100644 --- a/docs/reference/camel/tmpl/camel-transport.sgml +++ b/docs/reference/camel/tmpl/camel-transport.sgml @@ -39,3 +39,28 @@ CamelTransport @Returns: + + + + + +@CT_SEND_LOCK: + + + + + + +@transport: +@lock: + + + + + + + +@transport: +@lock: + + diff --git a/docs/reference/camel/tmpl/camel-unused.sgml b/docs/reference/camel/tmpl/camel-unused.sgml index 0b60cb8..4f23646 100644 --- a/docs/reference/camel/tmpl/camel-unused.sgml +++ b/docs/reference/camel/tmpl/camel-unused.sgml @@ -54,6 +54,34 @@ address-data addresses + + + + + + + + + + + + + + + + + + + + + + + + + +camel-arg + + @@ -2226,6 +2254,12 @@ CamelTestSession streams + + + + + + @@ -2550,6 +2584,36 @@ streams + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2580,6 +2644,38 @@ streams + + + + + +@tag: + + + + + + +@tag: + + + + + + +@ap: +@argc: +@argv: + + + + + + +@ap: +@argc: +@argv: + @@ -2602,6 +2698,16 @@ streams @parent_object: + + + + + +@CAMEL_DISCO_DIARY_ARG_NONE: +@CAMEL_DISCO_DIARY_ARG_FOLDER: +@CAMEL_DISCO_DIARY_ARG_UID: +@CAMEL_DISCO_DIARY_ARG_UID_LIST: + @@ -3651,6 +3757,15 @@ streams @lineptr: @lineend: + + + + + +@tag: +@name: +@description: + @@ -4167,6 +4282,75 @@ streams @ai_canonname: @ai_next: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@tv: +@Returns: + + + + + + +@tv: +@Returns: + + + + + + +@tv: + + + + + + +@tv: +@i: + + + + + + +@tv: +@last: + @@ -4328,6 +4512,16 @@ streams @n: @Returns: + + + + + +@folder: +@parent_store: +@full_name: +@name: + @@ -4336,6 +4530,32 @@ streams @summary: @array: + + + + + +@s: +@Returns: + + + + + + +@s: +@at_least: +@ex: + + + + + + +@s: +@ex: +@Returns: + @@ -6689,6 +6909,25 @@ streams @ctype: @Returns: + + + + + +@vo: +@tag: +@value: + + + + + + +@obj: +@ex: +@Varargs: +@Returns: + @@ -6718,6 +6957,16 @@ streams @tag: @Returns: + + + + + +@obj: +@ex: +@Param3: +@Returns: + @@ -6770,6 +7019,26 @@ streams @Param1: @Returns: + + + + + +@obj: +@ex: +@Varargs: +@Returns: + + + + + + +@obj: +@ex: +@Param3: +@Returns: + diff --git a/docs/reference/camel/tmpl/camel-vee-folder.sgml b/docs/reference/camel/tmpl/camel-vee-folder.sgml index 78d43b0..b23a34b 100644 --- a/docs/reference/camel/tmpl/camel-vee-folder.sgml +++ b/docs/reference/camel/tmpl/camel-vee-folder.sgml @@ -50,9 +50,6 @@ CamelVeeFolder @vf: -@parent_store: -@full: -@name: @flags: @@ -150,3 +147,48 @@ CamelVeeFolder @ex: + + + + + +@folder: +@Returns: + + + + + + + +@folder: +@unread_vfolder: + + + + + + + +@CVF_SUMMARY_LOCK: +@CVF_SUBFOLDER_LOCK: +@CVF_CHANGED_LOCK: + + + + + + +@folder: +@lock: + + + + + + + +@folder: +@lock: + + -- 2.7.4