Dont use gfloats, actually i'd rather it was just using ints anyway.
Otherwise looks ok, although you dont need to lock the ref_lock in
summary_size, that is only required if you're modifying a refcount.
Could you create an item in bugzilla and attach your patch to it to
track it?
On Mon, 2002-05-06 at 06:55, Bertrand Mathieu wrote:
> 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);
_______________________________________________
evolution-hackers maillist - [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/evolution-hackers