summaryrefslogtreecommitdiff
path: root/guile
diff options
context:
space:
mode:
authorDirk-Jan C. Binnema <djcb@djcbsoftware.nl>2020-11-03 10:01:44 +0200
committerDirk-Jan C. Binnema <djcb@djcbsoftware.nl>2020-11-07 11:43:11 +0200
commit3206b9db23963e53bdaa6b65e8bce838ca1e65b0 (patch)
tree54b1ad0973c9ff5550579790263b60bbe45772c6 /guile
parent2804087b3abebc70319da4f5f01b12a76e25402d (diff)
guile: use updated Query API
Diffstat (limited to 'guile')
-rw-r--r--guile/Makefile.am25
-rw-r--r--guile/mu-guile-message.cc (renamed from guile/mu-guile-message.c)47
-rw-r--r--guile/mu-guile-message.hh (renamed from guile/mu-guile-message.h)12
-rw-r--r--guile/mu-guile.cc (renamed from guile/mu-guile.c)67
-rw-r--r--guile/mu-guile.hh (renamed from guile/mu-guile.h)24
-rw-r--r--guile/tests/Makefile.am22
-rw-r--r--guile/tests/test-mu-guile.c134
7 files changed, 79 insertions, 252 deletions
diff --git a/guile/Makefile.am b/guile/Makefile.am
index a37d44d..64055ca 100644
--- a/guile/Makefile.am
+++ b/guile/Makefile.am
@@ -28,17 +28,23 @@ AM_CPPFLAGS= \
# don't use -Werror, as it might break on other compilers
# use -Wno-unused-parameters, because some callbacks may not
# really need all the params they get
-AM_CFLAGS=$(ASAN_CFLAGS) ${WARN_CFLAGS}
-AM_CXXFLAGS=$(ASAN_CXXFLAGS) ${WARN_CXXFLAGS}
+AM_CFLAGS= \
+ $(ASAN_CFLAGS) \
+ ${WARN_CFLAGS} \
+ -Wno-suggest-attribute=noreturn \
+ -Wno-missing-prototypes \
+ -Wno-missing-declarations
lib_LTLIBRARIES= \
libguile-mu.la
libguile_mu_la_SOURCES= \
- mu-guile.c \
- mu-guile.h \
- mu-guile-message.c \
- mu-guile-message.h
+ mu-guile.cc \
+ mu-guile.hh \
+ mu-guile-message.cc \
+ mu-guile-message.hh
+
+libguile_mu_la_CFLAGS=$(AM_CFLAGS)
libguile_mu_la_LIBADD= \
${top_builddir}/lib/libmu.la \
@@ -61,10 +67,13 @@ mu_guile_TEXINFOS= \
BUILT_SOURCES=$(XFILES)
-snarfcppopts= $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $(AM_CPPFLAGS)
+snarfcppopts= $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
SUFFIXES = .x .doc
.c.x:
- $(GUILE_SNARF) -o $@ $< $(snarfcppopts)
+ $(AM_V_GEN) $(GUILE_SNARF) -o $@ $< $(snarfcppopts)
+.cc.x:
+ $(AM_V_GEN) $(GUILE_SNARF) -o $@ $< $(snarfcppopts)
+
# FIXME: GUILE_SITEDIR would be better, but that
# breaks 'make distcheck'
diff --git a/guile/mu-guile-message.c b/guile/mu-guile-message.cc
index c081f33..ef58e98 100644
--- a/guile/mu-guile-message.c
+++ b/guile/mu-guile-message.cc
@@ -16,21 +16,20 @@
** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**
*/
-
-#if HAVE_CONFIG_H
+#include "mu-guile-message.hh"
#include <config.h>
-#endif /*HAVE_CONFIG_H*/
-
-#include "mu-guile-message.h"
#include <glib-object.h>
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wredundant-decls"
#include <libguile.h>
+#pragma GCC diagnostic pop
-#include "mu-guile.h"
+#include "mu-guile.hh"
#include <mu-runtime.h>
#include <mu-store.hh>
-#include <mu-query.h>
+#include <mu-query.hh>
#include <mu-msg.h>
#include <mu-msg-part.h>
@@ -42,7 +41,7 @@ static SCM SYMB_PRIO_LOW, SYMB_PRIO_NORMAL, SYMB_PRIO_HIGH;
static SCM SYMB_FLAG_NEW, SYMB_FLAG_PASSED, SYMB_FLAG_REPLIED,
SYMB_FLAG_SEEN, SYMB_FLAG_TRASHED, SYMB_FLAG_DRAFT,
SYMB_FLAG_FLAGGED, SYMB_FLAG_SIGNED, SYMB_FLAG_ENCRYPTED,
- SYMB_FLAG_HAS_ATTACH, SYMB_FLAG_UNREAD;
+ SYMB_FLAG_HAS_ATTACH, SYMB_FLAG_UNREAD, SYMB_FLAG_LIST;
static SCM SYMB_CONTACT_TO, SYMB_CONTACT_CC, SYMB_CONTACT_BCC,
SYMB_CONTACT_FROM;
@@ -66,7 +65,7 @@ mu_guile_msg_to_scm (MuMsg *msg)
g_return_val_if_fail (msg, SCM_UNDEFINED);
- msgwrap = scm_gc_malloc (sizeof (MuMsgWrapper), "msg");
+ msgwrap = (MuMsgWrapper*)scm_gc_malloc (sizeof (MuMsgWrapper), "msg");
msgwrap->_msg = msg;
msgwrap->_unrefme = FALSE;
@@ -82,10 +81,11 @@ typedef struct _FlagData FlagData;
#define MU_GUILE_INITIALIZED_OR_ERROR \
do { if (!(mu_guile_initialized())) \
- return mu_guile_error (FUNC_NAME, 0, \
+ mu_guile_error (FUNC_NAME, 0, \
"mu not initialized; call mu:initialize", \
SCM_UNDEFINED); \
- } while (0)
+ return SCM_UNSPECIFIED; \
+ } while (0)
static void
@@ -97,6 +97,7 @@ check_flag (MuFlags flag, FlagData *fdata)
return;
switch (flag) {
+ case MU_FLAG_NONE: break;
case MU_FLAG_NEW: flag_scm = SYMB_FLAG_NEW; break;
case MU_FLAG_PASSED: flag_scm = SYMB_FLAG_PASSED; break;
case MU_FLAG_REPLIED: flag_scm = SYMB_FLAG_REPLIED; break;
@@ -108,6 +109,7 @@ check_flag (MuFlags flag, FlagData *fdata)
case MU_FLAG_ENCRYPTED: flag_scm = SYMB_FLAG_ENCRYPTED; break;
case MU_FLAG_HAS_ATTACH: flag_scm = SYMB_FLAG_HAS_ATTACH; break;
case MU_FLAG_UNREAD: flag_scm = SYMB_FLAG_UNREAD; break;
+ case MU_FLAG_LIST: flag_scm = SYMB_FLAG_LIST; break;
default: flag_scm = SCM_UNDEFINED;
}
@@ -297,10 +299,11 @@ SCM_DEFINE (get_contacts, "mu:c:get-contacts", 2, 0, 0,
ecdata.ctype = MU_MSG_CONTACT_TYPE_BCC;
else if (scm_is_eq (CONTACT_TYPE, SYMB_CONTACT_FROM))
ecdata.ctype = MU_MSG_CONTACT_TYPE_FROM;
- else
- return mu_guile_error (FUNC_NAME, 0,
- "invalid contact type",
+ else {
+ mu_guile_error (FUNC_NAME, 0, "invalid contact type",
SCM_UNDEFINED);
+ return SCM_UNSPECIFIED;
+ }
}
ecdata.lst = SCM_EOL;
@@ -428,14 +431,12 @@ call_func (SCM FUNC, MuMsgIter *iter, const char* func_name)
static MuMsgIter*
-get_query_iter (MuQuery *query, const char* expr, int maxnum)
+get_query_iter (Mu::Query& query, const char* expr, int maxnum)
{
- MuMsgIter *iter;
- GError *err;
-
- err = NULL;
- iter = mu_query_run (query, expr, MU_MSG_FIELD_ID_NONE, maxnum,
- MU_QUERY_FLAG_NONE, &err);
+ GError *err{};
+ auto iter = query.run (expr, MU_MSG_FIELD_ID_NONE,
+ Mu::Query::Flags::None, maxnum,
+ &err);
if (!iter) {
mu_guile_g_error ("<internal error>", err);
g_clear_error (&err);
@@ -472,7 +473,7 @@ SCM_DEFINE (for_each_message, "mu:c:for-each-message", 3, 0, 0,
else
expr = scm_to_utf8_string(EXPR);
- iter = get_query_iter (mu_guile_instance()->query, expr,
+ iter = get_query_iter (mu_guile_query(), expr,
scm_to_int(MAXNUM));
free (expr);
if (!iter)
@@ -525,6 +526,8 @@ define_symbols (void)
SYMB_FLAG_ENCRYPTED = register_symbol ("mu:flag:encrypted");
SYMB_FLAG_HAS_ATTACH = register_symbol ("mu:flag:has-attach");
SYMB_FLAG_UNREAD = register_symbol ("mu:flag:unread");
+
+ SYMB_FLAG_LIST = register_symbol ("mu:flag:list");
}
diff --git a/guile/mu-guile-message.h b/guile/mu-guile-message.hh
index bde8129..066d807 100644
--- a/guile/mu-guile-message.h
+++ b/guile/mu-guile-message.hh
@@ -17,12 +17,8 @@
**
*/
-#ifndef __MU_GUILE_MESSAGE_H__
-#define __MU_GUILE_MESSAGE_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
+#ifndef MU_GUILE_MESSAGE_H__
+#define MU_GUILE_MESSAGE_H__
/**
* Initialize this mu guile module.
@@ -33,6 +29,4 @@ G_BEGIN_DECLS
*/
void* mu_guile_message_init (void *data);
-G_END_DECLS
-
-#endif /*__MU_GUILE_MESSAGE_H__*/
+#endif /*MU_GUILE_MESSAGE_HH__*/
diff --git a/guile/mu-guile.c b/guile/mu-guile.cc
index 4c3422f..f1b10a4 100644
--- a/guile/mu-guile.c
+++ b/guile/mu-guile.cc
@@ -17,9 +17,10 @@
**
*/
+#include "mu-guile.hh"
+
#include <config.h>
#include <locale.h>
-
#include <glib-object.h>
#pragma GCC diagnostic push
@@ -28,15 +29,10 @@
#pragma GCC diagnostic pop
#include <mu-runtime.h>
-#include <mu-query.h>
-#include <mu-runtime.h>
#include <mu-store.hh>
-#include <mu-query.h>
+#include <mu-query.hh>
#include <mu-msg.h>
-#include "mu-guile.h"
-
-
SCM
mu_guile_scm_from_str (const char *str)
{
@@ -47,7 +43,6 @@ mu_guile_scm_from_str (const char *str)
SCM_FAILED_CONVERSION_QUESTION_MARK);
}
-
SCM
mu_guile_error (const char *func_name, int status,
const char *fmt, SCM args)
@@ -75,68 +70,46 @@ mu_guile_g_error (const char *func_name, GError *err)
/* there can be only one */
-static MuGuile *_singleton = NULL;
+static std::unique_ptr<Mu::Query> QuerySingleton;
static gboolean
-mu_guile_init_instance (const char *muhome)
+mu_guile_init_instance (const char *muhome) try
{
- MuStore *store;
- MuQuery *query;
- GError *err;
-
setlocale (LC_ALL, "");
-
if (!mu_runtime_init (muhome, "guile", FALSE))
return FALSE;
- err = NULL;
- store = mu_store_new_readable
- (mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB),
- &err);
- if (!store)
- goto errexit;
-
- query = mu_query_new (store, &err);
- mu_store_unref (store);
- if (!query)
- goto errexit;
-
- _singleton = g_new0 (MuGuile, 1);
- _singleton->query = query;
+ Mu::Store store{mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB)};
+ QuerySingleton = std::make_unique<Mu::Query>(store);
return TRUE;
-errexit:
- mu_guile_g_error (__func__, err);
- g_clear_error (&err);
- return FALSE;
+} catch (...) {
+ return FALSE;
}
static void
-mu_guile_uninit_instance (void)
+mu_guile_uninit_instance ()
{
- g_return_if_fail (_singleton);
-
- mu_query_destroy (_singleton->query);
- g_free (_singleton);
-
- _singleton = NULL;
+ QuerySingleton.reset();
mu_runtime_uninit ();
}
-MuGuile*
-mu_guile_instance (void)
+Mu::Query&
+mu_guile_query ()
{
- g_return_val_if_fail (_singleton, NULL);
- return _singleton;
+ if (!QuerySingleton)
+ g_error("mu guile not initialized");
+
+ return *QuerySingleton.get();
}
gboolean
-mu_guile_initialized (void)
+mu_guile_initialized ()
{
- return _singleton != NULL;
+ return !!QuerySingleton;
}
@@ -212,7 +185,7 @@ SCM_DEFINE (log_func, "mu:c:log", 1, 0, 1, (SCM LEVEL, SCM FRM, SCM ARGS),
return SCM_UNSPECIFIED;
output = scm_to_utf8_string (str);
- g_log (G_LOG_DOMAIN, level, "%s", output);
+ g_log (G_LOG_DOMAIN, (GLogLevelFlags)level, "%s", output);
free (output);
return SCM_UNSPECIFIED;
diff --git a/guile/mu-guile.h b/guile/mu-guile.hh
index fd230a5..d2b72ef 100644
--- a/guile/mu-guile.h
+++ b/guile/mu-guile.hh
@@ -1,5 +1,5 @@
/*
-** Copyright (C) 2011-2013 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
+** Copyright (C) 2011-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
**
** 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
@@ -21,22 +21,14 @@
#define __MU_GUILE_H__
#include <glib.h>
-#include <mu-query.h>
+#include <libguile.h>
+#include <mu-query.hh>
-G_BEGIN_DECLS
-
-
-struct _MuGuile {
- MuQuery *query;
-};
-typedef struct _MuGuile MuGuile;
/**
- * get the single MuGuile instance
- *
- * @return the instance or NULL in case of error
+ * get the singleton Query instance
*/
-MuGuile *mu_guile_instance (void);
+Mu::Query& mu_guile_query (void);
/**
@@ -44,7 +36,7 @@ MuGuile *mu_guile_instance (void);
*
* @return TRUE if MuGuile is Initialized, FALSE otherwise
*/
-gboolean mu_guile_initialized (void);
+gboolean mu_guile_initialized ();
/**
@@ -83,7 +75,6 @@ SCM mu_guile_error (const char *func_name, int status,
*/
SCM mu_guile_scm_from_str (const char *str);
-
/**
* Initialize this mu guile module.
*
@@ -93,7 +84,4 @@ SCM mu_guile_scm_from_str (const char *str);
*/
void* mu_guile_init (void *data);
-
-G_END_DECLS
-
#endif /*__MU_GUILE_H__*/
diff --git a/guile/tests/Makefile.am b/guile/tests/Makefile.am
index 8df87fb..005a9d2 100644
--- a/guile/tests/Makefile.am
+++ b/guile/tests/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright (C) 2008-2013 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
+# Copyright (C) 2008-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
##
## 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
@@ -21,9 +21,9 @@ AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \
$(GLIB_CFLAGS) \
-I${top_srcdir} \
-I${top_srcdir}/lib \
- -DMU_TESTMAILDIR=\"${top_srcdir}/lib/testdir\" \
- -DMU_TESTMAILDIR2=\"${top_srcdir}/lib/testdir2\" \
- -DMU_TESTMAILDIR3=\"${top_srcdir}/lib/testdir3\" \
+ -DMU_TESTMAILDIR=\"${abs_top_srcdir}/lib/testdir\" \
+ -DMU_TESTMAILDIR2=\"${abs_top_srcdir}/lib/testdir2\" \
+ -DMU_TESTMAILDIR3=\"${abs_top_srcdir}/lib/testdir3\" \
-DMU_PROGRAM=\"${abs_top_builddir}/mu/mu\" \
-DMU_GUILE_MODULE_PATH=\"${abs_top_srcdir}/guile/\" \
-DMU_GUILE_LIBRARY_PATH=\"${abs_top_builddir}/guile/.libs\" \
@@ -39,14 +39,8 @@ AM_LDFLAGS=$(ASAN_LDFLAGS)
noinst_PROGRAMS= $(TEST_PROGS)
-TEST_PROGS += test-mu-guile
-test_mu_guile_SOURCES= test-mu-guile.c dummy.cc
-test_mu_guile_LDADD=${top_builddir}/lib/libtestmucommon.la
+# TEST_PROGS += test-mu-guile
+# test_mu_guile_SOURCES= test-mu-guile.cc
+# test_mu_guile_LDADD=${top_builddir}/lib/libtestmucommon.la
-# we need to use dummy.cc to enforce c++ linking...
-BUILT_SOURCES= \
- dummy.cc
-dummy.cc:
- touch dummy.cc
-
-EXTRA_DIST=test-mu-guile.scm
+EXTRA_DIST=test-mu-guile.scm test-mu-guile.cc
diff --git a/guile/tests/test-mu-guile.c b/guile/tests/test-mu-guile.c
deleted file mode 100644
index 50199eb..0000000
--- a/guile/tests/test-mu-guile.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-** Copyright (C) 2012-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
-**
-** 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
-** Free Software Foundation; either version 3, or (at your option) any
-** later version.
-**
-** 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, write to the Free Software Foundation,
-** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-**
-*/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif /*HAVE_CONFIG_H*/
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <lib/mu-query.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "test-mu-common.h"
-#include <lib/mu-store.hh>
-
-
-/* tests for the command line interface, uses testdir2 */
-
-static gchar*
-fill_database (void)
-{
- gchar *cmdline, *tmpdir;
- GError *err;
-
- tmpdir = test_mu_common_get_random_tmpdir();
- cmdline = g_strdup_printf (
- "/bin/sh -c '"
- "%s init --muhome=%s --maildir=%s --quiet; "
- "%s index --muhome=%s --quiet'",
- MU_PROGRAM, tmpdir, MU_TESTMAILDIR2,
- MU_PROGRAM, tmpdir);
-
- if (g_test_verbose())
- g_print ("%s\n", cmdline);
-
- err = NULL;
- if (!g_spawn_command_line_sync (cmdline, NULL, NULL,
- NULL, &err)) {
- g_printerr ("Error: %s\n", err ? err->message : "?");
- g_assert (0);
- }
-
- g_free (cmdline);
- return tmpdir;
-}
-
-
-static void
-test_something (const char *what)
-{
- char *dir, *cmdline;
- gint result;
-
- dir = fill_database ();
- cmdline = g_strdup_printf (
- "LD_LIBRARY_PATH=%s %s -q -L %s -e main %s/test-mu-guile.scm "
- "--muhome=%s --test=%s",
- MU_GUILE_LIBRARY_PATH,
- GUILE_BINARY,
- MU_GUILE_MODULE_PATH,
- ABS_SRCDIR,
- dir,
- what);
-
- if (g_test_verbose ())
- g_print ("cmdline: %s\n", cmdline);
-
- result = system (cmdline);
- g_assert (result == 0);
-
- g_free (dir);
- g_free (cmdline);
-}
-
-static void
-test_mu_guile_queries (void)
-{
- test_something ("queries");
-}
-
-static void
-test_mu_guile_messages (void)
-{
- test_something ("message");
-}
-
-static void
-test_mu_guile_stats (void)
-{
- test_something ("stats");
-}
-
-
-int
-main (int argc, char *argv[])
-{
- int rv;
- g_test_init (&argc, &argv, NULL);
-
- if (!set_en_us_utf8_locale())
- return 0; /* don't error out... */
-
- g_test_add_func ("/guile/queries", test_mu_guile_queries);
- g_test_add_func ("/guile/message", test_mu_guile_messages);
- g_test_add_func ("/guile/stats", test_mu_guile_stats);
-
- g_log_set_handler (NULL,
- G_LOG_LEVEL_MASK | G_LOG_LEVEL_WARNING|
- G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION,
- (GLogFunc)black_hole, NULL);
-
- rv = g_test_run ();
-
- return rv;
-}