update code for Mu::MessagePriority

Update dependent code
This commit is contained in:
Dirk-Jan C. Binnema
2022-02-13 14:32:10 +02:00
parent 13bcc6eb5d
commit 23fc8bdba8
10 changed files with 84 additions and 102 deletions

View File

@ -134,9 +134,9 @@ static SCM
get_prio_scm(MuMsg* msg) get_prio_scm(MuMsg* msg)
{ {
switch (mu_msg_get_prio(msg)) { switch (mu_msg_get_prio(msg)) {
case MU_MSG_PRIO_LOW: return SYMB_PRIO_LOW; case MessagePriority::Low: return SYMB_PRIO_LOW;
case MU_MSG_PRIO_NORMAL: return SYMB_PRIO_NORMAL; case MessagePriority::Normal: return SYMB_PRIO_NORMAL;
case MU_MSG_PRIO_HIGH: return SYMB_PRIO_HIGH; case MessagePriority::High: return SYMB_PRIO_HIGH;
default: g_return_val_if_reached(SCM_UNDEFINED); default: g_return_val_if_reached(SCM_UNDEFINED);
} }

View File

@ -61,12 +61,13 @@ lib_mu=static_library(
'mu-msg-file.hh', 'mu-msg-file.hh',
'mu-msg-part.cc', 'mu-msg-part.cc',
'mu-msg-part.hh', 'mu-msg-part.hh',
'mu-msg-prio.c',
'mu-msg-prio.h',
'mu-msg-priv.hh', 'mu-msg-priv.hh',
'mu-msg-sexp.cc', 'mu-msg-sexp.cc',
'mu-msg.cc', 'mu-msg.cc',
'mu-msg.hh' 'mu-msg.hh',
'mu-message-priority.hh'
'mu-message-priority.hh',
'mu-message-priority.cc'
], ],
dependencies: [ dependencies: [
glib_dep, glib_dep,

View File

@ -438,41 +438,41 @@ get_size(MuMsgFile* self)
return self->_size; return self->_size;
} }
static MuMsgPrio static MessagePriority
parse_prio_str(const char* priostr) parse_prio_str(const char* priostr)
{ {
int i; int i;
struct { struct {
const char* _str; const char* _str;
MuMsgPrio _prio; MessagePriority _prio;
} str_prio[] = {{"high", MU_MSG_PRIO_HIGH}, } str_prio[] = {{"high", MessagePriority::High},
{"1", MU_MSG_PRIO_HIGH}, {"1", MessagePriority::High},
{"2", MU_MSG_PRIO_HIGH}, {"2", MessagePriority::High},
{"normal", MU_MSG_PRIO_NORMAL}, {"normal", MessagePriority::Normal},
{"3", MU_MSG_PRIO_NORMAL}, {"3", MessagePriority::Normal},
{"low", MU_MSG_PRIO_LOW}, {"low", MessagePriority::Low},
{"list", MU_MSG_PRIO_LOW}, {"list", MessagePriority::Low},
{"bulk", MU_MSG_PRIO_LOW}, {"bulk", MessagePriority::Low},
{"4", MU_MSG_PRIO_LOW}, {"4", MessagePriority::Low},
{"5", MU_MSG_PRIO_LOW}}; {"5", MessagePriority::Low}};
for (i = 0; i != G_N_ELEMENTS(str_prio); ++i) for (i = 0; i != G_N_ELEMENTS(str_prio); ++i)
if (g_ascii_strcasecmp(priostr, str_prio[i]._str) == 0) if (g_ascii_strcasecmp(priostr, str_prio[i]._str) == 0)
return str_prio[i]._prio; return str_prio[i]._prio;
/* e.g., last-fm uses 'fm-user'... as precedence */ /* e.g., last-fm uses 'fm-user'... as precedence */
return MU_MSG_PRIO_NORMAL; return MessagePriority::Normal;
} }
static MuMsgPrio static MessagePriority
get_prio(MuMsgFile* self) get_prio(MuMsgFile* self)
{ {
GMimeObject* obj; GMimeObject* obj;
const char* priostr; const char* priostr;
g_return_val_if_fail(self, MU_MSG_PRIO_NONE); g_return_val_if_fail(self, MessagePriority::Normal);
obj = GMIME_OBJECT(self->_mime_msg); obj = GMIME_OBJECT(self->_mime_msg);
@ -481,8 +481,10 @@ get_prio(MuMsgFile* self)
priostr = g_mime_object_get_header(obj, "X-Priority"); priostr = g_mime_object_get_header(obj, "X-Priority");
if (!priostr) if (!priostr)
priostr = g_mime_object_get_header(obj, "Importance"); priostr = g_mime_object_get_header(obj, "Importance");
if (!priostr)
return priostr ? parse_prio_str(priostr) : MU_MSG_PRIO_NORMAL; return MessagePriority::Normal;
else
return parse_prio_str(priostr);
} }
/* NOTE: buffer will be *freed* or returned unchanged */ /* NOTE: buffer will be *freed* or returned unchanged */

View File

@ -385,7 +385,8 @@ Mu::msg_to_sexp_list(MuMsg* msg, unsigned docid, MuMsgOptions opts)
add_prop_nonempty(items, ":path", mu_msg_get_path(msg)); add_prop_nonempty(items, ":path", mu_msg_get_path(msg));
add_prop_nonempty(items, ":maildir", mu_msg_get_maildir(msg)); add_prop_nonempty(items, ":maildir", mu_msg_get_maildir(msg));
items.add_prop(":priority", Sexp::make_symbol(mu_msg_prio_name(mu_msg_get_prio(msg)))); items.add_prop(":priority",
Sexp::make_symbol_sv(message_priority_name(mu_msg_get_prio(msg))));
/* in the no-headers-only case (see below) we get a more complete list of contacts, so no /* in the no-headers-only case (see below) we get a more complete list of contacts, so no
* need to get them here if that's the case */ * need to get them here if that's the case */

View File

@ -427,11 +427,13 @@ Mu::mu_msg_get_size(MuMsg* self)
return (size_t)get_num_field(self, MU_MSG_FIELD_ID_SIZE); return (size_t)get_num_field(self, MU_MSG_FIELD_ID_SIZE);
} }
MuMsgPrio Mu::MessagePriority
Mu::mu_msg_get_prio(MuMsg* self) Mu::mu_msg_get_prio(MuMsg* self)
{ {
g_return_val_if_fail(self, MU_MSG_PRIO_NORMAL); g_return_val_if_fail(self, MessagePriority{});
return (MuMsgPrio)get_num_field(self, MU_MSG_FIELD_ID_PRIO);
return message_priority_from_char(
static_cast<char>(get_num_field(self, MU_MSG_FIELD_ID_PRIO)));
} }
struct _BodyData { struct _BodyData {

View File

@ -1,5 +1,5 @@
/* /*
** Copyright (C) 2010-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ** Copyright (C) 2010-2022 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
** **
** This program is free software; you can redistribute it and/or modify ** 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 ** it under the terms of the GNU General Public License as published by
@ -22,7 +22,7 @@
#include <mu-flags.hh> #include <mu-flags.hh>
#include <mu-msg-fields.h> #include <mu-msg-fields.h>
#include <mu-msg-prio.h> #include <mu-message-priority.hh>
#include <utils/mu-util.h> #include <utils/mu-util.h>
#include <utils/mu-utils.hh> #include <utils/mu-utils.hh>
#include <utils/mu-option.hh> #include <utils/mu-option.hh>
@ -339,17 +339,15 @@ const GSList* mu_msg_get_field_string_list(MuMsg* self, MuMsgFieldId mfid);
gint64 mu_msg_get_field_numeric(MuMsg* msg, MuMsgFieldId mfid); gint64 mu_msg_get_field_numeric(MuMsg* msg, MuMsgFieldId mfid);
/** /**
* get the message priority for this message (MU_MSG_PRIO_LOW, * get the message priority for this message. The X-Priority, X-MSMailPriority,
* MU_MSG_PRIO_NORMAL or MU_MSG_PRIO_HIGH) the X-Priority, * Importance and Precedence header are checked, in that order. if no known or
* X-MSMailPriority, Importance and Precedence header are checked, in * explicit priority is set, MessagePriority::Id::Normal is assumed
* that order. if no known or explicit priority is set,
* MU_MSG_PRIO_NORMAL is assumed
* *
* @param msg a valid MuMsg* instance * @param msg a valid MuMsg* instance
* *
* @return the message priority (!= 0) or 0 in case of error * @return the message priority
*/ */
MuMsgPrio mu_msg_get_prio(MuMsg* msg); MessagePriority mu_msg_get_prio(MuMsg* msg);
/** /**
* get the timestamp (mtime) for the file containing this message * get the timestamp (mtime) for the file containing this message

View File

@ -87,20 +87,6 @@ add_synonym_for_flag(MuFlags flag, Xapian::WritableDatabase* db)
pfx + (std::string(1, (char)(tolower(mu_flag_char(flag)))))); pfx + (std::string(1, (char)(tolower(mu_flag_char(flag))))));
} }
static void
add_synonym_for_prio(MuMsgPrio prio, Xapian::WritableDatabase* db)
{
static const std::string pfx(prefix(MU_MSG_FIELD_ID_PRIO));
std::string s1(pfx + mu_msg_prio_name(prio));
std::string s2(pfx + (std::string(1, mu_msg_prio_char(prio))));
db->clear_synonyms(s1);
db->clear_synonyms(s2);
db->add_synonym(s1, s2);
}
struct Store::Private { struct Store::Private {
enum struct XapianOpts { ReadOnly, enum struct XapianOpts { ReadOnly,
Open, Open,
@ -222,8 +208,17 @@ struct Store::Private {
void add_synonyms() void add_synonyms()
{ {
mu_flags_foreach((MuFlagsForeachFunc)add_synonym_for_flag, &writable_db()); mu_flags_foreach((MuFlagsForeachFunc)add_synonym_for_flag,
mu_msg_prio_foreach((MuMsgPrioForeachFunc)add_synonym_for_prio, &writable_db()); &writable_db());
for (auto&& prio : AllMessagePriorities) {
const auto s1{prefix(MU_MSG_FIELD_ID_PRIO) + to_string(prio)};
const auto s2{prefix(MU_MSG_FIELD_ID_PRIO) +
std::string{1, to_char(prio)}};
writable_db().clear_synonyms(s1);
writable_db().clear_synonyms(s2);
writable_db().add_synonym(s1, s2);
}
} }
time_t metadata_time_t(const std::string& key) const time_t metadata_time_t(const std::string& key) const
@ -722,20 +717,18 @@ flag_val(char flagchar)
} }
} }
/* pre-calculate; optimization */ static const std::string&
G_GNUC_CONST static const std::string& prio_val(MessagePriority prio)
prio_val(MuMsgPrio prio)
{ {
static const std::string pfx(prefix(MU_MSG_FIELD_ID_PRIO)); static const std::string pfx(prefix(MU_MSG_FIELD_ID_PRIO));
static const std::string low(pfx + std::string(1, to_char(MessagePriority::Low))),
static const std::string low(pfx + std::string(1, mu_msg_prio_char(MU_MSG_PRIO_LOW))), norm(pfx + std::string(1, to_char(MessagePriority::Normal))),
norm(pfx + std::string(1, mu_msg_prio_char(MU_MSG_PRIO_NORMAL))), high(pfx + std::string(1, to_char(MessagePriority::High)));
high(pfx + std::string(1, mu_msg_prio_char(MU_MSG_PRIO_HIGH)));
switch (prio) { switch (prio) {
case MU_MSG_PRIO_LOW: return low; case MessagePriority::Low: return low;
case MU_MSG_PRIO_NORMAL: return norm; case MessagePriority::Normal: return norm;
case MU_MSG_PRIO_HIGH: return high; case MessagePriority::High: return high;
default: g_return_val_if_reached(norm); return norm; default: g_return_val_if_reached(norm); return norm;
} }
} }
@ -766,7 +759,7 @@ add_terms_values_number(Xapian::Document& doc, MuMsg* msg, MuMsgFieldId mfid)
} }
} else if (mfid == MU_MSG_FIELD_ID_PRIO) } else if (mfid == MU_MSG_FIELD_ID_PRIO)
add_term(doc, prio_val((MuMsgPrio)num)); add_term(doc, prio_val(static_cast<MessagePriority>(num)));
} }
/* for string and string-list */ /* for string and string-list */

View File

@ -94,9 +94,7 @@ test_mu_msg_01(void)
g_assert_cmpstr(mu_msg_get_header(msg, "Mailing-List"), g_assert_cmpstr(mu_msg_get_header(msg, "Mailing-List"),
==, ==,
"contact gcc-help-help@gcc.gnu.org; run by ezmlm"); "contact gcc-help-help@gcc.gnu.org; run by ezmlm");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'klub' */ g_assert_true(mu_msg_get_prio(msg) == Mu::MessagePriority::Normal);
==,
MU_MSG_PRIO_NORMAL);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 1217530645); g_assert_cmpuint(mu_msg_get_date(msg), ==, 1217530645);
i = 0; i = 0;
@ -140,9 +138,8 @@ test_mu_msg_02(void)
g_assert_cmpstr(mu_msg_get_header(msg, "Errors-To"), g_assert_cmpstr(mu_msg_get_header(msg, "Errors-To"),
==, ==,
"help-gnu-emacs-bounces+xxxx.klub=gmail.com@gnu.org"); "help-gnu-emacs-bounces+xxxx.klub=gmail.com@gnu.org");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::Low);
MU_MSG_PRIO_LOW);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 1218051515); g_assert_cmpuint(mu_msg_get_date(msg), ==, 1218051515);
i = 0; i = 0;
@ -163,9 +160,8 @@ test_mu_msg_03(void)
g_assert_cmpstr(mu_msg_get_to(msg), ==, "Bilbo Baggins <bilbo@anotherexample.com>"); g_assert_cmpstr(mu_msg_get_to(msg), ==, "Bilbo Baggins <bilbo@anotherexample.com>");
g_assert_cmpstr(mu_msg_get_subject(msg), ==, "Greetings from Lothlórien"); g_assert_cmpstr(mu_msg_get_subject(msg), ==, "Greetings from Lothlórien");
g_assert_cmpstr(mu_msg_get_from(msg), ==, "Frodo Baggins <frodo@example.com>"); g_assert_cmpstr(mu_msg_get_from(msg), ==, "Frodo Baggins <frodo@example.com>");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::Normal);
MU_MSG_PRIO_NORMAL);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 0); g_assert_cmpuint(mu_msg_get_date(msg), ==, 0);
g_assert_cmpstr(mu_msg_get_body_text(msg, MU_MSG_OPTION_NONE), g_assert_cmpstr(mu_msg_get_body_text(msg, MU_MSG_OPTION_NONE),
==, ==,
@ -192,9 +188,8 @@ test_mu_msg_04(void)
g_assert_cmpstr(mu_msg_get_to(msg), ==, "George Custer <gac@example.com>"); g_assert_cmpstr(mu_msg_get_to(msg), ==, "George Custer <gac@example.com>");
g_assert_cmpstr(mu_msg_get_subject(msg), ==, "pics for you"); g_assert_cmpstr(mu_msg_get_subject(msg), ==, "pics for you");
g_assert_cmpstr(mu_msg_get_from(msg), ==, "Sitting Bull <sb@example.com>"); g_assert_cmpstr(mu_msg_get_from(msg), ==, "Sitting Bull <sb@example.com>");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::Normal);
MU_MSG_PRIO_NORMAL);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 0); g_assert_cmpuint(mu_msg_get_date(msg), ==, 0);
g_assert_cmpuint(mu_msg_get_flags(msg), ==, MU_FLAG_HAS_ATTACH | MU_FLAG_UNREAD); g_assert_cmpuint(mu_msg_get_flags(msg), ==, MU_FLAG_HAS_ATTACH | MU_FLAG_UNREAD);
mu_msg_unref(msg); mu_msg_unref(msg);
@ -257,9 +252,8 @@ test_mu_msg_umlaut(void)
g_assert_cmpstr(mu_msg_get_to(msg), ==, "Helmut Kröger <hk@testmu.xxx>"); g_assert_cmpstr(mu_msg_get_to(msg), ==, "Helmut Kröger <hk@testmu.xxx>");
g_assert_cmpstr(mu_msg_get_subject(msg), ==, "Motörhead"); g_assert_cmpstr(mu_msg_get_subject(msg), ==, "Motörhead");
g_assert_cmpstr(mu_msg_get_from(msg), ==, "Mü <testmu@testmu.xx>"); g_assert_cmpstr(mu_msg_get_from(msg), ==, "Mü <testmu@testmu.xx>");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::Normal);
MU_MSG_PRIO_NORMAL);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 0); g_assert_cmpuint(mu_msg_get_date(msg), ==, 0);
mu_msg_unref(msg); mu_msg_unref(msg);
@ -366,9 +360,8 @@ test_mu_msg_tags(void)
==, ==,
"Fere libenter homines id quod volunt credunt"); "Fere libenter homines id quod volunt credunt");
g_assert_cmpstr(mu_msg_get_from(msg), ==, "John Milton <jm@example.com>"); g_assert_cmpstr(mu_msg_get_from(msg), ==, "John Milton <jm@example.com>");
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::High);
MU_MSG_PRIO_HIGH);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 1217530645); g_assert_cmpuint(mu_msg_get_date(msg), ==, 1217530645);
tags = mu_msg_get_tags(msg); tags = mu_msg_get_tags(msg);
@ -414,9 +407,8 @@ test_mu_msg_comp_unix_programmer(void)
g_free(refs); g_free(refs);
//"jimbo@slp53.sl.home (Jimbo Foobarcuux)"; //"jimbo@slp53.sl.home (Jimbo Foobarcuux)";
g_assert_cmpuint(mu_msg_get_prio(msg), /* 'low' */ g_assert_true(mu_msg_get_prio(msg) /* 'low' */
==, == Mu::MessagePriority::Normal);
MU_MSG_PRIO_NORMAL);
g_assert_cmpuint(mu_msg_get_date(msg), ==, 1299603860); g_assert_cmpuint(mu_msg_get_date(msg), ==, 1299603860);
mu_msg_unref(msg); mu_msg_unref(msg);
@ -425,25 +417,17 @@ test_mu_msg_comp_unix_programmer(void)
static void static void
test_mu_str_prio_01(void) test_mu_str_prio_01(void)
{ {
g_assert_cmpstr(mu_msg_prio_name(MU_MSG_PRIO_LOW), ==, "low"); g_assert_true(message_priority_name(Mu::MessagePriority::Low) == "low");
g_assert_cmpstr(mu_msg_prio_name(MU_MSG_PRIO_NORMAL), ==, "normal"); g_assert_true(message_priority_name(Mu::MessagePriority::Normal) == "normal");
g_assert_cmpstr(mu_msg_prio_name(MU_MSG_PRIO_HIGH), ==, "high"); g_assert_true(message_priority_name(Mu::MessagePriority::High) == "high");
} }
static gboolean G_GNUC_UNUSED static gboolean
ignore_error(const char* log_domain, GLogLevelFlags log_level, const gchar* msg, gpointer user_data) ignore_error(const char* log_domain, GLogLevelFlags log_level, const gchar* msg, gpointer user_data)
{ {
return FALSE; /* don't abort */ return FALSE; /* don't abort */
} }
static void
test_mu_str_prio_02(void)
{
/* this must fail */
g_test_log_set_fatal_handler((GTestLogFatalFunc)ignore_error, NULL);
g_assert_cmpstr(mu_msg_prio_name((MuMsgPrio)666), ==, NULL);
}
static void static void
test_mu_str_display_contact(void) test_mu_str_display_contact(void)
{ {
@ -486,7 +470,6 @@ main(int argc, char* argv[])
/* mu_str_prio */ /* mu_str_prio */
g_test_add_func("/mu-str/mu-str-prio-01", test_mu_str_prio_01); g_test_add_func("/mu-str/mu-str-prio-01", test_mu_str_prio_01);
g_test_add_func("/mu-str/mu-str-prio-02", test_mu_str_prio_02);
g_test_add_func("/mu-str/mu-str-display_contact", test_mu_str_display_contact); g_test_add_func("/mu-str/mu-str-display_contact", test_mu_str_display_contact);

View File

@ -76,6 +76,7 @@ struct Sexp {
throw Error(Error::Code::InvalidArgument, "symbol must be non-empty"); throw Error(Error::Code::InvalidArgument, "symbol must be non-empty");
return Sexp{Type::Symbol, std::move(val)}; return Sexp{Type::Symbol, std::move(val)};
} }
static Sexp make_symbol_sv(std::string_view val) { return make_symbol(std::string{val}); }
/** /**
* *

View File

@ -307,8 +307,9 @@ display_field(MuMsg* msg, MuMsgFieldId mfid)
case MU_MSG_FIELD_TYPE_INT: case MU_MSG_FIELD_TYPE_INT:
if (mfid == MU_MSG_FIELD_ID_PRIO) { if (mfid == MU_MSG_FIELD_ID_PRIO) {
val = mu_msg_get_field_numeric(msg, mfid); const auto val = static_cast<char>(mu_msg_get_field_numeric(msg, mfid));
return mu_msg_prio_name((MuMsgPrio)val); const auto prio = message_priority_from_char(val);
return message_priority_name_c_str(prio);
} else if (mfid == MU_MSG_FIELD_ID_FLAGS) { } else if (mfid == MU_MSG_FIELD_ID_FLAGS) {
val = mu_msg_get_field_numeric(msg, mfid); val = mu_msg_get_field_numeric(msg, mfid);
return mu_str_flags_s((MuFlags)val); return mu_str_flags_s((MuFlags)val);