[evolution-patches] Exchange : Fix for 72104
- From: Sarfraaz Ahmed <asarfraaz novell com>
- To: asdf <evolution-patches lists ximian com>
- Subject: [evolution-patches] Exchange : Fix for 72104
- Date: Sat, 19 Feb 2005 10:17:20 +0530
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]