static char rcsid[] = "@(#)$Id: visit_mailbox.c,v 1.3.14.1 2007/08/24 20:01:56 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.3.14.1 $ $State: Exp $ * * Author: Kari Hurtta * or Kari Hurtta ***************************************************************************** * Some part based on code from src/elm.c. It have following copyright: * * The Elm Mail System * * This file and all associated files and documentation: * Copyright (c) 1988-1992 USENET Community Trust * Copyright (c) 1986,1987 Dave Taylor *****************************************************************************/ #include "def_list.h" #include "s_elm.h" DEBUG_VAR(Debug,__FILE__,"mail"); #if ANSI_C #define S_(x) static x; #else #define S_(x) #endif S_(subpage_simple_redraw sb_visit_mailbox_title) static int sb_visit_mailbox_title(ptr,list) struct menu_context *ptr; struct menu_param *list; { struct menu_common *mptr = mp_lookup_mcommon(list,elm_mp_menu); int message_count = mcommon_get_count(mptr); int selected = mcommon_get_selected(mptr); struct string * f1 = mcommon_title(mptr); struct string * buffer0 = NULL; struct string * buffer = NULL; struct string * buffer2 = NULL; int l0,l1,l2,l; int LINES, COLUMNS; DPRINT(Debug,9, (&Debug, "sb_visit_mailbox_title\n")); menu_ClearScreen(ptr); menu_get_sizes(ptr, &LINES, &COLUMNS); buffer0 = format_string(CATGETS(elm_msg_cat, ElmSet, ElmVisitMailboxTitle, "Visiting mailbox")); if (selected) buffer = format_string(CATGETS(elm_msg_cat, ElmSet, ElmShownXWithSelect, "%S with %d shown out of %d"), f1,selected, message_count); else buffer = format_string(CATGETS(elm_msg_cat, ElmSet, ElmShownXNoSelectItem, "%S with %d %S"), f1, message_count, (message_count == 1) ? mcommon_give_item(mptr,m_item) : mcommon_give_item(mptr,m_items)); free_string(&f1); l0 = string_len(buffer0); l1 = string_len(buffer); buffer2 = format_string(FRM("[ELM %s]"), version_buff); l2 = string_len(buffer2); l = l1 + l2 + 1; /* Assumed */ if (l + l0 + 2 < COLUMNS) { int la = l + l0 +2; menu_PutLineX(ptr,1,(COLUMNS - la)/2, FRM("%S: %S %S"), buffer0,buffer,buffer2); } else { if (l0 < COLUMNS) menu_PutLineX(ptr,0,(COLUMNS - l0)/2,FRM("%S"),buffer0); if (l > COLUMNS) { if (l2 < COLUMNS) menu_PutLineX(ptr,2,(COLUMNS - l2)/2,FRM("%S"),buffer2); if (l1 > COLUMNS) menu_PutLineX(ptr,1,1,FRM("%S"),buffer); else menu_PutLineX(ptr,1,(COLUMNS - l1)/2,FRM("%S"),buffer); } else { menu_PutLineX(ptr,1,(COLUMNS - l)/2,FRM("%S %S"),buffer,buffer2); } } free_string(&buffer); free_string(&buffer2); return 1; /* subpage area updated completely */ } S_(subpage_simple_redraw sb_visit_mailbox_menu) static int sb_visit_mailbox_menu(ptr,list) struct menu_context *ptr; struct menu_param *list; { 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, ElmLevel0VisitMLine2, "d)elete or u)ndelete mail, m)ail a message, r)eply mail, q)uit visit")); menu_print_format_center(ptr,2, CATGETS(elm_msg_cat, ElmSet, ElmLevel0PartLine3, "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, ElmLevel1VisitMLine2, "a)lias, C)opy, d)elete, f)orward, g)roup reply, m)ail,")); menu_print_format_center(ptr,2, CATGETS(elm_msg_cat, ElmSet, ElmLevel1VisitMLine3, "n)ext, P)rint text, r)eply, s)ave, t)ag, or q)uit")); } return 1; } 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_visit_mailbox_title, LIST); else menu_subpage_relocate(LOC->title_page,page,0,4); /* 2) menu part */ if (LOC->menu_page && LINES < 14) erase_menu_context (&(LOC->menu_page)); else if (LOC->menu_page) menu_subpage_relocate(LOC->menu_page,page,LINES-8,4); else if (mini_menu && LINES > 14) LOC->menu_page = new_menu_subpage(page,LINES-8,4, sb_visit_mailbox_menu,LIST); mailbox_screen_common(page,LOC, LIST); } static int showmsg_visit_mailbox_cmd P_(( struct MailboxView *mailbox, int cmd, struct pager_page *pager_page)); static int showmsg_visit_mailbox_cmd(mailbox,cmd,pager_page) struct MailboxView *mailbox; int cmd; struct pager_page *pager_page; { struct menu_common MENU; set_mcommon_from_mbxview(&MENU,mailbox); switch (cmd) { case '|' : { int current = get_current(mailbox); put_cmd_name(pager_page, TRUE, CATGETS(elm_msg_cat, ElmSet, ElmPipe, "Pipe")); if (give_message_data(mailbox,current-1, NULL,NULL,NULL, NO_mime_parse)) do_pipe(mailbox, pager_page->root, pager_page->prompt_area); else { DPRINT(Debug,3,(&Debug, "give_message_data [%d] fails",current-1)); } } break; } return cmd; } 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_visit_mailbox_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_visit_mailbox_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); } } /* Returns 'i' is return to index given */ int visit_mailbox_loop(mailbox, aview) struct MailboxView *mailbox; struct AliasView *aview; { int leave = 0; int retch = '\0'; 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 } }; int LINES, COLUMNS; mp_list_set_mcommon(PARAM,elm_mp_menu,&MENU); menu_get_sizes(page,&LINES, &COLUMNS); 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; menu_set_default(page); if (menu_resized(page)) { set_mailbox_screen(page,&LOC,PARAM); menu_get_sizes(page,&LINES, &COLUMNS); menu_trigger_redraw(page); } new_mail_check(mailbox, page, &LOC); 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; 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); 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_visit_mailbox_cmd, aview, page); switch (ch) { case 0: /* OK */ break; case '|' : { int current = get_current(mailbox); menu_Writechar(LOC.prompt_page, '|'); if (current < 1) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmNoMailToPipe, "No mail to pipe!")); } else if (give_message_data(mailbox,current-1, NULL,NULL,NULL,NO_mime_parse)) { /* softkeys_off(); */ do_pipe(mailbox, page,LOC.prompt_page); /* softkeys_on(); */ } else { DPRINT(Debug,3,(&Debug, "give_message_data [%d] fails",current-1)); } } break; case 'q': { int idx, mbxcount, found = 0; menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmQuit, "Quit")); FlushBuffer(); mbxcount = get_storage_count(mailbox); for (idx = 0 ; idx < mbxcount; idx++) { int bytes; struct current_storage * storage = get_storage(mailbox,idx); if (!storage->current_folder) continue; if (new_mail_on_folder(storage->current_folder,&bytes)) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmNewMailQuitCancelled, "New Mail! Quit canceled...")); found++; } } if (!found) { /* We specify resync so that messages are not moved to received folder ... visiting folder should not change message status (actually not true with IMAP) */ int status = sync_mbox(TRUE, TRUE, TRUE, NULL, mailbox, page); if ( status == -1) continue; if (status < 0) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmFailedLeaveFolder, "Failed to leave folder!")); } else { leave = 1; } } } break; case 'Q' : { int idx, mbxcount, found = 0; menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmQuickQuit, "Quick quit")); FlushBuffer(); mbxcount = get_storage_count(mailbox); for (idx = 0 ; idx < mbxcount; idx++) { int bytes; struct current_storage * storage = get_storage(mailbox,idx); if (!storage->current_folder) continue; if (new_mail_on_folder(storage->current_folder,&bytes)) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmNewMailQuickQuitCancelled, "New Mail! Quick Quit canceled...")); found++; } } if (!found) { /* We specify resync so that messages are not moved to received folder .... visiting folder should not change message status (actually not true with IMAP) */ int status = sync_mbox(TRUE, TRUE, FALSE, NULL, mailbox, page); if ( status == -1) continue; if (status < 0) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmFailedLeaveFolder, "Failed to leave folder!")); } else { leave = 1; } } } break; case 'X' : menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmQuickExit, "Quick Exit")); FlushBuffer(); leave = 1; break; case ctrl('Q') : case 'x' : { int r; menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmExit, "Exit")); FlushBuffer(); r = exit_mailbox(mailbox, page); if (EOF == r) { retch = EOF; goto OUT; /* Read failed, control tty died? */ } if (r) { leave=1; } } break; case 'i': { int r; menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmReturnIndex, "Return to index")); FlushBuffer(); { /* We specify resync so that messages are not moved to received folder .... visiting folder should not change message status (actually not true with IMAP) Let sync_mbox() to check about new mail .... */ int status = sync_mbox(TRUE, TRUE, TRUE, NULL, mailbox, page); if ( status == -1) continue; if (status < 0) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmFailedLeaveFolder, "Failed to leave folder!")); } else { retch = 'i'; 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; } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */