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 (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 . j = move down, k = move up")); } else { menu_print_format_center(ptr,0, CATGETS(elm_msg_cat, ElmSet, ElmLevel1MenuLine1, "|=pipe, !=shell, ?=help, =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: */