static char rcsid[] = "@(#)$Id: digest.c,v 1.23 2006/04/13 16:35:40 hurtta Exp $";
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.23 $ $State: Exp $
*
* Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
******************************************************************************
* This routine mimics some routines from src/file.c and src/elm.c.
* That code was following copyright:
*
* The Elm Mail System
*
* Copyright (c) 1988-1992 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*****************************************************************************/
#include "def_elm.h"
#include "s_elm.h"
DEBUG_VAR(Debug,__FILE__,"ELM");
#if ANSI_C
static subpage_simple_redraw sb_digest_menu;
#endif
static int sb_digest_menu P_((struct menu_context *ptr,
struct menu_param *list));
static int sb_digest_menu(ptr,list)
struct menu_context *ptr;
struct menu_param *list;
{
struct menu_common *mptr = mp_lookup_mcommon(list,elm_mp_menu);
int ul = give_dt_enumerate_as_int(&user_level);
menu_ClearScreen(ptr);
if (ul == 0) { /* a rank beginner. Give less options */
menu_print_format_center(ptr,0,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel0MenuLine1,
"You can use any of the following commands by pressing the first character;"));
menu_print_format_center(ptr,1,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel0DgtLine2,
"m)ail a message, r)eply or f)orward mail, return to i)ndex"));
menu_print_format_center(ptr,2,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel0DgtLine3,
"To read a message, press <return>. j = move down, k = move up"));
} else {
menu_print_format_center(ptr,0,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel1MenuLine1,
"|=pipe, !=shell, ?=help, <n>=set current to n, /=search pattern"));
menu_print_format_center(ptr,1,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel1DgtLine2,
"a)lias, C)opy, f)orward, g)roup reply, m)ail,"));
menu_print_format_center(ptr,2,
CATGETS(elm_msg_cat, ElmSet,
ElmLevel1DgtLine3,
"n)ext, o)ptions, P)rint text, r)eply, s)ave, t)ag, or i)index"));
}
return 1;
}
static int showmsg_digest_cmd P_(( struct MailboxView *mailbox,
int cmd,
struct pager_page *pager_page));
static int showmsg_digest_cmd(mailbox,cmd,pager_page)
struct MailboxView *mailbox;
int cmd;
struct pager_page *pager_page;
{
return cmd;
}
static void set_mailbox_screen P_((struct menu_context *page,
struct screen_parts *LOC,
struct menu_param *LIST));
static void set_mailbox_screen(page,LOC, LIST)
struct menu_context *page;
struct screen_parts *LOC;
struct menu_param *LIST;
{
int LINES, COLUMNS;
menu_get_sizes(page,&LINES, &COLUMNS);
/* 1) Title part of screen */
if (! LOC->title_page)
LOC->title_page = new_menu_subpage(page,0,4,sb_update_title,LIST);
else
menu_subpage_relocate(LOC->title_page,page,0,4);
/* 2) menu part */
if (LOC->menu_page)
menu_subpage_relocate(LOC->menu_page,page,LINES-8,4);
else if (mini_menu)
LOC->menu_page = new_menu_subpage(page,LINES-8,4,
sb_digest_menu,LIST);
mailbox_screen_common(page,LOC, LIST);
}
static void check_mailbox_screen P_((struct screen_parts *LOC,
struct menu_param *list));
static void check_mailbox_screen(LOC,list)
struct screen_parts *LOC;
struct menu_param *list;
{
if (menu_resized(LOC->title_page)) {
DPRINT(Debug,1, (&Debug, "title page resized\n"));
}
if (menu_need_redraw(LOC->title_page)) {
DPRINT(Debug,1, (&Debug, "title page redraw???\n"));
sb_update_title(LOC->title_page,list);
}
if (LOC->menu_page) {
/* 2) menu page */
if (menu_resized(LOC->menu_page)) {
DPRINT(Debug,1, (&Debug, "menu page resized\n"));
}
if (menu_need_redraw(LOC->menu_page)) {
DPRINT(Debug,1, (&Debug, "menu page redraw???\n"));
sb_digest_menu(LOC->menu_page,list);
}
}
/* 3) prompt part */
if (menu_resized(LOC->prompt_page)) {
DPRINT(Debug,1, (&Debug, "prompt page resized\n"));
}
if (menu_need_redraw(LOC->prompt_page)) {
menu_ClearScreen(LOC->prompt_page);
show_last_error(); /* for those operations that have to
* clear the footer except for a message.
*/
}
/* 4) headers part */
if (menu_resized(LOC->header_page)) {
DPRINT(Debug,1, (&Debug, "header page resized\n"));
}
if (menu_need_redraw(LOC->header_page)) {
DPRINT(Debug,1, (&Debug, "header page redraw\n"));
menu_ClearScreen(LOC->header_page);
}
}
/* Return 'i' if to should return to i)ndex */
static int digest_loop P_((struct MailboxView *mailbox,
struct AliasView *aview,
int *needresort));
static int digest_loop(mailbox, aview, needresort)
struct MailboxView *mailbox;
struct AliasView *aview;
int *needresort;
{
int retch = '\0';
int leave = 0;
int auto_assemble = 1;
struct menu_context *page = new_menu_context();
struct screen_parts LOC = { NULL };
struct menu_common MENU;
struct menu_param PARAM[elm_mp_COUNT+1] = {
{ mp_menu_common, 0 },
{ mp_integer, 0 },
{ mp_END,0 }
};
mp_list_set_mcommon(PARAM,elm_mp_menu,&MENU);
set_mcommon_from_mbxview(&MENU,mailbox);
set_mailbox_screen(page,&LOC,PARAM);
resort_mailbox(mailbox,1);
get_page(&MENU, LOC.header_page); /* resort_mailbox no longer call get_page() */
copy_current(&MENU,LOC.header_page);
showscreen(page);
while (!leave) {
int ch;
int LINES, COLUMNS;
menu_set_default(page);
menu_get_sizes(page,&LINES, &COLUMNS);
set_mcommon_from_mbxview(&MENU,mailbox);
if (menu_resized(page)) {
set_mailbox_screen(page,&LOC,PARAM);
menu_get_sizes(page,&LINES, &COLUMNS);
menu_trigger_redraw(page);
}
if (update_view(mailbox)) {
resort_mailbox(mailbox,1);
get_page(&MENU, LOC.header_page); /* resort_mailbox no longer call get_page() */
menu_trigger_redraw(LOC.header_page);
menu_trigger_redraw(LOC.title_page);
}
if (menu_need_redraw(page))
showscreen(page);
check_mailbox_screen(&LOC, PARAM);
{
int lin,col;
int fh = give_dt_enumerate_as_int(&fragment_handling);
menu_PutLineX(LOC.prompt_page,0,0,
FRM("%S"),mcommon_give_item(&MENU, m_Prompt));
menu_GetXYLocation(LOC.prompt_page,&lin,&col);
menu_CleartoEOLN(LOC.prompt_page);
if (auto_assemble && 2 == fh &&
have_partial(mailbox)) {
ch = 'A';
auto_assemble = 0;
DPRINT(Debug,4,(&Debug,"Automatic assemble ... \n"));
} else
ch = GetPrompt(LOC.prompt_page);
menu_CleartoEOS(LOC.prompt_page);
if (isascii(ch) && isprint(ch)) {
DPRINT(Debug,4,(&Debug,
"\nCommand: %c [%d]\n\n", ch, ch));
} else {
DPRINT(Debug,4,(&Debug,
"\nCommand: %d\n\n", ch));
}
set_error(""); /* clear error buffer */
menu_MoveCursor(LOC.prompt_page,lin,col);
}
ch = mailbox_command(mailbox,ch, &LOC,
showmsg_digest_cmd, aview,
page);
switch (ch) {
case 0: /* OK */
break;
case 'A': {
int current = get_current(mailbox);
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat,
ElmSet, ElmAssemble,
"Assemble message fragments"));
FlushBuffer();
sleep_message();
ViewPartial(mailbox,aview,page);
get_page(&MENU, LOC.header_page);
}
break;
case 'o' : {
int current = get_current(mailbox);
int i;
*needresort = 1;
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat, ElmSet,
ElmOptions,
"Options"));
if((i=options(mailbox, aview)) > 0) {
current = get_current(mailbox);
get_page(&MENU, LOC.header_page);
} else if(i < 0)
goto OUT;
menu_trigger_redraw(page); /* always fix screen... */
}
break;
case 'i':
retch = 'i';
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat, ElmSet,
ElmReturnIndex,
"Return to index"));
FlushBuffer();
/* FALLTHRU */
case ctrl('Q') :
case 'q':
case 'Q':
case 'x':
case 'X':
leave = 1;
break;
case EOF:
retch = EOF;
goto OUT;
default:
lib_error(CATGETS(elm_msg_cat, ElmSet,
ElmUnknownCommand2,
"Unknown command."));
}
if (menu_need_redraw(page))
showscreen(page);
check_range(&MENU,&LOC);
check_mailbox_screen(&LOC,PARAM);
} /* the BIG while loop! */
OUT:
free_mailbox_screen(&LOC);
erase_menu_context(&page);
return retch;
}
int ViewDigest(parent_mailbox, aview, parent_page)
struct MailboxView *parent_mailbox;
struct AliasView *aview;
struct menu_context *parent_page;
{
int retch = '0';
int tagged = 0;
int mc,i;
struct MailboxView *new_mailbox = NULL;
int current = get_current(parent_mailbox);
mc = get_message_count(parent_mailbox);
for (i=0; i < mc; i++) {
if (ison_status_message(parent_mailbox,i,status_basic,TAGGED)) {
tagged++;
}
}
if (tagged == 0) {
tagged = 1;
setf_status_message(parent_mailbox,current-1,status_basic,TAGGED);
}
mc = get_message_count(parent_mailbox);
for (i=0; i < mc; i++) { /* get each tagged msg */
if (ison_status_message(parent_mailbox,i,status_basic,TAGGED)) {
struct header_rec * hdr;
FILE *F;
clearf_status_message(parent_mailbox,i,status_basic,
TAGGED);
if (give_message_data(parent_mailbox,i,
&hdr,&F,NULL,
mime_parse_routine)) {
if (new_mailbox)
add_digest(new_mailbox,
& hdr->mime_rec,
hdr->received_time,
hdr->env_from,
F,
hdr->header_charset);
else
new_mailbox =
digest_to_mailbox_view(& hdr->mime_rec,
hdr->received_time,
hdr->env_from,
F,
hdr->header_charset);
}
}
}
if (new_mailbox) {
int need_resort = 0;
if (get_message_count(new_mailbox) > 0) {
set_current(new_mailbox,1); /* Set current to first message */
update_view(new_mailbox);
}
retch = digest_loop(new_mailbox, aview, &need_resort);
free_mailbox(& new_mailbox);
/* This is needed if sort order is changed on o)ptions menu */
if (need_resort)
resort_mailbox(parent_mailbox,1);
menu_trigger_redraw(parent_page);
/* Force default return to parent page ... */
menu_set_default(parent_page);
}
return retch;
}
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1