evolution r35366 - trunk/mail



Author: mcrha
Date: Mon Apr 14 15:59:36 2008
New Revision: 35366
URL: http://svn.gnome.org/viewvc/evolution?rev=35366&view=rev

Log:
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.



Modified:
   trunk/mail/ChangeLog
   trunk/mail/em-folder-properties.c
   trunk/mail/mail-ops.c
   trunk/mail/mail-ops.h

Modified: trunk/mail/em-folder-properties.c
==============================================================================
--- trunk/mail/em-folder-properties.c	(original)
+++ trunk/mail/em-folder-properties.c	Mon Apr 14 15:59:36 2008
@@ -65,6 +65,7 @@
 	int total;
 	int unread;
 	EMConfig *config;
+	CamelFolderQuotaInfo *quota;
 };
 
 static void
@@ -124,13 +125,41 @@
 	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 @@
 	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 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 @@
 	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 @@
 
 	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);
 }
 
 /**

Modified: trunk/mail/mail-ops.c
==============================================================================
--- trunk/mail/mail-ops.c	(original)
+++ trunk/mail/mail-ops.c	Mon Apr 14 15:59:36 2008
@@ -1253,6 +1253,75 @@
 	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 {

Modified: trunk/mail/mail-ops.h
==============================================================================
--- trunk/mail/mail-ops.h	(original)
+++ trunk/mail/mail-ops.h	Mon Apr 14 15:59:36 2008
@@ -73,6 +73,11 @@
 		     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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]