NeoMutt  2025-12-11-435-g4ac674
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 1659 of file handler.c.

1660{
1661 if (!b || !state)
1662 return -1;
1663
1664 bool plaintext = false;
1665 handler_t handler = NULL;
1666 handler_t encrypted_handler = NULL;
1667 int rc = 0;
1668 static unsigned short recurse_level = 0;
1669
1670 const int oflags = state->flags;
1671 const bool is_attachment_display = (oflags & STATE_DISPLAY_ATTACH);
1672
1673 if (recurse_level >= MUTT_MIME_MAX_DEPTH)
1674 {
1675 mutt_debug(LL_DEBUG1, "recurse level too deep. giving up\n");
1676 return 1;
1677 }
1678 recurse_level++;
1679
1680 /* first determine which handler to use to process this part */
1681
1682 if (is_autoview(b))
1683 {
1684 handler = autoview_handler;
1685 state->flags &= ~STATE_CHARCONV;
1686 }
1687 else if (b->type == TYPE_TEXT)
1688 {
1689 if (mutt_istr_equal("plain", b->subtype))
1690 {
1691 const bool c_reflow_text = cs_subset_bool(NeoMutt->sub, "reflow_text");
1692 /* avoid copying this part twice since removing the transfer-encoding is
1693 * the only operation needed. */
1695 {
1696 encrypted_handler = crypt_pgp_application_handler;
1697 handler = encrypted_handler;
1698 }
1699 else if (c_reflow_text &&
1700 mutt_istr_equal("flowed", mutt_param_get(&b->parameter, "format")))
1701 {
1702 handler = rfc3676_handler;
1703 }
1704 else
1705 {
1706 handler = text_plain_handler;
1707 }
1708 }
1709 else if (mutt_istr_equal("enriched", b->subtype))
1710 {
1711 handler = text_enriched_handler;
1712 }
1713 else /* text body type without a handler */
1714 {
1715 plaintext = false;
1716 }
1717 }
1718 else if (b->type == TYPE_MESSAGE)
1719 {
1720 if (mutt_is_message_type(b->type, b->subtype))
1721 handler = message_handler;
1722 else if (mutt_istr_equal("delivery-status", b->subtype))
1723 plaintext = true;
1724 else if (mutt_istr_equal("external-body", b->subtype))
1725 handler = external_body_handler;
1726 }
1727 else if (b->type == TYPE_MULTIPART)
1728 {
1729 const char *const c_show_multipart_alternative = cs_subset_string(NeoMutt->sub, "show_multipart_alternative");
1730 if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1731 mutt_istr_equal("alternative", b->subtype))
1732 {
1733 handler = alternative_handler;
1734 }
1735 else if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1736 mutt_istr_equal("multilingual", b->subtype))
1737 {
1738 handler = multilingual_handler;
1739 }
1740 else if ((WithCrypto != 0) && mutt_istr_equal("signed", b->subtype))
1741 {
1742 if (!mutt_param_get(&b->parameter, "protocol"))
1743 mutt_error(_("Error: multipart/signed has no protocol"));
1744 else if (state->flags & STATE_VERIFY)
1745 handler = mutt_signed_handler;
1746 }
1748 {
1749 encrypted_handler = valid_pgp_encrypted_handler;
1750 handler = encrypted_handler;
1751 }
1753 {
1754 encrypted_handler = malformed_pgp_encrypted_handler;
1755 handler = encrypted_handler;
1756 }
1757
1758 if (!handler)
1759 handler = multipart_handler;
1760
1761 if ((b->encoding != ENC_7BIT) && (b->encoding != ENC_8BIT) && (b->encoding != ENC_BINARY))
1762 {
1763 mutt_debug(LL_DEBUG1, "Bad encoding type %d for multipart entity, assuming 7 bit\n",
1764 b->encoding);
1765 b->encoding = ENC_7BIT;
1766 }
1767 }
1768 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1769 {
1770 if (OptDontHandlePgpKeys && mutt_istr_equal("pgp-keys", b->subtype))
1771 {
1772 /* pass raw part through for key extraction */
1773 plaintext = true;
1774 }
1775 else if (((WithCrypto & APPLICATION_PGP) != 0) && mutt_is_application_pgp(b))
1776 {
1777 encrypted_handler = crypt_pgp_application_handler;
1778 handler = encrypted_handler;
1779 }
1780 else if (((WithCrypto & APPLICATION_SMIME) != 0) && mutt_is_application_smime(b))
1781 {
1782 encrypted_handler = crypt_smime_application_handler;
1783 handler = encrypted_handler;
1784 }
1785 }
1786
1787 if ((plaintext || handler) && (is_attachment_display || !mutt_prefer_as_attachment(b)))
1788 {
1789 /* only respect disposition == attachment if we're not
1790 * displaying from the attachment menu (i.e. pager) */
1791 /* Prevent encrypted attachments from being included in replies
1792 * unless $include_encrypted is set. */
1793 const bool c_include_encrypted = cs_subset_bool(NeoMutt->sub, "include_encrypted");
1794 if ((state->flags & STATE_REPLYING) && (state->flags & STATE_FIRSTDONE) &&
1795 encrypted_handler && !c_include_encrypted)
1796 {
1797 goto cleanup;
1798 }
1799
1800 rc = run_decode_and_handler(b, state, handler, plaintext);
1801 }
1802 else if (state->flags & STATE_DISPLAY)
1803 {
1804 /* print hint to use attachment menu for disposition == attachment
1805 * if we're not already being called from there */
1806 const bool c_honor_disposition = cs_subset_bool(NeoMutt->sub, "honor_disposition");
1807 struct Buffer *msg = buf_pool_get();
1808
1809 if (is_attachment_display)
1810 {
1811 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1812 {
1813 buf_strcpy(msg, _("[-- This is an attachment --]\n"));
1814 }
1815 else
1816 {
1817 /* L10N: %s/%s is a MIME type, e.g. "text/plain". */
1818 buf_printf(msg, _("[-- %s/%s is unsupported --]\n"), BODY_TYPE(b), b->subtype);
1819 }
1820 }
1821 else
1822 {
1823 struct Buffer *keystroke = buf_pool_get();
1824 if (keymap_expand_key(km_find_func(MdPager, OP_VIEW_ATTACHMENTS), keystroke))
1825 {
1826 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1827 {
1828 /* L10N: %s expands to a keystroke/key binding, e.g. 'v'. */
1829 buf_printf(msg, _("[-- This is an attachment (use '%s' to view this part) --]\n"),
1830 buf_string(keystroke));
1831 }
1832 else
1833 {
1834 /* L10N: %s/%s is a MIME type, e.g. "text/plain".
1835 The last %s expands to a keystroke/key binding, e.g. 'v'. */
1836 buf_printf(msg, _("[-- %s/%s is unsupported (use '%s' to view this part) --]\n"),
1837 BODY_TYPE(b), b->subtype, buf_string(keystroke));
1838 }
1839 }
1840 else
1841 {
1842 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1843 {
1844 buf_strcpy(msg, _("[-- This is an attachment (need 'view-attachments' bound to key) --]\n"));
1845 }
1846 else
1847 {
1848 /* L10N: %s/%s is a MIME type, e.g. "text/plain". */
1849 buf_printf(msg, _("[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n"),
1850 BODY_TYPE(b), b->subtype);
1851 }
1852 }
1853 buf_pool_release(&keystroke);
1854 }
1855 state_mark_attach(state);
1856 state_printf(state, "%s", buf_string(msg));
1857 buf_pool_release(&msg);
1858 }
1859
1860cleanup:
1861 recurse_level--;
1862 state->flags = oflags | (state->flags & STATE_FIRSTDONE);
1863 if (rc != 0)
1864 {
1865 mutt_debug(LL_DEBUG1, "Bailing on attachment of type %s/%s\n", BODY_TYPE(b),
1866 NONULL(b->subtype));
1867 }
1868
1869 return rc;
1870}
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:469
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:1525
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:1496
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:1249
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:1241
#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:1877
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:1338
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:187
#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:674
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:662
#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 1893 of file handler.c.

1894{
1895 if (is_autoview(b))
1896 return true;
1897 if (b->type == TYPE_TEXT)
1898 return true;
1899 if (b->type == TYPE_MESSAGE)
1900 return true;
1901 if (b->type == TYPE_MULTIPART)
1902 {
1903 if (WithCrypto)
1904 {
1905 if (mutt_istr_equal(b->subtype, "signed") || mutt_istr_equal(b->subtype, "encrypted"))
1906 {
1907 return true;
1908 }
1909 }
1910
1911 for (struct Body *part = b->parts; part; part = part->next)
1912 {
1913 if (mutt_can_decode(part))
1914 return true;
1915 }
1916 }
1917 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1918 {
1920 return true;
1922 return true;
1923 }
1924
1925 return false;
1926}
bool mutt_can_decode(struct Body *b)
Will decoding the attachment produce any output.
Definition handler.c:1893
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 1933 of file handler.c.

1934{
1935 int istext = mutt_is_text_part(b) && (b->disposition == DISP_INLINE);
1936 iconv_t cd = ICONV_T_INVALID;
1937
1938 if (!mutt_file_seek(state->fp_in, b->offset, SEEK_SET))
1939 {
1940 return;
1941 }
1942
1943 if (istext && (b->charset || (state->flags & STATE_CHARCONV)))
1944 {
1945 const char *charset = b->charset;
1946 if (!charset)
1947 {
1948 charset = mutt_param_get(&b->parameter, "charset");
1949 if (!charset && !slist_is_empty(cc_assumed_charset()))
1951 }
1952 if (charset && cc_charset())
1954 }
1955
1956 switch (b->encoding)
1957 {
1959 decode_quoted(state, b->length,
1960 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1962 cd);
1963 break;
1964 case ENC_BASE64:
1965 mutt_decode_base64(state, b->length,
1966 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1968 cd);
1969 break;
1970 case ENC_UUENCODED:
1971 decode_uuencoded(state, b->length,
1972 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1974 cd);
1975 break;
1976 default:
1977 decode_xbit(state, b->length,
1978 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1980 cd);
1981 break;
1982 }
1983}
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:652
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:1560
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:395
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 1560 of file handler.c.

1561{
1562 char buf[5] = { 0 };
1563 int ch, i;
1564 bool cr = false;
1565 char bufi[BUFI_SIZE] = { 0 };
1566 size_t l = 0;
1567
1568 buf[4] = '\0';
1569
1570 if (istext)
1571 state_set_prefix(state);
1572
1573 while (len > 0)
1574 {
1575 for (i = 0; (i < 4) && (len > 0); len--)
1576 {
1577 ch = fgetc(state->fp_in);
1578 if (ch == EOF)
1579 break;
1580 if ((ch >= 0) && (ch < 128) && ((base64val(ch) != -1) || (ch == '=')))
1581 buf[i++] = ch;
1582 }
1583 if (i != 4)
1584 {
1585 /* "i" may be zero if there is trailing whitespace, which is not an error */
1586 if (i != 0)
1587 mutt_debug(LL_DEBUG2, "didn't get a multiple of 4 chars\n");
1588 break;
1589 }
1590
1591 const int c1 = base64val(buf[0]);
1592 const int c2 = base64val(buf[1]);
1593
1594 /* first char */
1595 ch = (c1 << 2) | (c2 >> 4);
1596
1597 if (cr && (ch != '\n'))
1598 bufi[l++] = '\r';
1599
1600 cr = false;
1601
1602 if (istext && (ch == '\r'))
1603 cr = true;
1604 else
1605 bufi[l++] = ch;
1606
1607 /* second char */
1608 if (buf[2] == '=')
1609 break;
1610 const int c3 = base64val(buf[2]);
1611 ch = ((c2 & 0xf) << 4) | (c3 >> 2);
1612
1613 if (cr && (ch != '\n'))
1614 bufi[l++] = '\r';
1615
1616 cr = false;
1617
1618 if (istext && (ch == '\r'))
1619 cr = true;
1620 else
1621 bufi[l++] = ch;
1622
1623 /* third char */
1624 if (buf[3] == '=')
1625 break;
1626 const int c4 = base64val(buf[3]);
1627 ch = ((c3 & 0x3) << 6) | c4;
1628
1629 if (cr && (ch != '\n'))
1630 bufi[l++] = '\r';
1631
1632 cr = false;
1633
1634 if (istext && (ch == '\r'))
1635 cr = true;
1636 else
1637 bufi[l++] = ch;
1638
1639 if ((l + 8) >= sizeof(bufi))
1640 convert_to_state(cd, bufi, &l, state);
1641 }
1642
1643 if (cr)
1644 bufi[l++] = '\r';
1645
1646 convert_to_state(cd, bufi, &l, state);
1647 convert_to_state(cd, 0, 0, state);
1648
1649 state_reset_prefix(state);
1650}
#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 1877 of file handler.c.

1878{
1879 if (!mutt_can_decode(b))
1880 return true;
1881
1882 if (b->disposition != DISP_ATTACH)
1883 return false;
1884
1885 return cs_subset_bool(NeoMutt->sub, "honor_disposition");
1886}
+ Here is the call graph for this function:
+ Here is the caller graph for this function: