[evolution-ews] Bug #675737 - Show user's folder sizes



commit 1a96a1ec2deb14f340316dfff9cc81239c6eb8c6
Author: Punit Jain <punnit nitt gmail com>
Date:   Fri Aug 16 00:58:37 2013 +0200

    Bug #675737 - Show user's folder sizes
    
    Signed-off-by: Fabiano Fidêncio <fidencio redhat com>

 src/configuration/Makefile.am                      |    2 +
 src/configuration/e-ews-config-utils.c             |  282 ++++++++++++++++++
 src/configuration/e-ews-config-utils.h             |    8 +-
 .../e-mail-config-ews-folder-sizes-page.c          |  305 ++++++++++++++++++++
 .../e-mail-config-ews-folder-sizes-page.h          |   71 +++++
 src/configuration/e-mail-config-ews-notebook.c     |    6 +
 src/configuration/module-ews-configuration.c       |    2 +
 src/server/e-ews-connection.c                      |    3 +
 src/server/e-ews-folder.c                          |   26 ++
 src/server/e-ews-folder.h                          |    1 +
 10 files changed, 705 insertions(+), 1 deletions(-)
---
diff --git a/src/configuration/Makefile.am b/src/configuration/Makefile.am
index e37d41d..cb0b478 100644
--- a/src/configuration/Makefile.am
+++ b/src/configuration/Makefile.am
@@ -29,6 +29,8 @@ module_ews_configuration_la_SOURCES = \
        e-mail-config-ews-oal-combo-box.h \
        e-mail-config-ews-delegates-page.c \
        e-mail-config-ews-delegates-page.h \
+       e-mail-config-ews-folder-sizes-page.c \
+       e-mail-config-ews-folder-sizes-page.h \
        e-mail-config-ews-ooo-page.c \
        e-mail-config-ews-ooo-page.h \
        e-ews-config-ui-extension.c \
diff --git a/src/configuration/e-ews-config-utils.c b/src/configuration/e-ews-config-utils.c
index d288994..24e4a52 100644
--- a/src/configuration/e-ews-config-utils.c
+++ b/src/configuration/e-ews-config-utils.c
@@ -428,6 +428,253 @@ e_ews_config_utils_open_connection_for (ESourceRegistry *registry,
        return conn;
 }
 
+enum {
+       COL_FOLDERSIZE_NAME = 0,
+       COL_FOLDERSIZE_SIZE,
+       COL_FOLDERSIZE_MAX
+};
+
+typedef struct
+{
+       GtkDialog *dialog;
+       GtkGrid *spinner_grid;
+
+       ESourceRegistry *registry;
+       ESource *source;
+       CamelEwsSettings *ews_settings;
+       CamelEwsStore *ews_store;
+
+       GSList *folder_list;
+       GCancellable *cancellable;
+       GError *error;
+} FolderSizeDialogData;
+
+static gboolean
+ews_settings_get_folder_sizes_idle (gpointer user_data)
+{
+       GtkWidget *widget;
+       GtkCellRenderer *renderer;
+       GtkListStore *store;
+       GtkTreeIter iter;
+       GtkBox *content_area;
+       FolderSizeDialogData *fsd = user_data;
+
+       g_return_val_if_fail (fsd != NULL, FALSE);
+
+       if (g_cancellable_is_cancelled (fsd->cancellable))
+               goto cleanup;
+
+       /* Hide progress bar. Set status */
+       gtk_widget_destroy (GTK_WIDGET (fsd->spinner_grid));
+
+       if (fsd->folder_list) {
+               GtkWidget *scrolledwindow, *tree_view;
+               GSList *fiter;
+
+               scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+               gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
+                               GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+               gtk_widget_show (scrolledwindow);
+
+               /* Tree View */
+               tree_view =  gtk_tree_view_new ();
+               renderer = gtk_cell_renderer_text_new ();
+               gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),-1,
+                               _("Folder"),
+                               renderer, "text", COL_FOLDERSIZE_NAME,
+                               NULL);
+
+               renderer = gtk_cell_renderer_text_new ();
+               gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),-1,
+                               _("Size"), renderer,
+                               "text", COL_FOLDERSIZE_SIZE,
+                               NULL);
+               /* Model for TreeView */
+               store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+               gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (store));
+
+               /* Populate model with data */
+               for (fiter = fsd->folder_list; fiter;  fiter = fiter->next) {
+                       EEwsFolder *folder = fiter->data;
+                       gchar *folder_size = g_format_size (e_ews_folder_get_size (folder));
+
+                       gtk_list_store_append (store, &iter);
+                       gtk_list_store_set (store, &iter,
+                                       COL_FOLDERSIZE_NAME,
+                                       e_ews_folder_get_name (folder),
+                                       COL_FOLDERSIZE_SIZE,
+                                       folder_size,
+                                       -1);
+
+                       g_free (folder_size);
+               }
+
+               gtk_container_add (GTK_CONTAINER (scrolledwindow), tree_view);
+               widget = scrolledwindow;
+       } else if (fsd->error) {
+               gchar *msg = g_strconcat (_("Unable to retrieve folder size information"), "\n",
+                               fsd->error->message, NULL);
+               widget = gtk_label_new (msg);
+               g_free (msg);
+       } else {
+               widget = gtk_label_new (_("Unable to retrieve folder size information"));
+       }
+
+       gtk_widget_show_all (widget);
+
+       /* Pack into content_area */
+       content_area = GTK_BOX (gtk_dialog_get_content_area (fsd->dialog));
+       gtk_box_pack_start (content_area, widget, TRUE, TRUE, 6);
+
+cleanup:
+       g_slist_free_full (fsd->folder_list, g_object_unref);
+       g_object_unref (fsd->registry);
+       g_object_unref (fsd->source);
+       g_object_unref (fsd->ews_settings);
+       g_object_unref (fsd->ews_store);
+       g_object_unref (fsd->cancellable);
+       g_clear_error (&fsd->error);
+       g_free (fsd);
+
+       return FALSE;
+}
+
+static gpointer
+ews_settings_get_folder_sizes_thread (gpointer user_data)
+{
+       FolderSizeDialogData *fsd = user_data;
+       EEwsConnection *cnc;
+
+       g_return_val_if_fail (fsd != NULL, NULL);
+
+       fsd->folder_list = NULL;
+       cnc = e_ews_config_utils_open_connection_for (
+                       fsd->registry,
+                       fsd->source,
+                       fsd->ews_settings,
+                       fsd->cancellable,
+                       &fsd->error);
+
+       if (cnc) {
+               EwsAdditionalProps *add_props;
+               EwsExtendedFieldURI *ext_uri;
+               GSList *ids, *l, *folders_ids = NULL;
+
+               fsd->folder_list = NULL;
+
+               /* Use MAPI property to retrieve folder size */
+               add_props = g_new0 (EwsAdditionalProps, 1);
+               ext_uri = g_new0 (EwsExtendedFieldURI, 1);
+               ext_uri->prop_tag = g_strdup ("0x0e08"); /* Folder size property tag */
+               ext_uri->prop_type = g_strdup ("Integer");
+               add_props->extended_furis = g_slist_prepend (add_props->extended_furis, ext_uri);
+
+               ids = camel_ews_store_summary_get_folders (fsd->ews_store->summary, NULL);
+               for (l = ids; l != NULL; l = l->next) {
+                       EwsFolderId *fid;
+                       fid = e_ews_folder_id_new (l->data, NULL, FALSE);
+                       folders_ids = g_slist_prepend (folders_ids, fid);
+               }
+               folders_ids = g_slist_reverse (folders_ids);
+
+               e_ews_connection_get_folder_sync (
+                               cnc, EWS_PRIORITY_MEDIUM, "Default",
+                               add_props, folders_ids, &fsd->folder_list,
+                               fsd->cancellable, &fsd->error);
+
+               g_slist_free_full (folders_ids, (GDestroyNotify) e_ews_folder_id_free);
+               g_free (ext_uri->prop_type);
+               g_free (ext_uri->prop_tag);
+               g_free (ext_uri);
+               g_slist_free (add_props->extended_furis);
+               g_free (add_props);
+               g_object_unref (cnc);
+       }
+
+       g_idle_add (ews_settings_get_folder_sizes_idle, fsd);
+
+       return NULL;
+}
+
+static void
+folder_sizes_dialog_response_cb (GObject *dialog,
+                                gint response_id,
+                                gpointer data)
+{
+       GCancellable *cancellable = data;
+
+       g_cancellable_cancel (cancellable);
+       g_object_unref (cancellable);
+
+       gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+void
+e_ews_config_utils_run_folder_sizes_dialog (GtkWindow *parent,
+                                           ESourceRegistry *registry,
+                                           ESource *source,
+                                           CamelEwsStore *ews_store)
+{
+       GtkBox *content_area;
+       GtkWidget *spinner, *alignment, *dialog;
+       GtkWidget *spinner_label;
+       GCancellable *cancellable;
+       GThread *thread;
+       FolderSizeDialogData *fsd;
+
+       g_return_if_fail (ews_store != NULL);
+
+       cancellable = g_cancellable_new ();
+
+       dialog = gtk_dialog_new_with_buttons (
+                       _("Folder Sizes"),
+                       parent,
+                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                       _("_Close"), GTK_RESPONSE_ACCEPT,
+                       NULL);
+
+       g_signal_connect (dialog, "response", G_CALLBACK (folder_sizes_dialog_response_cb), cancellable);
+
+       fsd = g_new0 (FolderSizeDialogData, 1);
+       fsd->dialog = GTK_DIALOG (dialog);
+
+       gtk_window_set_default_size (GTK_WINDOW (fsd->dialog), 250, 300);
+
+       content_area = GTK_BOX (gtk_dialog_get_content_area (fsd->dialog));
+
+       spinner = gtk_spinner_new ();
+       gtk_spinner_start (GTK_SPINNER (spinner));
+       spinner_label = gtk_label_new (_("Fetching folder list…"));
+
+       fsd->spinner_grid = GTK_GRID (gtk_grid_new ());
+       gtk_grid_set_column_spacing (fsd->spinner_grid, 6);
+       gtk_grid_set_column_homogeneous (fsd->spinner_grid, FALSE);
+       gtk_orientable_set_orientation (GTK_ORIENTABLE (fsd->spinner_grid), GTK_ORIENTATION_HORIZONTAL);
+
+       alignment = gtk_alignment_new (1.0, 0.5, 0.0, 1.0);
+       gtk_container_add (GTK_CONTAINER (alignment), spinner);
+       gtk_misc_set_alignment (GTK_MISC (spinner_label), 0.0, 0.5);
+
+       gtk_container_add (GTK_CONTAINER (fsd->spinner_grid), alignment);
+       gtk_container_add (GTK_CONTAINER (fsd->spinner_grid), spinner_label);
+
+       /* Pack the TreeView into dialog's content area */
+       gtk_box_pack_start (content_area, GTK_WIDGET (fsd->spinner_grid), TRUE, TRUE, 6);
+       gtk_widget_show_all (GTK_WIDGET (fsd->dialog));
+
+       fsd->registry = g_object_ref (registry);
+       fsd->source = g_object_ref (source);
+       fsd->ews_store = g_object_ref (ews_store);
+       fsd->ews_settings = CAMEL_EWS_SETTINGS (camel_service_ref_settings (CAMEL_SERVICE (ews_store)));
+       fsd->cancellable = g_object_ref (cancellable);
+
+       thread = g_thread_new (NULL, ews_settings_get_folder_sizes_thread, fsd);
+       g_thread_unref (thread);
+
+       /* Start the dialog */
+       gtk_widget_show (GTK_WIDGET (dialog));
+}
+
 static gboolean
 get_ews_store_from_folder_tree (EShellView *shell_view,
                                 gchar **pfolder_path,
@@ -473,6 +720,34 @@ get_ews_store_from_folder_tree (EShellView *shell_view,
 }
 
 static void
+action_folder_sizes_cb (GtkAction *action,
+                       EShellView *shell_view)
+{
+       GtkWindow *parent;
+       CamelSession *session;
+       CamelStore *store = NULL;
+       ESourceRegistry *registry;
+       ESource *source;
+
+       if (!get_ews_store_from_folder_tree (shell_view, NULL, &store))
+               return;
+
+       g_return_if_fail (store != NULL);
+
+       parent = GTK_WINDOW (e_shell_view_get_shell_window (shell_view));
+
+       session = camel_service_ref_session (CAMEL_SERVICE (store));
+       registry = e_mail_session_get_registry (E_MAIL_SESSION (session));
+       source = e_source_registry_ref_source (registry, camel_service_get_uid (CAMEL_SERVICE (store)));
+
+       e_ews_config_utils_run_folder_sizes_dialog (parent, registry, source, CAMEL_EWS_STORE (store));
+
+       g_object_unref (source);
+       g_object_unref (session);
+       g_object_unref (store);
+}
+
+static void
 action_subscribe_foreign_folder_cb (GtkAction *action,
                                     EShellView *shell_view)
 {
@@ -597,6 +872,12 @@ ews_ui_enable_actions (GtkActionGroup *action_group,
 }
 
 static GtkActionEntry mail_account_context_entries[] = {
+       { "mail-ews-folder-sizes",
+         NULL,
+         N_("Folder Sizes..."),
+         NULL,
+         NULL, /* XXX Add a tooltip! */
+         G_CALLBACK (action_folder_sizes_cb) },
 
        { "mail-ews-subscribe-foreign-folder",
          NULL,
@@ -618,6 +899,7 @@ static GtkActionEntry mail_folder_context_entries[] = {
 static const gchar *ews_ui_mail_def =
        "<popup name=\"mail-folder-popup\">\n"
        "  <placeholder name=\"mail-folder-popup-actions\">\n"
+       "    <menuitem action=\"mail-ews-folder-sizes\"/>\n"
        "    <menuitem action=\"mail-ews-subscribe-foreign-folder\"/>\n"
        "    <menuitem action=\"mail-ews-folder-permissions\"/>\n"
        "  </placeholder>\n"
diff --git a/src/configuration/e-ews-config-utils.h b/src/configuration/e-ews-config-utils.h
index f6487d8..a5e15d9 100644
--- a/src/configuration/e-ews-config-utils.h
+++ b/src/configuration/e-ews-config-utils.h
@@ -24,7 +24,7 @@
 #include <shell/e-shell-view.h>
 
 #include "server/e-ews-connection.h"
-#include "server/camel-ews-settings.h"
+#include "camel/camel-ews-store.h"
 
 typedef void           (* EEwsSetupFunc)                                       (GObject *with_object,
                                                                                 gpointer user_data,
@@ -63,4 +63,10 @@ GtkWindow *          e_ews_config_utils_get_widget_toplevel_window           (GtkWidget 
*widget);
 
 void                   e_ews_config_utils_unref_in_thread                      (GObject *object);
 
+void                   e_ews_config_utils_run_folder_sizes_dialog              (GtkWindow *parent,
+                                                                                ESourceRegistry *registry,
+                                                                                ESource *source,
+                                                                                CamelEwsStore *ews_store);
+
+
 #endif /* E_EWS_CONFIG_UTILS */
diff --git a/src/configuration/e-mail-config-ews-folder-sizes-page.c 
b/src/configuration/e-mail-config-ews-folder-sizes-page.c
new file mode 100644
index 0000000..8451b94
--- /dev/null
+++ b/src/configuration/e-mail-config-ews-folder-sizes-page.c
@@ -0,0 +1,305 @@
+/*
+ * e-mail-config-ews-folder-sizes-page.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
+
+#include <mail/e-mail-backend.h>
+#include <mail/e-mail-config-page.h>
+#include <mail/e-mail-config-security-page.h>
+
+#include "e-ews-config-utils.h"
+
+#include "e-mail-config-ews-folder-sizes-page.h"
+
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_GET_PRIVATE(obj) \
+       (G_TYPE_INSTANCE_GET_PRIVATE \
+       ((obj), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE, EMailConfigEwsFolderSizesPagePrivate))
+
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_SORT_ORDER \
+       (E_MAIL_CONFIG_SECURITY_PAGE_SORT_ORDER + 10)
+
+struct _EMailConfigEwsFolderSizesPagePrivate {
+       ESource *account_source;
+       ESourceRegistry *registry;
+};
+
+enum {
+       PROP_0,
+       PROP_ACCOUNT_SOURCE,
+       PROP_SOURCE_REGISTRY
+};
+
+static void e_mail_config_ews_folder_sizes_page_interface_init (EMailConfigPageInterface *interface);
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (EMailConfigEwsFolderSizesPage, e_mail_config_ews_folder_sizes_page, 
GTK_TYPE_BOX, 0,
+       G_IMPLEMENT_INTERFACE_DYNAMIC (E_TYPE_MAIL_CONFIG_PAGE, 
e_mail_config_ews_folder_sizes_page_interface_init))
+
+static void
+folder_sizes_clicked_cb (GtkWidget *button,
+                        EMailConfigEwsFolderSizesPage *page)
+{
+       GtkWindow *parent;
+       CamelService *service;
+       CamelSession *session;
+       EMailBackend *backend;
+       EShell *shell;
+       ESource *source;
+       ESourceRegistry *registry;
+
+       g_return_if_fail (page != NULL);
+
+       parent = GTK_WINDOW (gtk_widget_get_toplevel (button));
+
+       shell = e_shell_get_default ();
+       backend = E_MAIL_BACKEND (e_shell_get_backend_by_name (shell, "mail"));
+       g_return_if_fail (backend != NULL);
+
+       session = CAMEL_SESSION (e_mail_backend_get_session (backend));
+       source = e_mail_config_ews_folder_sizes_page_get_account_source (page);
+       registry = e_mail_config_ews_folder_sizes_page_get_source_registry (page);
+       service = camel_session_ref_service (session, e_source_get_uid (source));
+
+       e_ews_config_utils_run_folder_sizes_dialog (parent, registry, source, CAMEL_EWS_STORE (service));
+
+       g_object_unref (service);
+}
+
+static void
+mail_config_ews_folder_sizes_page_set_account_source (EMailConfigEwsFolderSizesPage *page,
+                                                     ESource *account_source)
+{
+       g_return_if_fail (E_IS_SOURCE (account_source));
+       g_return_if_fail (page->priv->account_source == NULL);
+
+       page->priv->account_source = g_object_ref (account_source);
+}
+
+static void
+mail_config_ews_folder_sizes_page_set_source_registry (EMailConfigEwsFolderSizesPage *page,
+                                                      ESourceRegistry *registry)
+{
+       g_return_if_fail (E_IS_SOURCE_REGISTRY (registry));
+       g_return_if_fail (page->priv->registry == NULL);
+
+       page->priv->registry = g_object_ref (registry);
+}
+
+static void
+mail_config_ews_folder_sizes_page_set_property (GObject *object,
+                                               guint property_id,
+                                               const GValue *value,
+                                               GParamSpec *pspec)
+{
+       switch (property_id) {
+               case PROP_ACCOUNT_SOURCE:
+                       mail_config_ews_folder_sizes_page_set_account_source (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object),
+                               g_value_get_object (value));
+                       return;
+
+               case PROP_SOURCE_REGISTRY:
+                       mail_config_ews_folder_sizes_page_set_source_registry (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object),
+                               g_value_get_object (value));
+                       return;
+       }
+
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_ews_folder_sizes_page_get_property (GObject *object,
+                                               guint property_id,
+                                               GValue *value,
+                                               GParamSpec *pspec)
+{
+       switch (property_id) {
+               case PROP_ACCOUNT_SOURCE:
+                       g_value_set_object (
+                               value,
+                               e_mail_config_ews_folder_sizes_page_get_account_source (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object)));
+                       return;
+
+               case PROP_SOURCE_REGISTRY:
+                       g_value_set_object (
+                               value,
+                               e_mail_config_ews_folder_sizes_page_get_source_registry (
+                               E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object)));
+                       return;
+       }
+
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+mail_config_ews_folder_sizes_page_dispose (GObject *object)
+{
+       EMailConfigEwsFolderSizesPagePrivate *priv;
+
+       priv = E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_GET_PRIVATE (object);
+
+       if (priv->account_source != NULL) {
+               g_object_unref (priv->account_source);
+               priv->account_source = NULL;
+       }
+
+       if (priv->registry != NULL) {
+               g_object_unref (priv->registry);
+               priv->registry = NULL;
+       }
+
+       /* Chain up to parent's dispose() method. */
+       G_OBJECT_CLASS (e_mail_config_ews_folder_sizes_page_parent_class)->dispose (object);
+}
+
+static void
+mail_config_ews_folder_sizes_page_constructed (GObject *object)
+{
+       EMailConfigEwsFolderSizesPage *page = E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (object);
+       GtkWidget *widget;
+       GtkGrid *content_grid;
+       gchar *markup;
+
+       /* Chain up to parent's constructed() method. */
+       G_OBJECT_CLASS (e_mail_config_ews_folder_sizes_page_parent_class)->constructed (object);
+
+       gtk_orientable_set_orientation (GTK_ORIENTABLE (page), GTK_ORIENTATION_VERTICAL);
+       gtk_box_set_spacing (GTK_BOX (page), 12);
+
+       content_grid = GTK_GRID (gtk_grid_new ());
+       gtk_grid_set_row_spacing (content_grid, 6);
+       gtk_grid_set_column_spacing (content_grid, 6);
+       gtk_box_pack_start (GTK_BOX (page), GTK_WIDGET (content_grid), FALSE, FALSE, 0);
+
+       markup = g_markup_printf_escaped ("<b>%s</b>", _("EWS Settings"));
+       widget = gtk_label_new (markup);
+       gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
+       gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+       gtk_grid_attach (content_grid, widget, 0, 0, 2, 1);
+
+       widget = gtk_label_new (_("View the size of all Exchange folders"));
+       gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
+       gtk_grid_attach (content_grid, widget, 0, 1, 1, 1);
+
+       widget = gtk_button_new_with_mnemonic (_("Folder _Sizes"));
+       g_signal_connect (widget, "clicked", G_CALLBACK (folder_sizes_clicked_cb), page);
+       gtk_grid_attach (content_grid, widget, 1, 1, 1, 1);
+
+       gtk_widget_show_all (GTK_WIDGET (page));
+}
+
+static void
+e_mail_config_ews_folder_sizes_page_class_init (EMailConfigEwsFolderSizesPageClass *class)
+{
+       GObjectClass *object_class;
+
+       g_type_class_add_private (class, sizeof (EMailConfigEwsFolderSizesPagePrivate));
+
+       object_class = G_OBJECT_CLASS (class);
+       object_class->set_property = mail_config_ews_folder_sizes_page_set_property;
+       object_class->get_property = mail_config_ews_folder_sizes_page_get_property;
+       object_class->dispose = mail_config_ews_folder_sizes_page_dispose;
+       object_class->constructed = mail_config_ews_folder_sizes_page_constructed;
+
+       g_object_class_install_property (
+               object_class,
+               PROP_ACCOUNT_SOURCE,
+               g_param_spec_object (
+                       "account-source",
+                       "Account Source",
+                       "Mail account source being edited",
+                       E_TYPE_SOURCE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT_ONLY));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_SOURCE_REGISTRY,
+               g_param_spec_object (
+                       "source-registry",
+                       "Source Registry",
+                       NULL,
+                       E_TYPE_SOURCE_REGISTRY,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+e_mail_config_ews_folder_sizes_page_class_finalize (EMailConfigEwsFolderSizesPageClass *class)
+{
+}
+
+static void
+e_mail_config_ews_folder_sizes_page_interface_init (EMailConfigPageInterface *interface)
+{
+       interface->title = _("EWS Settings");
+       interface->sort_order = E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_SORT_ORDER;
+}
+
+static void
+e_mail_config_ews_folder_sizes_page_init (EMailConfigEwsFolderSizesPage *page)
+{
+       page->priv = E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_GET_PRIVATE (page);
+}
+
+void
+e_mail_config_ews_folder_sizes_page_type_register (GTypeModule *type_module)
+{
+       /* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
+        *     function, so we have to wrap it with a public function in
+        *     order to register types from a separate compilation unit. */
+       e_mail_config_ews_folder_sizes_page_register_type (type_module);
+}
+
+EMailConfigPage *
+e_mail_config_ews_folder_sizes_page_new (ESource *account_source,
+                                        ESourceRegistry *registry)
+{
+       EMailConfigPage *page;
+
+       g_return_val_if_fail (E_IS_SOURCE (account_source), NULL);
+
+       page = g_object_new (E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE,
+               "account-source", account_source,
+               "source-registry", registry,
+               NULL);
+
+       return page;
+}
+
+ESource *
+e_mail_config_ews_folder_sizes_page_get_account_source (EMailConfigEwsFolderSizesPage *page)
+{
+       g_return_val_if_fail (E_IS_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (page), NULL);
+
+       return page->priv->account_source;
+}
+
+ESourceRegistry *
+e_mail_config_ews_folder_sizes_page_get_source_registry (EMailConfigEwsFolderSizesPage *page)
+{
+       g_return_val_if_fail (E_IS_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE (page), NULL);
+
+       return page->priv->registry;
+}
diff --git a/src/configuration/e-mail-config-ews-folder-sizes-page.h 
b/src/configuration/e-mail-config-ews-folder-sizes-page.h
new file mode 100644
index 0000000..d59caad
--- /dev/null
+++ b/src/configuration/e-mail-config-ews-folder-sizes-page.h
@@ -0,0 +1,71 @@
+/*
+ * e-mail-config-ews-folder-sizes-page.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#ifndef E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_H
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_H
+
+#include <gtk/gtk.h>
+#include <libedataserver/libedataserver.h>
+
+#include <mail/e-mail-config-page.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE \
+       (e_mail_config_ews_folder_sizes_page_get_type ())
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE(obj) \
+       (G_TYPE_CHECK_INSTANCE_CAST \
+       ((obj), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE, EMailConfigEwsFolderSizesPage))
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_CLASS(cls) \
+       (G_TYPE_CHECK_CLASS_CAST \
+       ((cls), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE, EMailConfigEwsFolderSizesPageClass))
+#define E_IS_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE(obj) \
+       (G_TYPE_CHECK_INSTANCE_TYPE \
+       ((obj), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE))
+#define E_IS_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_CLASS(cls) \
+       (G_TYPE_CHECK_CLASS_TYPE \
+       ((cls), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE))
+#define E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_GET_CLASS(obj) \
+       (G_TYPE_INSTANCE_GET_CLASS \
+       ((obj), E_TYPE_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE, EMailConfigEwsFolderSizesPage))
+
+G_BEGIN_DECLS
+
+typedef struct _EMailConfigEwsFolderSizesPage EMailConfigEwsFolderSizesPage;
+typedef struct _EMailConfigEwsFolderSizesPageClass EMailConfigEwsFolderSizesPageClass;
+typedef struct _EMailConfigEwsFolderSizesPagePrivate EMailConfigEwsFolderSizesPagePrivate;
+
+struct _EMailConfigEwsFolderSizesPage {
+       GtkBox parent;
+       EMailConfigEwsFolderSizesPagePrivate *priv;
+};
+
+struct _EMailConfigEwsFolderSizesPageClass {
+       GtkBoxClass parent_class;
+};
+
+GType                  e_mail_config_ews_folder_sizes_page_get_type            (void) G_GNUC_CONST;
+void                   e_mail_config_ews_folder_sizes_page_type_register       (GTypeModule *type_module);
+EMailConfigPage *      e_mail_config_ews_folder_sizes_page_new                 (ESource *account_source,
+                                                                                ESourceRegistry *registry);
+
+ESource *              e_mail_config_ews_folder_sizes_page_get_account_source  
(EMailConfigEwsFolderSizesPage *page);
+ESourceRegistry *      e_mail_config_ews_folder_sizes_page_get_source_registry 
(EMailConfigEwsFolderSizesPage *page);
+
+G_END_DECLS
+
+#endif /* E_MAIL_CONFIG_EWS_FOLDER_SIZES_PAGE_H */
diff --git a/src/configuration/e-mail-config-ews-notebook.c b/src/configuration/e-mail-config-ews-notebook.c
index 3f71a7a..2bbf97c 100644
--- a/src/configuration/e-mail-config-ews-notebook.c
+++ b/src/configuration/e-mail-config-ews-notebook.c
@@ -26,6 +26,7 @@
 
 #include "e-mail-config-ews-delegates-page.h"
 #include "e-mail-config-ews-ooo-page.h"
+#include "e-mail-config-ews-folder-sizes-page.h"
 
 G_DEFINE_DYNAMIC_TYPE (
        EMailConfigEwsNotebook,
@@ -93,6 +94,11 @@ mail_config_ews_notebook_constructed (GObject *object)
                        identity_source,
                        collection_source);
                e_mail_config_notebook_add_page (notebook, page);
+
+               page = e_mail_config_ews_folder_sizes_page_new (
+                       account_source,
+                       registry);
+               e_mail_config_notebook_add_page (notebook, page);
        }
 }
 
diff --git a/src/configuration/module-ews-configuration.c b/src/configuration/module-ews-configuration.c
index 2e6c7bd..f24ca56 100644
--- a/src/configuration/module-ews-configuration.c
+++ b/src/configuration/module-ews-configuration.c
@@ -31,6 +31,7 @@
 #include "e-mail-config-ews-oal-combo-box.h"
 #include "e-mail-config-ews-delegates-page.h"
 #include "e-mail-config-ews-ooo-page.h"
+#include "e-mail-config-ews-folder-sizes-page.h"
 #include "e-ews-ooo-notificator.h"
 
 #include "e-ews-config-ui-extension.h"
@@ -55,6 +56,7 @@ e_module_load (GTypeModule *type_module)
        e_mail_config_ews_oal_combo_box_type_register (type_module);
        e_mail_config_ews_delegates_page_type_register (type_module);
        e_mail_config_ews_ooo_page_type_register (type_module);
+       e_mail_config_ews_folder_sizes_page_type_register (type_module);
        e_ews_config_ui_extension_type_register (type_module);
        e_ews_ooo_notificator_type_register (type_module);
 
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 38e0263..2362eec 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -3272,6 +3272,9 @@ ews_append_additional_props_to_msg (ESoapMessage *msg,
                        if (ex_furi->distinguished_prop_set_id)
                                e_soap_message_add_attribute (msg, "DistinguishedPropertySetId", 
ex_furi->distinguished_prop_set_id, NULL, NULL);
 
+                       if (ex_furi->prop_tag)
+                               e_soap_message_add_attribute (msg, "PropertyTag", ex_furi->prop_tag, NULL, 
NULL);
+
                        if (ex_furi->prop_set_id)
                                e_soap_message_add_attribute (msg, "PropertySetId", ex_furi->prop_set_id, 
NULL, NULL);
 
diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c
index 98ee323..296ac35 100644
--- a/src/server/e-ews-folder.c
+++ b/src/server/e-ews-folder.c
@@ -44,6 +44,7 @@ struct _EEwsFolderPrivate {
        guint32 unread;
        guint32 total;
        guint32 child_count;
+       guint64 size;
        gboolean foreign;
 };
 
@@ -210,6 +211,23 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
        if (subparam)
                priv->child_count = e_soap_parameter_get_int_value (subparam);
 
+       subparam = e_soap_parameter_get_first_child_by_name (node, "ExtendedProperty");
+       if (subparam) {
+               ESoapParameter *subparam1;
+               gchar *prop_tag = NULL;
+
+               subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "ExtendedFieldURI");
+               if (subparam1) {
+                       prop_tag = e_soap_parameter_get_property (subparam1, "PropertyTag");
+                       if (g_strcmp0 (prop_tag, "0xe08") == 0) {
+                               subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "Value");
+                               if (subparam1)
+                                       priv->size = e_soap_parameter_get_int_value (subparam1);
+                       }
+                       g_free (prop_tag);
+               }
+       }
+
        return TRUE;
 }
 
@@ -431,6 +449,14 @@ e_ews_folder_get_child_count (EEwsFolder *folder)
        return folder->priv->child_count;
 }
 
+guint64
+e_ews_folder_get_size (EEwsFolder *folder)
+{
+       g_return_val_if_fail (E_IS_EWS_FOLDER (folder), -1);
+
+       return folder->priv->size;
+}
+
 gboolean
 e_ews_folder_get_foreign (EEwsFolder *folder)
 {
diff --git a/src/server/e-ews-folder.h b/src/server/e-ews-folder.h
index a9c4c0b..44a7065 100644
--- a/src/server/e-ews-folder.h
+++ b/src/server/e-ews-folder.h
@@ -71,6 +71,7 @@ const EwsFolderId *
 guint32                e_ews_folder_get_total_count (EEwsFolder *folder);
 guint32                e_ews_folder_get_unread_count (EEwsFolder *folder);
 guint32                e_ews_folder_get_child_count (EEwsFolder *folder);
+guint64                e_ews_folder_get_size (EEwsFolder *folder);
 gboolean       e_ews_folder_get_is_writable (EEwsFolder *folder);
 void           e_ews_folder_set_is_writable (EEwsFolder *folder, gboolean writable);
 EEwsFolderType e_ews_folder_get_folder_type (EEwsFolder *folder);


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