0b45142
From a7ff155b4a907af0cb979863758137aa5f8dce3f Mon Sep 17 00:00:00 2001
0b45142
From: Andrew Bauer <zonexpertconsulting@outlook.com>
0b45142
Date: Sat, 13 Mar 2021 13:16:36 -0600
0b45142
Subject: [PATCH] add support for tracker3
0b45142
0b45142
---
0b45142
 etc/afpd/spotlight.c          | 20 ++++++++++++++++++++
0b45142
 etc/spotlight/sparql_parser.c |  2 +-
0b45142
 etc/spotlight/sparql_parser.y |  2 +-
0b45142
 include/atalk/spotlight.h     |  2 ++
0b45142
 macros/netatalk.m4            | 10 +++++++++-
0b45142
 5 files changed, 33 insertions(+), 3 deletions(-)
0b45142
0b45142
diff --git a/etc/afpd/spotlight.c b/etc/afpd/spotlight.c
0b45142
index 9c8b4700..fa8f8083 100644
0b45142
--- a/etc/afpd/spotlight.c
0b45142
+++ b/etc/afpd/spotlight.c
0b45142
@@ -581,6 +581,7 @@ static void slq_dump(void)
0b45142
  * Tracker async callbacks
0b45142
  ************************************************/
0b45142
 
0b45142
+#ifndef HAVE_TRACKER3
0b45142
 static void tracker_con_cb(GObject      *object,
0b45142
                            GAsyncResult *res,
0b45142
                            gpointer      user_data)
0b45142
@@ -600,6 +601,7 @@ static void tracker_con_cb(GObject      *object,
0b45142
 
0b45142
     LOG(log_info, logtype_sl, "connected to Tracker");
0b45142
 }
0b45142
+#endif
0b45142
 
0b45142
 static void tracker_cursor_cb(GObject      *object,
0b45142
                               GAsyncResult *res,
0b45142
@@ -1312,6 +1314,9 @@ int spotlight_init(AFPObj *obj)
0b45142
     static bool initialized = false;
0b45142
     const char *attributes;
0b45142
     struct sl_ctx *sl_ctx;
0b45142
+#ifdef HAVE_TRACKER3
0b45142
+    GError *error = NULL;
0b45142
+#endif
0b45142
 
0b45142
     if (initialized) {
0b45142
         return 0;
0b45142
@@ -1342,8 +1347,23 @@ int spotlight_init(AFPObj *obj)
0b45142
     setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0);
0b45142
     setenv("TRACKER_USE_LOG_FILES", "1", 0);
0b45142
 
0b45142
+#ifdef HAVE_TRACKER3
0b45142
+    sl_ctx->tracker_con = tracker_sparql_connection_bus_new ("org.freedesktop.Tracker3.Miner.Files",
0b45142
+							     NULL, NULL, &error);
0b45142
+
0b45142
+    if (error) {
0b45142
+        LOG(log_error, logtype_sl, "Could not connect to Tracker: %s",
0b45142
+            error->message);
0b45142
+        sl_ctx->tracker_con = NULL;
0b45142
+        g_error_free(error);
0b45142
+        return -1;
0b45142
+    }
0b45142
+
0b45142
+    LOG(log_info, logtype_sl, "connected to Tracker3");
0b45142
+#else
0b45142
     tracker_sparql_connection_get_async(sl_ctx->cancellable,
0b45142
                                         tracker_con_cb, sl_ctx);
0b45142
+#endif
0b45142
 
0b45142
     initialized = true;
0b45142
     return 0;
0b45142
diff --git a/etc/spotlight/sparql_parser.c b/etc/spotlight/sparql_parser.c
0b45142
index d6f5d3be..88b868ef 100644
0b45142
--- a/etc/spotlight/sparql_parser.c
0b45142
+++ b/etc/spotlight/sparql_parser.c
0b45142
@@ -1455,7 +1455,7 @@ yyparse ()
0b45142
         result_limit = "";
0b45142
     ssp_result = talloc_asprintf(ssp_slq,
0b45142
                                  "SELECT ?url WHERE "
0b45142
-                                 "{ %s . ?obj nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
0b45142
+                                 "{ %s . ?obj nie:isStoredAs ?file . ?file nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
0b45142
                                  (yyvsp[(1) - (1)].sval), ssp_slq->slq_scope, result_limit);
0b45142
     (yyval.sval) = ssp_result;
0b45142
 }
0b45142
diff --git a/etc/spotlight/sparql_parser.y b/etc/spotlight/sparql_parser.y
0b45142
index 9d609976..5201e3d3 100644
0b45142
--- a/etc/spotlight/sparql_parser.y
0b45142
+++ b/etc/spotlight/sparql_parser.y
0b45142
@@ -78,7 +78,7 @@ expr                           {
0b45142
         result_limit = "";
0b45142
     ssp_result = talloc_asprintf(ssp_slq,
0b45142
                                  "SELECT ?url WHERE "
0b45142
-                                 "{ %s . ?obj nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
0b45142
+                                 "{ %s . ?obj nie:isStoredAs ?file . ?file nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
0b45142
                                  $1, ssp_slq->slq_scope, result_limit);
0b45142
     $$ = ssp_result;
0b45142
 }
0b45142
diff --git a/include/atalk/spotlight.h b/include/atalk/spotlight.h
0b45142
index 0e64b860..19d71009 100644
0b45142
--- a/include/atalk/spotlight.h
0b45142
+++ b/include/atalk/spotlight.h
0b45142
@@ -29,8 +29,10 @@
0b45142
 #ifdef HAVE_TRACKER
0b45142
 #include <gio/gio.h>
0b45142
 #include <tracker-sparql.h>
0b45142
+#ifndef HAVE_TRACKER3
0b45142
 #include <libtracker-miner/tracker-miner.h>
0b45142
 #endif
0b45142
+#endif
0b45142
 
0b45142
 /******************************************************************************
0b45142
  * Spotlight RPC and marshalling stuff
0b45142
diff --git a/macros/netatalk.m4 b/macros/netatalk.m4
0b45142
index 3bd03ccb..33ba5575 100644
0b45142
--- a/macros/netatalk.m4
0b45142
+++ b/macros/netatalk.m4
0b45142
@@ -184,14 +184,22 @@ AC_DEFUN([AC_NETATALK_SPOTLIGHT], [
0b45142
         AC_DEFINE(HAVE_TRACKER, 1, [Define if Tracker is available])
0b45142
         AC_DEFINE_UNQUOTED(TRACKER_PREFIX, ["$ac_cv_tracker_install_prefix"], [Path to Tracker])
0b45142
         AC_DEFINE_UNQUOTED([DBUS_DAEMON_PATH], ["$ac_cv_dbus_daemon"], [Path to dbus-daemon])
0b45142
+
0b45142
+        ac_cv_tracker_pkg_version_MAJOR=`echo $ac_cv_tracker_pkg_version | cut -d. -f1`
0b45142
+        if test $ac_cv_tracker_pkg_version_MAJOR -ge 3 ; then
0b45142
+          AC_DEFINE(HAVE_TRACKER3, 1, [Define if Tracker3 is used])
0b45142
+        fi
0b45142
     fi
0b45142
 
0b45142
     dnl Tracker Managing Command
0b45142
     if test x"$ac_cv_have_tracker" = x"yes" ; then
0b45142
-        AC_CHECK_PROGS(ac_cv_tracker_manage, tracker tracker-control, , ["$ac_cv_tracker_prefix"/bin])
0b45142
+        AC_CHECK_PROGS(ac_cv_tracker_manage, tracker tracker3 tracker-control, , ["$ac_cv_tracker_prefix"/bin])
0b45142
         if test x"$ac_cv_tracker_manage" = x"tracker" ; then
0b45142
            TRACKER_MANAGING_COMMAND="tracker daemon"
0b45142
            AC_DEFINE(TRACKER_MANAGING_COMMAND, "tracker daemon", [tracker managing command])
0b45142
+        elif test x"$ac_cv_tracker_manage" = x"tracker3" ; then
0b45142
+           TRACKER_MANAGING_COMMAND="tracker3 daemon"
0b45142
+           AC_DEFINE(TRACKER_MANAGING_COMMAND, "tracker3 daemon", [tracker managing command])
0b45142
         elif test x"$ac_cv_tracker_manage" = x"tracker-control" ; then
0b45142
            TRACKER_MANAGING_COMMAND="tracker-control"
0b45142
            AC_DEFINE(TRACKER_MANAGING_COMMAND, "tracker-control", [tracker managing command])