aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/exchange-operations/exchange-folder.c
diff options
context:
space:
mode:
authorShakti Sen <shprasad@novell.com>2005-07-08 18:54:11 +0800
committerShakti Prasad Sen <shaktis@src.gnome.org>2005-07-08 18:54:11 +0800
commit371bd457e48b8bf8576799fbd318e1bbb18bee4e (patch)
tree3358a3011ac38edab1cc3cc933e269453f8ca55b /plugins/exchange-operations/exchange-folder.c
parente1fc2d427bf99a469a3539efc99dedbc3df4d731 (diff)
downloadgsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar.gz
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar.bz2
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar.lz
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar.xz
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.tar.zst
gsoc2013-evolution-371bd457e48b8bf8576799fbd318e1bbb18bee4e.zip
Added new file for Folder Permissions. Added new file for Folder
2005-07-08 Shakti Sen <shprasad@novell.com> * exchange-folder-permission.c: Added new file for Folder Permissions. * exchange-permissions-dialog.c: Added new file for Folder Permissions. * exchange-permissions-dialog.h: Added new file for Folder Permissions. * exchange-permissions-dialog.glade: Added newly for Folder Permissions support. * org-gnome-folder-permissions.xml: Added new file for Folder Permissions support. * exchange-folder-subscription.c: Added new file for Folder Subscribe/Unsubcribe support. * exchange-folder-subscription.h: Added new file for Folder Subscribe/Unsubcribe support. * exchange-folder.c: Added new file for Folder Subscribe/Unsubcribe support. * org-gnome-folder-subscription.xml: Added new file for Folder Subscribe/Unsubcribe support. svn path=/trunk/; revision=29684
Diffstat (limited to 'plugins/exchange-operations/exchange-folder.c')
-rw-r--r--plugins/exchange-operations/exchange-folder.c417
1 files changed, 417 insertions, 0 deletions
diff --git a/plugins/exchange-operations/exchange-folder.c b/plugins/exchange-operations/exchange-folder.c
new file mode 100644
index 0000000000..ac9269902a
--- /dev/null
+++ b/plugins/exchange-operations/exchange-folder.c
@@ -0,0 +1,417 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Shakti Sen <shprasad@novell.com>
+ * Copyright (C) 2005 Novell, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkdialog.h>
+#include <gconf/gconf-client.h>
+#include <exchange-hierarchy.h>
+#include <calendar/gui/e-cal-popup.h>
+#include <mail/em-popup.h>
+#include <mail/em-menu.h>
+#include "exchange-operations.h"
+#include "addressbook/gui/widgets/eab-popup.h"
+
+
+void org_gnome_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target);
+void org_gnome_check_subscribed (EPlugin *ep, ECalPopupTargetSource *target);
+void org_gnome_folder_unsubscribe (EPlugin *ep, EPopupItem *p, void *data);
+void org_gnome_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target);
+void org_gnome_folder_ab_unsubscribe (EPlugin *ep, EPopupItem *p, void *data);
+void org_gnome_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target);
+void org_gnome_folder_inbox_unsubscribe (EPlugin *ep, EPopupItem *p, void *data);
+void popup_free (EPopup *ep, GSList *items, void *data);
+void popup_inbox_free (EPopup *ep, GSList *items, void *data);
+void popup_ab_free (EPopup *ep, GSList *items, void *data);
+
+#define CONF_KEY_SELECTED_CAL_SOURCES "/apps/evolution/calendar/display/selected_calendars"
+
+
+static EPopupItem popup_inbox_items[] = {
+ { E_POPUP_ITEM, "29.inbox_unsubscribe", N_("Unsubscribe Folder..."), org_gnome_folder_inbox_unsubscribe, NULL, "stock_new-dir", 0, EM_POPUP_FOLDER_INFERIORS }
+};
+
+void
+popup_inbox_free (EPopup *ep, GSList *items, void *data)
+{
+ g_slist_free (items);
+}
+
+void
+org_gnome_folder_inbox_unsubscribe (EPlugin *ep, EPopupItem *p, void *data)
+{
+ // To be done:
+}
+
+void
+org_gnome_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target)
+{
+ GSList *menus = NULL;
+ int i = 0;
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+ gchar *path = NULL;
+ gchar *sub_folder = NULL;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ path = g_strdup_printf (target->uri + strlen ("exchange://") + strlen (account->account_filename));
+ sub_folder = strchr (path, '@');
+
+ if (!sub_folder)
+ return;
+
+ for (i = 0; i < sizeof (popup_inbox_items) / sizeof (popup_inbox_items[0]); i++)
+ menus = g_slist_prepend (menus, &popup_inbox_items[i]);
+
+ e_popup_add_items (target->target.popup, menus, NULL, popup_inbox_free, target);
+ g_free (path);
+}
+
+static EPopupItem popup_items[] = {
+ { E_POPUP_ITEM, "29.calendar_unsubscribe", N_("Unsubscribe Folder..."), org_gnome_folder_unsubscribe, NULL, "stock_new-dir", 0, EM_POPUP_FOLDER_INFERIORS }
+};
+
+void
+popup_free (EPopup *ep, GSList *items, void *data)
+{
+ g_slist_free (items);
+}
+
+static EPopupItem popup_ab_items[] = {
+ { E_POPUP_ITEM, "29.address_book_unsubscribe", N_("Unsubscribe Folder..."), org_gnome_folder_ab_unsubscribe, NULL, "stock_new-dir", 0, EM_POPUP_FOLDER_INFERIORS }
+};
+
+void
+popup_ab_free (EPopup *ep, GSList *items, void *data)
+{
+ g_slist_free (items);
+}
+
+void
+org_gnome_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target)
+{
+ GSList *menus = NULL;
+ int i = 0;
+ ESource *source = NULL;
+ gchar *uri = NULL;
+ gchar *path = NULL;
+ char *sub_folder = NULL;
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ source = e_source_selector_peek_primary_selection (target->selector);
+ uri = e_source_get_uri (source);
+ path = g_strdup_printf (uri + strlen ("exchange://") + strlen (account->account_filename));
+ sub_folder = strchr (path, '@');
+
+ if (!sub_folder)
+ return;
+
+ for (i = 0; i < sizeof (popup_ab_items) / sizeof (popup_ab_items[0]); i++)
+ menus = g_slist_prepend (menus, &popup_ab_items[i]);
+
+ e_popup_add_items (target->target.popup, menus, NULL, popup_ab_free, target);
+ g_free (path);
+
+}
+
+void
+org_gnome_check_subscribed (EPlugin *ep, ECalPopupTargetSource *target)
+{
+ GSList *menus = NULL;
+ int i = 0;
+ ESource *source = NULL;
+ gchar *ruri = NULL;
+ gchar *path = NULL;
+ char *sub_folder = NULL;
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ source = e_source_selector_peek_primary_selection (target->selector);
+ ruri = e_source_peek_relative_uri (source);
+ path = g_strdup_printf (ruri + strlen (account->account_filename));
+ sub_folder = strchr (path, '@');
+
+ if (!sub_folder)
+ return;
+
+ for (i = 0; i < sizeof (popup_items) / sizeof (popup_items[0]); i++)
+ menus = g_slist_prepend (menus, &popup_items[i]);
+
+ e_popup_add_items (target->target.popup, menus, NULL, popup_free, target);
+ g_free (path);
+}
+
+static void
+unsubscribe_dialog_ab_response (GtkDialog *dialog, int response, gpointer data)
+{
+
+ if (response == GTK_RESPONSE_OK) {
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+ gchar *path = NULL;
+ gchar *uri = NULL;
+ const char *source_uid = NULL;
+ GConfClient *client;
+ ESourceGroup *source_group = NULL;
+ ESource *source = NULL;
+ EABPopupTargetSource *target = data;
+
+ client = gconf_client_get_default ();
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+ source = e_source_selector_peek_primary_selection (target->selector);
+ uri = e_source_get_uri (source);
+ path = g_strdup_printf (uri + strlen ("exchange://") + strlen (account->account_filename));
+ source_uid = e_source_peek_uid (source);
+
+ exchange_account_remove_shared_folder (account, path);
+
+ source_group = e_source_peek_group (source);
+ e_source_group_remove_source_by_uid (source_group, source_uid);
+ g_free (path);
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ }
+ if (response == GTK_RESPONSE_CANCEL)
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ if (response == GTK_RESPONSE_DELETE_EVENT)
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+unsubscribe_dialog_response (GtkDialog *dialog, int response, gpointer data)
+{
+
+ if (response == GTK_RESPONSE_OK) {
+ GSList *accounts, *acc;
+ GSList *ids, *node_to_be_deleted;
+ ExchangeAccount *account = NULL;
+ gchar *path = NULL;
+ gchar *ruri = NULL;
+ const char *source_uid = NULL;
+ GConfClient *client;
+ ESourceGroup *source_group = NULL;
+ ESource *source = NULL;
+ ECalPopupTargetSource *target = data;
+
+ client = gconf_client_get_default ();
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+ source = e_source_selector_peek_primary_selection (target->selector);
+ ruri = e_source_peek_relative_uri (source);
+ source_uid = e_source_peek_uid (source);
+
+ path = g_strdup_printf (ruri + strlen (account->account_filename));
+ exchange_account_remove_shared_folder (account, path);
+ ids = gconf_client_get_list (client,
+ CONF_KEY_SELECTED_CAL_SOURCES,
+ GCONF_VALUE_STRING, NULL);
+ if (ids) {
+ node_to_be_deleted = g_slist_find_custom (
+ ids,
+ source_uid,
+ (GCompareFunc) strcmp);
+ if (node_to_be_deleted) {
+ g_free (node_to_be_deleted->data);
+ ids = g_slist_delete_link (ids,
+ node_to_be_deleted);
+ gconf_client_set_list (client,
+ CONF_KEY_SELECTED_CAL_SOURCES,
+ GCONF_VALUE_STRING, ids, NULL);
+ }
+ g_slist_foreach (ids, (GFunc) g_free, NULL);
+ g_slist_free (ids);
+ }
+
+ source_group = e_source_peek_group (source);
+ e_source_group_remove_source_by_uid (source_group, source_uid);
+ g_free (path);
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ }
+ if (response == GTK_RESPONSE_CANCEL)
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+ if (response == GTK_RESPONSE_DELETE_EVENT)
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+void
+org_gnome_folder_ab_unsubscribe (EPlugin *ep, EPopupItem *p, void *data)
+{
+ GtkWidget *dialog = NULL;
+ EABPopupTargetSource *target = data;
+ ESource *source = NULL;
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+ gchar *title = NULL;
+ gchar *displayed_folder_name = NULL;
+ gint response;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ source = e_source_selector_peek_primary_selection (target->selector);
+ displayed_folder_name = e_source_peek_name (source);
+ dialog = gtk_message_dialog_new (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("Really unsubscribe from folder \"%s\"?"),
+ displayed_folder_name);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_REMOVE, GTK_RESPONSE_OK);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
+
+ gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 6);
+
+ title = g_strdup_printf (_("Unsubscribe from \"%s\""), displayed_folder_name);
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ g_free (title);
+ g_free (displayed_folder_name);
+
+ gtk_widget_show (dialog);
+ unsubscribe_dialog_ab_response (dialog, response, data);
+}
+void
+org_gnome_folder_unsubscribe (EPlugin *ep, EPopupItem *p, void *data)
+{
+ GtkWidget *dialog = NULL;
+ ECalPopupTargetSource *target = data;
+ ESource *source = NULL;
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+ gchar *title = NULL;
+ gchar *displayed_folder_name = NULL;
+ gint response;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ source = e_source_selector_peek_primary_selection (target->selector);
+ displayed_folder_name = e_source_peek_name (source);
+ dialog = gtk_message_dialog_new (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("Really unsubscribe from folder \"%s\"?"),
+ displayed_folder_name);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_REMOVE, GTK_RESPONSE_OK);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
+
+ gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 6);
+
+ title = g_strdup_printf (_("Unsubscribe from \"%s\""), displayed_folder_name);
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+ g_free (title);
+ g_free (displayed_folder_name);
+
+ gtk_widget_show (dialog);
+ unsubscribe_dialog_response (dialog, response, data);
+}
+
+
+void
+org_gnome_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target)
+{
+ GSList *accounts, *acc;
+ ExchangeAccount *account = NULL;
+ EFolder *folder = NULL;
+ ExchangeHierarchy *hier;
+ ExchangeAccountFolderResult result;
+ gchar *folder_display_name = NULL;
+ gchar *folder_type = NULL;
+ gchar *physical_uri = NULL;
+ gchar *user_email_address = NULL, *storage_name, *folder_name = NULL;
+
+ accounts = exchange_config_listener_get_accounts (exchange_global_config_listener);
+ for (acc = accounts; acc; acc = acc->next) {
+ account = acc->data;
+ }
+
+ create_folder_subscription_dialog (account->account_name, &user_email_address, &folder_name);
+
+ if (user_email_address && folder_name)
+ result = exchange_account_discover_shared_folder (account, user_email_address, folder_name, &folder);
+
+ if (!folder) {
+ return;
+ }
+
+ hier = e_folder_exchange_get_hierarchy (folder);
+ folder_display_name = g_strdup_printf ("%s's %s", hier->owner_name, folder_name);
+ folder_type = e_folder_get_type_string (folder);
+ physical_uri = e_folder_get_physical_uri (folder);
+ if (!(strcmp (folder_type, "calendar")) ||
+ !(strcmp (folder_type, "calendar/public"))) {
+ add_folder_esource (account, EXCHANGE_CALENDAR_FOLDER, folder_display_name, physical_uri);
+ }
+ else if (!(strcmp (folder_type, "tasks")) ||
+ !(strcmp (folder_type, "tasks/public"))) {
+ add_folder_esource (account, EXCHANGE_TASKS_FOLDER, folder_display_name, physical_uri);
+ }
+ else if (!(strcmp (folder_type, "contacts")) ||
+ !(strcmp (folder_type, "contacts/public")) ||
+ !(strcmp (folder_type, "contacts/ldap"))) {
+ add_folder_esource (account, EXCHANGE_CONTACTS_FOLDER, folder_display_name, physical_uri);
+}
+
+g_free (folder_display_name);
+exchange_account_open_folder (account, g_strdup_printf ("/%s", user_email_address));
+}
+