2012-11-28 [colin] 3.9.0cvs28
[claws.git] / src / news.c
index 393c7a1a7b0e72ba5e733a36847341ee247dc9c5..e5792c860b2c8e1ae00c510ff3659aa80926c72f 100644 (file)
@@ -19,6 +19,7 @@
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #ifdef HAVE_LIBETPAN
@@ -82,7 +83,7 @@ struct _NewsFolder
 struct _NewsSession
 {
        Session session;
-
+       Folder *folder;
        gchar *group;
 };
 
@@ -157,6 +158,7 @@ FolderClass *news_get_class(void)
                news_class.type = F_NEWS;
                news_class.idstr = "news";
                news_class.uistr = "News";
+               news_class.supports_server_search = FALSE;
 
                /* Folder functions */
                news_class.new_folder = news_folder_new;
@@ -174,6 +176,7 @@ FolderClass *news_get_class(void)
                news_class.get_msginfos = news_get_msginfos;
                news_class.fetch_msg = news_fetch_msg;
                news_class.synchronise = news_synchronise;
+               news_class.search_msgs = folder_item_search_msgs_local;
                news_class.remove_msg = news_remove_msg;
                news_class.remove_cached_msg = news_remove_cached_msg;
        };
@@ -279,6 +282,34 @@ static void news_session_destroy(Session *session)
                g_free(news_session->group);
 }
 
+static gboolean nntp_ping(gpointer data)
+{
+       Session *session = (Session *)data;
+       NewsSession *news_session = NEWS_SESSION(session);
+       int r;
+       struct tm lt;
+
+       if (session->state != SESSION_READY || news_folder_locked(news_session->folder))
+               return FALSE;
+       
+       if ((r = nntp_threaded_date(news_session->folder, &lt)) != NEWSNNTP_NO_ERROR) {
+               if (r != NEWSNNTP_ERROR_COMMAND_NOT_SUPPORTED &&
+                   r != NEWSNNTP_ERROR_COMMAND_NOT_UNDERSTOOD) {
+                       log_warning(LOG_PROTOCOL, _("NNTP connection to %s:%d has been"
+                             " disconnected.\n"),
+                           news_session->folder->account->nntp_server,
+                           news_session->folder->account->set_nntpport ?
+                           news_session->folder->account->nntpport : NNTP_PORT);
+                       REMOTE_FOLDER(news_session->folder)->session = NULL;
+                       session_destroy(session);
+                       return FALSE;
+               }
+       }
+       session_set_access_time(session);
+       return TRUE;
+}
+
+
 #ifdef USE_GNUTLS
 static Session *news_session_new(Folder *folder, const gchar *server, gushort port,
                                 const gchar *userid, const gchar *passwd,
@@ -292,8 +323,8 @@ static Session *news_session_new(Folder *folder, const gchar *server, gushort po
        int r = 0;
        cm_return_val_if_fail(server != NULL, NULL);
 
-       log_message(LOG_PROTOCOL, _("Account '%s': Connecting to NNTP server: %s...\n"),
-                                   folder->account->account_name, server);
+       log_message(LOG_PROTOCOL, _("Account '%s': Connecting to NNTP server: %s:%d...\n"),
+                                   folder->account->account_name, server, port);
 
        session = g_new0(NewsSession, 1);
        session_init(SESSION(session), folder->account, FALSE);
@@ -317,7 +348,10 @@ static Session *news_session_new(Folder *folder, const gchar *server, gushort po
                session_destroy(SESSION(session));
                return NULL;
        }
-       
+
+       session->folder = folder;
+
+       session_register_ping(SESSION(session), nntp_ping);
        return SESSION(session);
 }
 
@@ -434,8 +468,6 @@ static Session *news_session_new_for_folder(Folder *folder)
 static NewsSession *news_session_get(Folder *folder)
 {
        RemoteFolder *rfolder = REMOTE_FOLDER(folder);
-       struct tm lt;
-       int r;
        
        cm_return_val_if_fail(folder != NULL, NULL);
        cm_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
@@ -466,18 +498,8 @@ static NewsSession *news_session_get(Folder *folder)
                return NEWS_SESSION(rfolder->session);
        }
 
-       if ((r = nntp_threaded_date(folder, &lt)) != NEWSNNTP_NO_ERROR) {
-               if (r != NEWSNNTP_ERROR_COMMAND_NOT_SUPPORTED &&
-                   r != NEWSNNTP_ERROR_COMMAND_NOT_UNDERSTOOD) {
-                       log_warning(LOG_PROTOCOL, _("NNTP connection to %s:%d has been"
-                             " disconnected. Reconnecting...\n"),
-                           folder->account->nntp_server,
-                           folder->account->set_nntpport ?
-                           folder->account->nntpport : NNTP_PORT);
-                       session_destroy(rfolder->session);
-                       rfolder->session = news_session_new_for_folder(folder);
-               }
-       }
+       if (!nntp_ping(rfolder->session))
+               rfolder->session = news_session_new_for_folder(folder);
 
 newsession:
        if (rfolder->session)
@@ -1254,7 +1276,8 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        NewsSession *session;
        GSList *elem, *msginfo_list = NULL, *tmp_msgnum_list, *tmp_msginfo_list;
        guint first, last, next;
-       guint tofetch, fetched;
+/*     guint tofetch, fetched;
+*/
        
        cm_return_val_if_fail(folder != NULL, NULL);
        cm_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
@@ -1268,8 +1291,9 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        tmp_msgnum_list = g_slist_sort(tmp_msgnum_list, g_int_compare);
 
        progressindicator_start(PROGRESS_TYPE_NETWORK);
-       tofetch = g_slist_length(tmp_msgnum_list);
+/*     tofetch = g_slist_length(tmp_msgnum_list);
        fetched = 0;
+*/
 
        first = GPOINTER_TO_INT(tmp_msgnum_list->data);
        last = first;
@@ -1284,7 +1308,8 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
 */
                        tmp_msginfo_list = news_get_msginfos_for_range(session, item, first, last);
                        msginfo_list = g_slist_concat(msginfo_list, tmp_msginfo_list);
-                       fetched = last - first + 1;
+/*                     fetched = last - first + 1;
+*/
                        first = next;
                }
                last = next;
@@ -1355,6 +1380,48 @@ static gint news_remove_folder(Folder *folder, FolderItem *item)
        return 0;
 }
 
+void nntp_disconnect_all(gboolean have_connectivity)
+{
+       GList *list;
+       gboolean short_timeout;
+#ifdef HAVE_NETWORKMANAGER_SUPPORT
+       GError *error;
+#endif
+
+#ifdef HAVE_NETWORKMANAGER_SUPPORT
+       error = NULL;
+       short_timeout = !networkmanager_is_online(&error);
+       if(error) {
+               short_timeout = TRUE;
+               g_error_free(error);
+       }
+#else
+       short_timeout = TRUE;
+#endif
+
+       if(short_timeout)
+               nntp_main_set_timeout(1);
+
+       for (list = account_get_list(); list != NULL; list = list->next) {
+               PrefsAccount *account = list->data;
+               if (account->protocol == A_NNTP) {
+                       RemoteFolder *folder = (RemoteFolder *)account->folder;
+                       if (folder && folder->session) {
+                               NewsSession *session = (NewsSession *)folder->session;
+                               if (have_connectivity)
+                                       nntp_threaded_disconnect(FOLDER(folder));
+                               SESSION(session)->state = SESSION_DISCONNECTED;
+                               SESSION(session)->sock = NULL;
+                               session_destroy(SESSION(session));
+                               folder->session = NULL;
+                       }
+               }
+       }
+
+       if(short_timeout)
+               nntp_main_set_timeout(prefs_common.io_timeout_secs);
+}
+
 #else
 #include <glib.h>
 #include <glib/gi18n.h>
@@ -1431,5 +1498,8 @@ FolderClass *news_get_class(void)
        return &news_class;
 }
 
+void nntp_disconnect_all(gboolean have_connectivity)
+{
+}
 
 #endif