2009-03-25 [colin] 3.7.1cvs25
authorColin Leroy <colin@colino.net>
Wed, 25 Mar 2009 17:38:40 +0000 (17:38 +0000)
committerColin Leroy <colin@colino.net>
Wed, 25 Mar 2009 17:38:40 +0000 (17:38 +0000)
* src/news.c
* src/etpan/nntp-thread.c
Fix header fetching (NG/To/Cc). Fixes
bug 1883, 'Message processing fails to
act on Newsgroups: field'

ChangeLog
PATCHSETS
configure.ac
src/etpan/nntp-thread.c
src/news.c

index db90b161b04e7a438599cb13632dcdb9a785a1a2..a3b4f8d602601dcdb19f30fc34bfc46228d37710 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-03-25 [colin]     3.7.1cvs25
+
+       * src/news.c
+       * src/etpan/nntp-thread.c
+               Fix header fetching (NG/To/Cc). Fixes 
+               bug 1883, 'Message processing fails to 
+               act on Newsgroups: field'
+
 2009-03-23 [colin]     3.7.1cvs24
 
        * src/textview.c
index 9af3b9a35627e171900a1d4b2715a8ea22481fa2..fb83b1c831edfeb2d811d095a2a049cb7066f0c4 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.43.2.107 -r 1.43.2.108 src/toolbar.c;  cvs diff -u -r 1.36.2.168 -r 1.36.2.169 src/common/utils.c;  ) > 3.7.1cvs22.patchset
 ( cvs diff -u -r 1.654.2.3830 -r 1.654.2.3831 configure.ac;  ) > 3.7.1cvs23.patchset
 ( cvs diff -u -r 1.96.2.217 -r 1.96.2.218 src/textview.c;  ) > 3.7.1cvs24.patchset
+( cvs diff -u -r 1.101.2.60 -r 1.101.2.61 src/news.c;  cvs diff -u -r 1.1.2.10 -r 1.1.2.11 src/etpan/nntp-thread.c;  ) > 3.7.1cvs25.patchset
index 1efb70d9947d2cefeac26a27ad5cc518603a9044..fb7f1849e01792d8387736c8f6f96b129a05a56f 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=7
 MICRO_VERSION=1
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=24
+EXTRA_VERSION=25
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
@@ -86,7 +86,11 @@ AM_PROG_LEX
 AC_PROG_YACC
 AC_LIB_PREFIX
 AC_LIBTOOL_WIN32_DLL
+<<<<<<< configure.ac
+dnl LT_AC_PROG_RC
+=======
 LT_AC_PROG_RC
+>>>>>>> 1.654.2.3832
 AC_LIBTOOL_RC
 AC_PROG_LIBTOOL
 
index a42992818517c871e908b592d2b7342b956eae59..eb6e393e8bd5965231087d9eb1e3a90e607df421 100644 (file)
@@ -972,8 +972,7 @@ static void xhdr_run(struct etpan_thread_op * op)
        if (param->beg == param->end) {
                r = newsnntp_xhdr_single(param->nntp, param->header, param->beg, param->hdrlist);
        } else {
-               r = -1;
-               g_warning("XHDR range not implemented\n");
+               r = newsnntp_xhdr_range(param->nntp, param->header, param->beg, param->end, param->hdrlist);
        }
        
        result->error = r;
index 0d12cf4308e12d7cb61f446bdad0be9c669d07e5..0d4d6fa71a891762453a654e124ca269c2d413c5 100644 (file)
@@ -124,8 +124,6 @@ static gint news_select_group                (Folder        *folder,
                                          gint          *first,
                                          gint          *last);
 static MsgInfo *news_parse_xover        (struct newsnntp_xover_resp_item *item);
-static gchar *news_parse_xhdr           (clist         *list,
-                                         MsgInfo       *msginfo);
 static gint news_get_num_list                   (Folder        *folder, 
                                          FolderItem    *item,
                                          GSList       **list,
@@ -841,19 +839,6 @@ static MsgInfo *news_parse_xover(struct newsnntp_xover_resp_item *item)
        return msginfo;
 }
 
-static gchar *news_parse_xhdr(clist *hdrlist, MsgInfo *msginfo)
-{
-       struct newsnntp_xhdr_resp_item *hdr;
-       
-       if (!hdrlist)
-               return NULL;
-
-       hdr = clist_content(clist_begin(hdrlist));
-       if (hdr->hdr_article != msginfo->msgnum)
-               return NULL;
-       return g_strdup(hdr->hdr_value);
-}
-
 gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
 {
        gchar * tmp;
@@ -1023,54 +1008,62 @@ static void news_set_msg_flags(FolderItem *item, MsgInfo *msginfo)
        }
 }
 
-static MsgInfo *news_get_msginfo(Folder *folder, FolderItem *item, gint num)
+static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList *msglist)
 {
-       NewsSession *session;
        MsgInfo *msginfo = NULL;
        gint ok;
-       struct newsnntp_xover_resp_item *result = NULL;
+       GSList *cur;
        clist *hdrlist = NULL;
+       clistiter *hdr;
+       gint first = -1, last = -1;
+       GHashTable *hash_table;
+       
+       cm_return_if_fail(session != NULL);
+       cm_return_if_fail(item != NULL);
+       cm_return_if_fail(item->folder != NULL);
+       cm_return_if_fail(FOLDER_CLASS(item->folder) == &news_class);
 
-       session = news_session_get(folder);
-       cm_return_val_if_fail(session != NULL, NULL);
-       cm_return_val_if_fail(item != NULL, NULL);
-       cm_return_val_if_fail(item->folder != NULL, NULL);
-       cm_return_val_if_fail(FOLDER_CLASS(item->folder) == &news_class, NULL);
-
-       log_message(LOG_PROTOCOL, _("getting xover %d in %s...\n"),
-                   num, item->path);
        news_folder_lock(NEWS_FOLDER(item->folder));
 
-       ok = nntp_threaded_xover(folder, num, num, &result, NULL);
+       hash_table = g_hash_table_new(g_direct_hash, g_direct_equal);
+       
+       for (cur = msglist; cur; cur = cur->next) {
+               msginfo = (MsgInfo *)cur->data;
+               if (first == -1 || msginfo->msgnum < first)
+                       first = msginfo->msgnum;
+               if (last == -1 || msginfo->msgnum > last)
+                       last = msginfo->msgnum;
+               g_hash_table_insert(hash_table,
+                               GINT_TO_POINTER(msginfo->msgnum), msginfo);
+       }
+
+/* Newsgroups */
+       ok = nntp_threaded_xhdr(item->folder, "newsgroups", first, last, &hdrlist);
+
        if (ok != NEWSNNTP_NO_ERROR) {
-               log_warning(LOG_PROTOCOL, _("couldn't get xover\n"));
+               log_warning(LOG_PROTOCOL, _("couldn't get xhdr\n"));
                if (ok == NEWSNNTP_ERROR_STREAM) {
                        session_destroy(SESSION(session));
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
-               return NULL;
-       }
-       
-       msginfo = news_parse_xover(result);
-       xover_resp_item_free(result);
-       if (!msginfo) {
-               log_warning(LOG_PROTOCOL, _("invalid xover line\n"));
+               return;
        }
 
-       if(!msginfo) {
-               news_folder_unlock(NEWS_FOLDER(item->folder));
-               return NULL;
+       for (hdr = clist_begin(hdrlist); hdr; hdr = clist_next(hdr)) {
+               struct newsnntp_xhdr_resp_item *hdrval = clist_content(hdr);
+               msginfo = g_hash_table_lookup(hash_table, GINT_TO_POINTER(hdrval->hdr_article));
+               if (msginfo) {
+                       if (msginfo->newsgroups)
+                               g_free(msginfo->newsgroups);
+                       msginfo->newsgroups = g_strdup(hdrval->hdr_value);
+               }
        }
-
-       msginfo->folder = item;
+       newsnntp_xhdr_free(hdrlist);
        
-       news_set_msg_flags(item, msginfo);
-       msginfo->flags.tmp_flags |= MSG_NEWS;
-       msginfo->newsgroups = g_strdup(item->path);
+/* To */
+       ok = nntp_threaded_xhdr(item->folder, "to", first, last, &hdrlist);
 
-       ok = nntp_threaded_xhdr(folder, "to", num, num, &hdrlist);
-       
        if (ok != NEWSNNTP_NO_ERROR) {
                log_warning(LOG_PROTOCOL, _("couldn't get xhdr\n"));
                if (ok == NEWSNNTP_ERROR_STREAM) {
@@ -1078,14 +1071,23 @@ static MsgInfo *news_get_msginfo(Folder *folder, FolderItem *item, gint num)
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
-               return msginfo;
+               return;
        }
 
-       msginfo->to = news_parse_xhdr(hdrlist, msginfo);
+       for (hdr = clist_begin(hdrlist); hdr; hdr = clist_next(hdr)) {
+               struct newsnntp_xhdr_resp_item *hdrval = clist_content(hdr);
+               msginfo = g_hash_table_lookup(hash_table, GINT_TO_POINTER(hdrval->hdr_article));
+               if (msginfo) {
+                       if (msginfo->to)
+                               g_free(msginfo->to);
+                       msginfo->to = g_strdup(hdrval->hdr_value);
+               }
+       }
        newsnntp_xhdr_free(hdrlist);
-
-       ok = nntp_threaded_xhdr(folder, "cc", num, num, &hdrlist);
        
+/* Cc */
+       ok = nntp_threaded_xhdr(item->folder, "cc", first, last, &hdrlist);
+
        if (ok != NEWSNNTP_NO_ERROR) {
                log_warning(LOG_PROTOCOL, _("couldn't get xhdr\n"));
                if (ok == NEWSNNTP_ERROR_STREAM) {
@@ -1093,14 +1095,23 @@ static MsgInfo *news_get_msginfo(Folder *folder, FolderItem *item, gint num)
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
-               return msginfo;
+               return;
        }
 
-       msginfo->cc = news_parse_xhdr(hdrlist, msginfo);
+       for (hdr = clist_begin(hdrlist); hdr; hdr = clist_next(hdr)) {
+               struct newsnntp_xhdr_resp_item *hdrval = clist_content(hdr);
+               msginfo = g_hash_table_lookup(hash_table, GINT_TO_POINTER(hdrval->hdr_article));
+               if (msginfo) {
+                       if (msginfo->cc)
+                               g_free(msginfo->cc);
+                       msginfo->cc = g_strdup(hdrval->hdr_value);
+               }
+       }
        newsnntp_xhdr_free(hdrlist);
+       
 
+       g_hash_table_destroy(hash_table);
        news_folder_unlock(NEWS_FOLDER(item->folder));
-       return msginfo;
 }
 
 static GSList *news_get_msginfos_for_range(NewsSession *session, FolderItem *item, guint begin, guint end)
@@ -1144,7 +1155,6 @@ static GSList *news_get_msginfos_for_range(NewsSession *session, FolderItem *ite
                        msginfo->folder = item;
                        news_set_msg_flags(item, msginfo);
                        msginfo->flags.tmp_flags |= MSG_NEWS;
-                       msginfo->newsgroups = g_strdup(item->path);
 
                        if (!newlist)
                                llast = newlist = g_slist_append(newlist, msginfo);
@@ -1160,9 +1170,33 @@ static GSList *news_get_msginfos_for_range(NewsSession *session, FolderItem *ite
 
        session_set_access_time(SESSION(session));
 
+       news_get_extra_fields(session, item, newlist);
+       
        return newlist;
 }
 
+static MsgInfo *news_get_msginfo(Folder *folder, FolderItem *item, gint num)
+{
+       GSList *msglist = NULL;
+       NewsSession *session;
+       MsgInfo *msginfo = NULL;
+
+       session = news_session_get(folder);
+       cm_return_val_if_fail(session != NULL, NULL);
+       cm_return_val_if_fail(item != NULL, NULL);
+       cm_return_val_if_fail(item->folder != NULL, NULL);
+       cm_return_val_if_fail(FOLDER_CLASS(item->folder) == &news_class, NULL);
+
+       msglist = news_get_msginfos_for_range(session, item, num, num);
+       if (msglist)
+               msginfo = msglist->data;
+       
+       g_slist_free(msglist);
+       
+       return msginfo;
+}
+
 static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnum_list)
 {
        NewsSession *session;