if (session->state != SESSION_READY || news_folder_locked(news_session->folder))
return FALSE;
+ news_folder_lock(NEWS_FOLDER(news_session->folder));
+
if ((r = nntp_threaded_date(news_session->folder, <)) != NEWSNNTP_NO_ERROR) {
if (r != NEWSNNTP_ERROR_COMMAND_NOT_SUPPORTED &&
r != NEWSNNTP_ERROR_COMMAND_NOT_UNDERSTOOD) {
news_session->folder->account->set_nntpport ?
news_session->folder->account->nntpport : NNTP_PORT);
REMOTE_FOLDER(news_session->folder)->session = NULL;
+ news_folder_unlock(NEWS_FOLDER(news_session->folder));
+ session->state = SESSION_DISCONNECTED;
+ session->sock = NULL;
session_destroy(session);
return FALSE;
}
}
+
+ news_folder_unlock(NEWS_FOLDER(news_session->folder));
session_set_access_time(session);
return TRUE;
}
r = nntp_threaded_connect(folder, server, port);
if (r != NEWSNNTP_NO_ERROR) {
- log_error(LOG_PROTOCOL, _("Error logging in to %s:%d ...\n"), server, port);
- session_destroy(SESSION(session));
+ log_error(LOG_PROTOCOL, _("Error logging in to %s:%d...\n"), server, port);
+ if (session != NULL)
+ session_destroy(SESSION(session));
return NULL;
}
session->folder = folder;
- session_register_ping(SESSION(session), nntp_ping);
return SESSION(session);
}
else {
/* An error state bail out */
log_error(LOG_PROTOCOL, _("Error creating session with %s:%d\n"), ac->nntp_server, port);
- session_destroy(SESSION(session));
+ if (session != NULL)
+ session_destroy(SESSION(session));
g_free(passwd);
if (ac->session_passwd) {
g_free(ac->session_passwd);
if ((session != NULL) && ac->use_nntp_auth) { /* FIXME: && ac->use_nntp_auth_onconnect */
if (nntp_threaded_login(folder, userid, passwd) !=
NEWSNNTP_NO_ERROR) {
- log_error(LOG_PROTOCOL, _("Error authenticating to %s:%d ...\n"), ac->nntp_server, port);
+ log_error(LOG_PROTOCOL, _("Error authenticating to %s:%d...\n"), ac->nntp_server, port);
session_destroy(SESSION(session));
g_free(passwd);
if (ac->session_passwd) {
if (!rfolder->session) {
rfolder->session = news_session_new_for_folder(folder);
+ session_register_ping(SESSION(rfolder->session), nntp_ping);
return NEWS_SESSION(rfolder->session);
}
if (rfolder->session->port != folder->account->nntpport) {
session_destroy(rfolder->session);
rfolder->session = news_session_new_for_folder(folder);
+ session_register_ping(SESSION(rfolder->session), nntp_ping);
goto newsession;
}
return NEWS_SESSION(rfolder->session);
}
- if (!nntp_ping(rfolder->session))
+ if (!nntp_ping(rfolder->session)) {
rfolder->session = news_session_new_for_folder(folder);
+ session_register_ping(SESSION(rfolder->session), nntp_ping);
+ }
newsession:
if (rfolder->session)
r = nntp_threaded_article(folder, num, &result, &len);
if (r == NEWSNNTP_NO_ERROR) {
- if (str_write_to_file(result, filename) < 0)
+ if (str_write_to_file(result, filename) < 0) {
+ mmap_string_unref(result);
return -1;
- g_free(result);
+ }
+ mmap_string_unref(result);
}
return r;
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>
return &news_class;
}
+void nntp_disconnect_all(gboolean have_connectivity)
+{
+}
#endif