/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2002 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2003 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
#include "prefs_common.h"
#include "prefs_account.h"
#include "inputdialog.h"
-#include "alertpanel.h"
#include "log.h"
#include "progressindicator.h"
#if USE_OPENSSL
gint news_post_stream (Folder *folder,
FILE *fp);
+FolderClass news_class =
+{
+ F_NEWS,
+ "news",
+ "News",
+
+ /* Folder functions */
+ news_folder_new,
+ news_folder_destroy,
+ NULL,
+ NULL,
+
+ /* FolderItem functions */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ news_get_num_list,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ /* Message functions */
+ news_get_msginfo,
+ news_get_msginfos,
+ news_fetch_msg,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ news_remove_msg,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+FolderClass *news_get_class()
+{
+ return &news_class;
+}
+
Folder *news_folder_new(const gchar *name, const gchar *path)
{
Folder *folder;
folder = (Folder *)g_new0(NewsFolder, 1);
+ folder->class = &news_class;
news_folder_init(folder, name, path);
return folder;
static void news_folder_init(Folder *folder, const gchar *name,
const gchar *path)
{
- folder->type = F_NEWS;
-
folder_remote_folder_init(folder, name, path);
-
-/*
- folder->get_msg_list = news_get_article_list;
-*/
- folder->fetch_msg = news_fetch_msg;
-/*
- folder->scan = news_scan_group;
-*/
- folder->destroy = news_folder_destroy;
- folder->remove_msg = news_remove_msg;
- folder->get_num_list = news_get_num_list;
- folder->get_msginfo = news_get_msginfo;
- folder->get_msginfos = news_get_msginfos;
}
#if USE_OPENSSL
if (nntp_sock == NULL)
return NULL;
- session = g_new(NNTPSession, 1);
+ session = g_new0(NNTPSession, 1);
+ session_init(SESSION(session));
SESSION(session)->type = SESSION_NEWS;
SESSION(session)->server = g_strdup(server);
- session->nntp_sock = nntp_sock;
- SESSION(session)->sock = nntp_sock->sock;
- SESSION(session)->connected = TRUE;
- SESSION(session)->phase = SESSION_READY;
- SESSION(session)->last_access_time = time(NULL);
+ SESSION(session)->sock = NULL;
SESSION(session)->data = NULL;
SESSION(session)->destroy = news_session_destroy;
- session->group = NULL;
+ session->nntp_sock = nntp_sock;
+ session->group = NULL;
return SESSION(session);
}
{
nntp_close(NNTP_SESSION(session)->nntp_sock);
NNTP_SESSION(session)->nntp_sock = NULL;
- session->sock = NULL;
g_free(NNTP_SESSION(session)->group);
}
RemoteFolder *rfolder = REMOTE_FOLDER(folder);
g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(folder->type == F_NEWS, NULL);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
g_return_val_if_fail(folder->account != NULL, NULL);
if (!rfolder->session) {
gchar buf[NNTPBUFSIZE];
g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(folder->type == F_NEWS, NULL);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
path = folder_item_get_path(FOLDER_ITEM(folder->node->data));
if (!is_dir_exist(path))
g_free(filename);
return NULL;
}
- if (recv_write_to_file(SESSION(session)->sock, filename) < 0) {
+ if (recv_write_to_file
+ (session->nntp_sock->sock, filename) < 0) {
log_warning("can't retrieve newsgroup list\n");
session_destroy(SESSION(session));
REMOTE_FOLDER(folder)->session = NULL;
gchar *path, *filename;
g_return_if_fail(folder != NULL);
- g_return_if_fail(folder->type == F_NEWS);
+ g_return_if_fail(FOLDER_CLASS(folder) == &news_class);
path = folder_item_get_path(FOLDER_ITEM(folder->node->data));
filename = g_strconcat(path, G_DIR_SEPARATOR_S, NEWSGROUP_LIST, NULL);
gint ok;
g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(folder->type == F_NEWS, -1);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, -1);
g_return_val_if_fail(file != NULL, -1);
if ((fp = fopen(file, "rb")) == NULL) {
gint ok;
g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(folder->type == F_NEWS, -1);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, -1);
g_return_val_if_fail(fp != NULL, -1);
session = news_session_get(folder);
g_return_val_if_fail(item != NULL, -1);
g_return_val_if_fail(item->folder != NULL, -1);
- g_return_val_if_fail(item->folder->type == F_NEWS, -1);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, -1);
session = news_session_get(folder);
g_return_val_if_fail(session != NULL, -1);
#define READ_TO_LISTEND(hdr) \
while (!(buf[0] == '.' && buf[1] == '\r')) { \
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) { \
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) { \
log_warning(_("error occurred while getting %s.\n"), hdr); \
return msginfo; \
} \
g_return_val_if_fail(session != NULL, NULL);
g_return_val_if_fail(item != NULL, NULL);
g_return_val_if_fail(item->folder != NULL, NULL);
- g_return_val_if_fail(item->folder->type == F_NEWS, NULL);
+ g_return_val_if_fail(FOLDER_CLASS(item->folder) == &news_class, NULL);
log_message(_("getting xover %d in %s...\n"),
num, item->path);
return NULL;
}
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xover.\n"));
return NULL;
}
return msginfo;
}
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
return msginfo;
}
return msginfo;
}
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
return msginfo;
}
GSList *newlist = NULL;
GSList *llast = NULL;
MsgInfo *msginfo;
- guint count = 0, lines = (end - begin + 1) * 3;
+ guint count = 0, lines = (end - begin + 2) * 3;
g_return_val_if_fail(session != NULL, NULL);
g_return_val_if_fail(item != NULL, NULL);
}
for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xover.\n"));
return newlist;
}
count++;
progressindicator_set_percentage
- (PROGRESS_TYPE_NETWORK, session->fetch_base_percentage + ((gfloat) count / (gfloat) lines));
+ (PROGRESS_TYPE_NETWORK,
+ session->fetch_base_percentage +
+ (((gfloat) count) / ((gfloat) lines)) * session->fetch_total_percentage);
if (buf[0] == '.' && buf[1] == '\r') break;
llast = newlist;
for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
return newlist;
}
count++;
progressindicator_set_percentage
- (PROGRESS_TYPE_NETWORK, session->fetch_base_percentage + ((gfloat) count / (gfloat) lines));
+ (PROGRESS_TYPE_NETWORK,
+ session->fetch_base_percentage +
+ (((gfloat) count) / ((gfloat) lines)) * session->fetch_total_percentage);
if (buf[0] == '.' && buf[1] == '\r') break;
if (!llast) {
llast = newlist;
for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
+ if (sock_gets(session->nntp_sock->sock, buf, sizeof(buf)) < 0) {
log_warning(_("error occurred while getting xhdr.\n"));
return newlist;
}
count++;
progressindicator_set_percentage
- (PROGRESS_TYPE_NETWORK, session->fetch_base_percentage + ((gfloat) count / (gfloat) lines));
+ (PROGRESS_TYPE_NETWORK,
+ session->fetch_base_percentage +
+ (((gfloat) count) / ((gfloat) lines)) * session->fetch_total_percentage);
if (buf[0] == '.' && buf[1] == '\r') break;
if (!llast) {
guint tofetch, fetched;
g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(folder->type == F_NEWS, NULL);
+ g_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
g_return_val_if_fail(msgnum_list != NULL, NULL);
g_return_val_if_fail(item != NULL, NULL);
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)) {
- session->fetch_base_percentage = (gfloat) fetched / (gfloat) tofetch;
+ 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);
msginfo_list = g_slist_concat(msginfo_list, tmp_msginfo_list);
fetched = last - first + 1;
}
last = next;
}
+ 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);
msginfo_list = g_slist_concat(msginfo_list, tmp_msginfo_list);