NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
handler.h File Reference

Decide how to display email content. More...

#include <iconv.h>
#include <stdbool.h>
#include <stddef.h>
+ Include dependency graph for handler.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int mutt_body_handler (struct Body *b, struct State *state)
 Handler for the Body of an email.
 
bool mutt_can_decode (struct Body *b)
 Will decoding the attachment produce any output.
 
void mutt_decode_attachment (const struct Body *b, struct State *state)
 Decode an email's attachment.
 
void mutt_decode_base64 (struct State *state, size_t len, bool istext, iconv_t cd)
 Decode base64-encoded text.
 
bool mutt_prefer_as_attachment (struct Body *b)
 Do we want this part as an attachment?
 

Detailed Description

Decide how to display email content.

Authors
  • Richard Russon
  • Pietro Cerutti

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, see http://www.gnu.org/licenses/.

Definition in file handler.h.

Function Documentation

◆ mutt_body_handler()

int mutt_body_handler ( struct Body * b,
struct State * state )

Handler for the Body of an email.

Parameters
bBody of the email
stateState to work with
Return values
0Success
-1Error

Definition at line 1664 of file handler.c.

1665{
1666 if (!b || !state)
1667 return -1;
1668
1669 bool plaintext = false;
1670 handler_t handler = NULL;
1671 handler_t encrypted_handler = NULL;
1672 int rc = 0;
1673 static unsigned short recurse_level = 0;
1674
1675 const int oflags = state->flags;
1676 const bool is_attachment_display = (oflags & STATE_DISPLAY_ATTACH);
1677
1678 if (recurse_level >= MUTT_MIME_MAX_DEPTH)
1679 {
1680 mutt_debug(LL_DEBUG1, "recurse level too deep. giving up\n");
1681 return 1;
1682 }
1683 recurse_level++;
1684
1685 /* first determine which handler to use to process this part */
1686
1687 if (is_autoview(b))
1688 {
1689 handler = autoview_handler;
1690 state->flags &= ~STATE_CHARCONV;
1691 }
1692 else if (b->type == TYPE_TEXT)
1693 {
1694 if (mutt_istr_equal("plain", b->subtype))
1695 {
1696 const bool c_reflow_text = cs_subset_bool(NeoMutt->sub, "reflow_text");
1697 /* avoid copying this part twice since removing the transfer-encoding is
1698 * the only operation needed. */
1700 {
1701 encrypted_handler = crypt_pgp_application_handler;
1702 handler = encrypted_handler;
1703 }
1704 else if (c_reflow_text &&
1705 mutt_istr_equal("flowed", mutt_param_get(&b->parameter, "format")))
1706 {
1707 handler = rfc3676_handler;
1708 }
1709 else
1710 {
1711 handler = text_plain_handler;
1712 }
1713 }
1714 else if (mutt_istr_equal("enriched", b->subtype))
1715 {
1716 handler = text_enriched_handler;
1717 }
1718 else /* text body type without a handler */
1719 {
1720 plaintext = false;
1721 }
1722 }
1723 else if (b->type == TYPE_MESSAGE)
1724 {
1725 if (mutt_is_message_type(b->type, b->subtype))
1726 handler = message_handler;
1727 else if (mutt_istr_equal("delivery-status", b->subtype))
1728 plaintext = true;
1729 else if (mutt_istr_equal("external-body", b->subtype))
1730 handler = external_body_handler;
1731 }
1732 else if (b->type == TYPE_MULTIPART)
1733 {
1734 const char *const c_show_multipart_alternative = cs_subset_string(NeoMutt->sub, "show_multipart_alternative");
1735 if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1736 mutt_istr_equal("alternative", b->subtype))
1737 {
1738 handler = alternative_handler;
1739 }
1740 else if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1741 mutt_istr_equal("multilingual", b->subtype))
1742 {
1743 handler = multilingual_handler;
1744 }
1745 else if ((WithCrypto != 0) && mutt_istr_equal("signed", b->subtype))
1746 {
1747 if (!mutt_param_get(&b->parameter, "protocol"))
1748 mutt_error(_("Error: multipart/signed has no protocol"));
1749 else if (state->flags & STATE_VERIFY)
1750 handler = mutt_signed_handler;
1751 }
1753 {
1754 encrypted_handler = valid_pgp_encrypted_handler;
1755 handler = encrypted_handler;
1756 }
1758 {
1759 encrypted_handler = malformed_pgp_encrypted_handler;
1760 handler = encrypted_handler;
1761 }
1762
1763 if (!handler)
1764 handler = multipart_handler;
1765
1766 if ((b->encoding != ENC_7BIT) && (b->encoding != ENC_8BIT) && (b->encoding != ENC_BINARY))
1767 {
1768 mutt_debug(LL_DEBUG1, "Bad encoding type %d for multipart entity, assuming 7 bit\n",
1769 b->encoding);
1770 b->encoding = ENC_7BIT;
1771 }
1772 }
1773 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1774 {
1775 if (OptDontHandlePgpKeys && mutt_istr_equal("pgp-keys", b->subtype))
1776 {
1777 /* pass raw part through for key extraction */
1778 plaintext = true;
1779 }
1780 else if (((WithCrypto & APPLICATION_PGP) != 0) && mutt_is_application_pgp(b))
1781 {
1782 encrypted_handler = crypt_pgp_application_handler;
1783 handler = encrypted_handler;
1784 }
1785 else if (((WithCrypto & APPLICATION_SMIME) != 0) && mutt_is_application_smime(b))
1786 {
1787 encrypted_handler = crypt_smime_application_handler;
1788 handler = encrypted_handler;
1789 }
1790 }
1791
1792 if ((plaintext || handler) && (is_attachment_display || !mutt_prefer_as_attachment(b)))
1793 {
1794 /* only respect disposition == attachment if we're not
1795 * displaying from the attachment menu (i.e. pager) */
1796 /* Prevent encrypted attachments from being included in replies
1797 * unless $include_encrypted is set. */
1798 const bool c_include_encrypted = cs_subset_bool(NeoMutt->sub, "include_encrypted");
1799 if ((state->flags & STATE_REPLYING) && (state->flags & STATE_FIRSTDONE) &&
1800 encrypted_handler && !c_include_encrypted)
1801 {
1802 goto cleanup;
1803 }
1804
1805 rc = run_decode_and_handler(b, state, handler, plaintext);
1806 }
1807 else if (state->flags & STATE_DISPLAY)
1808 {
1809 /* print hint to use attachment menu for disposition == attachment
1810 * if we're not already being called from there */
1811 const bool c_honor_disposition = cs_subset_bool(NeoMutt->sub, "honor_disposition");
1812 struct Buffer *msg = buf_pool_get();
1813
1814 if (is_attachment_display)
1815 {
1816 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1817 {
1818 buf_strcpy(msg, _("[-- This is an attachment --]\n"));
1819 }
1820 else
1821 {
1822 /* L10N: %s/%s is a MIME type, e.g. "text/plain". */
1823 buf_printf(msg, _("[-- %s/%s is unsupported --]\n"), BODY_TYPE(b), b->subtype);
1824 }
1825 }
1826 else
1827 {
1828 struct Buffer *keystroke = buf_pool_get();
1829 if (keymap_expand_key(km_find_func(MdPager, OP_VIEW_ATTACHMENTS), keystroke))
1830 {
1831 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1832 {
1833 /* L10N: %s expands to a keystroke/key binding, e.g. 'v'. */
1834 buf_printf(msg, _("[-- This is an attachment (use '%s' to view this part) --]\n"),
1835 buf_string(keystroke));
1836 }
1837 else
1838 {
1839 /* L10N: %s/%s is a MIME type, e.g. "text/plain".
1840 The last %s expands to a keystroke/key binding, e.g. 'v'. */
1841 buf_printf(msg, _("[-- %s/%s is unsupported (use '%s' to view this part) --]\n"),
1842 BODY_TYPE(b), b->subtype, buf_string(keystroke));
1843 }
1844 }
1845 else
1846 {
1847 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1848 {
1849 buf_strcpy(msg, _("[-- This is an attachment (need 'view-attachments' bound to key) --]\n"));
1850 }
1851 else
1852 {
1853 /* L10N: %s/%s is a MIME type, e.g. "text/plain". */
1854 buf_printf(msg, _("[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n"),
1855 BODY_TYPE(b), b->subtype);
1856 }
1857 }
1858 buf_pool_release(&keystroke);
1859 }
1860 state_mark_attach(state);
1861 state_printf(state, "%s", buf_string(msg));
1862 buf_pool_release(&msg);
1863 }
1864
1865cleanup:
1866 recurse_level--;
1867 state->flags = oflags | (state->flags & STATE_FIRSTDONE);
1868 if (rc != 0)
1869 {
1870 mutt_debug(LL_DEBUG1, "Bailing on attachment of type %s/%s\n", BODY_TYPE(b),
1871 NONULL(b->subtype));
1872 }
1873
1874 return rc;
1875}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition buffer.c:161
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:395
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition helpers.c:291
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
SecurityFlags mutt_is_application_smime(struct Body *b)
Does the message use S/MIME?
Definition crypt.c:609
int mutt_is_valid_multipart_pgp_encrypted(struct Body *b)
Is this a valid multi-part encrypted message?
Definition crypt.c:467
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b)
Check for malformed layout.
Definition crypt.c:504
SecurityFlags mutt_is_application_pgp(const struct Body *b)
Does the message use PGP?
Definition crypt.c:548
bool mutt_is_message_type(int type, const char *subtype)
Determine if a mime type matches a message or not.
Definition parse.c:1506
bool OptDontHandlePgpKeys
(pseudo) used to extract PGP keys
Definition globals.c:46
int crypt_pgp_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
Definition cryptglue.c:236
static int alternative_handler(struct Body *b_email, struct State *state)
Handler for multipart alternative emails - Implements handler_t -.
Definition handler.c:950
int text_enriched_handler(struct Body *b_email, struct State *state)
Handler for enriched text - Implements handler_t -.
Definition enriched.c:473
static int text_plain_handler(struct Body *b_email, struct State *state)
Handler for plain text - Implements handler_t -.
Definition handler.c:694
int crypt_smime_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
Definition cryptglue.c:443
static int autoview_handler(struct Body *b_email, struct State *state)
Handler for autoviewable attachments - Implements handler_t -.
Definition handler.c:541
static int external_body_handler(struct Body *b_email, struct State *state)
Handler for external-body emails - Implements handler_t -.
Definition handler.c:779
int rfc3676_handler(struct Body *b_email, struct State *state)
Handler for format=flowed - Implements handler_t -.
Definition rfc3676.c:327
static int malformed_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Handler for invalid pgp-encrypted emails - Implements handler_t -.
Definition handler.c:1530
static int valid_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Handler for valid pgp-encrypted emails - Implements handler_t -.
Definition handler.c:1501
static int message_handler(struct Body *b_email, struct State *state)
Handler for message/rfc822 body parts - Implements handler_t -.
Definition handler.c:721
static int multipart_handler(struct Body *b_email, struct State *state)
Handler for multipart emails - Implements handler_t -.
Definition handler.c:1254
static int multilingual_handler(struct Body *b_email, struct State *state)
Handler for multi-lingual emails - Implements handler_t -.
Definition handler.c:1141
int mutt_signed_handler(struct Body *b_email, struct State *state)
Handler for "multipart/signed" - Implements handler_t -.
Definition crypt.c:1244
#define mutt_error(...)
Definition logging2.h:94
#define mutt_debug(LEVEL,...)
Definition logging2.h:91
static bool is_autoview(struct Body *b)
Should email body be filtered by mailcap.
Definition handler.c:491
bool mutt_prefer_as_attachment(struct Body *b)
Do we want this part as an attachment?
Definition handler.c:1882
int(* handler_t)(struct Body *b_email, struct State *state)
Definition handler.c:89
static int run_decode_and_handler(struct Body *b, struct State *state, handler_t handler, bool plaintext)
Run an appropriate decoder for an email.
Definition handler.c:1343
bool keymap_expand_key(struct Keymap *km, struct Buffer *buf)
Get the key string bound to a Keymap.
Definition keymap.c:229
struct Keymap * km_find_func(const struct MenuDefinition *md, int func)
Find a function's mapping in a Menu.
Definition menu.c:157
@ LL_DEBUG1
Log at debug level 1.
Definition logging2.h:45
@ ENC_7BIT
7-bit text
Definition mime.h:49
@ ENC_BINARY
Binary.
Definition mime.h:53
@ ENC_8BIT
8-bit text
Definition mime.h:50
#define MUTT_MIME_MAX_DEPTH
Maximum nesting depth for MIME parts to prevent stack overflow.
Definition mime.h:69
@ TYPE_MESSAGE
Type: 'message/*'.
Definition mime.h:35
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition mime.h:37
@ TYPE_APPLICATION
Type: 'application/*'.
Definition mime.h:33
@ TYPE_TEXT
Type: 'text/*'.
Definition mime.h:38
#define BODY_TYPE(body)
Get the type name of a body part.
Definition mime.h:93
@ DISP_ATTACH
Content is attached.
Definition mime.h:63
#define _(a)
Definition message.h:28
void state_mark_attach(struct State *state)
Write a unique marker around content.
Definition state.c:73
int state_printf(struct State *state, const char *fmt,...)
Write a formatted string to the State.
Definition state.c:190
#define STATE_DISPLAY
Output is displayed to the user.
Definition state.h:33
#define STATE_DISPLAY_ATTACH
We are displaying an attachment.
Definition state.h:41
#define STATE_FIRSTDONE
The first attachment has been done.
Definition state.h:40
#define STATE_REPLYING
Are we replying?
Definition state.h:39
#define STATE_VERIFY
Perform signature verification.
Definition state.h:34
#define STATE_CHARCONV
Do character set conversions.
Definition state.h:37
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition string.c:677
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:665
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition lib.h:98
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition lib.h:99
#define WithCrypto
Definition lib.h:124
struct MenuDefinition * MdPager
Pager Menu Definition.
Definition functions.c:64
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
Definition parameter.c:85
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
#define NONULL(x)
Definition string2.h:44
struct ParameterList parameter
Parameters of the content-type.
Definition body.h:63
unsigned int disposition
content-disposition, ContentDisposition
Definition body.h:42
char * subtype
content-type subtype
Definition body.h:61
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition body.h:41
unsigned int type
content-type primary type, ContentType
Definition body.h:40
String manipulation buffer.
Definition buffer.h:36
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
StateFlags flags
Flags, e.g. STATE_DISPLAY.
Definition state.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_can_decode()

bool mutt_can_decode ( struct Body * b)

Will decoding the attachment produce any output.

Parameters
bBody of email to test
Return values
trueDecoding the attachment will produce output

Definition at line 1898 of file handler.c.

1899{
1900 if (is_autoview(b))
1901 return true;
1902 if (b->type == TYPE_TEXT)
1903 return true;
1904 if (b->type == TYPE_MESSAGE)
1905 return true;
1906 if (b->type == TYPE_MULTIPART)
1907 {
1908 if (WithCrypto)
1909 {
1910 if (mutt_istr_equal(b->subtype, "signed") || mutt_istr_equal(b->subtype, "encrypted"))
1911 {
1912 return true;
1913 }
1914 }
1915
1916 for (struct Body *part = b->parts; part; part = part->next)
1917 {
1918 if (mutt_can_decode(part))
1919 return true;
1920 }
1921 }
1922 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1923 {
1925 return true;
1927 return true;
1928 }
1929
1930 return false;
1931}
bool mutt_can_decode(struct Body *b)
Will decoding the attachment produce any output.
Definition handler.c:1898
The body of an email.
Definition body.h:36
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
struct Body * next
next attachment in the list
Definition body.h:72
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_decode_attachment()

void mutt_decode_attachment ( const struct Body * b,
struct State * state )

Decode an email's attachment.

Parameters
bBody of the email
stateState of text being processed

Definition at line 1938 of file handler.c.

1939{
1940 int istext = mutt_is_text_part(b) && (b->disposition == DISP_INLINE);
1941 iconv_t cd = ICONV_T_INVALID;
1942
1943 if (!mutt_file_seek(state->fp_in, b->offset, SEEK_SET))
1944 {
1945 return;
1946 }
1947
1948 if (istext && (b->charset || (state->flags & STATE_CHARCONV)))
1949 {
1950 const char *charset = b->charset;
1951 if (!charset)
1952 {
1953 charset = mutt_param_get(&b->parameter, "charset");
1954 if (!charset && !slist_is_empty(cc_assumed_charset()))
1956 }
1957 if (charset && cc_charset())
1959 }
1960
1961 switch (b->encoding)
1962 {
1964 decode_quoted(state, b->length,
1965 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1967 cd);
1968 break;
1969 case ENC_BASE64:
1970 mutt_decode_base64(state, b->length,
1971 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1973 cd);
1974 break;
1975 case ENC_UUENCODED:
1976 decode_uuencoded(state, b->length,
1977 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1979 cd);
1980 break;
1981 default:
1982 decode_xbit(state, b->length,
1983 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1985 cd);
1986 break;
1987 }
1988}
const char * cc_charset(void)
Get the cached value of $charset.
const struct Slist * cc_assumed_charset(void)
Get the cached value of $assumed_charset.
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
Definition file.c:648
static void decode_uuencoded(struct State *state, long len, bool istext, iconv_t cd)
Decode uuencoded text.
Definition handler.c:378
void mutt_decode_base64(struct State *state, size_t len, bool istext, iconv_t cd)
Decode base64-encoded text.
Definition handler.c:1565
static void decode_quoted(struct State *state, long len, bool istext, iconv_t cd)
Decode an attachment encoded with quoted-printable.
Definition handler.c:314
static void decode_xbit(struct State *state, long len, bool istext, iconv_t cd)
Decode xbit-encoded text.
Definition handler.c:175
@ ENC_UUENCODED
UUEncoded text.
Definition mime.h:54
@ ENC_BASE64
Base-64 encoded text.
Definition mime.h:52
@ ENC_QUOTED_PRINTABLE
Quoted-printable text.
Definition mime.h:51
@ DISP_INLINE
Content is inline.
Definition mime.h:62
iconv_t mutt_ch_iconv_open(const char *tocode, const char *fromcode, uint8_t flags)
Set up iconv for conversions.
Definition charset.c:580
const char * mutt_ch_get_default_charset(const struct Slist *const assumed_charset)
Get the default character set.
Definition charset.c:451
#define MUTT_ICONV_HOOK_FROM
apply charset-hooks to fromcode
Definition charset.h:67
#define ICONV_T_INVALID
Error value for iconv functions.
Definition charset.h:111
bool slist_is_empty(const struct Slist *list)
Is the slist empty?
Definition slist.c:140
bool mutt_is_text_part(const struct Body *b)
Is this part of an email in plain text?
Definition muttlib.c:396
LOFF_T offset
offset where the actual data begins
Definition body.h:52
LOFF_T length
length (in bytes) of attachment
Definition body.h:53
char * charset
Send mode: charset of attached file as stored on disk.
Definition body.h:79
FILE * fp_in
File to read from.
Definition state.h:49
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_decode_base64()

void mutt_decode_base64 ( struct State * state,
size_t len,
bool istext,
iconv_t cd )

Decode base64-encoded text.

Parameters
stateState to work with
lenLength of text to decode
istextMime part is plain text
cdIconv conversion descriptor

Definition at line 1565 of file handler.c.

1566{
1567 char buf[5] = { 0 };
1568 int ch, i;
1569 bool cr = false;
1570 char bufi[BUFI_SIZE] = { 0 };
1571 size_t l = 0;
1572
1573 buf[4] = '\0';
1574
1575 if (istext)
1576 state_set_prefix(state);
1577
1578 while (len > 0)
1579 {
1580 for (i = 0; (i < 4) && (len > 0); len--)
1581 {
1582 ch = fgetc(state->fp_in);
1583 if (ch == EOF)
1584 break;
1585 if ((ch >= 0) && (ch < 128) && ((base64val(ch) != -1) || (ch == '=')))
1586 buf[i++] = ch;
1587 }
1588 if (i != 4)
1589 {
1590 /* "i" may be zero if there is trailing whitespace, which is not an error */
1591 if (i != 0)
1592 mutt_debug(LL_DEBUG2, "didn't get a multiple of 4 chars\n");
1593 break;
1594 }
1595
1596 const int c1 = base64val(buf[0]);
1597 const int c2 = base64val(buf[1]);
1598
1599 /* first char */
1600 ch = (c1 << 2) | (c2 >> 4);
1601
1602 if (cr && (ch != '\n'))
1603 bufi[l++] = '\r';
1604
1605 cr = false;
1606
1607 if (istext && (ch == '\r'))
1608 cr = true;
1609 else
1610 bufi[l++] = ch;
1611
1612 /* second char */
1613 if (buf[2] == '=')
1614 break;
1615 const int c3 = base64val(buf[2]);
1616 ch = ((c2 & 0xf) << 4) | (c3 >> 2);
1617
1618 if (cr && (ch != '\n'))
1619 bufi[l++] = '\r';
1620
1621 cr = false;
1622
1623 if (istext && (ch == '\r'))
1624 cr = true;
1625 else
1626 bufi[l++] = ch;
1627
1628 /* third char */
1629 if (buf[3] == '=')
1630 break;
1631 const int c4 = base64val(buf[3]);
1632 ch = ((c3 & 0x3) << 6) | c4;
1633
1634 if (cr && (ch != '\n'))
1635 bufi[l++] = '\r';
1636
1637 cr = false;
1638
1639 if (istext && (ch == '\r'))
1640 cr = true;
1641 else
1642 bufi[l++] = ch;
1643
1644 if ((l + 8) >= sizeof(bufi))
1645 convert_to_state(cd, bufi, &l, state);
1646 }
1647
1648 if (cr)
1649 bufi[l++] = '\r';
1650
1651 convert_to_state(cd, bufi, &l, state);
1652 convert_to_state(cd, 0, 0, state);
1653
1654 state_reset_prefix(state);
1655}
#define base64val(ch)
Convert base64 character to its numeric value.
Definition base64.h:33
#define BUFI_SIZE
Input buffer size for handler operations.
Definition handler.c:72
static void convert_to_state(iconv_t cd, char *bufi, size_t *l, struct State *state)
Convert text and write it to a file.
Definition handler.c:126
@ LL_DEBUG2
Log at debug level 2.
Definition logging2.h:46
#define state_set_prefix(state)
Definition state.h:56
#define state_reset_prefix(state)
Definition state.h:57
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_prefer_as_attachment()

bool mutt_prefer_as_attachment ( struct Body * b)

Do we want this part as an attachment?

Parameters
bBody of email to test
Return values
trueWe want this part as an attachment

Definition at line 1882 of file handler.c.

1883{
1884 if (!mutt_can_decode(b))
1885 return true;
1886
1887 if (b->disposition != DISP_ATTACH)
1888 return false;
1889
1890 return cs_subset_bool(NeoMutt->sub, "honor_disposition");
1891}
+ Here is the call graph for this function:
+ Here is the caller graph for this function: