RemoteFolder rfolder;
gboolean use_auth;
+ gboolean lock_count;
};
static void news_folder_init (Folder *folder,
return 0;
}
+static void news_folder_lock(NewsFolder *folder)
+{
+ folder->lock_count++;
+}
+
+static void news_folder_unlock(NewsFolder *folder)
+{
+ if (folder->lock_count > 0)
+ folder->lock_count--;
+}
+
+int news_folder_locked(Folder *folder)
+{
+ if (folder == NULL)
+ return 0;
+
+ return NEWS_FOLDER(folder)->lock_count;
+}
+
static Folder *news_folder_new(const gchar *name, const gchar *path)
{
Folder *folder;
g_free(filename);
return NULL;
}
-
+ GTK_EVENTS_FLUSH();
return filename;
}
g_return_val_if_fail(session != NULL, -1);
*old_uids_valid = TRUE;
+
+ news_folder_lock(NEWS_FOLDER(item->folder));
ok = news_select_group(session, item->path, &num, &first, &last);
if (ok != NN_SUCCESS) {
log_warning(_("can't set group: %s\n"), item->path);
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return -1;
}
remove_numbered_files(dir, 1, first - 1);
}
g_free(dir);
-
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return nummsgs;
}
log_message(_("getting xover %d in %s...\n"),
num, item->path);
ok = nntp_xover(session, num, num);
+
+ news_folder_lock(NEWS_FOLDER(item->folder));
+
if (ok != NN_SUCCESS) {
log_warning(_("can't get xover\n"));
if (ok == NN_SOCKET) {
session_destroy(SESSION(session));
REMOTE_FOLDER(item->folder)->session = NULL;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return NULL;
}
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xover.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return NULL;
}
READ_TO_LISTEND("xover");
- if(!msginfo)
+ if(!msginfo) {
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return NULL;
-
+ }
+
msginfo->folder = item;
msginfo->flags.perm_flags = MSG_NEW|MSG_UNREAD;
msginfo->flags.tmp_flags = MSG_NEWS;
session_destroy(SESSION(session));
REMOTE_FOLDER(item->folder)->session = NULL;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return msginfo;
}
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return msginfo;
}
session_destroy(SESSION(session));
REMOTE_FOLDER(item->folder)->session = NULL;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return msginfo;
}
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return msginfo;
}
msginfo->cc = news_parse_xhdr(buf, msginfo);
READ_TO_LISTEND("xhdr (cc)");
-
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return msginfo;
}
return NULL;
}
+ news_folder_lock(NEWS_FOLDER(item->folder));
+
for (;;) {
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xover.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return newlist;
}
count++;
session_destroy(SESSION(session));
REMOTE_FOLDER(item->folder)->session = NULL;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return newlist;
}
for (;;) {
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return newlist;
}
count++;
session_destroy(SESSION(session));
REMOTE_FOLDER(item->folder)->session = NULL;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return newlist;
}
for (;;) {
if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
+ news_folder_unlock(NEWS_FOLDER(item->folder));
return newlist;
}
count++;
llast = llast->next;
}
+ news_folder_unlock(NEWS_FOLDER(item->folder));
session_set_access_time(SESSION(session));
first = GPOINTER_TO_INT(tmp_msgnum_list->data);
last = first;
+
+ news_folder_lock(NEWS_FOLDER(item->folder));
+
for(elem = g_slist_next(tmp_msgnum_list); elem != NULL; elem = g_slist_next(elem)) {
next = GPOINTER_TO_INT(elem->data);
if(next != (last + 1)) {
}
last = next;
}
+
+ news_folder_unlock(NEWS_FOLDER(item->folder));
+
session->fetch_base_percentage = ((gfloat) fetched) / ((gfloat) tofetch);
session->fetch_total_percentage = ((gfloat) (last - first + 1)) / ((gfloat) tofetch);
tmp_msginfo_list = news_get_msginfos_for_range(session, item, first, last);
#include "news_gtk.h"
#include "common/hooks.h"
#include "inc.h"
+#include "news.h"
static void subscribe_newsgroup_cb(FolderView *folderview, guint action, GtkWidget *widget);
static void unsubscribe_newsgroup_cb(FolderView *folderview, guint action, GtkWidget *widget);
static void set_sensitivity(GtkItemFactory *factory, FolderItem *item)
{
+ MainWindow *mainwin = mainwindow_get_mainwindow();
+
#define SET_SENS(name, sens) \
menu_set_sensitive(factory, name, sens)
- SET_SENS("/Subscribe to newsgroup...", folder_item_parent(item) == NULL);
- SET_SENS("/Unsubscribe newsgroup", folder_item_parent(item) != NULL);
- SET_SENS("/Check for new messages", folder_item_parent(item) == NULL);
+ SET_SENS("/Subscribe to newsgroup...",
+ folder_item_parent(item) == NULL
+ && mainwin->lock_count == 0
+ && news_folder_locked(item->folder) == 0);
+ SET_SENS("/Unsubscribe newsgroup",
+ folder_item_parent(item) != NULL
+ && mainwin->lock_count == 0
+ && news_folder_locked(item->folder) == 0);
+ SET_SENS("/Check for new messages",
+ folder_item_parent(item) == NULL
+ && mainwin->lock_count == 0
+ && news_folder_locked(item->folder) == 0);
#undef SET_SENS
}
GSList *new_subscr;
GSList *cur;
GNode *gnode;
-
+ MainWindow *mainwin = mainwindow_get_mainwindow();
+
if (!folderview->selected) return;
item = gtk_ctree_node_get_row_data(ctree, folderview->selected);
g_return_if_fail(item != NULL);
+
+ if (mainwin->lock_count || news_folder_locked(item->folder))
+ return;
+
folder = item->folder;
g_return_if_fail(folder != NULL);
g_return_if_fail(FOLDER_TYPE(folder) == F_NEWS);
gchar *message;
gchar *old_id;
AlertValue avalue;
-
+ MainWindow *mainwin = mainwindow_get_mainwindow();
+
if (!folderview->selected) return;
item = gtk_ctree_node_get_row_data(ctree, folderview->selected);
g_return_if_fail(item != NULL);
+
+ if (mainwin->lock_count || news_folder_locked(item->folder))
+ return;
+
g_return_if_fail(item->folder != NULL);
g_return_if_fail(FOLDER_TYPE(item->folder) == F_NEWS);
g_return_if_fail(item->folder->account != NULL);
GtkWidget *widget)
{
FolderItem *item;
-
+ MainWindow *mainwin = mainwindow_get_mainwindow();
+
item = folderview_get_selected_item(folderview);
g_return_if_fail(item != NULL);
+ if (mainwin->lock_count || news_folder_locked(item->folder))
+ return;
+
summary_show(folderview->summaryview, NULL);
g_return_if_fail(item->folder != NULL);
g_return_if_fail(item != NULL);
g_return_if_fail(item->folder != NULL);
+ if (mainwin->lock_count || news_folder_locked(item->folder))
+ return;
+
main_window_cursor_wait(mainwin);
inc_lock();
main_window_lock(mainwin);