X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=nntp%2Fnntp.c;h=4875f67b34107a2999654a777a2af13a91986a52;hp=ed934eb619d662a59803485e0ee3846ed8b4ad04;hb=404b6ae11d8c6938a460645bff4adf87246d39a0;hpb=ba5e3af4ea19e1d20c80941c077039871ec84258 diff --git a/nntp/nntp.c b/nntp/nntp.c index ed934eb..4875f67 100644 --- a/nntp/nntp.c +++ b/nntp/nntp.c @@ -22,6 +22,8 @@ #include "rfc1524.h" #include "rfc2047.h" #include "nntp.h" +#include "sidebar.h" +#include "buffy.h" #include "mutt_crypt.h" @@ -37,6 +39,44 @@ static unsigned int _checked = 0; +static void update_sidebar (NNTP_DATA* data) { + int i = 0; + BUFFY* tmp = NULL; + char buf[STRING]; + + if (list_empty (Incoming)) + return; + + /* unfortunately, NNTP_DATA::group only is the plain + * group name, so for every single update, we need to + * compose the full string which must be defined via + * mailboxes command ;-((( FIXME + */ + buf[0] = '\0'; + snprintf (buf, sizeof (buf), "nntp%s://%s%s/%s", + (data->nserv->conn->account.flags & M_ACCT_SSL) ? "s" : "", + NONULL (data->nserv->conn->account.user), + data->nserv->conn->account.host, + data->group); + debug_print (4, ("group == '%s'\n", buf)); + + /* bail out if group not found via mailboxes */ + if ((i = buffy_lookup (buf)) < 0) + return; + + tmp = (BUFFY*) Incoming->data[i]; + /* copied from browser.c */ + if (option (OPTMARKOLD) && + data->lastCached >= data->firstMessage && + data->lastCached <= data->lastMessage) + tmp->msg_unread = data->lastMessage - data->lastCached; + else + tmp->msg_unread = data->unread; + tmp->new = data->unread > 0; + /* this is closest to a "total" count we can get */ + tmp->msgcount = data->lastMessage - data->firstMessage; +} + static void nntp_error (const char *where, const char *msg) { debug_print (1, ("unexpected response in %s: %s\n", where, msg)); } @@ -162,12 +202,6 @@ static int nntp_attempt_features (NNTP_SERVER * serv) char buf[LONG_STRING]; CONNECTION *conn = serv->conn; - mutt_socket_write (conn, "LISTGROUP\r\n"); - if (mutt_socket_readln (buf, sizeof (buf), conn) < 0) - return (nntp_connect_error (serv)); - if (str_ncmp ("500", buf, 3)) - serv->hasLISTGROUP = 1; - mutt_socket_write (conn, "XOVER\r\n"); if (mutt_socket_readln (buf, sizeof (buf), conn) < 0) return nntp_connect_error (serv); @@ -180,6 +214,12 @@ static int nntp_attempt_features (NNTP_SERVER * serv) if (str_ncmp ("500", buf, 3)) serv->hasXPAT = 1; + mutt_socket_write (conn, "LISTGROUP\r\n"); + if (mutt_socket_readln (buf, sizeof (buf), conn) < 0) + return (nntp_connect_error (serv)); + if (str_ncmp ("500", buf, 3)) + serv->hasLISTGROUP = 1; + mutt_socket_write (conn, "XGTITLE +\r\n"); if (mutt_socket_readln (buf, sizeof (buf), conn) < 0) return nntp_connect_error (serv); @@ -641,6 +681,7 @@ static int nntp_fetch_headers (CONTEXT * ctx, unsigned int first, { char buf[HUGE_STRING]; char *msg = _("Fetching message headers..."); + char *msg2 = _("Fetching headers from cache..."); NNTP_DATA *nntp_data = ((NNTP_DATA *) ctx->data); int ret; int num; @@ -674,29 +715,18 @@ static int nntp_fetch_headers (CONTEXT * ctx, unsigned int first, } } else { - /* mutt_nntp_query() issues a 'GROUP nntp_data->group' - * command on its own if !*buf */ - buf[0] = '\0'; - mutt_nntp_query (nntp_data, buf, sizeof (buf)); - if (sscanf (buf + 4, "%d %u %u %s", &num, &fc.first, &fc.last, buf) != 4) { - mutt_error (_("GROUP command failed: %s"), buf); - mem_free (&fc.messages); - return (-1); - } - else { - for (num = fc.first; num < fc.last; num++) - _nntp_fetch_numbers (num, &fc); - } + for (num = 0; num < last - first + 1; num++) + fc.messages[num] = 1; } /* CACHE: must be loaded xover cache here */ num = nntp_data->lastCached - first + 1; if (option (OPTNEWSCACHE) && nntp_data->cache && num > 0) { nntp_cache_expand (buf, nntp_data->cache); - mutt_message _("Fetching headers from cache..."); + mutt_message (msg2); if ((f = safe_fopen (buf, "r"))) { - int r = 0; + int r = 0, c = 0; /* counting number of lines */ while (fgets (buf, sizeof (buf), f) != NULL) @@ -708,8 +738,11 @@ static int nntp_fetch_headers (CONTEXT * ctx, unsigned int first, fc.first = first; fc.last = first + num - 1; fc.msg = NULL; - while (fgets (buf, sizeof (buf), f) != NULL) + while (fgets (buf, sizeof (buf), f) != NULL) { + if (ReadInc && ((++c) % ReadInc == 0)) + mutt_message ("%s %d/%d", msg2, c, r); add_xover_line (buf, &fc); + } fclose (f); nntp_data->lastLoaded = fc.last; first = fc.last + 1; @@ -1034,24 +1067,20 @@ void nntp_logout_all (void) { char buf[LONG_STRING]; CONNECTION *conn; - CONNECTION *tmp; conn = mutt_socket_head (); while (conn) { - tmp = conn; - + CONNECTION* next = conn->next; if (conn->account.type == M_ACCT_TYPE_NNTP) { mutt_message (_("Closing connection to %s..."), conn->account.host); mutt_socket_write (conn, "QUIT\r\n"); mutt_socket_readln (buf, sizeof (buf), conn); mutt_clear_error (); mutt_socket_close (conn); - - mutt_socket_free (tmp); + mutt_socket_free (conn); } - - conn = conn->next; + conn = next; } } @@ -1106,6 +1135,8 @@ void nntp_fastclose_mailbox (CONTEXT * ctx) if ((tmp = hash_find (data->nserv->newsgroups, data->group)) == NULL || tmp != data) nntp_delete_data (data); + else + update_sidebar (data); } /* commit changes and terminate connection */ @@ -1192,6 +1223,7 @@ static int _nntp_check_mailbox (CONTEXT * ctx, NNTP_DATA * nntp_data) nntp_data->entries[0].first = 1; nntp_data->entries[0].last = 0; } + update_sidebar (nntp_data); } time (&nntp_data->nserv->check_time);