summaryrefslogtreecommitdiff
path: root/src/miners/fs/tracker-miner-files.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-06-18 01:31:07 +0200
committerCarlos Garnacho <carlosg@gnome.org>2017-06-29 20:49:05 +0200
commit5795f54962e2455fb6cf28a3c52d12564ce9a86f (patch)
treeef8a7b7244ae8d0b53bb00d74c83542f80cd263f /src/miners/fs/tracker-miner-files.c
parent80d1eb556bf09cf22664ec495bcfb5efba3e3b0c (diff)
downloadtracker-5795f54962e2455fb6cf28a3c52d12564ce9a86f.tar.gz
tracker-miner-fs: Adopt TrackerThumbnailer from libtracker-miner
It makes no sense to have that at the library level, just move thumbnail handling to TrackerMinerFiles. Coincidentally, this removes further queries that required knowledge about the ontology in TrackerMinerFS.
Diffstat (limited to 'src/miners/fs/tracker-miner-files.c')
-rw-r--r--src/miners/fs/tracker-miner-files.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/miners/fs/tracker-miner-files.c b/src/miners/fs/tracker-miner-files.c
index 3c86bbdbc..93b1b3da2 100644
--- a/src/miners/fs/tracker-miner-files.c
+++ b/src/miners/fs/tracker-miner-files.c
@@ -45,6 +45,7 @@
#include "tracker-config.h"
#include "tracker-storage.h"
#include "tracker-extract-watchdog.h"
+#include "tracker-thumbnailer.h"
#define DISK_SPACE_CHECK_FREQUENCY 10
#define SECONDS_PER_DAY 86400
@@ -104,8 +105,15 @@ struct TrackerMinerFilesPrivate {
guint stale_volumes_check_id;
GList *extraction_queue;
+
+ TrackerThumbnailer *thumbnailer;
};
+typedef struct {
+ GMainLoop *main_loop;
+ TrackerMiner *miner;
+} ThumbnailMoveData;
+
enum {
VOLUME_MOUNTED_IN_STORE = 1 << 0,
VOLUME_MOUNTED = 1 << 1
@@ -565,6 +573,7 @@ miner_files_initable_init (GInitable *initable,
disk_space_check_start (mf);
mf->private->extract_watchdog = tracker_extract_watchdog_new ();
+ mf->private->thumbnailer = tracker_thumbnailer_new ();
return TRUE;
}
@@ -666,6 +675,10 @@ miner_files_finalize (GObject *object)
priv->stale_volumes_check_id = 0;
}
+ if (priv->thumbnailer) {
+ g_object_unref (priv->thumbnailer);
+ }
+
g_list_free (priv->extraction_queue);
G_OBJECT_CLASS (tracker_miner_files_parent_class)->finalize (object);
@@ -2438,6 +2451,11 @@ miner_files_finished (TrackerMinerFS *fs,
gint files_found,
gint files_ignored)
{
+ TrackerMinerFilesPrivate *priv = TRACKER_MINER_FILES (fs)->private;
+
+ if (priv->thumbnailer)
+ tracker_thumbnailer_send (priv->thumbnailer);
+
tracker_miner_files_set_last_crawl_done (TRUE);
}
@@ -2488,15 +2506,59 @@ static gchar *
miner_files_remove_file (TrackerMinerFS *fs,
GFile *file)
{
+ TrackerMinerFilesPrivate *priv = TRACKER_MINER_FILES (fs)->private;
+
+ if (priv->thumbnailer) {
+ gchar *uri;
+
+ uri = g_file_get_uri (file);
+ tracker_thumbnailer_remove_add (priv->thumbnailer, uri, NULL);
+ g_free (uri);
+ }
+
return create_delete_sparql (file, TRUE, TRUE);
}
+static void
+move_thumbnails_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ ThumbnailMoveData *data = user_data;
+ TrackerMinerFilesPrivate *priv = TRACKER_MINER_FILES (data->miner)->private;
+ GError *error = NULL;
+
+ TrackerSparqlCursor *cursor = tracker_sparql_connection_query_finish (TRACKER_SPARQL_CONNECTION (object), result, &error);
+
+ if (error) {
+ g_critical ("Could move thumbnails: %s", error->message);
+ g_error_free (error);
+ } else {
+ while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+ const gchar *src, *dst, *mimetype;
+
+ src = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+ dst = tracker_sparql_cursor_get_string (cursor, 1, NULL);
+ mimetype = tracker_sparql_cursor_get_string (cursor, 2, NULL);
+
+ if (priv->thumbnailer) {
+ tracker_thumbnailer_move_add (priv->thumbnailer,
+ src, mimetype, dst);
+ }
+ }
+ }
+
+ g_object_unref (cursor);
+ g_main_loop_quit (data->main_loop);
+}
+
static gchar *
miner_files_move_file (TrackerMinerFS *fs,
GFile *file,
GFile *source_file,
gboolean recursive)
{
+ TrackerMinerFilesPrivate *priv = TRACKER_MINER_FILES (fs)->private;
GString *sparql = g_string_new (NULL);
const gchar *new_parent_iri;
gchar *uri, *source_uri, *display_name;
@@ -2508,6 +2570,48 @@ miner_files_move_file (TrackerMinerFS *fs,
source_uri = g_file_get_uri (source_file);
source_iri = tracker_miner_fs_query_urn (fs, file);
+ if (priv->thumbnailer) {
+ GFileInfo *file_info;
+
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL, NULL);
+ tracker_thumbnailer_move_add (priv->thumbnailer, source_uri,
+ g_file_info_get_content_type (file_info),
+ uri);
+ g_object_unref (file_info);
+
+ if (recursive) {
+ ThumbnailMoveData move_data;
+ gchar *query;
+
+ g_debug ("Moving thumbnails within '%s'", uri);
+
+ /* Push all moved files to thumbnailer */
+ move_data.main_loop = g_main_loop_new (NULL, FALSE);
+ move_data.miner = TRACKER_MINER (fs);
+
+ query = g_strdup_printf ("SELECT ?url ?new_url nie:mimeType(?u) {"
+ " ?u a rdfs:Resource ;"
+ " nie:url ?url ."
+ " BIND (CONCAT (\"%s/\", SUBSTR (?url, STRLEN (\"%s/\") + 1)) AS ?new_url) ."
+ " FILTER (STRSTARTS (?url, \"%s/\"))"
+ "}",
+ uri, source_uri, source_uri);
+
+ tracker_sparql_connection_query_async (tracker_miner_get_connection (TRACKER_MINER (fs)),
+ query,
+ NULL,
+ move_thumbnails_cb,
+ &move_data);
+
+ g_main_loop_run (move_data.main_loop);
+ g_main_loop_unref (move_data.main_loop);
+ g_free (query);
+ }
+ }
+
path = g_file_get_path (file);
basename = g_filename_display_basename (path);
display_name = tracker_sparql_escape_string (basename);