From e1dd392702012d024b169db782b88c4717351b56 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Wed, 17 Oct 2012 01:08:25 +0200 Subject: [PATCH] Add tracker_miner_manager and try to manually index new files Doesn't work, hangs in tracker_miner_manager_new_full() for an unknown reason. --- etc/afpd/Makefile.am | 4 ++-- etc/afpd/file.c | 5 ++--- etc/afpd/spotlight.c | 9 +++++++++ etc/afpd/spotlight.h | 3 ++- etc/afpd/spotlight_module.c | 40 ++++++++++++++++++++++++++++++++++++- macros/netatalk.m4 | 20 ++++++++++++++++++- 6 files changed, 73 insertions(+), 8 deletions(-) diff --git a/etc/afpd/Makefile.am b/etc/afpd/Makefile.am index d870d703..31f0b047 100644 --- a/etc/afpd/Makefile.am +++ b/etc/afpd/Makefile.am @@ -87,6 +87,6 @@ moduledir = @UAMS_PATH@ module_LTLIBRARIES = mod_spotlight.la mod_spotlight_la_SOURCES = spotlight_module.c -mod_spotlight_la_CFLAGS = -DDBUS_API_SUBJECT_TO_CHANGE @TRACKER_CFLAGS@ -mod_spotlight_la_LDFLAGS = -module -avoid-version @TRACKER_LIBS@ +mod_spotlight_la_CFLAGS = -DDBUS_API_SUBJECT_TO_CHANGE @TRACKER_CFLAGS@ @TRACKER_MINER_CFLAGS@ +mod_spotlight_la_LDFLAGS = -module -avoid-version @TRACKER_LIBS@ @TRACKER_MINER_LIBS@ endif diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 407dc6f9..d97863d1 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -34,6 +34,7 @@ #include "file.h" #include "filedir.h" #include "unix.h" +#include "spotlight.h" /* the format for the finderinfo fields (from IM: Toolbox Essentials): * field bytes subfield bytes @@ -738,10 +739,8 @@ createfile_iderr: ad_flush(&ad); ad_close(&ad, ADFLAGS_DF|ADFLAGS_HF ); fce_register_new_file(s_path); - -createfile_done: + sl_index_file(path); curdir->d_offcnt++; - setvoltime(obj, vol ); return (retvalue); diff --git a/etc/afpd/spotlight.c b/etc/afpd/spotlight.c index 52e2e340..cede06d2 100644 --- a/etc/afpd/spotlight.c +++ b/etc/afpd/spotlight.c @@ -368,9 +368,18 @@ EC_CLEANUP: EC_EXIT; } +/** + * Index a file + **/ +void sl_index_file(const char *path) +{ + sl_module_export->sl_mod_index_file(path); +} + /************************************************************************************************** * AFP functions **************************************************************************************************/ + int afp_spotlight_rpc(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) { EC_INIT; diff --git a/etc/afpd/spotlight.h b/etc/afpd/spotlight.h index 49a8fac0..4a93c18a 100644 --- a/etc/afpd/spotlight.h +++ b/etc/afpd/spotlight.h @@ -39,10 +39,11 @@ struct sl_module_export { int (*sl_mod_fetch_result)(void *); int (*sl_mod_end_search) (void *); int (*sl_mod_error) (void *); + int (*sl_mod_index_file) (const void *); }; extern int sl_mod_load(const char *path); - +extern void sl_index_file(const char *path); /************************************************************************************************** * Spotlight RPC and marshalling stuff diff --git a/etc/afpd/spotlight_module.c b/etc/afpd/spotlight_module.c index f5321cd1..d38abebb 100644 --- a/etc/afpd/spotlight_module.c +++ b/etc/afpd/spotlight_module.c @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -289,11 +290,48 @@ EC_CLEANUP: EC_EXIT; } +static int sl_mod_index_file(const void *p) +{ +#ifdef HAVE_TRACKER_MINER + /* hangs in tracker_miner_manager_new_full() for whatever reason... */ + return 0; + + EC_INIT; + const char *f = p; + + if (!f) + goto EC_CLEANUP; + + TrackerMinerManager *manager; + GError *error = NULL; + GFile *file; + + if ((manager = tracker_miner_manager_new_full(FALSE, &error)) == NULL) { + LOG(log_error, logtype_sl, "sl_mod_index_file(\"%s\"): couldn't connect to Tracker miner", f); + } else { + file = g_file_new_for_commandline_arg(f); + tracker_miner_manager_index_file(manager, file, &error); + if (error) + LOG(log_error, logtype_sl, "sl_mod_index_file(\"%s\"): indexing failed", f); + else + LOG(log_debug, logtype_sl, "sl_mod_index_file(\"%s\"): indexing file was successful", f); + g_object_unref(manager); + g_object_unref(file); + } + +EC_CLEANUP: + EC_EXIT; +#else + return 0; +#endif +} + struct sl_module_export sl_mod = { SL_MODULE_VERSION, sl_mod_init, sl_mod_start_search, sl_mod_fetch_result, sl_mod_close_query, - sl_mod_error + sl_mod_error, + sl_mod_index_file }; diff --git a/macros/netatalk.m4 b/macros/netatalk.m4 index 50d209c2..72867803 100644 --- a/macros/netatalk.m4 +++ b/macros/netatalk.m4 @@ -28,12 +28,30 @@ AC_DEFUN([AC_NETATALK_SPOTLIGHT], [ if test x"$ac_cv_have_tracker" = x"no" ; then if test x"$need_tracker" = x"yes" ; then AC_MSG_ERROR([$ac_cv_tracker_pkg not found]) + fi + else + AC_DEFINE(HAVE_TRACKER, 1, [Define if Tracker library is available]) fi - fi AC_SUBST(TRACKER_CFLAGS) AC_SUBST(TRACKER_LIBS) AM_CONDITIONAL(HAVE_TRACKER, [test x"$ac_cv_have_tracker" = x"yes"]) + + ac_cv_tracker_miner_pkg_default=tracker-miner-0.12 + AC_ARG_WITH([tracker-miner-pkg-config], + [AS_HELP_STRING([--with-tracker-miner-pkg-config],[name of the Tracker miner pkg in pkg-config])], + [ac_cv_tracker_miner_pkg=$withval], + [ac_cv_tracker_miner_pkg=$ac_cv_tracker_miner_pkg_default]) + + AC_MSG_NOTICE([searching for $ac_cv_tracker_miner_pkg]) + + PKG_CHECK_MODULES([TRACKER_MINER], [$ac_cv_tracker_miner_pkg >= 0.12], [ac_cv_have_tracker_miner=yes], [ac_cv_have_tracker_miner=no]) + + if test x"$ac_cv_have_tracker_miner" = x"yes" ; then + AC_DEFINE(HAVE_TRACKER_MINER, 1, [Define if Tracker miner library is available]) + AC_SUBST(TRACKER_MINER_CFLAGS) + AC_SUBST(TRACKER_MINER_LIBS) + fi ]) dnl Whether to disable bundled libevent -- 2.39.2