From ec83754093baced2517bdd34ff99f58c8725499f Mon Sep 17 00:00:00 2001 From: Richard Russon Date: Sun, 21 Oct 2018 20:12:58 +0100 Subject: [PATCH] Nntp: add new/free/get functions --- nntp/newsrc.c | 33 ++------------ nntp/nntp.c | 108 ++++++++++++++++++++++++++++++++++++-------- nntp/nntp_private.h | 10 ++-- 3 files changed, 101 insertions(+), 50 deletions(-) diff --git a/nntp/newsrc.c b/nntp/newsrc.c index e3f68ab8b..3995364b7 100644 --- a/nntp/newsrc.c +++ b/nntp/newsrc.c @@ -116,29 +116,12 @@ void nntp_acache_free(struct NntpMboxData *mdata) } } -/** - * nntp_data_free - Free NntpMboxData, used to destroy hash elements - * @param data NNTP data - */ -void nntp_data_free(void *data) -{ - struct NntpMboxData *mdata = data; - - if (!mdata) - return; - nntp_acache_free(mdata); - mutt_bcache_close(&mdata->bcache); - FREE(&mdata->newsrc_ent); - FREE(&mdata->desc); - FREE(&data); -} - /** * nntp_hash_destructor_t - Free our hash table data - Implements ::hash_destructor_t */ void nntp_hash_destructor_t(int type, void *obj, intptr_t data) { - nntp_data_free(obj); + nntp_mdata_free(obj); } /** @@ -354,7 +337,7 @@ void nntp_newsrc_gen_entries(struct Context *ctx) { /* We don't actually check sequential order, since we mark * "missing" entries as read/deleted */ - last = NNTP_EDATA(ctx->mailbox->hdrs[i])->article_num; + last = nntp_edata_get(ctx->mailbox->hdrs[i])->article_num; if (last >= mdata->first_message && !ctx->mailbox->hdrs[i]->deleted && !ctx->mailbox->hdrs[i]->read) { @@ -378,7 +361,7 @@ void nntp_newsrc_gen_entries(struct Context *ctx) first = last + 1; series = true; } - last = NNTP_EDATA(ctx->mailbox->hdrs[i])->article_num; + last = nntp_edata_get(ctx->mailbox->hdrs[i])->article_num; } } @@ -1015,7 +998,6 @@ struct NntpAccountData *nntp_select_server(struct Mailbox *m, char *server, bool int rc; struct ConnAccount acct; struct NntpAccountData *adata = NULL; - struct NntpMboxData *mdata = NULL; struct Connection *conn = NULL; struct Url url; @@ -1081,12 +1063,7 @@ struct NntpAccountData *nntp_select_server(struct Mailbox *m, char *server, bool } /* new news server */ - adata = mutt_mem_calloc(1, sizeof(struct NntpAccountData)); - adata->conn = conn; - adata->groups_hash = mutt_hash_create(1009, 0); - mutt_hash_set_destructor(adata->groups_hash, nntp_hash_destructor_t, 0); - adata->groups_max = 16; - adata->groups_list = mutt_mem_malloc(adata->groups_max * sizeof(mdata)); + adata = nntp_adata_new(conn); rc = nntp_open_connection(adata); @@ -1144,7 +1121,7 @@ struct NntpAccountData *nntp_select_server(struct Mailbox *m, char *server, bool if (strlen(group) < 8 || (strcmp(p, ".hcache") != 0)) continue; *p = '\0'; - mdata = mutt_hash_find(adata->groups_hash, group); + struct NntpMboxData *mdata = mutt_hash_find(adata->groups_hash, group); if (!mdata) continue; diff --git a/nntp/nntp.c b/nntp/nntp.c index 7041aa463..ea04c3cc6 100644 --- a/nntp/nntp.c +++ b/nntp/nntp.c @@ -113,6 +113,53 @@ struct ChildCtx anum_t *child; }; +/** + * nntp_adata_new - Allocate and initialise a new NntpAccountData structure + * @retval ptr New NntpAccountData + */ +struct NntpAccountData *nntp_adata_new(struct Connection *conn) +{ + struct NntpAccountData *adata = mutt_mem_calloc(1, sizeof(struct NntpAccountData)); + adata->conn = conn; + adata->groups_hash = mutt_hash_create(1009, 0); + mutt_hash_set_destructor(adata->groups_hash, nntp_hash_destructor_t, 0); + adata->groups_max = 16; + adata->groups_list = + mutt_mem_malloc(adata->groups_max * sizeof(struct NntpMboxData *)); + return adata; +} + +/** + * nntp_adata_get - Get the Account data for this mailbox + * @retval ptr Private Account data + */ +struct NntpAccountData *nntp_adata_get(struct Mailbox *m) +{ + if (!m || (m->magic != MUTT_NNTP)) + return NULL; + struct Account *a = m->account; + if (!a) + return NULL; + return a->adata; +} + +/** + * nntp_mdata_free - Free NntpMboxData, used to destroy hash elements + * @param ptr NNTP data + */ +void nntp_mdata_free(void *ptr) +{ + struct NntpMboxData *mdata = ptr; + + if (!mdata) + return; + nntp_acache_free(mdata); + mutt_bcache_close(&mdata->bcache); + FREE(&mdata->newsrc_ent); + FREE(&mdata->desc); + FREE(&ptr); +} + /** * nntp_edata_free - Free data attached to an Email * @param data Email data @@ -131,6 +178,17 @@ static struct NntpEmailData *nntp_edata_new(void) return mutt_mem_calloc(1, sizeof(struct NntpEmailData)); } +/** + * nntp_edata_get - Get the private data for this Email + * @retval ptr Private Email data + */ +struct NntpEmailData *nntp_edata_get(struct Email *e) +{ + if (!e) + return NULL; + return e->edata; +} + /** * nntp_connect_error - Signal a failed connection * @param adata NNTP server @@ -937,8 +995,8 @@ static void nntp_parse_xref(struct Mailbox *m, struct Email *e) continue; nntp_article_status(m, e, grp, anum); - if (!NNTP_EDATA(e)->article_num && (mutt_str_strcmp(mdata->group, grp) == 0)) - NNTP_EDATA(e)->article_num = anum; + if (!nntp_edata_get(e)->article_num && (mutt_str_strcmp(mdata->group, grp) == 0)) + nntp_edata_get(e)->article_num = anum; } FREE(&buf); } @@ -1114,7 +1172,7 @@ static int parse_overview_line(char *line, void *data) e->deleted = false; e->edata = nntp_edata_new(); e->free_edata = nntp_edata_free; - NNTP_EDATA(e)->article_num = anum; + nntp_edata_get(e)->article_num = anum; if (fc->restore) e->changed = true; else @@ -1176,6 +1234,15 @@ static int nntp_fetch_headers(struct Context *ctx, void *hc, anum_t first, fc.hc = hc; #endif + if (!ctx->mailbox->hdrs) + { + /* Allocate some memory to get started */ + ctx->mailbox->hdrmax = ctx->mailbox->msg_count; + ctx->mailbox->msg_count = 0; + ctx->mailbox->vcount = 0; + mx_alloc_memory(ctx->mailbox); + } + /* fetch list of articles */ if (NntpListgroup && mdata->adata->hasLISTGROUP && !mdata->deleted) { @@ -1338,12 +1405,12 @@ static int nntp_fetch_headers(struct Context *ctx, void *hc, anum_t first, e->deleted = false; e->edata = nntp_edata_new(); e->free_edata = nntp_edata_free; - NNTP_EDATA(e)->article_num = current; + nntp_edata_get(e)->article_num = current; if (restore) e->changed = true; else { - nntp_article_status(ctx->mailbox, e, NULL, NNTP_EDATA(e)->article_num); + nntp_article_status(ctx->mailbox, e, NULL, nntp_edata_get(e)->article_num); if (!e->read) nntp_parse_xref(ctx->mailbox, e); } @@ -1498,7 +1565,7 @@ static int check_mailbox(struct Context *ctx) for (int i = 0; i < ctx->mailbox->msg_count; i++) { bool flagged = false; - anum = NNTP_EDATA(ctx->mailbox->hdrs[i])->article_num; + anum = nntp_edata_get(ctx->mailbox->hdrs[i])->article_num; #ifdef USE_HCACHE /* check hcache for flagged and deleted flags */ @@ -1581,7 +1648,7 @@ static int check_mailbox(struct Context *ctx) e->old = false; e->edata = nntp_edata_new(); e->free_edata = nntp_edata_free; - NNTP_EDATA(e)->article_num = anum; + nntp_edata_get(e)->article_num = anum; nntp_article_status(ctx->mailbox, e, NULL, anum); if (!e->read) nntp_parse_xref(ctx->mailbox, e); @@ -1697,7 +1764,7 @@ static int fetch_children(char *line, void *data) if (!line || sscanf(line, ANUM, &anum) != 1) return 0; for (unsigned int i = 0; i < cc->mailbox->msg_count; i++) - if (NNTP_EDATA(cc->mailbox->hdrs[i])->article_num == anum) + if (nntp_edata_get(cc->mailbox->hdrs[i])->article_num == anum) return 0; if (cc->num >= cc->max) { @@ -2182,7 +2249,7 @@ int nntp_check_msgid(struct Context *ctx, const char *msgid) mutt_email_free(&e); return -1; } - sscanf(buf + 4, ANUM, &NNTP_EDATA(e)->article_num); + sscanf(buf + 4, ANUM, &nntp_edata_get(e)->article_num); } /* reset flags */ @@ -2271,8 +2338,8 @@ int nntp_compare_order(const void *a, const void *b) struct Email **ea = (struct Email **) a; struct Email **eb = (struct Email **) b; - anum_t na = NNTP_EDATA(*ea)->article_num; - anum_t nb = NNTP_EDATA(*eb)->article_num; + anum_t na = nntp_edata_get(*ea)->article_num; + anum_t nb = nntp_edata_get(*eb)->article_num; int result = (na == nb) ? 0 : (na > nb) ? 1 : -1; result = perform_auxsort(result, a, b); return SORTCODE(result); @@ -2363,6 +2430,9 @@ static int nntp_mbox_open(struct Context *ctx) CurrentNewsSrv = adata; ctx->mailbox->account->adata = adata; + ctx->mailbox->msg_count = 0; + ctx->mailbox->msg_unread = 0; + ctx->mailbox->vcount = 0; if (group[0] == '/') group++; @@ -2518,7 +2588,7 @@ static int nntp_mbox_sync(struct Context *ctx, int *index_hint) struct Email *e = ctx->mailbox->hdrs[i]; char buf[16]; - snprintf(buf, sizeof(buf), "%d", NNTP_EDATA(e)->article_num); + snprintf(buf, sizeof(buf), "%d", nntp_edata_get(e)->article_num); if (mdata->bcache && e->deleted) { mutt_debug(2, "mutt_bcache_del %s\n", buf); @@ -2569,7 +2639,7 @@ static int nntp_mbox_close(struct Context *ctx) tmp_mdata = mutt_hash_find(mdata->adata->groups_hash, mdata->group); if (!tmp_mdata || tmp_mdata != mdata) - nntp_data_free(mdata); + nntp_mdata_free(mdata); return 0; } @@ -2599,11 +2669,11 @@ static int nntp_msg_open(struct Context *ctx, struct Message *msg, int msgno) FREE(&acache->path); } } - snprintf(article, sizeof(article), "%d", NNTP_EDATA(e)->article_num); + snprintf(article, sizeof(article), "%d", nntp_edata_get(e)->article_num); msg->fp = mutt_bcache_get(mdata->bcache, article); if (msg->fp) { - if (NNTP_EDATA(e)->parsed) + if (nntp_edata_get(e)->parsed) return 0; } else @@ -2634,7 +2704,7 @@ static int nntp_msg_open(struct Context *ctx, struct Message *msg, int msgno) /* fetch message to cache file */ snprintf(buf, sizeof(buf), "ARTICLE %s\r\n", - NNTP_EDATA(e)->article_num ? article : e->env->message_id); + nntp_edata_get(e)->article_num ? article : e->env->message_id); const int rc = nntp_fetch_lines(mdata, buf, sizeof(buf), fetch_msg, fetch_tempfile, msg->fp); if (rc) @@ -2647,10 +2717,10 @@ static int nntp_msg_open(struct Context *ctx, struct Message *msg, int msgno) } if (rc > 0) { - if (mutt_str_strncmp(NNTP_EDATA(e)->article_num ? "423" : "430", buf, 3) == 0) + if (mutt_str_strncmp(nntp_edata_get(e)->article_num ? "423" : "430", buf, 3) == 0) { mutt_error(_("Article %d not found on the server"), - NNTP_EDATA(e)->article_num ? article : e->env->message_id); + nntp_edata_get(e)->article_num ? article : e->env->message_id); } else mutt_error("ARTICLE: %s", buf); @@ -2684,7 +2754,7 @@ static int nntp_msg_open(struct Context *ctx, struct Message *msg, int msgno) /* this is called in neomutt before the open which fetches the message, * which is probably wrong, but we just call it again here to handle * the problem instead of fixing it */ - NNTP_EDATA(e)->parsed = true; + nntp_edata_get(e)->parsed = true; mutt_parse_mime_message(ctx, e); /* these would normally be updated in mx_update_context(), but the diff --git a/nntp/nntp_private.h b/nntp/nntp_private.h index 712a47ace..99400fe18 100644 --- a/nntp/nntp_private.h +++ b/nntp/nntp_private.h @@ -27,10 +27,12 @@ #include "hcache/hcache.h" #endif +struct Connection; struct Context; +struct Email; struct Mailbox; -struct NntpMboxData; struct NntpAccountData; +struct NntpMboxData; #define NNTP_PORT 119 #define NNTP_SSL_PORT 563 @@ -45,16 +47,18 @@ enum NntpStatus NNTP_BYE }; -#define NNTP_EDATA(email) ((struct NntpEmailData *) ((email)->edata)) - void nntp_acache_free(struct NntpMboxData *mdata); int nntp_active_save_cache(struct NntpAccountData *adata); +struct NntpAccountData *nntp_adata_new(struct Connection *conn); int nntp_add_group(char *line, void *data); void nntp_bcache_update(struct NntpMboxData *mdata); int nntp_check_new_groups(struct Mailbox *m, struct NntpAccountData *adata); void nntp_data_free(void *data); void nntp_delete_group_cache(struct NntpMboxData *mdata); +struct NntpEmailData *nntp_edata_get(struct Email *e); void nntp_group_unread_stat(struct NntpMboxData *mdata); +void nntp_hash_destructor_t(int type, void *obj, intptr_t data); +void nntp_mdata_free(void *ptr); void nntp_newsrc_gen_entries(struct Context *ctx); int nntp_open_connection(struct NntpAccountData *adata); -- 2.40.0