From e282d80bc0ef3630984871e5f7b4a0c707234eff Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Sat, 28 Nov 2020 10:15:49 +0200 Subject: [PATCH] lib: Update for new querying machinery Port to c++ and use new APIs. --- .gitignore | 1 + lib/Makefile.am | 46 ++-- lib/{mu-flags.c => mu-flags.cc} | 31 +-- lib/{mu-flags.h => mu-flags.hh} | 21 +- lib/{mu-maildir.c => mu-maildir.cc} | 32 +-- lib/{mu-maildir.h => mu-maildir.hh} | 14 +- lib/{mu-msg-crypto.c => mu-msg-crypto.cc} | 33 ++- lib/mu-msg-doc.cc | 21 +- lib/{mu-msg-doc.h => mu-msg-doc.hh} | 17 +- lib/{mu-msg-file.c => mu-msg-file.cc} | 33 +-- lib/{mu-msg-file.h => mu-msg-file.hh} | 16 +- lib/{mu-msg-part.c => mu-msg-part.cc} | 43 ++-- lib/{mu-msg-part.h => mu-msg-part.hh} | 23 +- lib/{mu-msg-priv.h => mu-msg-priv.hh} | 30 +-- lib/mu-msg-sexp.cc | 290 ++++++++++------------ lib/{mu-msg.c => mu-msg.cc} | 95 +++---- lib/{mu-msg.h => mu-msg.hh} | 93 ++----- lib/mu-server.cc | 76 +++--- lib/mu-store.cc | 6 +- lib/mu-store.hh | 9 +- lib/test-mu-flags.cc | 6 +- lib/test-mu-maildir.cc | 5 +- lib/test-mu-msg.cc | 4 +- lib/utils/mu-sexp.hh | 1 - 24 files changed, 433 insertions(+), 513 deletions(-) rename lib/{mu-flags.c => mu-flags.cc} (87%) rename lib/{mu-flags.h => mu-flags.hh} (94%) rename lib/{mu-maildir.c => mu-maildir.cc} (96%) rename lib/{mu-maildir.h => mu-maildir.hh} (98%) rename lib/{mu-msg-crypto.c => mu-msg-crypto.cc} (92%) rename lib/{mu-msg-doc.h => mu-msg-doc.hh} (92%) rename lib/{mu-msg-file.c => mu-msg-file.cc} (95%) rename lib/{mu-msg-file.h => mu-msg-file.hh} (91%) rename lib/{mu-msg-part.c => mu-msg-part.cc} (95%) rename lib/{mu-msg-part.h => mu-msg-part.hh} (95%) rename lib/{mu-msg-priv.h => mu-msg-priv.hh} (89%) rename lib/{mu-msg.c => mu-msg.cc} (91%) rename lib/{mu-msg.h => mu-msg.hh} (88%) diff --git a/.gitignore b/.gitignore index 2b3cf768..e430f93a 100644 --- a/.gitignore +++ b/.gitignore @@ -126,3 +126,4 @@ compile_commands.json /lib/test-mu-threader /lib/test-mu-tokenizer /lib/test-mu-parser +/lib/test-mu-query-threader diff --git a/lib/Makefile.am b/lib/Makefile.am index 09561fa9..62a1ed42 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -63,13 +63,16 @@ libmu_la_SOURCES= \ mu-bookmarks.hh \ mu-contacts.cc \ mu-contacts.hh \ - mu-container.cc \ - mu-container.hh \ mu-data.hh \ mu-parser.cc \ mu-parser.hh \ mu-query.cc \ mu-query.hh \ + mu-query-results.hh \ + mu-query-match-deciders.cc \ + mu-query-match-deciders.hh \ + mu-query-threader.cc \ + mu-query-threader.hh \ mu-runtime.cc \ mu-runtime.hh \ mu-script.cc \ @@ -78,34 +81,30 @@ libmu_la_SOURCES= \ mu-server.hh \ mu-store.cc \ mu-store.hh \ - mu-threader.cc \ - mu-threader.hh \ mu-tokenizer.cc \ mu-tokenizer.hh \ mu-tree.hh \ mu-xapian.cc \ mu-xapian.hh \ - mu-flags.c \ - mu-maildir.c \ - mu-maildir.h \ - mu-flags.h \ - mu-msg-crypto.c \ + mu-maildir.cc \ + mu-maildir.hh \ + mu-flags.cc \ + mu-flags.hh \ + mu-msg-crypto.cc \ mu-msg-doc.cc \ - mu-msg-doc.h \ + mu-msg-doc.hh \ mu-msg-fields.c \ mu-msg-fields.h \ - mu-msg-file.c \ - mu-msg-file.h \ - mu-msg-iter.cc \ - mu-msg-iter.h \ - mu-msg-part.c \ - mu-msg-part.h \ + mu-msg-file.cc \ + mu-msg-file.hh \ + mu-msg-part.cc \ + mu-msg-part.hh \ mu-msg-prio.c \ mu-msg-prio.h \ - mu-msg-priv.h \ + mu-msg-priv.hh \ mu-msg-sexp.cc \ - mu-msg.c \ - mu-msg.h + mu-msg.cc \ + mu-msg.hh libmu_la_LIBADD= \ $(XAPIAN_LIBS) \ @@ -130,7 +129,6 @@ tokenize_LDADD= \ utils/libmu-utils.la EXTRA_DIST= \ - mu-msg-crypto.c \ doxyfile.in noinst_PROGRAMS+=$(TEST_PROGS) @@ -154,14 +152,14 @@ TEST_PROGS += test-mu-store test_mu_store_SOURCES= test-mu-store.cc test_mu_store_LDADD= libtestmucommon.la +TEST_PROGS += test-mu-query +test_mu_query_SOURCES= test-query.cc +test_mu_query_LDADD= libtestmucommon.la + TEST_PROGS += test-mu-flags test_mu_flags_SOURCES= test-mu-flags.cc test_mu_flags_LDADD= libtestmucommon.la -TEST_PROGS += test-mu-container -test_mu_container_SOURCES= test-mu-container.cc -test_mu_container_LDADD= libtestmucommon.la - TEST_PROGS += test-mu-contacts test_mu_contacts_SOURCES= test-mu-contacts.cc test_mu_contacts_LDADD= libtestmucommon.la diff --git a/lib/mu-flags.c b/lib/mu-flags.cc similarity index 87% rename from lib/mu-flags.c rename to lib/mu-flags.cc index 330fa316..66626d18 100644 --- a/lib/mu-flags.c +++ b/lib/mu-flags.cc @@ -1,5 +1,5 @@ /* -** Copyright (C) 2011-2012 +** Copyright (C) 2011-2020 ** ** 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 the @@ -18,15 +18,16 @@ */ #include -#include "mu-flags.h" +#include "mu-flags.hh" -struct _FlagInfo { +using namespace Mu; + +struct FlagInfo { MuFlags flag; char kar; const char *name; MuFlagType flag_type; }; -typedef struct _FlagInfo FlagInfo; static const FlagInfo FLAG_INFO[] = { @@ -53,7 +54,7 @@ static const FlagInfo FLAG_INFO[] = { MuFlagType -mu_flag_type (MuFlags flag) +Mu::mu_flag_type (MuFlags flag) { unsigned u; @@ -66,7 +67,7 @@ mu_flag_type (MuFlags flag) char -mu_flag_char (MuFlags flag) +Mu::mu_flag_char (MuFlags flag) { unsigned u; @@ -78,7 +79,7 @@ mu_flag_char (MuFlags flag) MuFlags -mu_flag_char_from_name (const char *str) +Mu::mu_flag_char_from_name (const char *str) { unsigned u; @@ -86,9 +87,9 @@ mu_flag_char_from_name (const char *str) for (u = 0; u != G_N_ELEMENTS (FLAG_INFO); ++u) if (g_strcmp0(FLAG_INFO[u].name, str) == 0) - return FLAG_INFO[u].kar; + return (MuFlags)FLAG_INFO[u].kar; - return 0; + return (MuFlags)0; } @@ -106,7 +107,7 @@ mu_flag_from_char (char kar) const char* -mu_flag_name (MuFlags flag) +Mu::mu_flag_name (MuFlags flag) { unsigned u; @@ -119,7 +120,7 @@ mu_flag_name (MuFlags flag) const char* -mu_flags_to_str_s (MuFlags flags, MuFlagType types) +Mu::mu_flags_to_str_s (MuFlags flags, MuFlagType types) { unsigned u,v; static char str[sizeof(FLAG_INFO) + 1]; @@ -135,7 +136,7 @@ mu_flags_to_str_s (MuFlags flags, MuFlagType types) MuFlags -mu_flags_from_str (const char *str, MuFlagType types, +Mu::mu_flags_from_str (const char *str, MuFlagType types, gboolean ignore_invalid) { const char *cur; @@ -165,7 +166,7 @@ mu_flags_from_str (const char *str, MuFlagType types, char* -mu_flags_custom_from_str (const char *str) +Mu::mu_flags_custom_from_str (const char *str) { char *custom; const char* cur; @@ -195,7 +196,7 @@ mu_flags_custom_from_str (const char *str) void -mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data) +Mu::mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data) { unsigned u; @@ -207,7 +208,7 @@ mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data) MuFlags -mu_flags_from_str_delta (const char *str, MuFlags oldflags, +Mu::mu_flags_from_str_delta (const char *str, MuFlags oldflags, MuFlagType types) { const char *cur; diff --git a/lib/mu-flags.h b/lib/mu-flags.hh similarity index 94% rename from lib/mu-flags.h rename to lib/mu-flags.hh index 9d892f39..af8727f8 100644 --- a/lib/mu-flags.h +++ b/lib/mu-flags.hh @@ -1,5 +1,5 @@ /* -** Copyright (C) 2011-2013 Dirk-Jan C. Binnema +** Copyright (C) 2011-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -18,14 +18,15 @@ */ -#ifndef __MU_FLAGS_H__ -#define __MU_FLAGS_H__ +#ifndef MU_FLAGS_HH__ +#define MU_FLAGS_HH__ #include +#include -G_BEGIN_DECLS +namespace Mu { -enum _MuFlags { +enum MuFlags { MU_FLAG_NONE = 0, /* next 6 are seen in the file-info part of maildir message @@ -56,17 +57,18 @@ enum _MuFlags { /* other content flags */ MU_FLAG_LIST = 1 << 11 }; -typedef enum _MuFlags MuFlags; +MU_ENABLE_BITOPS(MuFlags); + #define MU_FLAG_INVALID ((MuFlags)-1) -enum _MuFlagType { +enum MuFlagType { MU_FLAG_TYPE_MAILFILE = 1 << 0, MU_FLAG_TYPE_MAILDIR = 1 << 1, MU_FLAG_TYPE_CONTENT = 1 << 2, MU_FLAG_TYPE_PSEUDO = 1 << 3 }; -typedef enum _MuFlagType MuFlagType; +MU_ENABLE_BITOPS(MuFlagType); #define MU_FLAG_TYPE_ANY ((MuFlagType)-1) #define MU_FLAG_TYPE_INVALID ((MuFlagType)-1) @@ -179,6 +181,7 @@ typedef void (*MuFlagsForeachFunc) (MuFlags flag, gpointer user_data); */ void mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data); -G_END_DECLS +} // namespace Mu + #endif /*__MU_FLAGS_H__*/ diff --git a/lib/mu-maildir.c b/lib/mu-maildir.cc similarity index 96% rename from lib/mu-maildir.c rename to lib/mu-maildir.cc index 65ba31e3..86050658 100644 --- a/lib/mu-maildir.c +++ b/lib/mu-maildir.cc @@ -30,9 +30,11 @@ #include #include -#include "mu-maildir.h" +#include "mu-maildir.hh" #include "utils/mu-str.h" +using namespace Mu; + #define MU_MAILDIR_NOINDEX_FILE ".noindex" #define MU_MAILDIR_NOUPDATE_FILE ".noupdate" @@ -115,7 +117,7 @@ create_noindex (const char *path, GError **err) } gboolean -mu_maildir_mkdir (const char* path, mode_t mode, gboolean noindex, GError **err) +Mu::mu_maildir_mkdir (const char* path, mode_t mode, gboolean noindex, GError **err) { g_return_val_if_fail (path, FALSE); @@ -181,7 +183,7 @@ get_target_fullpath (const char* src, const char *targetpath, GError **err) gboolean -mu_maildir_link (const char* src, const char *targetpath, GError **err) +Mu::mu_maildir_link (const char* src, const char *targetpath, GError **err) { char *targetfullpath; int rv; @@ -248,7 +250,7 @@ process_file (const char* fullpath, const char* mdir, * (we're skipping 'tmp' for obvious reasons) */ gboolean -mu_maildir_is_leaf_dir (const char *path) +Mu::mu_maildir_is_leaf_dir (const char *path) { size_t len; @@ -468,7 +470,7 @@ process_dir_entries (DIR *dir, const char* path, const char* mdir, errno = 0; res = readdir (dir); if (res) { - entry = g_memdup (res, sizeof(struct dirent)); + entry = (struct dirent*)g_memdup (res, sizeof(struct dirent)); lst = g_slist_prepend (lst, entry); } else if (errno == 0) { break; @@ -540,7 +542,7 @@ process_dir (const char* path, const char* mdir, MuError -mu_maildir_walk (const char *path, MuMaildirWalkMsgCallback cb_msg, +Mu::mu_maildir_walk (const char *path, MuMaildirWalkMsgCallback cb_msg, MuMaildirWalkDirCallback cb_dir, gboolean full, void *data) { @@ -612,7 +614,7 @@ clear_links (const char *path, DIR *dir) } gboolean -mu_maildir_clear_links (const char *path, GError **err) +Mu::mu_maildir_clear_links (const char *path, GError **err) { DIR *dir; gboolean rv; @@ -633,11 +635,8 @@ mu_maildir_clear_links (const char *path, GError **err) return rv; } - - - MuFlags -mu_maildir_get_flags_from_path (const char *path) +Mu::mu_maildir_get_flags_from_path (const char *path) { g_return_val_if_fail (path, MU_FLAG_INVALID); @@ -678,7 +677,7 @@ mu_maildir_get_flags_from_path (const char *path) /* get the file flags */ { - char *info; + const char *info; info = strrchr (path, '2'); if (!info || info == path || @@ -728,14 +727,15 @@ get_new_path (const char *mdir, const char *mfile, MuFlags flags, char* -mu_maildir_get_maildir_from_path (const char* path) +Mu::mu_maildir_get_maildir_from_path (const char* path) { char *mdir; /* determine the maildir */ mdir = g_path_get_dirname (path); if (!g_str_has_suffix (mdir, "cur") && - !g_str_has_suffix (mdir, "new")) { + + !g_str_has_suffix (mdir, "new")) { g_warning ("%s: not a valid maildir path: %s", __func__, path); g_free (mdir); @@ -773,7 +773,7 @@ find_path_separator(const char *path) } char* -mu_maildir_get_new_path (const char *oldpath, const char *new_mdir, +Mu::mu_maildir_get_new_path (const char *oldpath, const char *new_mdir, MuFlags newflags, gboolean new_name) { char *mfile, *mdir, *custom_flags, *cur, *newpath, flags_sep = ':'; @@ -933,7 +933,7 @@ msg_move (const char* src, const char *dst, GError **err) } char* -mu_maildir_move_message (const char* oldpath, const char* targetmdir, +Mu::mu_maildir_move_message (const char* oldpath, const char* targetmdir, MuFlags newflags, gboolean ignore_dups, gboolean new_name, GError **err) { diff --git a/lib/mu-maildir.h b/lib/mu-maildir.hh similarity index 98% rename from lib/mu-maildir.h rename to lib/mu-maildir.hh index d14755a8..93684d01 100644 --- a/lib/mu-maildir.h +++ b/lib/mu-maildir.hh @@ -17,18 +17,16 @@ ** */ -#ifndef __MU_MAILDIR_H__ -#define __MU_MAILDIR_H__ +#ifndef MU_MAILDIR_HH__ +#define MU_MAILDIR_HH__ #include #include #include /* for mode_t */ #include -#include - - -G_BEGIN_DECLS +#include +namespace Mu { /** * create a new maildir. if parts of the maildir already exists, those * will simply be ignored. IOW, if you try to create the same maildir @@ -218,6 +216,6 @@ char* mu_maildir_move_message (const char* oldpath, const char* targetmdir, gboolean new_name, GError **err) G_GNUC_WARN_UNUSED_RESULT; -G_END_DECLS +} // namespace Mu -#endif /*__MU_MAILDIR_H__*/ +#endif /*MU_MAILDIR_HH__*/ diff --git a/lib/mu-msg-crypto.c b/lib/mu-msg-crypto.cc similarity index 92% rename from lib/mu-msg-crypto.c rename to lib/mu-msg-crypto.cc index c7ca8bad..909292d0 100644 --- a/lib/mu-msg-crypto.c +++ b/lib/mu-msg-crypto.cc @@ -1,5 +1,5 @@ /* -** Copyright (C) 2012-2018 Dirk-Jan C. Binnema +** Copyright (C) 2012-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -17,24 +17,25 @@ ** */ -#if HAVE_CONFIG_H #include "config.h" -#endif /*HAVE_CONFIG_H*/ #include -#include "mu-msg.h" -#include "mu-msg-priv.h" -#include "mu-msg-part.h" +#include "mu-msg.hh" +#include "mu-msg-priv.hh" +#include "mu-msg-part.hh" #include "utils/mu-date.h" #include #include +using namespace Mu; static const char* get_pubkey_algo_name (GMimePubKeyAlgo algo) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch-enum" switch (algo) { case GMIME_PUBKEY_ALGO_DEFAULT: return "default"; @@ -53,11 +54,15 @@ get_pubkey_algo_name (GMimePubKeyAlgo algo) default: return "unknown pubkey algorithm"; } +#pragma GCC diagnostic pop + } static const gchar* get_digestkey_algo_name (GMimeDigestAlgo algo) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch-enum" switch (algo) { case GMIME_DIGEST_ALGO_DEFAULT: return "default"; @@ -86,6 +91,7 @@ get_digestkey_algo_name (GMimeDigestAlgo algo) default: return "unknown digest algorithm"; } +#pragma GCC diagnostic pop } @@ -196,16 +202,17 @@ get_verdict_report (GMimeSignature *msig) static char* get_signers (GHashTable *signerhash) { - GString *gstr; - GHashTableIter iter; - const char *name; + GString *gstr; + GHashTableIter iter; + char *name; if (!signerhash || g_hash_table_size(signerhash) == 0) return NULL; gstr = g_string_new (NULL); g_hash_table_iter_init (&iter, signerhash); - while (g_hash_table_iter_next (&iter, (gpointer)&name, NULL)) { + + while (g_hash_table_iter_next (&iter, reinterpret_cast(&name), NULL)) { if (gstr->len != 0) g_string_append_c (gstr, ','); gstr = g_string_append (gstr, name); @@ -272,7 +279,7 @@ get_status_report (GMimeSignatureList *sigs) } void -mu_msg_part_sig_status_report_destroy (MuMsgPartSigStatusReport *report) +Mu::mu_msg_part_sig_status_report_destroy (MuMsgPartSigStatusReport *report) { if (!report) return; @@ -295,7 +302,7 @@ tag_with_sig_status(GObject *part, void -mu_msg_crypto_verify_part (GMimeMultipartSigned *sig, MuMsgOptions opts, +Mu::mu_msg_crypto_verify_part (GMimeMultipartSigned *sig, MuMsgOptions opts, GError **err) { /* the signature status */ @@ -349,7 +356,7 @@ check_decrypt_result(GMimeMultipartEncrypted *part, GMimeDecryptResult *res, GMimeObject* /* this is declared in mu-msg-priv.h */ -mu_msg_crypto_decrypt_part (GMimeMultipartEncrypted *enc, MuMsgOptions opts, +Mu::mu_msg_crypto_decrypt_part (GMimeMultipartEncrypted *enc, MuMsgOptions opts, MuMsgPartPasswordFunc func, gpointer user_data, GError **err) { diff --git a/lib/mu-msg-doc.cc b/lib/mu-msg-doc.cc index 21c3c8b0..0df4f91d 100644 --- a/lib/mu-msg-doc.cc +++ b/lib/mu-msg-doc.cc @@ -1,5 +1,5 @@ /* -** Copyright (C) 2008-2013 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 @@ -24,17 +24,18 @@ #include #include "mu-msg-fields.h" -#include "mu-msg-doc.h" +#include "mu-msg-doc.hh" #include "utils/mu-util.h" #include "utils/mu-str.h" #include "utils/mu-date.h" #include "utils/mu-utils.hh" -struct _MuMsgDoc { +using namespace Mu; - _MuMsgDoc (Xapian::Document *doc): _doc (doc) { } - ~_MuMsgDoc () { delete _doc; } +struct Mu::MuMsgDoc { + MuMsgDoc (Xapian::Document *doc): _doc (doc) { } + ~MuMsgDoc () { delete _doc; } const Xapian::Document doc() const { return *_doc; } private: Xapian::Document *_doc; @@ -42,7 +43,7 @@ private: MuMsgDoc* -mu_msg_doc_new (XapianDocument *doc, GError **err) +Mu::mu_msg_doc_new (XapianDocument *doc, GError **err) { g_return_val_if_fail (doc, NULL); @@ -55,7 +56,7 @@ mu_msg_doc_new (XapianDocument *doc, GError **err) } void -mu_msg_doc_destroy (MuMsgDoc *self) +Mu::mu_msg_doc_destroy (MuMsgDoc *self) { try { delete self; @@ -65,7 +66,7 @@ mu_msg_doc_destroy (MuMsgDoc *self) gchar* -mu_msg_doc_get_str_field (MuMsgDoc *self, MuMsgFieldId mfid) +Mu::mu_msg_doc_get_str_field (MuMsgDoc *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), NULL); @@ -86,7 +87,7 @@ mu_msg_doc_get_str_field (MuMsgDoc *self, MuMsgFieldId mfid) GSList* -mu_msg_doc_get_str_list_field (MuMsgDoc *self, MuMsgFieldId mfid) +Mu::mu_msg_doc_get_str_list_field (MuMsgDoc *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), NULL); @@ -102,7 +103,7 @@ mu_msg_doc_get_str_list_field (MuMsgDoc *self, MuMsgFieldId mfid) gint64 -mu_msg_doc_get_num_field (MuMsgDoc *self, MuMsgFieldId mfid) +Mu::mu_msg_doc_get_num_field (MuMsgDoc *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, -1); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), -1); diff --git a/lib/mu-msg-doc.h b/lib/mu-msg-doc.hh similarity index 92% rename from lib/mu-msg-doc.h rename to lib/mu-msg-doc.hh index 2f5fe5c4..f9258809 100644 --- a/lib/mu-msg-doc.h +++ b/lib/mu-msg-doc.hh @@ -1,5 +1,5 @@ /* -** Copyright (C) 2012-2013 Dirk-Jan C. Binnema +** Copyright (C) 2012-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -17,16 +17,16 @@ ** */ -#ifndef __MU_MSG_DOC_H__ -#define __MU_MSG_DOC_H__ +#ifndef MU_MSG_DOC_HH__ +#define MU_MSG_DOC_HH__ #include #include -G_BEGIN_DECLS -struct _MuMsgDoc; -typedef struct _MuMsgDoc MuMsgDoc; +namespace Mu { + +struct MuMsgDoc; /** * create a new MuMsgDoc instance @@ -90,7 +90,6 @@ GSList* mu_msg_doc_get_str_list_field (MuMsgDoc *self, MuMsgFieldId mfid) */ gint64 mu_msg_doc_get_num_field (MuMsgDoc *self, MuMsgFieldId mfid); +} // namespace Mu -G_END_DECLS - -#endif /*__MU_MSG_DOC_H__*/ +#endif /*MU_MSG_DOC_HH__*/ diff --git a/lib/mu-msg-file.c b/lib/mu-msg-file.cc similarity index 95% rename from lib/mu-msg-file.c rename to lib/mu-msg-file.cc index df733268..30a6ee3c 100644 --- a/lib/mu-msg-file.c +++ b/lib/mu-msg-file.cc @@ -27,25 +27,27 @@ #include #include -#include "mu-maildir.h" +#include "mu-maildir.hh" #include "mu-store.hh" -#include "mu-msg-priv.h" +#include "mu-msg-priv.hh" #include "utils/mu-util.h" #include "utils/mu-str.h" +using namespace Mu; + static gboolean init_file_metadata (MuMsgFile *self, const char* path, const char *mdir, GError **err); static gboolean init_mime_msg (MuMsgFile *msg, const char *path, GError **err); MuMsgFile* -mu_msg_file_new (const char* filepath, const char *mdir, GError **err) +Mu::mu_msg_file_new (const char* filepath, const char *mdir, GError **err) { MuMsgFile *self; g_return_val_if_fail (filepath, NULL); - self = g_slice_new0 (MuMsgFile); + self = g_new0(MuMsgFile, 1); if (!init_file_metadata (self, filepath, mdir, err)) { mu_msg_file_destroy (self); @@ -61,18 +63,17 @@ mu_msg_file_new (const char* filepath, const char *mdir, GError **err) } void -mu_msg_file_destroy (MuMsgFile *self) +Mu::mu_msg_file_destroy (MuMsgFile *self) { if (!self) return; - if (self->_mime_msg) - g_object_unref (self->_mime_msg); + g_clear_object(&self->_mime_msg); g_free(self->_path); g_free(self->_maildir); - g_slice_free (MuMsgFile, self); + g_free (self); } static gboolean @@ -477,7 +478,7 @@ stream_to_string (GMimeStream *stream, size_t buflen) } gchar* -mu_msg_mime_part_to_string (GMimePart *part, gboolean *err) +Mu::mu_msg_mime_part_to_string (GMimePart *part, gboolean *err) { GMimeDataWrapper *wrapper; GMimeStream *stream; @@ -641,7 +642,7 @@ address_type (MuMsgFieldId mfid) case MU_MSG_FIELD_ID_CC : return GMIME_ADDRESS_TYPE_CC; case MU_MSG_FIELD_ID_TO : return GMIME_ADDRESS_TYPE_TO; case MU_MSG_FIELD_ID_FROM: return GMIME_ADDRESS_TYPE_FROM; - default: g_return_val_if_reached (-1); + default: g_return_val_if_reached ((GMimeAddressType)-1); } } @@ -661,7 +662,7 @@ get_msgid (MuMsgFile *self, gboolean *do_free) } char* -mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, +Mu::mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, gboolean *do_free) { g_return_val_if_fail (self, NULL); @@ -705,7 +706,7 @@ mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, } GSList* -mu_msg_file_get_str_list_field (MuMsgFile *self, MuMsgFieldId mfid) +Mu::mu_msg_file_get_str_list_field (MuMsgFile *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); g_return_val_if_fail (mu_msg_field_is_string_list(mfid), NULL); @@ -718,7 +719,7 @@ mu_msg_file_get_str_list_field (MuMsgFile *self, MuMsgFieldId mfid) } gint64 -mu_msg_file_get_num_field (MuMsgFile *self, const MuMsgFieldId mfid) +Mu::mu_msg_file_get_num_field (MuMsgFile *self, const MuMsgFieldId mfid) { g_return_val_if_fail (self, -1); g_return_val_if_fail (mu_msg_field_is_numeric(mfid), -1); @@ -745,7 +746,7 @@ mu_msg_file_get_num_field (MuMsgFile *self, const MuMsgFieldId mfid) } char* -mu_msg_file_get_header (MuMsgFile *self, const char *header) +Mu::mu_msg_file_get_header (MuMsgFile *self, const char *header) { const gchar *hdr; @@ -797,8 +798,8 @@ foreach_cb (GMimeObject *parent, GMimeObject *part, ForeachData *fdata) } void -mu_mime_message_foreach (GMimeMessage *msg, gboolean decrypt, - GMimeObjectForeachFunc func, gpointer user_data) +Mu::mu_mime_message_foreach (GMimeMessage *msg, gboolean decrypt, + GMimeObjectForeachFunc func, gpointer user_data) { ForeachData fdata; diff --git a/lib/mu-msg-file.h b/lib/mu-msg-file.hh similarity index 91% rename from lib/mu-msg-file.h rename to lib/mu-msg-file.hh index e26c4a77..0ba9b7db 100644 --- a/lib/mu-msg-file.h +++ b/lib/mu-msg-file.hh @@ -1,7 +1,5 @@ -/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ - /* -** Copyright (C) 2012-2013 Dirk-Jan C. Binnema +** Copyright (C) 2012-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -19,11 +17,12 @@ ** */ -#ifndef __MU_MSG_FILE_H__ -#define __MU_MSG_FILE_H__ +#ifndef MU_MSG_FILE_HH__ +#define MU_MSG_FILE_HH__ -struct _MuMsgFile; -typedef struct _MuMsgFile MuMsgFile; +namespace Mu { + +struct MuMsgFile; /** * create a new message from a file @@ -101,5 +100,6 @@ GSList* mu_msg_file_get_str_list_field (MuMsgFile *self, MuMsgFieldId msfid) */ gint64 mu_msg_file_get_num_field (MuMsgFile *self, MuMsgFieldId mfid); +} // namespace Mu -#endif /*__MU_MSG_FILE_H__*/ +#endif /*MU_MSG_FILE_HH__*/ diff --git a/lib/mu-msg-part.c b/lib/mu-msg-part.cc similarity index 95% rename from lib/mu-msg-part.c rename to lib/mu-msg-part.cc index 3d33c98f..47235870 100644 --- a/lib/mu-msg-part.c +++ b/lib/mu-msg-part.cc @@ -1,6 +1,5 @@ -/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ /* -** Copyright (C) 2008-2014 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -18,17 +17,18 @@ ** */ -#if HAVE_CONFIG_H #include "config.h" -#endif /*HAVE_CONFIG_H*/ #include #include +#include "mu-msg.hh" #include "utils/mu-util.h" #include "utils/mu-str.h" -#include "mu-msg-priv.h" -#include "mu-msg-part.h" +#include "mu-msg-priv.hh" +#include "mu-msg-part.hh" + +using namespace Mu; struct _DoData { GMimeObject *mime_obj; @@ -60,7 +60,7 @@ get_mime_object_at_index (MuMsg *msg, MuMsgOptions opts, unsigned index) ddata.index = index; /* wipe out some irrelevant options */ - opts &= ~MU_MSG_OPTION_VERIFY; + opts &= (MuMsgOptions)~MU_MSG_OPTION_VERIFY; opts &= ~MU_MSG_OPTION_EXTRACT_IMAGES; mu_msg_part_foreach (msg, opts, @@ -192,7 +192,7 @@ get_text_from_mime_msg (MuMsg *msg, GMimeMessage *mmsg, MuMsgOptions opts) char* -mu_msg_part_get_text (MuMsg *msg, MuMsgPart *self, MuMsgOptions opts) +Mu::mu_msg_part_get_text (MuMsg *msg, MuMsgPart *self, MuMsgOptions opts) { GMimeObject *mobj; GMimeMessage *mime_msg; @@ -336,7 +336,7 @@ mime_part_get_filename (GMimeObject *mobj, unsigned index, char* -mu_msg_part_get_filename (MuMsgPart *mpart, gboolean construct_if_needed) +Mu::mu_msg_part_get_filename (MuMsgPart *mpart, gboolean construct_if_needed) { g_return_val_if_fail (mpart, NULL); g_return_val_if_fail (GMIME_IS_OBJECT(mpart->data), NULL); @@ -346,7 +346,7 @@ mu_msg_part_get_filename (MuMsgPart *mpart, gboolean construct_if_needed) } const gchar* -mu_msg_part_get_content_id (MuMsgPart *mpart) +Mu::mu_msg_part_get_content_id (MuMsgPart *mpart) { g_return_val_if_fail (mpart, NULL); g_return_val_if_fail (GMIME_IS_OBJECT(mpart->data), NULL); @@ -494,7 +494,8 @@ copy_status_report_maybe (GObject *obj) { MuMsgPartSigStatusReport *report, *copy; - report = g_object_get_data (obj, SIG_STATUS_REPORT); + report = (MuMsgPartSigStatusReport*) + g_object_get_data (obj, SIG_STATUS_REPORT); if (!report) return NULL; /* nothing to copy */ @@ -661,7 +662,7 @@ handle_mime_object (MuMsg *msg, GMimeObject *mobj, GMimeObject *parent, gboolean -mu_msg_part_foreach (MuMsg *msg, MuMsgOptions opts, +Mu::mu_msg_part_foreach (MuMsg *msg, MuMsgOptions opts, MuMsgPartForeachFunc func, gpointer user_data) { unsigned index; @@ -788,8 +789,8 @@ save_object (GMimeObject *obj, MuMsgOptions opts, const char *fullpath, gchar* -mu_msg_part_get_path (MuMsg *msg, MuMsgOptions opts, - const char* targetdir, unsigned index, GError **err) +Mu::mu_msg_part_get_path (MuMsg *msg, MuMsgOptions opts, + const char* targetdir, unsigned index, GError **err) { char *fname, *filepath; GMimeObject* mobj; @@ -821,7 +822,7 @@ mu_msg_part_get_path (MuMsg *msg, MuMsgOptions opts, gchar* -mu_msg_part_get_cache_path (MuMsg *msg, MuMsgOptions opts, guint partid, +Mu::mu_msg_part_get_cache_path (MuMsg *msg, MuMsgOptions opts, guint partid, GError **err) { char *dirname, *filepath; @@ -856,7 +857,7 @@ mu_msg_part_get_cache_path (MuMsg *msg, MuMsgOptions opts, guint partid, gboolean -mu_msg_part_save (MuMsg *msg, MuMsgOptions opts, +Mu::mu_msg_part_save (MuMsg *msg, MuMsgOptions opts, const char *fullpath, guint partidx, GError **err) { gboolean rv; @@ -897,7 +898,7 @@ mu_msg_part_save (MuMsg *msg, MuMsgOptions opts, gchar* -mu_msg_part_save_temp (MuMsg *msg, MuMsgOptions opts, guint partidx, +Mu::mu_msg_part_save_temp (MuMsg *msg, MuMsgOptions opts, guint partidx, GError **err) { gchar *filepath; @@ -925,7 +926,7 @@ match_cid (MuMsgPart *mpart, const char *cid) } int -mu_msg_find_index_for_cid (MuMsg *msg, MuMsgOptions opts, +Mu::mu_msg_find_index_for_cid (MuMsg *msg, MuMsgOptions opts, const char *sought_cid) { const char* cid; @@ -961,7 +962,7 @@ match_filename_rx (MuMsg *msg, MuMsgPart *mpart, RxMatchData *mdata) if (!fname) return; - if (g_regex_match (mdata->_rx, fname, 0, NULL)) + if (g_regex_match (mdata->_rx, fname, (GRegexMatchFlags)0, NULL)) mdata->_lst = g_slist_prepend (mdata->_lst, GUINT_TO_POINTER(mpart->index)); g_free (fname); @@ -969,7 +970,7 @@ match_filename_rx (MuMsg *msg, MuMsgPart *mpart, RxMatchData *mdata) GSList* -mu_msg_find_files (MuMsg *msg, MuMsgOptions opts, const GRegex *pattern) +Mu::mu_msg_find_files (MuMsg *msg, MuMsgOptions opts, const GRegex *pattern) { RxMatchData mdata; @@ -991,7 +992,7 @@ mu_msg_find_files (MuMsg *msg, MuMsgOptions opts, const GRegex *pattern) gboolean -mu_msg_part_maybe_attachment (MuMsgPart *part) +Mu::mu_msg_part_maybe_attachment (MuMsgPart *part) { g_return_val_if_fail (part, FALSE); diff --git a/lib/mu-msg-part.h b/lib/mu-msg-part.hh similarity index 95% rename from lib/mu-msg-part.h rename to lib/mu-msg-part.hh index 4f26ddf3..0c0c51e1 100644 --- a/lib/mu-msg-part.h +++ b/lib/mu-msg-part.hh @@ -1,7 +1,5 @@ -/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ - /* -** Copyright (C) 2008-2013 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -19,17 +17,18 @@ ** */ -#ifndef __MU_MSG_PART_H__ -#define __MU_MSG_PART_H__ +#ifndef MU_MSG_PART_HH__ +#define MU_MSG_PART_HH__ +#include "utils/mu-utils.hh" #include #include /* for ssize_t */ +namespace Mu { + #define SIG_STATUS_REPORT "sig-status-report" -G_BEGIN_DECLS - -enum _MuMsgPartType { +enum MuMsgPartType { MU_MSG_PART_TYPE_NONE = 0, /* MIME part without children */ @@ -51,8 +50,7 @@ enum _MuMsgPartType { /* a text/html part? */ MU_MSG_PART_TYPE_TEXT_HTML = 1 << 9 }; -typedef enum _MuMsgPartType MuMsgPartType; - +MU_ENABLE_BITOPS(MuMsgPartType); /* the signature status */ enum _MuMsgPartSigStatus { @@ -113,7 +111,6 @@ typedef struct _MuMsgPart MuMsgPart; char *mu_msg_part_get_filename (MuMsgPart *mpart, gboolean construct_if_needed) G_GNUC_WARN_UNUSED_RESULT; - /** * get appropriate content id for the mime-part * @@ -263,6 +260,6 @@ typedef void (*MuMsgPartForeachFunc) (MuMsg *msg, MuMsgPart*, gpointer); gboolean mu_msg_part_foreach (MuMsg *msg, MuMsgOptions opts, MuMsgPartForeachFunc func, gpointer user_data); -G_END_DECLS +} // namespace Mu -#endif /*__MU_MSG_PART_H__*/ +#endif /*MU_MSG_PART_HH__*/ diff --git a/lib/mu-msg-priv.h b/lib/mu-msg-priv.hh similarity index 89% rename from lib/mu-msg-priv.h rename to lib/mu-msg-priv.hh index 58ae6d0b..85954360 100644 --- a/lib/mu-msg-priv.h +++ b/lib/mu-msg-priv.hh @@ -1,7 +1,5 @@ -/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ - /* -** Copyright (C) 2008-2013 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 @@ -19,24 +17,20 @@ ** */ -#ifndef __MU_MSG_PRIV_H__ -#define __MU_MSG_PRIV_H__ - -#if HAVE_CONFIG_H -#include "config.h" -#endif /*HAVE_CONFIG_H*/ +#ifndef MU_MSG_PRIV_HH__ +#define MU_MSG_PRIV_HH__ #include #include -#include -#include -#include -#include "mu-msg-part.h" +#include +#include +#include +#include "mu-msg-part.hh" -G_BEGIN_DECLS +namespace Mu { -struct _MuMsgFile { +struct MuMsgFile { GMimeMessage *_mime_msg; time_t _timestamp; size_t _size; @@ -47,7 +41,7 @@ struct _MuMsgFile { /* we put the the MuMsg definition in this separate -priv file, so we * can split the mu_msg implementations over separate files */ -struct _MuMsg { +struct MuMsg { guint _refcount; @@ -135,6 +129,6 @@ GMimeObject* mu_msg_crypto_decrypt_part (GMimeMultipartEncrypted *enc, MuMsgOpti GError **err) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -G_END_DECLS +} // namespace Mu -#endif /*__MU_MSG_PRIV_H__*/ +#endif /*MU_MSG_PRIV_HH__*/ diff --git a/lib/mu-msg-sexp.cc b/lib/mu-msg-sexp.cc index 77c74017..966df4c8 100644 --- a/lib/mu-msg-sexp.cc +++ b/lib/mu-msg-sexp.cc @@ -19,11 +19,11 @@ #include #include +#include "mu-query-results.hh" #include "utils/mu-str.h" -#include "mu-msg.h" -#include "mu-msg-iter.h" -#include "mu-msg-part.h" -#include "mu-maildir.h" +#include "mu-msg.hh" +#include "mu-msg-part.hh" +#include "mu-maildir.hh" using namespace Mu; @@ -31,7 +31,7 @@ static void add_prop_nonempty (Sexp::List& list, const char* elm, const GSList *str_lst) { Sexp::List elms; - while (str_lst) { + while (str_lst) { elms.add(Sexp::make_string((const char*)str_lst->data)); str_lst = g_slist_next(str_lst); } @@ -43,7 +43,7 @@ add_prop_nonempty (Sexp::List& list, const char* elm, const GSList *str_lst) static void add_prop_nonempty (Sexp::List& list, const char* name, const char *str) { - if (str && str[0]) + if (str && str[0]) list.add_prop(name, Sexp::make_string(str)); } @@ -68,22 +68,22 @@ make_contact_sexp (MuMsgContact *c) static void add_list_post (Sexp::List& list, MuMsg *msg) { - /* some mailing lists do not set the reply-to; see pull #1278. So for - * those cases, check the List-Post address and use that instead */ + /* some mailing lists do not set the reply-to; see pull #1278. So for + * those cases, check the List-Post address and use that instead */ - GMatchInfo *minfo; - GRegex *rx; - const char* list_post; + GMatchInfo *minfo; + GRegex *rx; + const char* list_post; - list_post = mu_msg_get_header (msg, "List-Post"); - if (!list_post) - return; + list_post = mu_msg_get_header (msg, "List-Post"); + if (!list_post) + return; - rx = g_regex_new ("?", G_REGEX_CASELESS, + rx = g_regex_new ("?", G_REGEX_CASELESS, (GRegexMatchFlags)0, NULL); - g_return_if_fail(rx); + g_return_if_fail(rx); - if (g_regex_match (rx, list_post, (GRegexMatchFlags)0, &minfo)) { + if (g_regex_match (rx, list_post, (GRegexMatchFlags)0, &minfo)) { auto address = (char*)g_match_info_fetch (minfo, 1); MuMsgContact contact{NULL, address}; list.add_prop(":list-post", @@ -91,8 +91,8 @@ add_list_post (Sexp::List& list, MuMsg *msg) g_free(address); } - g_match_info_free (minfo); - g_regex_unref (rx); + g_match_info_free (minfo); + g_regex_unref (rx); } @@ -105,28 +105,28 @@ typedef struct _ContactData ContactData; static gboolean each_contact (MuMsgContact *c, ContactData *cdata) { - switch (mu_msg_contact_type (c)) { + switch (mu_msg_contact_type (c)) { - case MU_MSG_CONTACT_TYPE_FROM: + case MU_MSG_CONTACT_TYPE_FROM: cdata->from.add(make_contact_sexp(c)); break; - case MU_MSG_CONTACT_TYPE_TO: + case MU_MSG_CONTACT_TYPE_TO: cdata->to.add(make_contact_sexp(c)); - break; - case MU_MSG_CONTACT_TYPE_CC: + break; + case MU_MSG_CONTACT_TYPE_CC: cdata->cc.add(make_contact_sexp(c)); - break; - case MU_MSG_CONTACT_TYPE_BCC: + break; + case MU_MSG_CONTACT_TYPE_BCC: cdata->bcc.add(make_contact_sexp(c)); - break; - case MU_MSG_CONTACT_TYPE_REPLY_TO: + break; + case MU_MSG_CONTACT_TYPE_REPLY_TO: cdata->reply_to.add(make_contact_sexp(c)); - break; - default: + break; + default: g_return_val_if_reached (FALSE); return FALSE; - } - return TRUE; + } + return TRUE; } static void @@ -144,9 +144,9 @@ add_prop_nonempty_list(Sexp::List& list, std::string&& name, static void add_contacts (Sexp::List& list, MuMsg *msg) { - ContactData cdata{}; - mu_msg_contact_foreach (msg, (MuMsgContactForeachFunc)each_contact, - &cdata); + ContactData cdata{}; + mu_msg_contact_foreach (msg, (MuMsgContactForeachFunc)each_contact, + &cdata); add_prop_nonempty_list (list, ":from", std::move(cdata.from)); add_prop_nonempty_list (list, ":to", std::move(cdata.to)); @@ -159,23 +159,23 @@ add_contacts (Sexp::List& list, MuMsg *msg) typedef struct { Sexp::List flaglist; - MuFlags msgflags; + MuFlags msgflags; } FlagData; static void each_flag (MuFlags flag, FlagData *fdata) { - if (flag & fdata->msgflags) + if (flag & fdata->msgflags) fdata->flaglist.add(Sexp::make_symbol(mu_flag_name(flag))); } static void add_flags (Sexp::List& list, MuMsg *msg) { - FlagData fdata{}; - fdata.msgflags = mu_msg_get_flags (msg); + FlagData fdata{}; + fdata.msgflags = mu_msg_get_flags (msg); - mu_flags_foreach ((MuFlagsForeachFunc)each_flag, &fdata); + mu_flags_foreach ((MuFlagsForeachFunc)each_flag, &fdata); if (!fdata.flaglist.empty()) list.add_prop(":flags", Sexp::make_list(std::move(fdata.flaglist))); @@ -184,24 +184,24 @@ add_flags (Sexp::List& list, MuMsg *msg) static char* get_temp_file (MuMsg *msg, MuMsgOptions opts, unsigned index) { - char *path; - GError *err; + char *path; + GError *err; - err = NULL; - path = mu_msg_part_get_cache_path (msg, opts, index, &err); - if (!path) - goto errexit; + err = NULL; + path = mu_msg_part_get_cache_path (msg, opts, index, &err); + if (!path) + goto errexit; - if (!mu_msg_part_save (msg, opts, path, index, &err)) - goto errexit; + if (!mu_msg_part_save (msg, opts, path, index, &err)) + goto errexit; - return path; + return path; errexit: - g_warning ("failed to save mime part: %s", - err->message ? err->message : "something went wrong"); - g_clear_error (&err); - g_free (path); + g_warning ("failed to save mime part: %s", + err->message ? err->message : "something went wrong"); + g_clear_error (&err); + g_free (path); return NULL; } @@ -209,41 +209,41 @@ errexit: static gchar* get_temp_file_maybe (MuMsg *msg, MuMsgPart *part, MuMsgOptions opts) { - opts = (MuMsgOptions)((int)opts | (int)MU_MSG_OPTION_USE_EXISTING); - if (!(opts & MU_MSG_OPTION_EXTRACT_IMAGES) || - g_ascii_strcasecmp (part->type, "image") != 0) - return NULL; + opts = (MuMsgOptions)((int)opts | (int)MU_MSG_OPTION_USE_EXISTING); + if (!(opts & MU_MSG_OPTION_EXTRACT_IMAGES) || + g_ascii_strcasecmp (part->type, "image") != 0) + return NULL; else return get_temp_file (msg, opts, part->index); } struct PartInfo { - Sexp::List parts; - MuMsgOptions opts; + Sexp::List parts; + MuMsgOptions opts; }; static void sig_verdict (Sexp::List& partlist, MuMsgPart *mpart) { - MuMsgPartSigStatusReport *report = mpart->sig_status_report; - if (!report) - return; + MuMsgPartSigStatusReport *report = mpart->sig_status_report; + if (!report) + return; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wswitch-enum" - switch (report->verdict) { - case MU_MSG_PART_SIG_STATUS_GOOD: + switch (report->verdict) { + case MU_MSG_PART_SIG_STATUS_GOOD: partlist.add_prop(":signature", Sexp::make_symbol("verified")); - break; - case MU_MSG_PART_SIG_STATUS_BAD: + break; + case MU_MSG_PART_SIG_STATUS_BAD: partlist.add_prop(":signature", Sexp::make_symbol("bad")); - break; - case MU_MSG_PART_SIG_STATUS_ERROR: + break; + case MU_MSG_PART_SIG_STATUS_ERROR: partlist.add_prop(":signature", Sexp::make_symbol("unverified")); - break; - default: - break; - } + break; + default: + break; + } #pragma GCC diagnostic pop if (report->signers) @@ -253,7 +253,7 @@ sig_verdict (Sexp::List& partlist, MuMsgPart *mpart) static void dec_verdict (Sexp::List& partlist, MuMsgPart *mpart) { - if (mpart->part_type & MU_MSG_PART_TYPE_DECRYPTED) + if (mpart->part_type & MU_MSG_PART_TYPE_DECRYPTED) partlist.add_prop(":decryption", Sexp::make_symbol("succeeded")); else if (mpart->part_type & MU_MSG_PART_TYPE_ENCRYPTED) partlist.add_prop(":decryption", Sexp::make_symbol("failed")); @@ -263,21 +263,21 @@ dec_verdict (Sexp::List& partlist, MuMsgPart *mpart) static Sexp make_part_types (MuMsgPartType ptype) { - struct PartTypes { - MuMsgPartType ptype; - const char* name; - } ptypes[] = { - { MU_MSG_PART_TYPE_LEAF, "leaf" }, - { MU_MSG_PART_TYPE_MESSAGE, "message" }, - { MU_MSG_PART_TYPE_INLINE, "inline" }, - { MU_MSG_PART_TYPE_ATTACHMENT, "attachment" }, - { MU_MSG_PART_TYPE_SIGNED, "signed" }, - { MU_MSG_PART_TYPE_ENCRYPTED, "encrypted" } - }; + struct PartTypes { + MuMsgPartType ptype; + const char* name; + } ptypes[] = { + { MU_MSG_PART_TYPE_LEAF, "leaf" }, + { MU_MSG_PART_TYPE_MESSAGE, "message" }, + { MU_MSG_PART_TYPE_INLINE, "inline" }, + { MU_MSG_PART_TYPE_ATTACHMENT, "attachment" }, + { MU_MSG_PART_TYPE_SIGNED, "signed" }, + { MU_MSG_PART_TYPE_ENCRYPTED, "encrypted" } + }; Sexp::List list; - for (auto u = 0U; u!= G_N_ELEMENTS(ptypes); ++u) - if (ptype & ptypes[u].ptype) + for (auto u = 0U; u!= G_N_ELEMENTS(ptypes); ++u) + if (ptype & ptypes[u].ptype) list.add(Sexp::make_symbol(ptypes[u].name)); return Sexp::make_list(std::move(list)); @@ -298,7 +298,6 @@ each_part (MuMsg *msg, MuMsgPart *part, PartInfo *pinfo) part->subtype ? part->subtype : "octet-stream"); auto maybe_attach = Sexp::make_symbol(mu_msg_part_maybe_attachment (part) ? "t" : "nil"); - Sexp::List partlist; partlist.add_prop(":index", Sexp::make_number(part->index)); @@ -334,31 +333,35 @@ each_part (MuMsg *msg, MuMsgPart *part, PartInfo *pinfo) static void add_parts (Sexp::List& items, MuMsg *msg, MuMsgOptions opts) { - PartInfo pinfo; - pinfo.opts = opts; + PartInfo pinfo; + pinfo.opts = opts; - if (mu_msg_part_foreach (msg, opts, (MuMsgPartForeachFunc)each_part, &pinfo) && + if (mu_msg_part_foreach (msg, opts, (MuMsgPartForeachFunc)each_part, &pinfo) && !pinfo.parts.empty()) items.add_prop(":parts", Sexp::make_list(std::move(pinfo.parts))); } static void -add_thread_info (Sexp::List& items, const MuMsgIterThreadInfo *ti) +add_thread_info (Sexp::List& items, const QueryMatch& qmatch) { Sexp::List info; - info.add_prop( ":path", Sexp::make_string(ti->threadpath)); - info.add_prop( ":level", Sexp::make_number(ti->level)); + info.add_prop(":path", Sexp::make_string(qmatch.thread_path)); + info.add_prop(":level", Sexp::make_number(qmatch.thread_level)); - if (ti->prop & MU_MSG_ITER_THREAD_PROP_FIRST_CHILD) + if (any_of(qmatch.flags & QueryMatch::Flags::Root)) + info.add_prop( ":root", symbol_t()); + if (any_of(qmatch.flags & QueryMatch::Flags::Related)) + info.add_prop( ":related", symbol_t()); + if (any_of(qmatch.flags & QueryMatch::Flags::First)) info.add_prop( ":first-child", symbol_t()); - if (ti->prop & MU_MSG_ITER_THREAD_PROP_LAST_CHILD) + if (any_of(qmatch.flags & QueryMatch::Flags::Last)) info.add_prop( ":last-child", symbol_t()); - if (ti->prop & MU_MSG_ITER_THREAD_PROP_EMPTY_PARENT) + if (any_of(qmatch.flags & QueryMatch::Flags::Orphan)) info.add_prop( ":empty-parent", symbol_t()); - if (ti->prop & MU_MSG_ITER_THREAD_PROP_DUP) + if (any_of(qmatch.flags & QueryMatch::Flags::Duplicate)) info.add_prop( ":duplicate", symbol_t()); - if (ti->prop & MU_MSG_ITER_THREAD_PROP_HAS_CHILD) + if (any_of(qmatch.flags & QueryMatch::Flags::HasChild)) info.add_prop( ":has-child", symbol_t()); items.add_prop(":thread", Sexp::make_list(std::move(info))); @@ -369,18 +372,18 @@ static void add_message_file_parts (Sexp::List& items, MuMsg *msg, MuMsgOptions opts) { GError *err{NULL}; - if (!mu_msg_load_msg_file (msg, &err)) { - g_warning ("failed to load message file: %s", - err ? err->message : "some error occurred"); - g_clear_error (&err); - return; - } + if (!mu_msg_load_msg_file (msg, &err)) { + g_warning ("failed to load message file: %s", + err ? err->message : "some error occurred"); + g_clear_error (&err); + return; + } - add_parts (items, msg, opts); - add_contacts (items, msg); + add_parts (items, msg, opts); + add_contacts (items, msg); - /* add the user-agent / x-mailer */ - auto str = mu_msg_get_header (msg, "User-Agent"); + /* add the user-agent / x-mailer */ + auto str = mu_msg_get_header (msg, "User-Agent"); if (!str) str = mu_msg_get_header (msg, "X-Mailer"); @@ -396,8 +399,8 @@ static void add_date_and_size (Sexp::List& items, MuMsg *msg) { auto t = mu_msg_get_date (msg); - if (t == (time_t)-1) /* invalid date? */ - t = 0; + if (t == (time_t)-1) /* invalid date? */ + t = 0; Sexp::List dlist; dlist.add(Sexp::make_number((unsigned)(t >> 16))); @@ -407,8 +410,8 @@ add_date_and_size (Sexp::List& items, MuMsg *msg) items.add_prop(":date", Sexp::make_list(std::move(dlist))); auto s = mu_msg_get_size (msg); - if (s == (size_t)-1) /* invalid size? */ - s = 0; + if (s == (size_t)-1) /* invalid size? */ + s = 0; items.add_prop(":size", Sexp::make_number(s)); } @@ -428,64 +431,45 @@ add_tags (Sexp::List& items, MuMsg *msg) Mu::Sexp Mu::msg_to_sexp (MuMsg *msg, unsigned docid, - const struct _MuMsgIterThreadInfo *ti, - MuMsgOptions opts) + const Option qm, MuMsgOptions opts) { g_return_val_if_fail (msg, Sexp::make_symbol("error")); - g_return_val_if_fail (!((opts & MU_MSG_OPTION_HEADERS_ONLY) && - (opts & MU_MSG_OPTION_EXTRACT_IMAGES)), + g_return_val_if_fail (!((opts & MU_MSG_OPTION_HEADERS_ONLY) && + (opts & MU_MSG_OPTION_EXTRACT_IMAGES)), Sexp::make_symbol("error")); Sexp::List items; if (docid != 0) items.add_prop(":docid", Sexp::make_number(docid)); - if (ti) - add_thread_info (items, ti); + if (qm) + add_thread_info (items, *qm); - add_prop_nonempty (items, ":subject", mu_msg_get_subject (msg)); - add_prop_nonempty (items, ":message-id", mu_msg_get_msgid (msg)); - add_prop_nonempty (items, ":mailing-list", mu_msg_get_mailing_list (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, ":subject", mu_msg_get_subject (msg)); + add_prop_nonempty (items, ":message-id", mu_msg_get_msgid (msg)); + add_prop_nonempty (items, ":mailing-list", mu_msg_get_mailing_list (msg)); + add_prop_nonempty (items, ":path", mu_msg_get_path (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)))); - /* 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 */ - if (opts & MU_MSG_OPTION_HEADERS_ONLY) - add_contacts (items, msg); + /* 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 */ + if (opts & MU_MSG_OPTION_HEADERS_ONLY) + add_contacts (items, msg); add_prop_nonempty (items, ":references", mu_msg_get_references (msg)); - add_prop_nonempty (items, ":in-reply-to", mu_msg_get_header (msg, "In-Reply-To")); + add_prop_nonempty (items, ":in-reply-to", mu_msg_get_header (msg, "In-Reply-To")); - add_date_and_size (items, msg); + add_date_and_size (items, msg); add_flags (items, msg); - add_tags (items, msg); + add_tags (items, msg); - /* headers are retrieved from the database, views from the - * message file file attr things can only be gotten from the - * file (ie., mu view), not from the database (mu find). */ - if (!(opts & MU_MSG_OPTION_HEADERS_ONLY)) - add_message_file_parts (items, msg, opts); + /* headers are retrieved from the database, views from the + * message file file attr things can only be gotten from the + * file (ie., mu view), not from the database (mu find). */ + if (!(opts & MU_MSG_OPTION_HEADERS_ONLY)) + add_message_file_parts (items, msg, opts); return Sexp::make_list(std::move(items)); } - - -char* -mu_msg_to_sexp (MuMsg *msg, unsigned docid, const MuMsgIterThreadInfo *ti, - MuMsgOptions opts) -{ - return g_strdup (Mu::msg_to_sexp (msg, docid, ti, opts) - .to_sexp_string().c_str()); -} - - -char* -mu_msg_to_json (MuMsg *msg, unsigned docid, const MuMsgIterThreadInfo *ti, - MuMsgOptions opts) -{ - return g_strdup (Mu::msg_to_sexp (msg, docid, ti, opts) - .to_json_string().c_str()); -} diff --git a/lib/mu-msg.c b/lib/mu-msg.cc similarity index 91% rename from lib/mu-msg.c rename to lib/mu-msg.cc index 2ac3838b..6ef4b183 100644 --- a/lib/mu-msg.c +++ b/lib/mu-msg.cc @@ -1,5 +1,4 @@ /* -** ** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** This program is free software; you can redistribute it and/or modify @@ -28,11 +27,13 @@ #include -#include "mu-msg-priv.h" /* include before mu-msg.h */ -#include "mu-msg.h" +#include "mu-msg-priv.hh" /* include before mu-msg.h */ +#include "mu-msg.hh" #include "utils/mu-str.h" -#include "mu-maildir.h" +#include "mu-maildir.hh" + +using namespace Mu; /* note, we do the gmime initialization here rather than in * mu-runtime, because this way we don't need mu-runtime for simple @@ -64,15 +65,15 @@ msg_new (void) { MuMsg *self; - self = g_slice_new0 (MuMsg); + self = g_new0 (MuMsg, 1); self->_refcount = 1; return self; } MuMsg* -mu_msg_new_from_file (const char *path, const char *mdir, - GError **err) +Mu::mu_msg_new_from_file (const char *path, const char *mdir, + GError **err) { MuMsg *self; MuMsgFile *msgfile; @@ -101,7 +102,7 @@ mu_msg_new_from_file (const char *path, const char *mdir, } MuMsg* -mu_msg_new_from_doc (XapianDocument *doc, GError **err) +Mu::mu_msg_new_from_doc (XapianDocument *doc, GError **err) { MuMsg *self; MuMsgDoc *msgdoc; @@ -139,11 +140,11 @@ mu_msg_destroy (MuMsg *self) g_slist_free (self->_free_later_lst); } - g_slice_free (MuMsg, self); + g_free (self); } MuMsg* -mu_msg_ref (MuMsg *self) +Mu::mu_msg_ref (MuMsg *self) { g_return_val_if_fail (self, NULL); @@ -153,7 +154,7 @@ mu_msg_ref (MuMsg *self) } void -mu_msg_unref (MuMsg *self) +Mu::mu_msg_unref (MuMsg *self) { g_return_if_fail (self); g_return_if_fail (self->_refcount >= 1); @@ -210,7 +211,7 @@ get_path (MuMsg *self) /* for some data, we need to read the message file from disk */ gboolean -mu_msg_load_msg_file (MuMsg *self, GError **err) +Mu::mu_msg_load_msg_file (MuMsg *self, GError **err) { const char *path; @@ -231,7 +232,7 @@ mu_msg_load_msg_file (MuMsg *self, GError **err) } void -mu_msg_unload_msg_file (MuMsg *msg) +Mu::mu_msg_unload_msg_file (MuMsg *msg) { g_return_if_fail (msg); @@ -303,7 +304,7 @@ get_num_field (MuMsg *self, MuMsgFieldId mfid) } const char* -mu_msg_get_header (MuMsg *self, const char *header) +Mu::mu_msg_get_header (MuMsg *self, const char *header) { GError *err; @@ -324,7 +325,7 @@ mu_msg_get_header (MuMsg *self, const char *header) } time_t -mu_msg_get_timestamp (MuMsg *self) +Mu::mu_msg_get_timestamp (MuMsg *self) { const char *path; struct stat statbuf; @@ -342,28 +343,28 @@ mu_msg_get_timestamp (MuMsg *self) } const char* -mu_msg_get_path (MuMsg *self) +Mu::mu_msg_get_path (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_PATH); } const char* -mu_msg_get_subject (MuMsg *self) +Mu::mu_msg_get_subject (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_SUBJECT); } const char* -mu_msg_get_msgid (MuMsg *self) +Mu::mu_msg_get_msgid (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_MSGID); } const char* -mu_msg_get_mailing_list (MuMsg *self) +Mu::mu_msg_get_mailing_list (MuMsg *self) { const char *ml; char *decml; @@ -382,63 +383,63 @@ mu_msg_get_mailing_list (MuMsg *self) } const char* -mu_msg_get_maildir (MuMsg *self) +Mu::mu_msg_get_maildir (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_MAILDIR); } const char* -mu_msg_get_from (MuMsg *self) +Mu::mu_msg_get_from (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_FROM); } const char* -mu_msg_get_to (MuMsg *self) +Mu::mu_msg_get_to (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_TO); } const char* -mu_msg_get_cc (MuMsg *self) +Mu::mu_msg_get_cc (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_CC); } const char* -mu_msg_get_bcc (MuMsg *self) +Mu::mu_msg_get_bcc (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_field (self, MU_MSG_FIELD_ID_BCC); } time_t -mu_msg_get_date (MuMsg *self) +Mu::mu_msg_get_date (MuMsg *self) { g_return_val_if_fail (self, (time_t)-1); return (time_t)get_num_field (self, MU_MSG_FIELD_ID_DATE); } MuFlags -mu_msg_get_flags (MuMsg *self) +Mu::mu_msg_get_flags (MuMsg *self) { g_return_val_if_fail (self, MU_FLAG_NONE); return (MuFlags)get_num_field (self, MU_MSG_FIELD_ID_FLAGS); } size_t -mu_msg_get_size (MuMsg *self) +Mu::mu_msg_get_size (MuMsg *self) { g_return_val_if_fail (self, (size_t)-1); return (size_t)get_num_field (self, MU_MSG_FIELD_ID_SIZE); } MuMsgPrio -mu_msg_get_prio (MuMsg *self) +Mu::mu_msg_get_prio (MuMsg *self) { g_return_val_if_fail (self, MU_MSG_PRIO_NORMAL); return (MuMsgPrio)get_num_field (self, MU_MSG_FIELD_ID_PRIO); @@ -517,11 +518,11 @@ find_content_type (MuMsg *msg, MuMsgPart *mpart, ContentTypeData *cdata) if (!cdata->want_html && (mpart->part_type & MU_MSG_PART_TYPE_TEXT_PLAIN)) - wanted = mpart->data; + wanted = (GMimePart*)mpart->data; else if (!(mpart->part_type & MU_MSG_PART_TYPE_ATTACHMENT) && cdata->want_html && (mpart->part_type & MU_MSG_PART_TYPE_TEXT_HTML)) - wanted = mpart->data; + wanted = (GMimePart*)mpart->data; else wanted = NULL; @@ -569,56 +570,56 @@ get_content_type_parameters (MuMsg *self, MuMsgOptions opts, gboolean want_html) } const GSList* -mu_msg_get_body_text_content_type_parameters (MuMsg *self, MuMsgOptions opts) +Mu::mu_msg_get_body_text_content_type_parameters (MuMsg *self, MuMsgOptions opts) { g_return_val_if_fail (self, NULL); return get_content_type_parameters(self, opts, FALSE); } const char* -mu_msg_get_body_html (MuMsg *self, MuMsgOptions opts) +Mu::mu_msg_get_body_html (MuMsg *self, MuMsgOptions opts) { g_return_val_if_fail (self, NULL); return free_later_str (self, get_body (self, opts, TRUE)); } const char* -mu_msg_get_body_text (MuMsg *self, MuMsgOptions opts) +Mu::mu_msg_get_body_text (MuMsg *self, MuMsgOptions opts) { g_return_val_if_fail (self, NULL); return free_later_str (self, get_body (self, opts, FALSE)); } const GSList* -mu_msg_get_references (MuMsg *self) +Mu::mu_msg_get_references (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_list_field (self, MU_MSG_FIELD_ID_REFS); } const GSList* -mu_msg_get_tags (MuMsg *self) +Mu::mu_msg_get_tags (MuMsg *self) { g_return_val_if_fail (self, NULL); return get_str_list_field (self, MU_MSG_FIELD_ID_TAGS); } const char* -mu_msg_get_field_string (MuMsg *self, MuMsgFieldId mfid) +Mu::mu_msg_get_field_string (MuMsg *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); return get_str_field (self, mfid); } const GSList* -mu_msg_get_field_string_list (MuMsg *self, MuMsgFieldId mfid) +Mu::mu_msg_get_field_string_list (MuMsg *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, NULL); return get_str_list_field (self, mfid); } gint64 -mu_msg_get_field_numeric (MuMsg *self, MuMsgFieldId mfid) +Mu::mu_msg_get_field_numeric (MuMsg *self, MuMsgFieldId mfid) { g_return_val_if_fail (self, -1); return get_num_field (self, mfid); @@ -744,7 +745,7 @@ msg_contact_foreach_doc (MuMsg *msg, MuMsgContactForeachFunc func, } void -mu_msg_contact_foreach (MuMsg *msg, MuMsgContactForeachFunc func, +Mu::mu_msg_contact_foreach (MuMsg *msg, MuMsgContactForeachFunc func, gpointer user_data) { g_return_if_fail (msg); @@ -809,7 +810,7 @@ cmp_subject (const char* s1, const char *s2) } int -mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) +Mu::mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) { g_return_val_if_fail (m1, 0); g_return_val_if_fail (m2, 0); @@ -834,7 +835,7 @@ mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) } gboolean -mu_msg_is_readable (MuMsg *self) +Mu::mu_msg_is_readable (MuMsg *self) { g_return_val_if_fail (self, FALSE); @@ -903,7 +904,7 @@ get_target_mdir (MuMsg *msg, const char *target_maildir, GError **err) * super-paranoid here... */ gboolean -mu_msg_move_to_maildir (MuMsg *self, const char *maildir, +Mu::mu_msg_move_to_maildir (MuMsg *self, const char *maildir, MuFlags flags, gboolean ignore_dups, gboolean new_name, GError **err) { @@ -947,7 +948,7 @@ mu_msg_move_to_maildir (MuMsg *self, const char *maildir, * some 3rd party progs such as mbsync */ gboolean -mu_msg_tickle (MuMsg *self, GError **err) +Mu::mu_msg_tickle (MuMsg *self, GError **err) { g_return_val_if_fail (self, FALSE); @@ -958,13 +959,13 @@ mu_msg_tickle (MuMsg *self, GError **err) } const char* -mu_str_flags_s (MuFlags flags) +Mu::mu_str_flags_s (MuFlags flags) { return mu_flags_to_str_s (flags, MU_FLAG_TYPE_ANY); } char* -mu_str_flags (MuFlags flags) +Mu::mu_str_flags (MuFlags flags) { return g_strdup (mu_str_flags_s(flags)); } @@ -991,7 +992,7 @@ cleanup_contact (char *contact) /* this is still somewhat simplistic... */ const char* -mu_str_display_contact_s (const char *str) +Mu::mu_str_display_contact_s (const char *str) { static gchar contact[255]; gchar *c, *c2; @@ -1017,7 +1018,7 @@ mu_str_display_contact_s (const char *str) } char* -mu_str_display_contact (const char *str) +Mu::mu_str_display_contact (const char *str) { g_return_val_if_fail (str, NULL); diff --git a/lib/mu-msg.h b/lib/mu-msg.hh similarity index 88% rename from lib/mu-msg.h rename to lib/mu-msg.hh index a77652be..6befc9f6 100644 --- a/lib/mu-msg.h +++ b/lib/mu-msg.hh @@ -1,7 +1,5 @@ - -/* -*- mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- -** -** Copyright (C) 2010-2013 Dirk-Jan C. Binnema +/* +** Copyright (C) 2010-2020 Dirk-Jan C. Binnema ** ** 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 @@ -19,21 +17,23 @@ ** */ -#ifndef __MU_MSG_H__ -#define __MU_MSG_H__ +#ifndef MU_MSG_HH__ +#define MU_MSG_HH__ -#include +#include #include #include #include +#include +#include +#include -G_BEGIN_DECLS +namespace Mu { -struct _MuMsg; -typedef struct _MuMsg MuMsg; +struct MuMsg; /* options for various functions */ -typedef enum { +enum MuMsgOptions { MU_MSG_OPTION_NONE = 0, /* 1 << 0 is still free! */ @@ -59,8 +59,8 @@ typedef enum { /* recurse into submessages */ MU_MSG_OPTION_RECURSE_RFC822 = 1 << 11 - -} MuMsgOptions; +}; +MU_ENABLE_BITOPS(MuMsgOptions); /** * create a new MuMsg* instance which parses a message and provides @@ -593,26 +593,7 @@ char* mu_str_flags (MuFlags flags) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -struct _MuMsgIterThreadInfo; - -/** - * convert the msg to json - * - * @param msg a valid message - * @param docid the docid for this message, or 0 - * @param ti thread info for the current message, or NULL - * @param opts, bitwise OR'ed; - * - MU_MSG_OPTION_HEADERS_ONLY: only include message fields which can be - * obtained from the database (this is much faster if the MuMsg is - * database-backed, so no file needs to be opened) - * - MU_MSG_OPTION_EXTRACT_IMAGES: extract image attachments as temporary - * files and include links to those in the sexp - * - * @return a string with the json (free with g_free) or NULL in case of error - */ -char* mu_msg_to_json (MuMsg *msg, unsigned docid, - const struct _MuMsgIterThreadInfo *ti, - MuMsgOptions ops) G_GNUC_WARN_UNUSED_RESULT; +struct QueryMatch; /** * convert the msg to a Lisp symbolic expression (for further processing in @@ -620,44 +601,7 @@ char* mu_msg_to_json (MuMsg *msg, unsigned docid, * * @param msg a valid message * @param docid the docid for this message, or 0 - * @param ti thread info for the current message, or NULL - * @param opts, bitwise OR'ed; - * - MU_MSG_OPTION_HEADERS_ONLY: only include message fields which can be - * obtained from the database (this is much faster if the MuMsg is - * database-backed, so no file needs to be opened) - * - MU_MSG_OPTION_EXTRACT_IMAGES: extract image attachments as temporary - * files and include links to those in the sexp - * and for message parts: - * MU_MSG_OPTION_CHECK_SIGNATURES: check signatures - * MU_MSG_OPTION_AUTO_RETRIEVE_KEY: attempt to retrieve keys online - * MU_MSG_OPTION_USE_AGENT: attempt to use GPG-agent - * MU_MSG_OPTION_USE_PKCS7: attempt to use PKCS (instead of gpg) - * - * @return a string with the sexp (free with g_free) or NULL in case of error - */ -char* mu_msg_to_sexp (MuMsg *msg, unsigned docid, - const struct _MuMsgIterThreadInfo *ti, - MuMsgOptions ops) - G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; - - - -G_END_DECLS - - -#ifdef __cplusplus - -#include - -namespace Mu { - -/** - * convert the msg to a Lisp symbolic expression (for further processing in - * e.g. emacs) - * - * @param msg a valid message - * @param docid the docid for this message, or 0 - * @param ti thread info for the current message, or NULL + * @param qm information about this match * @param opts, bitwise OR'ed; * - MU_MSG_OPTION_HEADERS_ONLY: only include message fields which can be * obtained from the database (this is much faster if the MuMsg is @@ -673,11 +617,8 @@ namespace Mu { * @return a Sexp::Node representing the message */ Mu::Sexp msg_to_sexp (MuMsg *msg, unsigned docid, - const struct _MuMsgIterThreadInfo *ti, + const Option qm, MuMsgOptions ops); } -#endif /*__cplusplus*/ - - -#endif /*__MU_MSG_H__*/ +#endif /*MU_MSG_HH__*/ diff --git a/lib/mu-server.cc b/lib/mu-server.cc index 9fb6ff19..7a610791 100644 --- a/lib/mu-server.cc +++ b/lib/mu-server.cc @@ -34,13 +34,12 @@ #include #include -#include "mu-msg.h" #include "mu-runtime.hh" -#include "mu-maildir.h" +#include "mu-maildir.hh" #include "mu-query.hh" #include "index/mu-indexer.hh" #include "mu-store.hh" -#include "mu-msg-part.h" +#include "mu-msg-part.hh" #include "mu-contacts.hh" #include "utils/mu-str.h" @@ -90,7 +89,7 @@ struct Server::Private { void output_sexp(Sexp::List&& lst) const { output_sexp(Sexp::make_list(std::move(lst))); } - size_t output_sexp (MuMsgIter *iter, unsigned maxnum); + size_t output_sexp (const QueryResults& qres, unsigned maxnum); // // handlers for various commands. @@ -359,8 +358,7 @@ Server::Private::add_handler (const Parameters& params) path.c_str(), docid); Sexp::List update; - update.add_prop(":update", Mu::msg_to_sexp(msg, docid, NULL, - MU_MSG_OPTION_VERIFY)); + update.add_prop(":update", Mu::msg_to_sexp(msg, docid, {}, MU_MSG_OPTION_VERIFY)); output_sexp(Sexp::make_list(std::move(update))); mu_msg_unref(msg); } @@ -617,18 +615,17 @@ docids_for_msgid (const Query& q, const std::string& msgid, size_t max=100) g_free(tmp); GError *gerr{}; - auto iter{q.run(expr , MU_MSG_FIELD_ID_NONE, Query::Flags::None, max)}; + const auto res{q.run(expr, MU_MSG_FIELD_ID_NONE, QueryFlags::None, max)}; g_free (expr); - if (!iter) + if (!res) throw Error(Error::Code::Store, &gerr, "failed to run msgid-query"); - if (mu_msg_iter_is_done (iter)) + else if (res->empty()) throw Error(Error::Code::NotFound, - "could not find message(s) for msgid %s", msgid.c_str()); - std::vector docids; - do { - docids.emplace_back(mu_msg_iter_get_docid (iter)); - } while (mu_msg_iter_next (iter)); - mu_msg_iter_destroy (iter); + "could not find message(s) for msgid %s", msgid.c_str()); + + std::vector docids{}; + for(auto&& mi: *res) + docids.emplace_back(mi.doc_id()); return docids; } @@ -676,24 +673,23 @@ determine_docids (const Query& q, const Parameters& params) size_t -Server::Private::output_sexp (MuMsgIter *iter, unsigned maxnum) +Server::Private::output_sexp (const QueryResults& qres, unsigned maxnum) { size_t n{}; - while (!mu_msg_iter_is_done (iter) && n < maxnum) { + for (auto&& mi: qres) { - MuMsg *msg; - msg = mu_msg_iter_get_msg_floating (iter); + if (n >= maxnum) + break; + ++n; + auto msg{mi.floating_msg()}; + if (!msg) + continue; - if (mu_msg_is_readable (msg)) { - const MuMsgIterThreadInfo* ti; - ti = mu_msg_iter_get_thread_info (iter); - output_sexp(Mu::msg_to_sexp(msg, - mu_msg_iter_get_docid (iter), - ti, MU_MSG_OPTION_HEADERS_ONLY)); - ++n; - } - mu_msg_iter_next (iter); + auto qm{mi.query_match()}; + output_sexp(Mu::msg_to_sexp(msg, mi.doc_id(), + qm, MU_MSG_OPTION_HEADERS_ONLY)); } + return n; } @@ -718,20 +714,19 @@ Server::Private::find_handler (const Parameters& params) sortfieldstr.c_str()}; } - auto qflags{Query::Flags::None}; + auto qflags{QueryFlags::None}; if (descending) - qflags |= Query::Flags::Descending; + qflags |= QueryFlags::Descending; if (skip_dups) - qflags |= Query::Flags::SkipDups; + qflags |= QueryFlags::SkipDuplicates; if (include_related) - qflags |= Query::Flags::IncludeRelated; + qflags |= QueryFlags::IncludeRelated; if (threads) - qflags |= Query::Flags::Threading; + qflags |= QueryFlags::Threading; - GError *gerr{}; - auto miter{query().run(q, sort_field, qflags, maxnum, &gerr)}; - if (!miter) - throw Error(Error::Code::Query, &gerr, "failed to run query"); + auto qres{query().run(q, sort_field, qflags, maxnum)}; + if (!qres) + throw Error(Error::Code::Query, "failed to run query"); /* before sending new results, send an 'erase' message, so the frontend * knows it should erase the headers buffer. this will ensure that the @@ -743,16 +738,13 @@ Server::Private::find_handler (const Parameters& params) } { - const auto foundnum{output_sexp (miter, maxnum)}; + const auto foundnum{output_sexp (*qres, maxnum)}; Sexp::List lst; lst.add_prop(":found", Sexp::make_number(foundnum)); output_sexp(std::move(lst)); } - //output_sexp ("(:found %u)", foundnum); - mu_msg_iter_destroy (miter); } - void Server::Private::help_handler (const Parameters& params) { @@ -886,7 +878,7 @@ perform_move (Store& store, DocId docid, MuMsg *msg, const std::string& maildira throw Error{Error::Code::Store, "failed to store updated message"}; Sexp::List seq; - seq.add_prop(":update", msg_to_sexp (msg, docid, NULL, MU_MSG_OPTION_VERIFY)); + seq.add_prop(":update", msg_to_sexp (msg, docid, {}, MU_MSG_OPTION_VERIFY)); /* note, the :move t thing is a hint to the frontend that it * could remove the particular header */ if (different_mdir) diff --git a/lib/mu-store.cc b/lib/mu-store.cc index ac4e3497..d2909bef 100644 --- a/lib/mu-store.cc +++ b/lib/mu-store.cc @@ -38,7 +38,7 @@ #include "utils/mu-str.h" #include "utils/mu-error.hh" -#include "mu-msg-part.h" +#include "mu-msg-part.hh" #include "utils/mu-utils.hh" using namespace Mu; @@ -425,7 +425,7 @@ Store::remove_message (const std::string& path) try { const std::string term{(get_uid_term(path.c_str()))}; - priv()->writable_db().delete_document(term); + priv_->writable_db().delete_document(term); } MU_XAPIAN_CATCH_BLOCK_RETURN (false); @@ -443,7 +443,7 @@ Store::remove_messages (const std::vector& ids) try { for (auto&& id: ids) { - priv()->writable_db().delete_document(id); + priv_->writable_db().delete_document(id); priv_->dirty(); } diff --git a/lib/mu-store.hh b/lib/mu-store.hh index 27b52f93..1d815db1 100644 --- a/lib/mu-store.hh +++ b/lib/mu-store.hh @@ -20,7 +20,7 @@ #ifndef __MU_STORE_HH__ #define __MU_STORE_HH__ -#include +#include #ifdef __cplusplus @@ -52,7 +52,6 @@ public: */ Store (const std::string& path, bool readonly=true); - struct Config { size_t max_message_size{}; /**< maximum size (in bytes) for a message, or 0 for default */ @@ -121,8 +120,8 @@ public: /** - * Get the Indexer associated with this store. It is an error - * to call this on a read-only store. + * Get the Indexer associated with this store. It is an error to call + * this on a read-only store. * * @return the indexer. */ @@ -143,7 +142,7 @@ public: * @param msg a message * @param id the id for this message * - * @return false in case of failure; true ottherwise. + * @return false in case of failure; true otherwise. */ bool update_message (MuMsg *msg, Id id); diff --git a/lib/test-mu-flags.cc b/lib/test-mu-flags.cc index f87468c6..9c9c5754 100644 --- a/lib/test-mu-flags.cc +++ b/lib/test-mu-flags.cc @@ -1,6 +1,5 @@ -/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/ /* -** Copyright (C) 2008-2013 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -23,9 +22,10 @@ #endif /*HAVE_CONFIG_H*/ #include -#include "mu-flags.h" +#include "mu-flags.hh" #include "test-mu-common.hh" +using namespace Mu; static void test_mu_flag_char (void) diff --git a/lib/test-mu-maildir.cc b/lib/test-mu-maildir.cc index 8d7010da..3665c9cb 100644 --- a/lib/test-mu-maildir.cc +++ b/lib/test-mu-maildir.cc @@ -1,5 +1,5 @@ /* -** Copyright (C) 2008-2016 Dirk-Jan C. Binnema +** Copyright (C) 2008-2020 Dirk-Jan C. Binnema ** ** 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 the @@ -29,9 +29,10 @@ #include #include "test-mu-common.hh" -#include "mu-maildir.h" +#include "mu-maildir.hh" #include "utils/mu-util.h" +using namespace Mu; static void test_mu_maildir_mkdir_01 (void) diff --git a/lib/test-mu-msg.cc b/lib/test-mu-msg.cc index 907b16f4..7513ef27 100644 --- a/lib/test-mu-msg.cc +++ b/lib/test-mu-msg.cc @@ -29,9 +29,11 @@ #include #include "test-mu-common.hh" -#include "mu-msg.h" +#include "mu-msg.hh" #include "utils/mu-str.h" +using namespace Mu; + static MuMsg* get_msg (const char *path) diff --git a/lib/utils/mu-sexp.hh b/lib/utils/mu-sexp.hh index a4f90022..adc2cf30 100644 --- a/lib/utils/mu-sexp.hh +++ b/lib/utils/mu-sexp.hh @@ -21,7 +21,6 @@ #ifndef MU_SEXP_HH__ #define MU_SEXP_HH__ -#include #include #include #include