[evolution-ews] Bug #675737 - Show user's folder sizes
- From: Fabiano Fidêncio <ffidencio src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug #675737 - Show user's folder sizes
- Date: Fri, 16 Aug 2013 16:32:13 +0000 (UTC)
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]