X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fnews.c;h=27a500221133c976b268ddfdc7e4dc4e56e2f2e0;hp=279b8f960622a8408007f7b2aeb32959867d0fa6;hb=ce4a512127c7f7651421625968a9d5b1d2833c1c;hpb=036b63d8fc5a8c6e1ff150737226122c174c39cb diff --git a/src/news.c b/src/news.c index 279b8f960..27a500221 100644 --- a/src/news.c +++ b/src/news.c @@ -28,6 +28,7 @@ #include #include +#include "defs.h" #include "intl.h" #include "news.h" #include "nntp.h" @@ -41,6 +42,9 @@ #include "codeconv.h" #include "utils.h" #include "prefs_common.h" +#include "prefs_account.h" +#include "inputdialog.h" +#include "alertpanel.h" static gint news_get_article_cmd (NNTPSession *session, const gchar *cmd, @@ -64,23 +68,29 @@ static GSList *news_delete_old_article (GSList *alist, static void news_delete_all_article (FolderItem *item); -Session *news_session_new(const gchar *server, gushort port) +static Session *news_session_new(const gchar *server, gushort port, + const gchar *userid, const gchar *passwd) { gchar buf[NNTPBUFSIZE]; NNTPSession *session; - gint nntp_sock; + NNTPSockInfo *nntp_sock; g_return_val_if_fail(server != NULL, NULL); log_message(_("creating NNTP connection to %s:%d ...\n"), server, port); - if ((nntp_sock = nntp_open(server, port, buf)) < 0) + if (userid && passwd) + nntp_sock = nntp_open_auth(server, port, buf, userid, passwd); + else + nntp_sock = nntp_open(server, port, buf); + if (nntp_sock < 0) return NULL; session = g_new(NNTPSession, 1); SESSION(session)->type = SESSION_NEWS; SESSION(session)->server = g_strdup(server); - SESSION(session)->sock = nntp_sock; + session->nntp_sock = nntp_sock; + SESSION(session)->sock = nntp_sock->sock; SESSION(session)->connected = TRUE; SESSION(session)->phase = SESSION_READY; SESSION(session)->data = NULL; @@ -91,30 +101,75 @@ Session *news_session_new(const gchar *server, gushort port) void news_session_destroy(NNTPSession *session) { - close(SESSION(session)->sock); + nntp_close(session->nntp_sock); + session->nntp_sock = NULL; + SESSION(session)->sock = NULL; g_free(session->group); } +static gchar *news_query_password(const gchar *server, + const gchar *user) +{ + gchar *message; + gchar *pass; + + message = g_strdup_printf(_("Input password for %s on %s:"), + user, server); + + pass = input_dialog_with_invisible(_("Input password"), + message, NULL); + g_free(message); +/* manage_window_focus_in(inc_dialog->mainwin->window, */ +/* NULL, NULL); */ + return pass; +} + +static Session *news_session_new_for_folder(Folder *folder) +{ + Session *session; + PrefsAccount *ac; + const gchar *userid; + gchar *passwd; + + ac = folder->account; + if (ac->userid && ac->userid[0]) { + userid = ac->userid; + if (ac->passwd && ac->passwd[0]) + passwd = g_strdup(ac->passwd); + else { + passwd = news_query_password(ac->nntp_server, userid); + if (!passwd) + userid = NULL; + } + } else { + userid = passwd = NULL; + } + session = news_session_new(ac->nntp_server, 119, userid, passwd); + g_free(passwd); + return session; +} + NNTPSession *news_session_get(Folder *folder) { + NNTPSession *session; + g_return_val_if_fail(folder != NULL, NULL); g_return_val_if_fail(folder->type == F_NEWS, NULL); g_return_val_if_fail(folder->account != NULL, NULL); if (!REMOTE_FOLDER(folder)->session) { REMOTE_FOLDER(folder)->session = - news_session_new(folder->account->nntp_server, 119); + news_session_new_for_folder(folder); } else { - if (nntp_mode(REMOTE_FOLDER(folder)->session->sock, FALSE) - != NN_SUCCESS) { + session = NNTP_SESSION(REMOTE_FOLDER(folder)->session); + if (nntp_mode(session->nntp_sock, FALSE) != NN_SUCCESS) { log_warning(_("NNTP connection to %s:%d has been" " disconnected. Reconnecting...\n"), folder->account->nntp_server, 119); session_destroy(REMOTE_FOLDER(folder)->session); REMOTE_FOLDER(folder)->session = - news_session_new(folder->account->nntp_server, - 119); + news_session_new_for_folder(folder); } } @@ -223,7 +278,7 @@ gint news_post(Folder *folder, const gchar *file) return -1; } - ok = nntp_post(SESSION(session)->sock, fp); + ok = nntp_post(session->nntp_sock, fp); if (ok != NN_SUCCESS) { log_warning(_("can't post article.\n")); return -1; @@ -241,14 +296,14 @@ static gint news_get_article_cmd(NNTPSession *session, const gchar *cmd, { gchar *msgid; - if (nntp_get_article(SESSION(session)->sock, cmd, num, &msgid) + if (nntp_get_article(session->nntp_sock, cmd, num, &msgid) != NN_SUCCESS) return -1; debug_print("Message-Id = %s, num = %d\n", msgid, num); g_free(msgid); - 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 article %d\n"), num); return -1; } @@ -285,7 +340,7 @@ static GSList *news_get_uncached_articles(NNTPSession *session, g_return_val_if_fail(item->folder != NULL, NULL); g_return_val_if_fail(item->folder->type == F_NEWS, NULL); - ok = nntp_group(SESSION(session)->sock, item->path, + ok = nntp_group(session->nntp_sock, item->path, &num, &first, &last); if (ok != NN_SUCCESS) { log_warning(_("can't set group: %s\n"), item->path); @@ -315,13 +370,13 @@ static GSList *news_get_uncached_articles(NNTPSession *session, log_message(_("getting xover %d - %d in %s...\n"), begin, end, item->path); - if (nntp_xover(SESSION(session)->sock, begin, end) != NN_SUCCESS) { + if (nntp_xover(session->nntp_sock, begin, end) != NN_SUCCESS) { log_warning(_("can't get xover\n")); return NULL; } for (;;) { - if (sock_read(SESSION(session)->sock, buf, sizeof(buf)) < 0) { + if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) { log_warning(_("error occurred while getting xover.\n")); return newlist; } @@ -482,3 +537,89 @@ static void news_delete_all_article(FolderItem *item) debug_print(_("done.\n")); } + +/* + news_get_group_list returns a strings list. + These strings are the names of the newsgroups of a server. + item is the FolderItem of the news server. + The names of the newsgroups are cached into a file so that + when the function is called again, there is no need to make + a request to the server. + */ + +GSList * news_get_group_list(FolderItem *item) +{ + gchar *path, *filename; + gint ok; + NNTPSession *session; + GSList * group_list = NULL; + FILE * f; + gchar buf[NNTPBUFSIZE]; + int len; + + if (item == NULL) + return NULL; + + path = folder_item_get_path(item); + + if (!is_dir_exist(path)) + make_dir_hier(path); + + filename = g_strconcat(path, G_DIR_SEPARATOR_S, GROUPLIST_FILE, NULL); + g_free(path); + + session = news_session_get(item->folder); + + if (session == NULL) + return NULL; + + if (is_file_exist(filename)) { + debug_print(_("group list has been already cached.\n")); + } + else { + ok = nntp_list(session->nntp_sock); + if (ok != NN_SUCCESS) + return NULL; + + if (recv_write_to_file(SESSION(session)->sock, filename) < 0) { + log_warning(_("can't retrieve group list\n")); + return NULL; + } + } + + f = fopen(filename, "r"); + while (fgets(buf, NNTPBUFSIZE, f)) { + char * s; + + len = 0; + while ((buf[len] != 0) && (buf[len] != ' ')) + len++; + buf[len] = 0; + s = g_strdup(buf); + + group_list = g_slist_append(group_list, s); + } + fclose(f); + g_free(filename); + + group_list = g_slist_sort(group_list, (GCompareFunc) g_strcasecmp); + + return group_list; +} + +/* + remove the cache file of the names of the newsgroups. + */ + +void news_reset_group_list(FolderItem *item) +{ + gchar *path, *filename; + + debug_print(_("\tDeleting cached group list... ")); + path = folder_item_get_path(item); + filename = g_strconcat(path, G_DIR_SEPARATOR_S, GROUPLIST_FILE, NULL); + g_free(path); + if (remove(filename) != 0) + log_warning(_("can't delete cached group list %s\n"), filename); + g_free(filename); +}