/* * 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 * * * Authors: * Shakti Sen * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "exchange-operations.h" #include "addressbook/gui/widgets/eab-popup.h" #include "exchange-folder-subscription.h" void org_gnome_exchange_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target, gchar *fname); void org_gnome_exchange_inbox_subscription (EPlugin *ep, EMMenuTargetSelect *target); void org_gnome_exchange_addressbook_subscription (EPlugin *ep, EMMenuTargetSelect *target); void org_gnome_exchange_calendar_subscription (EPlugin *ep, EMMenuTargetSelect *target); void org_gnome_exchange_tasks_subscription (EPlugin *ep, EMMenuTargetSelect *target); void org_gnome_exchange_check_subscribed (EPlugin *ep, ECalPopupTargetSource *target); void org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, void *data); void org_gnome_exchange_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target); void org_gnome_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, void *data); void org_gnome_exchange_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target); void org_gnome_exchange_folder_inbox_unsubscribe (EPopup *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); static void exchange_get_folder (char *uri, CamelFolder *folder, 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_exchange_folder_inbox_unsubscribe, NULL, "folder-new", 0, EM_POPUP_FOLDER_INFERIORS } }; void popup_inbox_free (EPopup *ep, GSList *items, void *data) { g_slist_free (items); } void org_gnome_exchange_folder_inbox_unsubscribe (EPopup *ep, EPopupItem *p, void *data) { ExchangeAccount *account = NULL; EMPopupTargetFolder *target = data; gchar *path = NULL; gchar *stored_path = NULL; const char *inbox_uri = NULL; const char *inbox_physical_uri = NULL; gchar *target_uri = NULL; EFolder *inbox; ExchangeAccountFolderResult result; account = exchange_operations_get_exchange_account (); if (!account) return; target_uri = g_strdup (target->uri); path = target->uri + strlen ("exchange://") + strlen (account->account_filename); /* User will be able to unsubscribe by doing a right click on any one of this two-Inbox or the tree. */ stored_path = strrchr (path + 1, '/'); if (stored_path) path[stored_path - path] = '\0'; result = exchange_account_remove_shared_folder (account, path); switch (result) { case EXCHANGE_ACCOUNT_FOLDER_OK: break; case EXCHANGE_ACCOUNT_FOLDER_ALREADY_EXISTS: e_error_run (NULL, ERROR_DOMAIN ":folder-exists-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_DOES_NOT_EXIST: e_error_run (NULL, ERROR_DOMAIN ":folder-doesnt-exist-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_UNKNOWN_TYPE: e_error_run (NULL, ERROR_DOMAIN ":folder-unknown-type", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_PERMISSION_DENIED: e_error_run (NULL, ERROR_DOMAIN ":folder-perm-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_OFFLINE: e_error_run (NULL, ERROR_DOMAIN ":folder-offline-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_UNSUPPORTED_OPERATION: e_error_run (NULL, ERROR_DOMAIN ":folder-unsupported-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_GENERIC_ERROR: e_error_run (NULL, ERROR_DOMAIN ":folder-generic-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_GC_NOTREACHABLE: e_error_run (NULL, ERROR_DOMAIN ":folder-no-gc-error", NULL); return; case EXCHANGE_ACCOUNT_FOLDER_NO_SUCH_USER: e_error_run (NULL, ERROR_DOMAIN ":no-user-error", NULL); return; } /* We need to get the physical uri for the Inbox */ inbox_uri = exchange_account_get_standard_uri (account, "inbox"); inbox = exchange_account_get_folder (account, inbox_uri); inbox_physical_uri = e_folder_get_physical_uri (inbox); /* To get the CamelStore/Folder */ mail_get_folder (inbox_physical_uri, 0, exchange_get_folder, target_uri, mail_msg_unordered_push); } static CamelFolderInfo * ex_create_folder_info (CamelStore *store, char *name, char *uri, int unread_count, int flags) { CamelFolderInfo *info; const char *path; path = strstr (uri, "://"); if (!path) return NULL; path = strchr (path + 3, '/'); if (!path) return NULL; info = camel_folder_info_new (); info->name = name; info->uri = uri; info->full_name = g_strdup (path + 1); info->unread = unread_count; return info; } static void exchange_get_folder (char *uri, CamelFolder *folder, void *data) { CamelStore *store; CamelException ex; CamelFolderInfo *info; gchar *name = NULL; gchar *stored_name = NULL; gchar *target_uri = (gchar *)data; ExchangeAccount *account = NULL; account = exchange_operations_get_exchange_account (); if (!account) return; /* Get the subscribed folder name. */ name = target_uri + strlen ("exchange://") + strlen (account->account_filename); stored_name = strrchr (name + 1, '/'); if (stored_name) name[stored_name - name] = '\0'; camel_exception_init (&ex); store = camel_folder_get_parent_store (folder); /* Construct the CamelFolderInfo */ info = ex_create_folder_info (store, name, target_uri, -1, 0); camel_object_trigger_event (CAMEL_OBJECT (store), "folder_unsubscribed", info); g_free (target_uri); } void org_gnome_exchange_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *target) { GSList *menus = NULL; int i = 0; ExchangeAccount *account = NULL; gchar *path = NULL; gchar *sub_folder = NULL; if (!g_strrstr (target->uri, "exchange://")) return; account = exchange_operations_get_exchange_account (); if (!account) return; path = g_strdup (target->uri + strlen ("exchange://") + strlen (account->account_filename)); sub_folder = strchr (path, '@'); g_free (path); if (!sub_folder || !g_strrstr(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); } static EPopupItem popup_items[] = { { E_POPUP_ITEM, "29.calendar_unsubscribe", N_("Unsubscribe Folder..."), org_gnome_exchange_folder_unsubscribe, NULL, "folder-new", 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_exchange_folder_ab_unsubscribe, NULL, "folder-new", 0, EM_POPUP_FOLDER_INFERIORS } }; void popup_ab_free (EPopup *ep, GSList *items, void *data) { g_slist_free (items); } void org_gnome_exchange_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; const char *base_uri; ExchangeAccount *account = NULL; ESourceGroup *group; account = exchange_operations_get_exchange_account (); if (!account) return; source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector)); group = e_source_peek_group (source); base_uri = e_source_group_peek_base_uri (group); if (!base_uri || strcmp (base_uri, "exchange://")) return; uri = e_source_get_uri (source); path = g_strdup (uri + strlen ("exchange://") + strlen (account->account_filename) + strlen ("/;")); g_free (uri); sub_folder = strchr (path, '@'); if (!sub_folder) { g_free (path); 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_exchange_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; const char *base_uri; ExchangeAccount *account = NULL; ESourceGroup *group; account = exchange_operations_get_exchange_account (); if (!account) return; source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector)); group = e_source_peek_group (source); base_uri = e_source_group_peek_base_uri (group); if (!base_uri || strcmp (base_uri, "exchange://")) return; ruri = (gchar *) e_source_peek_relative_uri (source); path = g_strdup (ruri + strlen (account->account_filename) + strlen ("/;")); sub_folder = strchr (path, '@'); if (!sub_folder) { g_free (path); 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) { ExchangeAccount *account = NULL; gchar *path = NULL; gchar *uri = NULL; const char *source_uid = NULL; ESourceGroup *source_group = NULL; ESource *source = NULL; EABPopupTargetSource *target = data; account = exchange_operations_get_exchange_account (); if (!account) return; source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector)); uri = e_source_get_uri (source); path = g_strdup (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 *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 (); account = exchange_operations_get_exchange_account (); if (!account) return; source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector)); ruri = (gchar *) e_source_peek_relative_uri (source); source_uid = e_source_peek_uid (source); path = g_strdup (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_exchange_folder_ab_unsubscribe (EPopup *ep, EPopupItem *p, void *data) { GtkWidget *dialog = NULL; EABPopupTargetSource *target = data; ESource *source = NULL; ExchangeAccount *account = NULL; gchar *title = NULL; gchar *displayed_folder_name = NULL; gint response; gint mode; ExchangeConfigListenerStatus status; account = exchange_operations_get_exchange_account (); if (!account) return; status = exchange_is_offline (&mode); if (status != CONFIG_LISTENER_STATUS_OK) { g_warning ("Config listener not found"); return; } else if (mode == OFFLINE_MODE) { e_error_run (NULL, ERROR_DOMAIN ":account-offline-generic", NULL); return; } source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector)); displayed_folder_name = (gchar *) 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 (GTK_DIALOG (dialog), response, data); } void org_gnome_exchange_folder_unsubscribe (EPopup *ep, EPopupItem *p, void *data) { GtkWidget *dialog = NULL; ECalPopupTargetSource *target = data; ESource *source = NULL; ExchangeAccount *account = NULL; gchar *title = NULL; const gchar *displayed_folder_name; gint response; gint mode; ExchangeConfigListenerStatus status; account = exchange_operations_get_exchange_account (); if (!account) return; status = exchange_is_offline (&mode); if (status != CONFIG_LISTENER_STATUS_OK) { g_warning ("Config listener not found"); return; } else if (mode == OFFLINE_MODE) { e_error_run (NULL, ERROR_DOMAIN ":account-offline-generic", NULL); return; } source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (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); gtk_widget_show (dialog); unsubscribe_dialog_response (GTK_DIALOG (dialog), response, data); } void org_gnome_exchange_folder_subscription (EPlugin *ep, EMMenuTargetSelect *target, gchar *fname) { ExchangeAccount *account = NULL; gint mode; ExchangeConfigListenerStatus status; account = exchange_operations_get_exchange_account (); if (!account) return; status = exchange_is_offline (&mode); if (status != CONFIG_LISTENER_STATUS_OK) { g_warning ("Config listener not found"); return; } else if (mode == OFFLINE_MODE) { /* Translators: this error code can be used for any operation * (like subscribing to other user's folders, unsubscribing * etc,) which can not be performed in offline mode */ e_error_run (NULL, ERROR_DOMAIN ":account-offline-generic", NULL); return; } create_folder_subscription_dialog (account, fname); } void org_gnome_exchange_calendar_subscription (EPlugin *ep, EMMenuTargetSelect *target) { gchar *folder_name = N_("Calendar"); org_gnome_exchange_folder_subscription (ep, target, folder_name); } void org_gnome_exchange_addressbook_subscription (EPlugin *ep, EMMenuTargetSelect *target) { gchar *folder_name = N_("Contacts"); org_gnome_exchange_folder_subscription (ep, target, folder_name); } void org_gnome_exchange_tasks_subscription (EPlugin *ep, EMMenuTargetSelect *target) { gchar *folder_name = N_("Tasks"); org_gnome_exchange_folder_subscription (ep, target, folder_name); } void org_gnome_exchange_inbox_subscription (EPlugin *ep, EMMenuTargetSelect *target) { gchar *folder_name = N_("Inbox"); org_gnome_exchange_folder_subscription (ep, target, folder_name); } ef='#n262'>262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295






































































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
ÿØÿá¯Exif