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);