[evolution-patches] Exchange : Fix for 72104



Hi,

This fixes the problem of not updating the folder size information when the folder is refreshed. Also, this has a string change and would need i18n approval.

Thanks
-- Sarfraaz
Index: storage/exchange-folder-size.c
===================================================================
RCS file: /cvs/gnome/evolution-exchange/storage/exchange-folder-size.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 exchange-folder-size.c
--- storage/exchange-folder-size.c	10 Jan 2005 20:13:55 -0000	1.7
+++ storage/exchange-folder-size.c	19 Feb 2005 04:46:13 -0000
@@ -43,13 +43,15 @@ static GObjectClass *parent_class = NULL
 
 typedef struct {
         char *folder_name;
-        char *folder_size;
+        gdouble folder_size;
 } folder_info;
 
 
 struct _ExchangeFolderSizePrivate {
 	
 	GHashTable *table;
+	GtkListStore *model;
+	GHashTable *row_refs;
 };
 
 enum {
@@ -59,11 +61,10 @@ enum {
 };
 
 static void
-free_table (gpointer key, gpointer value, gpointer data)
+free_fsize_table (gpointer key, gpointer value, gpointer data)
 {
 	folder_info *f_info = (folder_info *) value;
 	g_free (f_info->folder_name);
-	g_free (f_info->folder_size);
 	g_free (f_info);
 }
 
@@ -73,6 +74,7 @@ finalize (GObject *object)
 	ExchangeFolderSize *fsize = EXCHANGE_FOLDER_SIZE (object);
 
 	g_hash_table_destroy (fsize->priv->table);
+	g_hash_table_destroy (fsize->priv->row_refs);
 
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -101,7 +103,9 @@ init (GObject *object)
 
 	fsize->priv = g_new0 (ExchangeFolderSizePrivate, 1);
 	fsize->priv->table = g_hash_table_new_full (g_str_hash, g_str_equal,
-					g_free, (GDestroyNotify)free_table);
+					NULL, (GDestroyNotify)free_fsize_table);
+        fsize->priv->model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_DOUBLE);
+	fsize->priv->row_refs = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
 E2K_MAKE_TYPE (exchange_folder_size, ExchangeFolderSize, class_init, init, PARENT_TYPE)
@@ -124,39 +128,85 @@ exchange_folder_size_new (void)
 
 void
 exchange_folder_size_update (ExchangeFolderSize *fsize, 
-				const char *permanent_uri,
+				char *permanent_uri,
 				const char *folder_name,
-				const char *folder_size)
+				gdouble folder_size)
 {
-	folder_info *f_info;
+	folder_info *f_info, *cached_info;
 	ExchangeFolderSizePrivate *priv;
 	GHashTable *folder_size_table;
+	GtkTreeRowReference *row;
+	GtkTreeIter iter;
+	GtkTreePath *path;
 
 	g_return_if_fail (EXCHANGE_IS_FOLDER_SIZE (fsize));
 
 	priv = fsize->priv;
 	folder_size_table = priv->table;
 
-	/*FIXME : Check if value is already present */
+	cached_info = g_hash_table_lookup (folder_size_table, folder_name);
+	if (cached_info) {
+		if (cached_info->folder_size == folder_size) {
+			return;
+		} else {
+			cached_info->folder_size = folder_size;
+			row = g_hash_table_lookup (priv->row_refs, folder_name);
+			path = gtk_tree_row_reference_get_path (row);
+			if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fsize->priv->model), &iter, path)) {
+				gtk_list_store_set (fsize->priv->model, &iter,
+						      COLUMN_NAME, cached_info->folder_name,
+						      COLUMN_SIZE, cached_info->folder_size,
+						      -1);
+			}
+			gtk_tree_path_free (path);
+			return;
+		}
+	} else {
+		f_info = g_new0(folder_info, 1);
+		f_info->folder_name = g_strdup (folder_name);
+		f_info->folder_size = folder_size;
+		g_hash_table_insert (folder_size_table, f_info->folder_name, f_info); 
+
+		gtk_list_store_append (fsize->priv->model, &iter);
+		gtk_list_store_set (fsize->priv->model, &iter,
+				      COLUMN_NAME, f_info->folder_name,
+				      COLUMN_SIZE, f_info->folder_size,
+				      -1);
+		
+		path = gtk_tree_model_get_path (GTK_TREE_MODEL (fsize->priv->model), &iter);
+		row = gtk_tree_row_reference_new (GTK_TREE_MODEL (fsize->priv->model), path);
+		gtk_tree_path_free (path);
+
+		g_hash_table_insert (fsize->priv->row_refs, f_info->folder_name, row);
+	}
+}
+
+static void
+format_size_func (GtkTreeViewColumn *col,
+                  GtkCellRenderer   *renderer,
+                  GtkTreeModel      *model,
+                  GtkTreeIter       *iter,
+                 gpointer           user_data)
+{
+	GtkCellRendererText *cell = (GtkCellRendererText *)renderer;
+	gdouble folder_size;
+	char * new_text;
+	
+	gtk_tree_model_get(model, iter, COLUMN_SIZE, &folder_size, -1);
+	
+	if (folder_size)
+		new_text = g_strdup_printf ("%.2f", folder_size);
+	else
+		new_text = g_strdup ("0");
 
-        f_info = g_new0(folder_info, 1);
-        f_info->folder_name = g_strdup (folder_name);
-        f_info->folder_size = g_strdup (folder_size);
-        g_hash_table_insert (folder_size_table, g_strdup (permanent_uri), f_info); 
+	g_object_set (cell, "text", new_text, NULL);
+	g_free (new_text);
 }
 
 static void
-add_entry (gpointer key, gpointer value, gpointer data)
+parent_destroyed (gpointer dialog, GObject *ex_parent)
 {
-        folder_info *f_info = value;
-        GtkListStore *store = data;
-        GtkTreeIter iter;
-
-        gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter,
-                              COLUMN_NAME, f_info->folder_name,
-                              COLUMN_SIZE, f_info->folder_size,
-                              -1);
+	gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
 }
 
 void
@@ -166,10 +216,12 @@ exchange_folder_size_display (EFolder *f
 	ExchangeFolderSize *fsize;
         ExchangeHierarchy *hier;
         GtkTreeViewColumn *column;
+	GtkTreeSortable *sortable;
+	GtkCellRenderer *cell;
         GHashTable *folder_size_table;
         GladeXML *xml;
         GtkWidget *dialog, *table;
-        GtkListStore *model;
+	GList *l;
         int response;
 
         g_return_if_fail (GTK_IS_WIDGET (parent));
@@ -186,30 +238,39 @@ exchange_folder_size_display (EFolder *f
 	priv = fsize->priv;
 	folder_size_table = priv->table;
 
+	if (!g_hash_table_size (folder_size_table))
+		return;
+
         xml = glade_xml_new (CONNECTOR_GLADEDIR "/exchange-folder-tree.glade", NULL, NULL);
         g_return_if_fail (xml != NULL);
         dialog = glade_xml_get_widget (xml, "folder_tree");
         table = glade_xml_get_widget (xml, "folder_treeview");
 
         e_dialog_set_transient_for (GTK_WINDOW (dialog), parent);
-	/* fsize->parent = parent;
-        g_object_weak_ref (G_OBJECT (parent), parent_destroyed, fsize); */
+	/* fsize->parent = parent; */
+        g_object_weak_ref (G_OBJECT (parent), parent_destroyed, dialog);
 
         /* Set up the table */
-        model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
-        if (folder_size_table)
-                g_hash_table_foreach (folder_size_table, add_entry, model);
+	sortable = GTK_TREE_SORTABLE (priv->model);
+	gtk_tree_sortable_set_sort_column_id (sortable, COLUMN_SIZE, GTK_SORT_DESCENDING);
 
         column = gtk_tree_view_column_new_with_attributes (
                 _("Folder Name"), gtk_cell_renderer_text_new (), "text", COLUMN_NAME, NULL);
         gtk_tree_view_append_column (GTK_TREE_VIEW (table),
                                      column);
+
         column = gtk_tree_view_column_new_with_attributes (
-                _("Folder Size"), gtk_cell_renderer_text_new (), "text", COLUMN_SIZE, NULL);
+                _("Folder Size (KB)"), gtk_cell_renderer_text_new (), "text", COLUMN_SIZE, NULL);
+	
+	l = gtk_tree_view_column_get_cell_renderers (column);
+	cell = (GtkCellRenderer *)l->data;
+	gtk_tree_view_column_set_cell_data_func (column, cell, format_size_func, NULL, NULL );
+	g_list_free (l);
+
         gtk_tree_view_append_column (GTK_TREE_VIEW (table),
                                      column);
         gtk_tree_view_set_model (GTK_TREE_VIEW (table),
-                                 GTK_TREE_MODEL (model));
+                                 GTK_TREE_MODEL (priv->model));
 	response = gtk_dialog_run (GTK_DIALOG (dialog));
         gtk_widget_destroy (dialog);
         g_object_unref (xml);
Index: storage/exchange-folder-size.h
===================================================================
RCS file: /cvs/gnome/evolution-exchange/storage/exchange-folder-size.h,v
retrieving revision 1.2
diff -u -p -u -r1.2 exchange-folder-size.h
--- storage/exchange-folder-size.h	8 Nov 2004 13:10:52 -0000	1.2
+++ storage/exchange-folder-size.h	19 Feb 2005 04:46:13 -0000
@@ -40,9 +40,9 @@ GType    exchange_folder_size_get_type (
 ExchangeFolderSize *exchange_folder_size_new (void);
 
 void exchange_folder_size_update (ExchangeFolderSize *fsize,
-						const char *permanent_uri,
+						char *permanent_uri,
 						const char *folder_name,
-						const char *folder_size);
+						gdouble folder_size);
 
 void exchange_folder_size_display (EFolder *folder, GtkWidget *parent);
 
Index: storage/exchange-hierarchy-webdav.c
===================================================================
RCS file: /cvs/gnome/evolution-exchange/storage/exchange-hierarchy-webdav.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 exchange-hierarchy-webdav.c
--- storage/exchange-hierarchy-webdav.c	4 Feb 2005 11:29:45 -0000	1.22
+++ storage/exchange-hierarchy-webdav.c	19 Feb 2005 04:46:13 -0000
@@ -473,16 +473,25 @@ add_href (gpointer path, gpointer folder
 	g_ptr_array_add (hrefs, path);
 }
 
+static const char *rescan_props[] = {
+	E2K_PR_EXCHANGE_FOLDER_SIZE,
+	E2K_PR_HTTPMAIL_UNREAD_COUNT
+};
+static const int n_rescan_props = sizeof (rescan_props) / sizeof (rescan_props[0]);
+
 static void
 rescan (ExchangeHierarchy *hier)
 {
 	ExchangeHierarchyWebDAV *hwd = EXCHANGE_HIERARCHY_WEBDAV (hier);
 	const char *prop = E2K_PR_HTTPMAIL_UNREAD_COUNT;
+	const char *folder_size, *permanenturl, *folder_name;
 	GPtrArray *hrefs;
 	E2kResultIter *iter;
 	E2kResult *result;
 	EFolder *folder;
 	int unread;
+	gboolean personal = ( hier->type == EXCHANGE_HIERARCHY_PERSONAL );
+	gdouble fsize_d;
 
 	if ( exchange_account_is_offline (hier->account) ||
 	    hier->type == EXCHANGE_HIERARCHY_PUBLIC)
@@ -500,7 +509,7 @@ rescan (ExchangeHierarchy *hier)
 	iter = e_folder_exchange_bpropfind_start (hier->toplevel, NULL,
 						  (const char **)hrefs->pdata,
 						  hrefs->len,
-						  &prop, 1);
+						  rescan_props, n_rescan_props);
 	g_ptr_array_free (hrefs, TRUE);
 
 	while ((result = e2k_result_iter_next (iter))) {
@@ -517,6 +526,16 @@ rescan (ExchangeHierarchy *hier)
 
 		if (unread != e_folder_get_unread_count (folder))
 			e_folder_set_unread_count (folder, unread);
+
+		folder_size = e2k_properties_get_prop (result->props,
+						E2K_PR_EXCHANGE_FOLDER_SIZE);
+		if (folder_size && personal) {
+			permanenturl = e_folder_exchange_get_permanent_uri (folder);
+			folder_name = e_folder_get_name (folder);
+			fsize_d = g_ascii_strtod (folder_size, NULL)/1024;
+			exchange_folder_size_update (hwd->priv->foldersize, 
+				g_strdup (permanenturl), folder_name, fsize_d);
+		}
 	}
 	e2k_result_iter_free (iter);
 	g_object_unref (hier);
@@ -538,6 +557,8 @@ exchange_hierarchy_webdav_status_to_fold
 ExchangeFolderSize *
 exchange_hierarchy_webdav_get_folder_size (ExchangeHierarchyWebDAV *hwd)
 {
+	g_return_val_if_fail (EXCHANGE_IS_HIERARCHY_WEBDAV (hwd), NULL);
+
 	return hwd->priv->foldersize;
 }
 
@@ -551,6 +572,7 @@ exchange_hierarchy_webdav_parse_folder (
 	const char *name, *prop, *outlook_class, *permanenturl, *folder_size;
 	int unread;
 	gboolean hassubs;
+	gdouble fsize_d;
 
 	g_return_val_if_fail (EXCHANGE_IS_HIERARCHY_WEBDAV (hwd), NULL);
 	g_return_val_if_fail (E_IS_FOLDER (parent), NULL);
@@ -606,7 +628,10 @@ exchange_hierarchy_webdav_parse_folder (
 		e_folder_exchange_set_has_subfolders (folder, TRUE);
 	if (permanenturl) {
 		e_folder_exchange_set_permanent_uri (folder, permanenturl);
-		exchange_folder_size_update (hwd->priv->foldersize, permanenturl, name, folder_size);
+		/* FIXME : Find a better way of doing this */
+		fsize_d = g_ascii_strtod (folder_size, NULL)/1024 ;
+		exchange_folder_size_update (hwd->priv->foldersize, 
+					g_strdup (permanenturl), name, fsize_d);
 	}
 
 	return folder;


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