long get_msgno_by_msg_id(MAILSTREAM *stream, char *message_id, MSGNO_S *msgmap) { SEARCHPGM *pgm = NULL; long hint = mn_m2raw(msgmap, mn_get_cur(msgmap)); long newmsgno = -1L; int iter = 0; MESSAGECACHE *mc; extern MAILSTREAM *mm_search_stream; extern long mm_search_count; if(!(message_id && message_id[0]) || stream->nmsgs < 1L) return(newmsgno); mm_search_count = 0L; mm_search_stream = stream; while(mm_search_count == 0L && iter++ < 3 && (pgm = mail_newsearchpgm()) != NULL){ pgm->message_id = mail_newstringlist(); pgm->message_id->text.data = (unsigned char *) cpystr(message_id); pgm->message_id->text.size = strlen(message_id); if(iter > 1 || hint > stream->nmsgs) iter++; if(iter == 1){ /* restrict to hint message on first try */ pgm->msgno = mail_newsearchset(); pgm->msgno->first = pgm->msgno->last = hint; } else if(iter == 2){ /* restrict to last 50 messages on 2nd try */ pgm->msgno = mail_newsearchset(); if(stream->nmsgs > 100L) pgm->msgno->first = stream->nmsgs-50L; else{ pgm->msgno->first = 1L; iter++; } pgm->msgno->last = stream->nmsgs; } pine_mail_search_full(stream, NULL, pgm, SE_NOPREFETCH | SE_FREE); if(mm_search_count){ for(newmsgno=stream->nmsgs; newmsgno > 0L; newmsgno--) if((mc = mail_elt(stream, newmsgno)) && mc->searched) break; } } return(mn_raw2m(msgmap, newmsgno)); }
/*---------------------------------------------------------------------- Got thru the message mapping table, and remove messages with DELETED flag Accepts: stream -- mail stream to removed message references from msgs -- pointer to message manipulation struct f -- flags to use a purge criteria ----*/ void msgno_exclude_deleted(MAILSTREAM *stream, MSGNO_S *msgs, char *sequence) { long i, rawno; MESSAGECACHE *mc; int need_isort_reset = 0; if(!msgs || msgs->max_msgno < 1L) return; /* * With 3.91 we're using a new strategy for finding and operating * on all the messages with deleted status. The idea is to do a * mail_search for deleted messages so the elt's "searched" bit gets * set, and then to scan the elt's for them and set our local bit * to indicate they're excluded... */ (void) count_flagged(stream, F_DEL); if(sequence) mail_sequence (stream,sequence); /* * Start with the end of the folder and work backwards so that * msgno_exclude doesn't have to shift the entire array each time when * there are lots of deleteds. In fact, if everything is deleted (like * might be the case in a huge newsgroup) then it never has to shift * anything. It is always at the end of the array just eliminating the * last one instead. So instead of an n**2 operation, it is n. */ for(i = msgs->max_msgno; i >= 1L; i--) if((rawno = mn_m2raw(msgs, i)) > 0L && stream && rawno <= stream->nmsgs && (mc = mail_elt(stream, rawno)) && (sequence ? mc->sequence : 1) && ((mc->valid && mc->deleted) || (!mc->valid && mc->searched))){ msgno_exclude(stream, msgs, i, 0); need_isort_reset++; } if(need_isort_reset) msgno_reset_isort(msgs); /* * If we excluded away a zoomed display, unhide everything... */ if(msgs->max_msgno > 0L && any_lflagged(msgs, MN_HIDE) >= msgs->max_msgno) for(i = 1L; i <= msgs->max_msgno; i++) set_lflag(stream, msgs, i, MN_HIDE, 0); }
/* * Erase a particular entry in the cache. */ void clear_index_cache_ent(MAILSTREAM *stream, long int msgno, unsigned int flags) { long rawno = -1L; PINELT_S **peltp; MESSAGECACHE *mc; if(stream){ if(flags && IC_USE_RAW_MSGNO) rawno = msgno; else rawno = mn_m2raw(sp_msgmap(stream), msgno); if(rawno > 0L && rawno <= stream->nmsgs){ mc = mail_elt(stream, rawno); if(mc && mc->sparep){ peltp = (PINELT_S **) &mc->sparep; if((*peltp)->ice){ /* * This is intended to be a lightweight reset of * just the widths and print_format strings. For example, * the width of the screen changed and nothing else. * We simply unset the widths_done bit and it * is up to the drawer to free and recalculate the * print_format strings and to reset the widths. * * The else case is a clear of the entire cache entry * leaving behind only the empty structure. */ if(flags & IC_CLEAR_WIDTHS_DONE){ (*peltp)->ice->widths_done = 0; /* also zero out hash value */ (*peltp)->ice->id = 0; if((*peltp)->ice->tice){ (*peltp)->ice->tice->widths_done = 0; /* also zero out hash value */ (*peltp)->ice->tice->id = 0; } } else clear_ice(&(*peltp)->ice); } } } } }
/* * Checks whether any parts of any of the messages in msgmap are marked * for deletion. */ int msgno_any_deletedparts(MAILSTREAM *stream, MSGNO_S *msgmap) { long n, rawno; PINELT_S *pelt; PARTEX_S **partp; MESSAGECACHE *mc; for(n = mn_first_cur(msgmap); n > 0L; n = mn_next_cur(msgmap)) if((rawno = mn_m2raw(msgmap, n)) > 0L && stream && rawno <= stream->nmsgs && (mc = mail_elt(stream, rawno)) && (pelt = (PINELT_S *) mc->sparep)) for(partp = &pelt->exceptions; *partp; partp = &(*partp)->next) if(((*partp)->handling & MSG_EX_DELETE) && (*partp)->partno && *(*partp)->partno != '0' && isdigit((unsigned char) *(*partp)->partno)) return(1); return(0); }
void smime_info_screen(struct pine *ps) { long msgno; OtherMenu what; int offset = 0; BODY *body; ENVELOPE *env; HANDLE_S *handles = NULL; SCROLL_S scrollargs; STORE_S *store = NULL; ps->prev_screen = smime_info_screen; ps->next_screen = SCREEN_FUN_NULL; if(mn_total_cur(ps->msgmap) > 1L){ q_status_message(SM_ORDER | SM_DING, 0, 3, _("Can only view one message's information at a time.")); return; } /* else check for existence of smime bits */ msgno = mn_m2raw(ps->msgmap, mn_get_cur(ps->msgmap)); env = mail_fetch_structure(ps->mail_stream, msgno, &body, 0); if(!env || !body){ q_status_message(SM_ORDER, 0, 3, _("Can't fetch body of message.")); return; } what = FirstMenu; store = so_get(CharStar, NULL, EDIT_ACCESS); while(ps->next_screen == SCREEN_FUN_NULL){ ClearLine(1); so_truncate(store, 0); view_writec_init(store, &handles, HEADER_ROWS(ps), HEADER_ROWS(ps) + ps->ttyo->screen_rows - (HEADER_ROWS(ps) + HEADER_ROWS(ps))); gf_puts_uline("Overview", view_writec); gf_puts(NEWLINE, view_writec); format_smime_info(1, body, msgno, view_writec); gf_puts(NEWLINE, view_writec); format_smime_info(2, body, msgno, view_writec); view_writec_destroy(); ps->next_screen = SCREEN_FUN_NULL; memset(&scrollargs, 0, sizeof(SCROLL_S)); scrollargs.text.text = so_text(store); scrollargs.text.src = CharStar; scrollargs.text.desc = "S/MIME information"; scrollargs.body_valid = 1; if(offset){ /* resize? preserve paging! */ scrollargs.start.on = Offset; scrollargs.start.loc.offset = offset; offset = 0L; } scrollargs.bar.title = "S/MIME INFORMATION"; /* scrollargs.end_scroll = view_end_scroll; */ scrollargs.resize_exit = 1; scrollargs.help.text = NULL; scrollargs.help.title = "HELP FOR S/MIME INFORMATION VIEW"; scrollargs.keys.menu = &smime_info_keymenu; scrollargs.keys.what = what; setbitmap(scrollargs.keys.bitmap); if(scrolltool(&scrollargs) == MC_RESIZE) offset = scrollargs.start.loc.offset; } so_give(&store); }