NeoMutt  2025-01-09-117-gace867
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 1633 of file handler.c.

1634{
1635 if (!b || !state)
1636 return -1;
1637
1638 bool plaintext = false;
1639 handler_t handler = NULL;
1640 handler_t encrypted_handler = NULL;
1641 int rc = 0;
1642 static unsigned short recurse_level = 0;
1643
1644 const int oflags = state->flags;
1645 const bool is_attachment_display = (oflags & STATE_DISPLAY_ATTACH);
1646
1647 if (recurse_level >= MUTT_MIME_MAX_DEPTH)
1648 {
1649 mutt_debug(LL_DEBUG1, "recurse level too deep. giving up\n");
1650 return 1;
1651 }
1652 recurse_level++;
1653
1654 /* first determine which handler to use to process this part */
1655
1656 if (is_autoview(b))
1657 {
1658 handler = autoview_handler;
1659 state->flags &= ~STATE_CHARCONV;
1660 }
1661 else if (b->type == TYPE_TEXT)
1662 {
1663 if (mutt_istr_equal("plain", b->subtype))
1664 {
1665 const bool c_reflow_text = cs_subset_bool(NeoMutt->sub, "reflow_text");
1666 /* avoid copying this part twice since removing the transfer-encoding is
1667 * the only operation needed. */
1669 {
1670 encrypted_handler = crypt_pgp_application_handler;
1671 handler = encrypted_handler;
1672 }
1673 else if (c_reflow_text &&
1674 mutt_istr_equal("flowed", mutt_param_get(&b->parameter, "format")))
1675 {
1676 handler = rfc3676_handler;
1677 }
1678 else
1679 {
1680 handler = text_plain_handler;
1681 }
1682 }
1683 else if (mutt_istr_equal("enriched", b->subtype))
1684 {
1685 handler = text_enriched_handler;
1686 }
1687 else /* text body type without a handler */
1688 {
1689 plaintext = false;
1690 }
1691 }
1692 else if (b->type == TYPE_MESSAGE)
1693 {
1694 if (mutt_is_message_type(b->type, b->subtype))
1695 handler = message_handler;
1696 else if (mutt_istr_equal("delivery-status", b->subtype))
1697 plaintext = true;
1698 else if (mutt_istr_equal("external-body", b->subtype))
1699 handler = external_body_handler;
1700 }
1701 else if (b->type == TYPE_MULTIPART)
1702 {
1703 const char *const c_show_multipart_alternative = cs_subset_string(NeoMutt->sub, "show_multipart_alternative");
1704 if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1705 mutt_istr_equal("alternative", b->subtype))
1706 {
1707 handler = alternative_handler;
1708 }
1709 else if (!mutt_str_equal("inline", c_show_multipart_alternative) &&
1710 mutt_istr_equal("multilingual", b->subtype))
1711 {
1712 handler = multilingual_handler;
1713 }
1714 else if ((WithCrypto != 0) && mutt_istr_equal("signed", b->subtype))
1715 {
1716 if (!mutt_param_get(&b->parameter, "protocol"))
1717 mutt_error(_("Error: multipart/signed has no protocol"));
1718 else if (state->flags & STATE_VERIFY)
1719 handler = mutt_signed_handler;
1720 }
1722 {
1723 encrypted_handler = valid_pgp_encrypted_handler;
1724 handler = encrypted_handler;
1725 }
1727 {
1728 encrypted_handler = malformed_pgp_encrypted_handler;
1729 handler = encrypted_handler;
1730 }
1731
1732 if (!handler)
1733 handler = multipart_handler;
1734
1735 if ((b->encoding != ENC_7BIT) && (b->encoding != ENC_8BIT) && (b->encoding != ENC_BINARY))
1736 {
1737 mutt_debug(LL_DEBUG1, "Bad encoding type %d for multipart entity, assuming 7 bit\n",
1738 b->encoding);
1739 b->encoding = ENC_7BIT;
1740 }
1741 }
1742 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1743 {
1744 if (OptDontHandlePgpKeys && mutt_istr_equal("pgp-keys", b->subtype))
1745 {
1746 /* pass raw part through for key extraction */
1747 plaintext = true;
1748 }
1749 else if (((WithCrypto & APPLICATION_PGP) != 0) && mutt_is_application_pgp(b))
1750 {
1751 encrypted_handler = crypt_pgp_application_handler;
1752 handler = encrypted_handler;
1753 }
1754 else if (((WithCrypto & APPLICATION_SMIME) != 0) && mutt_is_application_smime(b))
1755 {
1756 encrypted_handler = crypt_smime_application_handler;
1757 handler = encrypted_handler;
1758 }
1759 }
1760
1761 if ((plaintext || handler) && (is_attachment_display || !mutt_prefer_as_attachment(b)))
1762 {
1763 /* only respect disposition == attachment if we're not
1764 * displaying from the attachment menu (i.e. pager) */
1765 /* Prevent encrypted attachments from being included in replies
1766 * unless $include_encrypted is set. */
1767 const bool c_include_encrypted = cs_subset_bool(NeoMutt->sub, "include_encrypted");
1768 if ((state->flags & STATE_REPLYING) && (state->flags & STATE_FIRSTDONE) &&
1769 encrypted_handler && !c_include_encrypted)
1770 {
1771 goto cleanup;
1772 }
1773
1774 rc = run_decode_and_handler(b, state, handler, plaintext);
1775 }
1776 else if (state->flags & STATE_DISPLAY)
1777 {
1778 /* print hint to use attachment menu for disposition == attachment
1779 * if we're not already being called from there */
1780 const bool c_honor_disposition = cs_subset_bool(NeoMutt->sub, "honor_disposition");
1781 struct Buffer *msg = buf_pool_get();
1782
1783 if (is_attachment_display)
1784 {
1785 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1786 {
1787 buf_strcpy(msg, _("[-- This is an attachment --]\n"));
1788 }
1789 else
1790 {
1791 /* L10N: %s/%s is a MIME type, e.g. "text/plain". */
1792 buf_printf(msg, _("[-- %s/%s is unsupported --]\n"), BODY_TYPE(b), b->subtype);
1793 }
1794 }
1795 else
1796 {
1797 struct Buffer *keystroke = buf_pool_get();
1798 if (km_expand_key(km_find_func(MENU_PAGER, OP_VIEW_ATTACHMENTS), keystroke))
1799 {
1800 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1801 {
1802 /* L10N: %s expands to a keystroke/key binding, e.g. 'v'. */
1803 buf_printf(msg, _("[-- This is an attachment (use '%s' to view this part) --]\n"),
1804 buf_string(keystroke));
1805 }
1806 else
1807 {
1808 /* L10N: %s/%s is a MIME type, e.g. "text/plain".
1809 The last %s expands to a keystroke/key binding, e.g. 'v'. */
1810 buf_printf(msg, _("[-- %s/%s is unsupported (use '%s' to view this part) --]\n"),
1811 BODY_TYPE(b), b->subtype, buf_string(keystroke));
1812 }
1813 }
1814 else
1815 {
1816 if (c_honor_disposition && (b->disposition == DISP_ATTACH))
1817 {
1818 buf_strcpy(msg, _("[-- This is an attachment (need 'view-attachments' bound to key) --]\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 (need 'view-attachments' bound to key) --]\n"),
1824 BODY_TYPE(b), b->subtype);
1825 }
1826 }
1827 buf_pool_release(&keystroke);
1828 }
1829 state_mark_attach(state);
1830 state_printf(state, "%s", buf_string(msg));
1831 buf_pool_release(&msg);
1832 }
1833
1834cleanup:
1835 recurse_level--;
1836 state->flags = oflags | (state->flags & STATE_FIRSTDONE);
1837 if (rc != 0)
1838 {
1839 mutt_debug(LL_DEBUG1, "Bailing on attachment of type %s/%s\n", BODY_TYPE(b),
1840 NONULL(b->subtype));
1841 }
1842
1843 return rc;
1844}
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:1498
bool OptDontHandlePgpKeys
(pseudo) used to extract PGP keys
Definition: globals.c:58
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:943
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:687
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:534
static int external_body_handler(struct Body *b_email, struct State *state)
Handler for external-body emails - Implements handler_t -.
Definition: handler.c:772
int rfc3676_handler(struct Body *b_email, struct State *state)
Handler for format=flowed - Implements handler_t -.
Definition: rfc3676.c:323
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:1502
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:1473
static int message_handler(struct Body *b_email, struct State *state)
Handler for message/rfc822 body parts - Implements handler_t -.
Definition: handler.c:714
static int multipart_handler(struct Body *b_email, struct State *state)
Handler for multipart emails - Implements handler_t -.
Definition: handler.c:1239
static int multilingual_handler(struct Body *b_email, struct State *state)
Handler for multi-lingual emails - Implements handler_t -.
Definition: handler.c:1131
int mutt_signed_handler(struct Body *b_email, struct State *state)
Handler for "multipart/signed" - Implements handler_t -.
Definition: crypt.c:1243
#define mutt_error(...)
Definition: logging2.h:93
#define mutt_debug(LEVEL,...)
Definition: logging2.h:90
static bool is_autoview(struct Body *b)
Should email body be filtered by mailcap.
Definition: handler.c:487
bool mutt_prefer_as_attachment(struct Body *b)
Do we want this part as an attachment?
Definition: handler.c:1851
int(* handler_t)(struct Body *b_email, struct State *state)
Definition: handler.c:85
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:1328
struct Keymap * km_find_func(enum MenuType mtype, int func)
Find a function's mapping in a Menu.
Definition: lib.c:541
bool km_expand_key(struct Keymap *map, struct Buffer *buf)
Get the key string bound to a Keymap.
Definition: lib.c:509
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:44
@ 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
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)
Definition: mime.h:89
@ 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
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition: string.c:673
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:661
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition: lib.h:96
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
Definition: lib.h:97
#define WithCrypto
Definition: lib.h:122
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:82
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:96
#define NONULL(x)
Definition: string2.h:37
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:43
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:47
StateFlags flags
Flags, e.g. STATE_DISPLAY.
Definition: state.h:52
@ MENU_PAGER
Pager pager (email viewer)
Definition: type.h:48
+ 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 1867 of file handler.c.

1868{
1869 if (is_autoview(b))
1870 return true;
1871 if (b->type == TYPE_TEXT)
1872 return true;
1873 if (b->type == TYPE_MESSAGE)
1874 return true;
1875 if (b->type == TYPE_MULTIPART)
1876 {
1877 if (WithCrypto)
1878 {
1879 if (mutt_istr_equal(b->subtype, "signed") || mutt_istr_equal(b->subtype, "encrypted"))
1880 {
1881 return true;
1882 }
1883 }
1884
1885 for (struct Body *part = b->parts; part; part = part->next)
1886 {
1887 if (mutt_can_decode(part))
1888 return true;
1889 }
1890 }
1891 else if ((WithCrypto != 0) && (b->type == TYPE_APPLICATION))
1892 {
1894 return true;
1896 return true;
1897 }
1898
1899 return false;
1900}
bool mutt_can_decode(struct Body *b)
Will decoding the attachment produce any output.
Definition: handler.c:1867
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 1907 of file handler.c.

1908{
1909 int istext = mutt_is_text_part(b) && (b->disposition == DISP_INLINE);
1910 iconv_t cd = ICONV_T_INVALID;
1911
1912 if (!mutt_file_seek(state->fp_in, b->offset, SEEK_SET))
1913 {
1914 return;
1915 }
1916
1917 if (istext && (b->charset || (state->flags & STATE_CHARCONV)))
1918 {
1919 const char *charset = b->charset;
1920 if (!charset)
1921 {
1922 charset = mutt_param_get(&b->parameter, "charset");
1923 if (!charset && !slist_is_empty(cc_assumed_charset()))
1925 }
1926 if (charset && cc_charset())
1928 }
1929
1930 switch (b->encoding)
1931 {
1933 decode_quoted(state, b->length,
1934 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1936 cd);
1937 break;
1938 case ENC_BASE64:
1939 mutt_decode_base64(state, b->length,
1940 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1942 cd);
1943 break;
1944 case ENC_UUENCODED:
1945 decode_uuencoded(state, b->length,
1946 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1948 cd);
1949 break;
1950 default:
1951 decode_xbit(state, b->length,
1952 istext || (((WithCrypto & APPLICATION_PGP) != 0) &&
1954 cd);
1955 break;
1956 }
1957}
const char * cc_charset(void)
Get the cached value of $charset.
Definition: config_cache.c:116
const struct Slist * cc_assumed_charset(void)
Get the cached value of $assumed_charset.
Definition: config_cache.c:101
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
Definition: file.c:655
static void decode_uuencoded(struct State *state, long len, bool istext, iconv_t cd)
Decode uuencoded text.
Definition: handler.c:374
void mutt_decode_base64(struct State *state, size_t len, bool istext, iconv_t cd)
Decode base64-encoded text.
Definition: handler.c:1534
static void decode_quoted(struct State *state, long len, bool istext, iconv_t cd)
Decode an attachment encoded with quoted-printable.
Definition: handler.c:310
static void decode_xbit(struct State *state, long len, bool istext, iconv_t cd)
Decode xbit-encoded text.
Definition: handler.c:171
@ 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:594
const char * mutt_ch_get_default_charset(const struct Slist *const assumed_charset)
Get the default character set.
Definition: charset.c:465
#define MUTT_ICONV_HOOK_FROM
apply charset-hooks to fromcode
Definition: charset.h:65
#define ICONV_T_INVALID
Error value for iconv functions.
Definition: charset.h:93
bool slist_is_empty(const struct Slist *list)
Is the slist empty?
Definition: slist.c:140
#define STATE_CHARCONV
Do character set conversions.
Definition: state.h:37
bool mutt_is_text_part(const struct Body *b)
Is this part of an email in plain text?
Definition: muttlib.c:407
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 1534 of file handler.c.

1535{
1536 char buf[5] = { 0 };
1537 int ch, i;
1538 bool cr = false;
1539 char bufi[BUFI_SIZE] = { 0 };
1540 size_t l = 0;
1541
1542 buf[4] = '\0';
1543
1544 if (istext)
1545 state_set_prefix(state);
1546
1547 while (len > 0)
1548 {
1549 for (i = 0; (i < 4) && (len > 0); len--)
1550 {
1551 ch = fgetc(state->fp_in);
1552 if (ch == EOF)
1553 break;
1554 if ((ch >= 0) && (ch < 128) && ((base64val(ch) != -1) || (ch == '=')))
1555 buf[i++] = ch;
1556 }
1557 if (i != 4)
1558 {
1559 /* "i" may be zero if there is trailing whitespace, which is not an error */
1560 if (i != 0)
1561 mutt_debug(LL_DEBUG2, "didn't get a multiple of 4 chars\n");
1562 break;
1563 }
1564
1565 const int c1 = base64val(buf[0]);
1566 const int c2 = base64val(buf[1]);
1567
1568 /* first char */
1569 ch = (c1 << 2) | (c2 >> 4);
1570
1571 if (cr && (ch != '\n'))
1572 bufi[l++] = '\r';
1573
1574 cr = false;
1575
1576 if (istext && (ch == '\r'))
1577 cr = true;
1578 else
1579 bufi[l++] = ch;
1580
1581 /* second char */
1582 if (buf[2] == '=')
1583 break;
1584 const int c3 = base64val(buf[2]);
1585 ch = ((c2 & 0xf) << 4) | (c3 >> 2);
1586
1587 if (cr && (ch != '\n'))
1588 bufi[l++] = '\r';
1589
1590 cr = false;
1591
1592 if (istext && (ch == '\r'))
1593 cr = true;
1594 else
1595 bufi[l++] = ch;
1596
1597 /* third char */
1598 if (buf[3] == '=')
1599 break;
1600 const int c4 = base64val(buf[3]);
1601 ch = ((c3 & 0x3) << 6) | c4;
1602
1603 if (cr && (ch != '\n'))
1604 bufi[l++] = '\r';
1605
1606 cr = false;
1607
1608 if (istext && (ch == '\r'))
1609 cr = true;
1610 else
1611 bufi[l++] = ch;
1612
1613 if ((l + 8) >= sizeof(bufi))
1614 convert_to_state(cd, bufi, &l, state);
1615 }
1616
1617 if (cr)
1618 bufi[l++] = '\r';
1619
1620 convert_to_state(cd, bufi, &l, state);
1621 convert_to_state(cd, 0, 0, state);
1622
1623 state_reset_prefix(state);
1624}
#define base64val(ch)
Definition: base64.h:32
#define BUFI_SIZE
Definition: handler.c:68
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:122
@ LL_DEBUG2
Log at debug level 2.
Definition: logging2.h:45
#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 1851 of file handler.c.

1852{
1853 if (!mutt_can_decode(b))
1854 return true;
1855
1856 if (b->disposition != DISP_ATTACH)
1857 return false;
1858
1859 return cs_subset_bool(NeoMutt->sub, "honor_disposition");
1860}
+ Here is the call graph for this function:
+ Here is the caller graph for this function: