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

Reply via email to