aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-05-18 04:58:23 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-05-18 04:58:23 +0000
commit192f216fca62585bbd810655792a25393d612b06 (patch)
tree1c464ae4407321a5b22d8739ecc5276685b9d4bf
parentdc556e29120702f70ebea1f8d3237a26527b04e2 (diff)
cancel online mode switch if active sessions exist.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2881 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog7
-rw-r--r--libsylph/folder.c31
-rw-r--r--libsylph/folder.h6
-rw-r--r--libsylph/imap.c19
-rw-r--r--libsylph/imap.h4
-rw-r--r--src/mainwindow.c18
6 files changed, 80 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 8ac520a2..41497ea4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
}