diff options
Diffstat (limited to 'libmailutils/mailbox/attribute.c')
-rw-r--r-- | libmailutils/mailbox/attribute.c | 98 |
1 files changed, 70 insertions, 28 deletions
diff --git a/libmailutils/mailbox/attribute.c b/libmailutils/mailbox/attribute.c index 1f00257ac..508a9f203 100644 --- a/libmailutils/mailbox/attribute.c +++ b/libmailutils/mailbox/attribute.c @@ -1,5 +1,5 @@ /* GNU Mailutils -- a suite of utilities for electronic mail - Copyright (C) 1999-2019 Free Software Foundation, Inc. + Copyright (C) 1999-2024 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -134,17 +134,21 @@ mu_attribute_unset_flags (mu_attribute_t attr, int flags) return EINVAL; /* If the required bits are already cleared, do not modify anything */ - mu_attribute_get_flags (attr, &oflags); - if ((oflags & flags) == 0) - return 0; - - if (attr->_unset_flags) - status = attr->_unset_flags (attr, flags); - else - attr->flags &= ~flags; + status = mu_attribute_get_flags (attr, &oflags); if (status == 0) - mu_attribute_set_modified (attr); - return 0; + { + if ((oflags & flags) == 0) + return 0; + + if (attr->_unset_flags) + status = attr->_unset_flags (attr, flags); + else + attr->flags &= ~flags; + + if (status == 0) + mu_attribute_set_modified (attr); + } + return status; } int @@ -240,6 +244,12 @@ mu_attribute_set_recent (mu_attribute_t attr) } int +mu_attribute_set_forwarded (mu_attribute_t attr) +{ + return mu_attribute_set_flags (attr, MU_ATTRIBUTE_FORWARDED); +} + +int mu_attribute_is_userflag (mu_attribute_t attr, int flag) { if (attr == NULL) @@ -311,6 +321,15 @@ mu_attribute_is_recent (mu_attribute_t attr) } int +mu_attribute_is_forwarded (mu_attribute_t attr) +{ + int flags = 0; + if (mu_attribute_get_flags (attr, &flags) == 0) + return flags & MU_ATTRIBUTE_FORWARDED; + return 0; +} + +int mu_attribute_unset_userflag (mu_attribute_t attr, int flag) { if (attr == NULL) @@ -362,6 +381,12 @@ mu_attribute_unset_recent (mu_attribute_t attr) } int +mu_attribute_unset_forwarded (mu_attribute_t attr) +{ + return mu_attribute_unset_flags (attr, MU_ATTRIBUTE_FORWARDED); +} + +int mu_attribute_is_equal (mu_attribute_t attr, mu_attribute_t attr2) { int flags2 = 0, flags = 0; @@ -400,6 +425,7 @@ static struct flagtrans flagtrans[] = { { MU_ATTRIBUTE_DELETED, 'D' }, { MU_ATTRIBUTE_DRAFT, 'd' }, { MU_ATTRIBUTE_SEEN, 'O' }, + { MU_ATTRIBUTE_FORWARDED, 'P' }, { MU_ATTRIBUTE_READ, 'R' }, { 0 } }; @@ -409,17 +435,17 @@ static struct flagtrans flagtrans[] = { mu_verify (MU_ARRAY_SIZE (flagtrans) == MU_STATUS_BUF_SIZE); int -mu_string_to_flags (const char *buffer, int *pflags) +mu_attribute_string_to_flags (const char *buffer, int *pflags) { const char *sep; if (pflags == NULL) return EINVAL; - /* Set the attribute */ + /* Skip the header name */ if (mu_c_strncasecmp (buffer, "Status:", 7) == 0) { - sep = strchr(buffer, ':'); /* pass the ':' */ + sep = strchr (buffer, ':'); /* pass the ':' */ sep++; } else @@ -439,6 +465,35 @@ mu_string_to_flags (const char *buffer, int *pflags) return 0; } +int +mu_attribute_flags_to_string (int flags, char *buffer, size_t len, size_t *pn) +{ + int i, j; + struct flagtrans *ft; + + if (!buffer || len == 0) + return EINVAL; + + len--; + + i = j = 0; + for (ft = flagtrans; ft->flag; ft++) + { + if (ft->flag & flags) + { + if (buffer && i < len) + buffer[i++] = ft->letter; + j++; + } + } + if (buffer) + buffer[i++] = 0; + + if (pn) + *pn = j; + return j <= len ? 0 : MU_ERR_BUFSPACE; +} + /* NOTE: When adding/removing flags, make sure to update the MU_STATUS_BUF_SIZE define in include/mailutils/attribute.h */ int @@ -446,24 +501,11 @@ mu_attribute_to_string (mu_attribute_t attr, char *buffer, size_t len, size_t *pn) { int flags = 0; - char buf[MU_STATUS_BUF_SIZE]; - int i; int rc; - struct flagtrans *ft; rc = mu_attribute_get_flags (attr, &flags); if (rc) return rc; - - i = 0; - for (ft = flagtrans; ft->flag; ft++) - if (ft->flag & flags) - buf[i++] = ft->letter; - buf[i++] = 0; - - i = mu_cpystr (buffer, buf, i); - if (pn) - *pn = i; - return 0; + return mu_attribute_flags_to_string (flags, buffer, len, pn); } |