/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *
+ * Parts were written/modified by:
+ * Nico Golde <nico@ngolde.de>
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
*/
#if HAVE_CONFIG_H
#include "mutt_curses.h"
#include "mx.h"
#include "mutt_menu.h"
-#include "mailbox.h"
#include "mapping.h"
#include "sort.h"
+#include "recvattach.h"
#include "buffy.h"
#include "mx.h"
#include "sidebar.h"
+#include "thread.h"
+#include "xterm.h"
#ifdef USE_POP
#include "pop.h"
#include "nntp.h"
#endif
+#ifdef USE_SASL
+#include "mutt_sasl.h"
+#endif
+
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/str.h"
+#include "lib/debug.h"
#include <ctype.h>
#include <stdlib.h>
N_("Function not permitted in attach-message mode.");
static const char *No_visible = N_("No visible messages.");
+#define CHECK_IN_MAILBOX if (!Context) \
+ { \
+ mutt_flushinp (); \
+ mutt_error (_(No_mailbox_is_open)); \
+ break; \
+ }
+
#define CHECK_MSGCOUNT if (!Context) \
{ \
- mutt_flushinp (); \
+ mutt_flushinp (); \
mutt_error(_(No_mailbox_is_open)); \
break; \
} \
break; \
}
-#ifdef USE_IMAP
-/* the error message returned here could be better. */
-#define CHECK_IMAP_ACL(aclbit) if (Context->magic == M_IMAP) \
- if (mutt_bit_isset (((IMAP_DATA *)Context->data)->capabilities, ACL) \
- && !mutt_bit_isset(((IMAP_DATA *)Context->data)->rights,aclbit)){ \
- mutt_flushinp(); \
- mutt_error ("Operation not permitted by the IMAP ACL for this mailbox"); \
- break; \
- }
-#endif
-
#define CHECK_ATTACH if(option(OPTATTACHMSG)) \
{\
mutt_flushinp (); \
extern const char *ReleaseDate;
extern size_t UngetCount;
-static void set_xterm_title_bar (char *title)
-{
- fputs ("\033]2;", stdout);
- fputs (title, stdout);
- fputs ("\007", stdout);
- fflush (stdout);
-}
-
-static void set_xterm_icon_name (char *name)
-{
- fputs ("\033]1;", stdout);
- fputs (name, stdout);
- fputs ("\007", stdout);
- fflush (stdout);
-}
-
void index_make_entry (char *s, size_t l, MUTTMENU * menu, int num)
{
format_flag flag =
* they will be visible in the limited view */
if (Context->pattern) {
#define THIS_BODY Context->hdrs[j]->content
- if (oldcount || check == M_REOPENED) {
- for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount;
- j++) {
- if (mutt_pattern_exec
- (Context->limit_pattern, M_MATCH_FULL_ADDRESS, Context,
- Context->hdrs[j])) {
- Context->hdrs[j]->virtual = Context->vcount;
- Context->v2r[Context->vcount] = j;
- Context->hdrs[j]->limited = 1;
- Context->vcount++;
- Context->vsize +=
- THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset;
- }
+ for (j = (check == M_REOPENED) ? 0 : oldcount; j < Context->msgcount; j++) {
+ if (mutt_pattern_exec
+ (Context->limit_pattern, M_MATCH_FULL_ADDRESS, Context,
+ Context->hdrs[j])) {
+ Context->hdrs[j]->virtual = Context->vcount;
+ Context->v2r[Context->vcount] = j;
+ Context->hdrs[j]->limited = 1;
+ Context->vcount++;
+ Context->vsize +=
+ THIS_BODY->length + THIS_BODY->offset - THIS_BODY->hdr_offset;
}
}
#undef THIS_BODY
/* save the list of new messages */
if (oldcount && check != M_REOPENED && ((Sort & SORT_MASK) == SORT_THREADS)) {
save_new =
- (HEADER **) safe_malloc (sizeof (HEADER *) *
+ (HEADER **) mem_malloc (sizeof (HEADER *) *
(Context->msgcount - oldcount));
for (j = oldcount; j < Context->msgcount; j++)
save_new[j - oldcount] = Context->hdrs[j];
mutt_uncollapse_thread (Context, h);
}
}
- FREE (&save_new);
+ mem_free (&save_new);
mutt_set_virtual (Context);
}
}
if (menu->current < 0)
menu->current = ci_first_message ();
-
}
static void resort_index (MUTTMENU * menu)
IndexHelp);
if (!attach_msg) {
- mutt_buffy_check (1); /* force the buffy check after we enter the folder */
+ buffy_check (1); /* force the buffy check after we enter the folder */
/* record folder we open to place sidebar indicator properly */
if (Context && Context->path)
- set_curbuffy (Context->path);
+ sidebar_set_current (Context->path);
}
FOREVER {
if ((check = mx_check_mailbox (Context, &index_hint, 0)) < 0) {
if (!Context->path) {
/* fatal error occurred */
- FREE (&Context);
+ mem_free (&Context);
menu->redraw = REDRAW_FULL;
}
set_option (OPTSEARCHINVALID);
("Mailbox was externally modified. Flags may be wrong."));
else if (check == M_NEW_MAIL) {
/* on new mail: redraw sidebar */
- draw_sidebar (CurrentMenu);
+ sidebar_draw (CurrentMenu);
mutt_message (_("New mail in this mailbox."));
if (option (OPTBEEPNEW))
if (!attach_msg) {
/* check for new mail in the incoming folders */
oldcount = newcount;
- if ((newcount = mutt_buffy_check (0)) != oldcount) {
+ if ((newcount = buffy_check (0)) != oldcount) {
menu->redraw |= REDRAW_STATUS;
menu->redraw |= REDRAW_SIDEBAR;
}
if (do_buffy_notify) {
- if (mutt_buffy_notify () && option (OPTBEEPNEW))
+ if (buffy_notify () && option (OPTBEEPNEW))
beep ();
}
else
if (op != -1)
mutt_curs_set (0);
if (menu->redraw & REDRAW_SIDEBAR)
- draw_sidebar (menu->menu);
+ sidebar_draw (menu->menu);
if (menu->redraw & REDRAW_FULL) {
menu_redraw_full (menu);
- draw_sidebar (menu->menu);
+ sidebar_draw (menu->menu);
mutt_show_error ();
}
DrawFullLine = 0;
CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES - 2);
SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
mutt_paddstr (COLS, buf);
SETCOLOR (MT_COLOR_NORMAL);
- set_buffystats (Context);
+ BKGDSET (MT_COLOR_NORMAL);
+ sidebar_set_buffystats (Context);
menu->redraw &= ~REDRAW_STATUS;
if (option (OPTXTERMSETTITLES)) {
menu_status_line (buf, sizeof (buf), menu, NONULL (XtermTitle));
- set_xterm_title_bar (buf);
+ mutt_xterm_set_title (buf);
menu_status_line (buf, sizeof (buf), menu, NONULL (XtermIcon));
- set_xterm_icon_name (buf);
+ mutt_xterm_set_icon (buf);
}
}
if (option (OPTARROWCURSOR))
move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
else
move (menu->current - menu->top + menu->offset, COLS - 1);
mutt_refresh ();
op = km_dokey (MENU_MAIN);
- dprint (4,
- (debugfile, "mutt_index_menu[%d]: Got op %d\n", __LINE__, op));
+ debug_print (4, ("Got op %d\n", op));
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
if (SigWinch) {
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
CHECK_ATTACH;
mutt_pattern_func (M_DELETE, _("Delete messages matching: "));
break;
case OP_MAIN_SHOW_LIMIT:
- CHECK_MSGCOUNT;
+ CHECK_IN_MAILBOX;
if (!Context->pattern)
mutt_message (_("No limit pattern is in effect."));
case OP_MAIN_LIMIT:
case OP_TOGGLE_READ:
- CHECK_MSGCOUNT;
+ CHECK_IN_MAILBOX;
menu->oldcurrent = (Context->vcount && menu->current >= 0
&& menu->current <
Context->vcount) ? CURHDR->index : -1;
snprintf (buf, sizeof (buf), "~A");
unset_option (OPTHIDEREAD);
}
- FREE (&Context->pattern);
- Context->pattern = safe_strdup (buf);
+ mem_free (&Context->pattern);
+ Context->pattern = str_dup (buf);
}
if ((op == OP_TOGGLE_READ && mutt_pattern_func (M_LIMIT, NULL) == 0) ||
mutt_pattern_func (M_LIMIT, _("Limit to messages matching: ")) == 0)
else
menu->current = 0;
menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
- if ((Sort & SORT_MASK) == SORT_THREADS)
+ if (Context->msgcount && (Sort & SORT_MASK) == SORT_THREADS)
mutt_draw_tree (Context);
menu->redraw = REDRAW_FULL;
}
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
if (mutt_pattern_func (M_UNDELETE, _("Undelete messages matching: ")) ==
0)
/* check for a fatal error, or all messages deleted */
if (!Context->path)
- FREE (&Context);
+ mem_free (&Context);
/* if we were in the pager, redisplay the message */
if (menu->menu == MENU_PAGER) {
cp = _("Open newsgroup in read-only mode");
else
cp = _("Open newsgroup");
- nntp_buffy (buf);
+ nntp_buffy (buf, sizeof (buf));
}
else
#endif
{
if (Context && Context->path)
strncpy (buf, Context->path, sizeof (buf));
- mutt_buffy (buf, sizeof (buf));
+ if (op != OP_SIDEBAR_OPEN)
+ buffy_next (buf, sizeof (buf));
}
if (op == OP_SIDEBAR_OPEN) {
- if (!CurBuffy)
- break;
- strncpy (buf, CurBuffy->path, sizeof (buf));
+ strncpy (buf, NONULL(sidebar_get_current ()), sizeof (buf));
}
else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) ==
-1)
else
#endif
mutt_expand_path (buf, sizeof (buf));
- set_curbuffy (buf);
if (mx_get_magic (buf) <= 0) {
mutt_error (_("%s is not a mailbox."), buf);
break;
}
- mutt_str_replace (&CurrentFolder, buf);
+ str_replace (&CurrentFolder, buf);
if (Context) {
int check;
#ifdef USE_COMPRESSED
if (Context->compressinfo && Context->realpath)
- mutt_str_replace (&LastFolder, Context->realpath);
+ str_replace (&LastFolder, Context->realpath);
else
#endif
- mutt_str_replace (&LastFolder, Context->path);
+ str_replace (&LastFolder, Context->path);
oldcount = Context ? Context->msgcount : 0;
if ((check = mx_close_mailbox (Context, &index_hint)) != 0) {
menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
break;
}
- FREE (&Context);
+ mem_free (&Context);
}
mutt_sleep (0);
}
else
menu->current = 0;
+ sidebar_set_current (buf);
#ifdef USE_NNTP
- /* mutt_buffy_check() must be done with mail-reader mode! */
+ /* buffy_check() must be done with mail-reader mode! */
menu->help = mutt_compile_help (helpstr, sizeof (helpstr), MENU_MAIN,
(Context
&& (Context->magic ==
IndexHelp);
#endif
mutt_clear_error ();
- mutt_buffy_check (1); /* force the buffy check after we have changed
+ buffy_check (1); /* force the buffy check after we have changed
the folder */
menu->redraw = REDRAW_FULL;
set_option (OPTSEARCHINVALID);
menu->current = mutt_thread_next_unread (Context, CURHDR);
}
+ if (option (OPTPGPAUTODEC) &&
+ (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+ mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
if ((op = mutt_display_message (CURHDR)) == -1) {
unset_option (OPTNEEDRESORT);
break;
{
if (Context) {
mx_fastclose_mailbox (Context);
- FREE (&Context);
+ mem_free (&Context);
}
done = 1;
}
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_POP
- if (Context->magic == M_POP) {
- mutt_flushinp ();
- mutt_error (_("Can't change 'important' flag on POP server."));
-
- break;
- }
-#endif
-
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_WRITE);
-#endif
-
-#ifdef USE_NNTP
- if (Context->magic == M_NNTP) {
- mutt_flushinp ();
- mutt_error (_("Can't change 'important' flag on NNTP server."));
-
- break;
- }
-#endif
+ CHECK_MX_ACL (Context, ACL_WRITE, _("Flagging"));
if (tag) {
for (j = 0; j < Context->vcount; j++) {
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_SEEN);
-#endif
+ CHECK_MX_ACL (Context, ACL_SEEN, _("Toggling"));
if (tag) {
for (j = 0; j < Context->vcount; j++) {
case OP_TOGGLE_WRITE:
- CHECK_MSGCOUNT;
+ CHECK_IN_MAILBOX;
if (mx_toggle_write (Context) == 0)
menu->redraw |= REDRAW_STATUS;
break;
CHECK_VISIBLE;
CHECK_READONLY;
-/* #ifdef USE_IMAP
-CHECK_IMAP_ACL(IMAP_ACL_WRITE);
-#endif */
-
if (mutt_change_flag (tag ? NULL : CURHDR, (op == OP_MAIN_SET_FLAG)) ==
0) {
menu->redraw = REDRAW_STATUS;
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
if (tag) {
mutt_tag_set_flag (M_DELETE, 1);
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Deletion"));
rc = mutt_thread_set_flag (CURHDR, M_DELETE, 1,
op == OP_DELETE_THREAD ? 0 : 1);
CHECK_READONLY;
CHECK_ATTACH;
-#ifdef USE_POP
- if (Context->magic == M_POP) {
- mutt_flushinp ();
- mutt_error (_("Can't edit message on POP server."));
-
- break;
- }
-#endif
-
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_INSERT);
-#endif
-
-#ifdef USE_NNTP
- if (Context->magic == M_NNTP) {
- mutt_flushinp ();
- mutt_error (_("Can't edit message on newsserver."));
-
- break;
- }
-#endif
+ CHECK_MX_ACL (Context, ACL_INSERT, _("Editing"));
if (option (OPTPGPAUTODEC)
&& (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
CHECK_MSGCOUNT;
CHECK_VISIBLE;
CHECK_ATTACH;
+
+ if (option (OPTPGPAUTODEC) &&
+ (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+ mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
ci_send_message (SENDFORWARD, NULL, NULL, Context, tag ? NULL : CURHDR);
menu->redraw = REDRAW_FULL;
break;
CHECK_MSGCOUNT;
CHECK_VISIBLE;
CHECK_ATTACH;
+
+ if (option (OPTPGPAUTODEC) &&
+ (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+ mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
ci_send_message (SENDREPLY | SENDGROUPREPLY, NULL, NULL, Context,
tag ? NULL : CURHDR);
menu->redraw = REDRAW_FULL;
CHECK_ATTACH;
CHECK_MSGCOUNT;
CHECK_VISIBLE;
+
+ if (option (OPTPGPAUTODEC) &&
+ (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+ mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
ci_send_message (SENDREPLY | SENDLISTREPLY, NULL, NULL, Context,
tag ? NULL : CURHDR);
menu->redraw = REDRAW_FULL;
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_SEEN);
-#endif
+ CHECK_MX_ACL (Context, ACL_SEEN, _("Marking as read"));
rc = mutt_thread_set_flag (CURHDR, M_READ, 1,
op == OP_MAIN_READ_THREAD ? 0 : 1);
sleep (2);
}
else if (op != OP_FOLLOWUP || !CURHDR->env->followup_to ||
- mutt_strcasecmp (CURHDR->env->followup_to, "poster") ||
+ str_casecmp (CURHDR->env->followup_to, "poster") ||
query_quadoption (OPT_FOLLOWUPTOPOSTER,
_("Reply by mail as poster prefers?")) !=
M_YES) {
CHECK_ATTACH;
CHECK_MSGCOUNT;
CHECK_VISIBLE;
+
+ if (option (OPTPGPAUTODEC) &&
+ (tag || !(CURHDR->security & PGP_TRADITIONAL_CHECKED)))
+ mutt_check_traditional_pgp (tag ? NULL : CURHDR, &menu->redraw);
+
ci_send_message (SENDREPLY, NULL, NULL, Context, tag ? NULL : CURHDR);
menu->redraw = REDRAW_FULL;
break;
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
if (tag) {
mutt_tag_set_flag (M_DELETE, 0);
CHECK_VISIBLE;
CHECK_READONLY;
-#ifdef USE_IMAP
- CHECK_IMAP_ACL (IMAP_ACL_DELETE);
-#endif
+ CHECK_MX_ACL (Context, ACL_DELETE, _("Undeletion"));
rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
op == OP_UNDELETE_THREAD ? 0 : 1)
break;
case OP_BUFFY_LIST:
- mutt_buffy_list ();
+ if (option (OPTFORCEBUFFYCHECK))
+ buffy_check (1);
+ buffy_list ();
menu->redraw = REDRAW_FULL;
break;
case OP_SIDEBAR_PREV:
case OP_SIDEBAR_NEXT_NEW:
case OP_SIDEBAR_PREV_NEW:
- scroll_sidebar (op, menu->menu);
+ sidebar_scroll (op, menu->menu);
break;
default:
if (menu->menu == MENU_MAIN)
break;
}
+ if (!attach_msg) {
#ifdef USE_IMAP
/* Close all open IMAP connections */
- if (!attach_msg)
imap_logout_all ();
#endif
#ifdef USE_NNTP
/* Close all open NNTP connections */
- if (!attach_msg)
nntp_logout_all ();
#endif
+#ifdef USE_SASL
+ mutt_sasl_done ();
+#endif
+ }
mutt_menuDestroy (&menu);
return (close);