diff options
-rw-r--r-- | mail/ChangeLog | 14 | ||||
-rw-r--r-- | mail/em-folder-properties.c | 96 | ||||
-rw-r--r-- | mail/mail-ops.c | 69 | ||||
-rw-r--r-- | mail/mail-ops.h | 5 |
4 files changed, 160 insertions, 24 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 5bbc9d0439..c6954caaf2 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2008-04-14 Milan Crha <mcrha@redhat.com> + + ** Fix for bug #270406 + + * em-folder-properties.c: (struct _prop_data), (emfp_free), + (add_numbered_row), (emfp_get_folder_item), + (emfp_dialog_got_folder_quota), (emfp_dialog_got_folder): + Retrieve quota information for a folder and show it in a dialog. + * mail-ops.h: (mail_get_folder_quota): + * mail-ops.c: (struct _get_quota_msg), (get_quota_desc), + (get_quota_exec), (get_quota_done), (get_quota_free), + (MailMsgInfo get_quota_info), (mail_get_folder_quota): + New operation to get folder's quota information. + 2008-04-13 Matthew Barnes <mbarnes@redhat.com> * em-folder-browser.c: diff --git a/mail/em-folder-properties.c b/mail/em-folder-properties.c index 8a2875969e..1af52a1f47 100644 --- a/mail/em-folder-properties.c +++ b/mail/em-folder-properties.c @@ -65,6 +65,7 @@ struct _prop_data { int total; int unread; EMConfig *config; + CamelFolderQuotaInfo *quota; }; static void @@ -124,13 +125,41 @@ emfp_free(EConfig *ec, GSList *items, void *data) camel_object_unref (prop_data->object); g_free (prop_data->argv); + camel_folder_quota_info_free (prop_data->quota); + g_free (prop_data); } +static int +add_numbered_row (GtkTable *table, int row, const char *description, const char *format, int num) +{ + char *str; + GtkWidget *label; + + g_return_val_if_fail (table != NULL, row); + g_return_val_if_fail (description != NULL, row); + g_return_val_if_fail (format != NULL, row); + + label = gtk_label_new (description); + gtk_widget_show (label); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_table_attach (table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); + + str = g_strdup_printf (format, num); + + label = gtk_label_new (str); + gtk_widget_show (label); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (table, label, 1, 2, row, row+1, GTK_FILL | GTK_EXPAND, 0, 0, 0); + + g_free (str); + + return row + 1; +} + static GtkWidget * emfp_get_folder_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) { - char countstr[16]; GtkWidget *w, *table, *label; struct _prop_data *prop_data = data; int row = 0, i; @@ -146,31 +175,37 @@ emfp_get_folder_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, gtk_box_pack_start ((GtkBox *) parent, table, TRUE, TRUE, 0); /* to be on the safe side, ngettext is used here, see e.g. comment #3 at bug 272567 */ - label = gtk_label_new (ngettext ("Unread messages:", "Unread messages:", prop_data->unread)); - gtk_widget_show (label); - gtk_misc_set_alignment ((GtkMisc *) label, 0.0, 0.5); - gtk_table_attach ((GtkTable *) table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); - - sprintf(countstr, "%d", prop_data->unread); - label = gtk_label_new (countstr); - gtk_widget_show (label); - gtk_misc_set_alignment ((GtkMisc *) label, 1.0, 0.5); - gtk_table_attach ((GtkTable *) table, label, 1, 2, row, row+1, GTK_FILL | GTK_EXPAND, 0, 0, 0); - row++; + row = add_numbered_row (GTK_TABLE (table), row, ngettext ("Unread messages:", "Unread messages:", prop_data->unread), "%d", prop_data->unread); /* TODO: can this be done in a loop? */ /* to be on the safe side, ngettext is used here, see e.g. comment #3 at bug 272567 */ - label = gtk_label_new (ngettext ("Total messages:", "Total messages:", prop_data->total)); - gtk_widget_show (label); - gtk_misc_set_alignment ((GtkMisc *) label, 0.0, 0.5); - gtk_table_attach ((GtkTable *) table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); + row = add_numbered_row (GTK_TABLE (table), row, ngettext ("Total messages:", "Total messages:", prop_data->total), "%d", prop_data->total); - sprintf(countstr, "%d", prop_data->total); - label = gtk_label_new (countstr); - gtk_widget_show (label); - gtk_misc_set_alignment ((GtkMisc *) label, 1.0, 0.5); - gtk_table_attach ((GtkTable *) table, label, 1, 2, row, row+1, GTK_FILL | GTK_EXPAND, 0, 0, 0); - row++; + if (prop_data->quota) { + CamelFolderQuotaInfo *info; + CamelFolderQuotaInfo *quota = prop_data->quota; + + for (info = quota; info; info = info->next) { + char *descr; + int procs; + + /* should not happen, but anyway... */ + if (!info->total) + continue; + + /* show quota name only when available and have more than one quota info */ + if (info->name && quota->next) + descr = g_strdup_printf ("%s (%s):", _("Quota usage"), _(info->name)); + else + descr = g_strdup_printf ("%s:", _("Quota usage")); + + procs = (int) ((((double) info->used) / ((double) info->total)) * 100.0 + 0.5); + + row = add_numbered_row (GTK_TABLE (table), row, descr, "%d%%", procs); + + g_free (descr); + } + } /* setup the ui with the values retrieved */ l = prop_data->properties; @@ -226,7 +261,7 @@ static EMConfigItem emfp_items[] = { static gboolean emfp_items_translated = FALSE; static void -emfp_dialog_got_folder (char *uri, CamelFolder *folder, void *data) +emfp_dialog_got_folder_quota (CamelFolder *folder, CamelFolderQuotaInfo *quota, void *data) { GtkWidget *dialog, *w; struct _prop_data *prop_data; @@ -239,15 +274,19 @@ emfp_dialog_got_folder (char *uri, CamelFolder *folder, void *data) gboolean hide_deleted; GConfClient *gconf; CamelStore *store; + char *uri = (char *)data; - if (folder == NULL) + if (folder == NULL) { + g_free (uri); return; + } store = folder->parent_store; prop_data = g_malloc0 (sizeof (*prop_data)); prop_data->object = folder; camel_object_ref (folder); + prop_data->quota = camel_folder_quota_info_clone (quota); /* Get number of VISIBLE and DELETED messages, instead of TOTAL messages. VISIBLE+DELETED @@ -354,6 +393,15 @@ emfp_dialog_got_folder (char *uri, CamelFolder *folder, void *data) g_signal_connect (dialog, "response", G_CALLBACK (emfp_dialog_response), prop_data); gtk_widget_show (dialog); + + g_free (uri); +} + +static void +emfp_dialog_got_folder (char *uri, CamelFolder *folder, void *data) +{ + /* this should be called in a thread too */ + mail_get_folder_quota (folder, emfp_dialog_got_folder_quota, g_strdup (uri), mail_msg_unordered_push); } /** diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 36f45efe6e..d13740570d 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -1253,6 +1253,75 @@ mail_get_folder (const char *uri, guint32 flags, return id; } +/* ** GET FOLDER'S QUOTA ********************************************************* */ + +struct _get_quota_msg { + MailMsg base; + + CamelFolder *folder; + CamelFolderQuotaInfo *quota; + void (*done) (CamelFolder *folder, CamelFolderQuotaInfo *quota, void *data); + void *data; +}; + +static gchar * +get_quota_desc (struct _get_quota_msg *m) +{ + return g_strdup_printf(_("Retrieving quota information for folder %s"), camel_folder_get_name (m->folder)); +} + +static void +get_quota_exec (struct _get_quota_msg *m) +{ + m->quota = camel_folder_get_quota_info (m->folder); +} + +static void +get_quota_done (struct _get_quota_msg *m) +{ + if (m->done) + m->done (m->folder, m->quota, m->data); +} + +static void +get_quota_free (struct _get_quota_msg *m) +{ + if (m->folder) + camel_object_unref (m->folder); + if (m->quota) + camel_folder_quota_info_free (m->quota); +} + +static MailMsgInfo get_quota_info = { + sizeof (struct _get_quota_msg), + (MailMsgDescFunc) get_quota_desc, + (MailMsgExecFunc) get_quota_exec, + (MailMsgDoneFunc) get_quota_done, + (MailMsgFreeFunc) get_quota_free +}; + +int +mail_get_folder_quota (CamelFolder *folder, + void (*done)(CamelFolder *folder, CamelFolderQuotaInfo *quota, void *data), + void *data, MailMsgDispatchFunc dispatch) +{ + struct _get_quota_msg *m; + int id; + + g_return_val_if_fail (folder != NULL, -1); + + m = mail_msg_new (&get_quota_info); + m->folder = folder; + m->data = data; + m->done = done; + + camel_object_ref (m->folder); + + id = m->base.seq; + dispatch (m); + return id; +} + /* ** GET STORE ******************************************************* */ struct _get_store_msg { diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 8b532e896f..e60b8d48bb 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -73,6 +73,11 @@ int mail_get_folder (const char *uri, guint32 flags, void (*done) (char *uri, CamelFolder *folder, void *data), void *data, MailMsgDispatchFunc dispatch); +/* get quota information for a folder */ +int mail_get_folder_quota (CamelFolder *folder, + void (*done)(CamelFolder *folder, CamelFolderQuotaInfo *quota, void *data), + void *data, MailMsgDispatchFunc dispatch); + /* and for a store */ int mail_get_store (const char *uri, CamelOperation *op, void (*done) (char *uri, CamelStore *store, void *data), void *data); |