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

Reply via email to