diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | libsylph/folder.c | 31 | ||||
-rw-r--r-- | libsylph/folder.h | 6 | ||||
-rw-r--r-- | libsylph/imap.c | 19 | ||||
-rw-r--r-- | libsylph/imap.h | 4 | ||||
-rw-r--r-- | src/mainwindow.c | 18 |
6 files changed, 80 insertions, 5 deletions
@@ -1,3 +1,10 @@ +2011-05-18 + + * libsylph/folder.[ch] + libsylph/imap.[ch] + src/mainwindow.c: cancel online mode switch if active sessions + exist. + 2011-05-13 * src/textview.c: textview_make_clickable_parts(): removed alloca() diff --git a/libsylph/folder.c b/libsylph/folder.c index 97c13237..33d0356e 100644 --- a/libsylph/folder.c +++ b/libsylph/folder.c @@ -172,7 +172,8 @@ gint folder_remote_folder_destroy_all_sessions(void) folder = FOLDER(list->data); if (FOLDER_IS_REMOTE(folder)) { rfolder = REMOTE_FOLDER(folder); - if (rfolder->session) { + if (rfolder->session && + !folder_remote_folder_is_session_active(rfolder)) { session_destroy(rfolder->session); rfolder->session = NULL; } @@ -182,6 +183,34 @@ gint folder_remote_folder_destroy_all_sessions(void) return 0; } +gboolean folder_remote_folder_is_session_active(RemoteFolder *rfolder) +{ + g_return_val_if_fail(rfolder != NULL, FALSE); + + if (FOLDER_TYPE(rfolder) == F_IMAP) + return imap_is_session_active(IMAP_FOLDER(rfolder)); + + return FALSE; +} + +gboolean folder_remote_folder_active_session_exist(void) +{ + GList *list; + Folder *folder; + RemoteFolder *rfolder; + + for (list = folder_list; list != NULL; list = list->next) { + folder = FOLDER(list->data); + if (FOLDER_IS_REMOTE(folder)) { + rfolder = REMOTE_FOLDER(folder); + if (folder_remote_folder_is_session_active(rfolder)) + return TRUE; + } + } + + return FALSE; +} + gint folder_scan_tree(Folder *folder) { g_return_val_if_fail(folder != NULL, -1); diff --git a/libsylph/folder.h b/libsylph/folder.h index 81f90f0a..e989f9bb 100644 --- a/libsylph/folder.h +++ b/libsylph/folder.h @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2009 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -335,6 +335,10 @@ void folder_remote_folder_destroy(RemoteFolder *rfolder); gint folder_remote_folder_destroy_all_sessions (void); +gboolean folder_remote_folder_is_session_active + (RemoteFolder *rfolder); +gboolean folder_remote_folder_active_session_exist (void); + gint folder_scan_tree (Folder *folder); gint folder_create_tree (Folder *folder); diff --git a/libsylph/imap.c b/libsylph/imap.c index 53d37b58..5414d0ac 100644 --- a/libsylph/imap.c +++ b/libsylph/imap.c @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2010 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -5112,3 +5112,20 @@ static gint imap_thread_run_progress(IMAPSession *session, IMAPThreadFunc func, return ret; } #endif /* USE_THREADS */ + +gboolean imap_is_session_active(IMAPFolder *folder) +{ +#if USE_THREADS + IMAPRealSession *real; + + g_return_val_if_fail(folder != NULL, FALSE); + + real = (IMAPRealSession *)(REMOTE_FOLDER(folder)->session); + if (!real) + return FALSE; + + return real->is_running; +#else + return FALSE; +#endif +} diff --git a/libsylph/imap.h b/libsylph/imap.h index 81211b53..ac928b4d 100644 --- a/libsylph/imap.h +++ b/libsylph/imap.h @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2010 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -125,4 +125,6 @@ gint imap_msg_list_unset_perm_flags (GSList *msglist, gint imap_msg_list_set_colorlabel_flags (GSList *msglist, guint color); +gboolean imap_is_session_active (IMAPFolder *folder); + #endif /* __IMAP_H__ */ diff --git a/src/mainwindow.c b/src/mainwindow.c index 2eb2e6b0..185c42b9 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2010 Hiroyuki Yamamoto + * Copyright (C) 1999-2011 Hiroyuki Yamamoto * * 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 @@ -3075,10 +3075,18 @@ static void online_switch_clicked(GtkWidget *widget, gpointer data) MainWindow *mainwin = (MainWindow *)data; GtkWidget *menuitem; + debug_print("Toggle online mode: %d -> %d\n", prefs_common.online_mode, + !prefs_common.online_mode); + menuitem = gtk_item_factory_get_item(mainwin->menu_factory, "/File/Work offline"); if (prefs_common.online_mode == TRUE) { + if (folder_remote_folder_active_session_exist()) { + debug_print("Active session exist. Cancelling online switch.\n"); + return; + } + prefs_common.online_mode = FALSE; gtk_widget_hide(mainwin->online_pixmap); gtk_widget_show(mainwin->offline_pixmap); @@ -3363,6 +3371,14 @@ static void print_cb(MainWindow *mainwin, guint action, GtkWidget *widget) static void toggle_offline_cb(MainWindow *mainwin, guint action, GtkWidget *widget) { + if (GTK_CHECK_MENU_ITEM(widget)->active && + folder_remote_folder_active_session_exist()) { + debug_print("Active session exist. Cancelling online switch.\n"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), + FALSE); + return; + } + main_window_toggle_online (mainwin, !GTK_CHECK_MENU_ITEM(widget)->active); } |