hi,
I have made a patch (see attachment) that print the size of a mail
folder in the status bar.
ex: "3 new, 1 selected, 9 total (270,91 K)".
I wanted a feature like this to know how many space I was using with my
IMAP account. A possible extension could be to present a summary in
"Local Folder" or any root IMAP account folder of all children folders.
I don't know if it is related to my modifications, but with this and the
current CVS version I can't delete mails on my IMAP account. No problem
with POP mails. Any idea?
--
Bertrand Mathieu
Index: mail/folder-browser.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/folder-browser.c,v
retrieving revision 1.279
diff -u -r1.279 folder-browser.c
--- mail/folder-browser.c 1 May 2002 22:10:44 -0000 1.279
+++ mail/folder-browser.c 5 May 2002 21:08:43 -0000
@@ -25,6 +25,7 @@
#include <config.h>
#endif
+#include <string.h>
#include <ctype.h>
#include <errno.h>
@@ -123,6 +124,8 @@
static guint folder_browser_signals [LAST_SIGNAL] = {0, };
+static gchar *filter_size (guint size);
+
static void
folder_browser_finalise (GtkObject *object)
{
@@ -729,6 +732,7 @@
CORBA_Environment ev;
int tmp, total;
GString *work;
+ gchar *size_text;
extern CamelFolder *outbox_folder, *sent_folder;
if (fb->folder == NULL
@@ -780,6 +784,10 @@
else
g_string_sprintfa(work, _("%d total"), total);
+ size_text = filter_size(camel_folder_get_size(fb->folder));
+ g_string_sprintfa(work, " (%s)", size_text);
+ g_free(size_text);
+
CORBA_exception_init(&ev);
GNOME_Evolution_ShellView_setFolderBarLabel(fb->shell_view, work->str, &ev);
CORBA_exception_free(&ev);
@@ -2481,3 +2489,21 @@
E_MAKE_TYPE (folder_browser, "FolderBrowser", FolderBrowser,
folder_browser_class_init, folder_browser_init, PARENT_TYPE);
+
+static gchar *
+filter_size (guint size)
+{
+ gfloat fsize;
+
+ if (size < 1024) {
+ return g_strdup_printf ("%d", size);
+ } else {
+ fsize = ((gfloat) size) / 1024.0;
+ if (fsize < 1024.0) {
+ return g_strdup_printf ("%.2f K", fsize);
+ } else {
+ fsize /= 1024.0;
+ return g_strdup_printf ("%.2f M", fsize);
+ }
+ }
+}
Index: camel/camel-folder.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-folder.c,v
retrieving revision 1.158
diff -u -r1.158 camel-folder.c
--- camel/camel-folder.c 8 Jan 2002 00:45:58 -0000 1.158
+++ camel/camel-folder.c 5 May 2002 21:08:44 -0000
@@ -70,6 +70,7 @@
static gint get_message_count (CamelFolder *folder);
static gint get_unread_message_count (CamelFolder *folder);
+static gint get_size (CamelFolder *folder);
static void expunge (CamelFolder *folder,
CamelException *ex);
@@ -128,6 +129,7 @@
camel_folder_class->expunge = expunge;
camel_folder_class->get_message_count = get_message_count;
camel_folder_class->get_unread_message_count = get_unread_message_count;
+ camel_folder_class->get_size = get_size;
camel_folder_class->append_message = append_message;
camel_folder_class->get_permanent_flags = get_permanent_flags;
camel_folder_class->get_message_flags = get_message_flags;
@@ -459,6 +461,31 @@
g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
ret = CF_CLASS (folder)->get_unread_message_count (folder);
+
+ return ret;
+}
+
+static int
+get_size (CamelFolder *folder)
+{
+ g_return_val_if_fail(folder->summary != NULL, -1);
+
+ return camel_folder_summary_size(folder->summary);
+}
+/**
+ * camel_folder_get_size:
+ * @folder: A CamelFolder object
+ *
+ * Return value: the size of the folder, or -1 if unknown.
+ **/
+int
+camel_folder_get_size (CamelFolder *folder)
+{
+ int ret;
+
+ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
+
+ ret = CF_CLASS (folder)->get_size (folder);
return ret;
}
Index: camel/camel-folder.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-folder.h,v
retrieving revision 1.111
diff -u -r1.111 camel-folder.h
--- camel/camel-folder.h 27 Oct 2001 16:59:27 -0000 1.111
+++ camel/camel-folder.h 5 May 2002 21:08:44 -0000
@@ -93,6 +93,7 @@
int (*get_unread_message_count) (CamelFolder *folder);
+ int (*get_size) (CamelFolder *folder);
void (*append_message) (CamelFolder *folder,
CamelMimeMessage *message,
const CamelMessageInfo *info,
@@ -235,6 +236,8 @@
int camel_folder_get_message_count (CamelFolder *folder);
int camel_folder_get_unread_message_count (CamelFolder *folder);
+
+int camel_folder_get_size (CamelFolder *folder);
GPtrArray * camel_folder_get_summary (CamelFolder *folder);
void camel_folder_free_summary (CamelFolder *folder,
Index: camel/camel-folder-summary.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-folder-summary.c,v
retrieving revision 1.101
diff -u -r1.101 camel-folder-summary.c
--- camel/camel-folder-summary.c 5 Apr 2002 00:08:23 -0000 1.101
+++ camel/camel-folder-summary.c 5 May 2002 21:08:45 -0000
@@ -420,6 +420,35 @@
}
/**
+ * camel_folder_summary_size:
+ * @s:
+ *
+ * Get the total size of summary items stored in this summary.
+ *
+ * Return value: The total size of items in the summary.
+ **/
+guint
+camel_folder_summary_size(CamelFolderSummary *s)
+{
+ CamelMessageInfo *info;
+ int size = 0;
+ int i;
+
+ CAMEL_SUMMARY_LOCK(s, summary_lock);
+ CAMEL_SUMMARY_LOCK(s, ref_lock);
+
+ for (i=0; i<s->messages->len;i++) {
+ info = g_ptr_array_index(s->messages, i);
+ size += info->size;
+ }
+
+ CAMEL_SUMMARY_UNLOCK(s, ref_lock);
+ CAMEL_SUMMARY_UNLOCK(s, summary_lock);
+
+ return size;
+}
+
+/**
* camel_folder_summary_uid:
* @s:
* @uid:
Index: camel/camel-folder-summary.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-folder-summary.h,v
retrieving revision 1.61
diff -u -r1.61 camel-folder-summary.h
--- camel/camel-folder-summary.h 25 Mar 2002 12:11:42 -0000 1.61
+++ camel/camel-folder-summary.h 5 May 2002 21:08:46 -0000
@@ -263,6 +263,7 @@
CamelMessageInfo *camel_folder_summary_uid(CamelFolderSummary *, const char *uid);
GPtrArray *camel_folder_summary_array(CamelFolderSummary *s);
void camel_folder_summary_array_free(CamelFolderSummary *s, GPtrArray *array);
+guint camel_folder_summary_size(CamelFolderSummary *);
/* summary formatting utils */
char *camel_folder_summary_format_address(struct _header_raw *h, const char *name);