/* This function can be called in any thread */ void tracker_extract_file (TrackerExtract *extract, const gchar *file, const gchar *mimetype, const gchar *graph, GCancellable *cancellable, GAsyncReadyCallback cb, gpointer user_data) { GSimpleAsyncResult *res; GError *error = NULL; TrackerExtractTask *task; g_return_if_fail (TRACKER_IS_EXTRACT (extract)); g_return_if_fail (file != NULL); g_return_if_fail (cb != NULL); #ifdef THREAD_ENABLE_TRACE g_debug ("Thread:%p <-- '%s': Processing file\n", g_thread_self (), file); #endif /* THREAD_ENABLE_TRACE */ res = g_simple_async_result_new (G_OBJECT (extract), cb, user_data, NULL); task = extract_task_new (extract, file, mimetype, graph, cancellable, G_ASYNC_RESULT (res), &error); if (error) { g_warning ("Could not get mimetype, %s", error->message); g_simple_async_result_set_from_error (res, error); g_simple_async_result_complete_in_idle (res); g_error_free (error); } else { TrackerExtractPrivate *priv; priv = TRACKER_EXTRACT_GET_PRIVATE (task->extract); g_mutex_lock (&priv->task_mutex); priv->running_tasks = g_list_prepend (priv->running_tasks, task); g_mutex_unlock (&priv->task_mutex); g_idle_add ((GSourceFunc) dispatch_task_cb, task); } /* Task takes a ref and if this fails, we want to unref anyway */ g_object_unref (res); }
void tracker_extract_get_metadata_by_cmdline (TrackerExtract *object, const gchar *uri, const gchar *mime) { GError *error = NULL; TrackerExtractPrivate *priv; TrackerExtractTask *task; TrackerExtractInfo *info; gboolean no_modules = TRUE; priv = TRACKER_EXTRACT_GET_PRIVATE (object); priv->disable_summary_on_finalize = TRUE; g_return_if_fail (uri != NULL); task = extract_task_new (object, uri, mime, NULL, NULL, NULL, &error); if (error) { g_printerr ("Extraction failed, %s\n", error->message); g_error_free (error); return; } task->mimetype_handlers = tracker_extract_module_manager_get_mimetype_handlers (task->mimetype); task->cur_module = tracker_mimetype_info_get_module (task->mimetype_handlers, &task->cur_func, NULL); while (task->cur_module && task->cur_func) { if (!filter_module (object, task->cur_module) && get_file_metadata (task, &info)) { const gchar *preupdate_str, *postupdate_str, *statements_str, *where; TrackerSparqlBuilder *builder; no_modules = FALSE; preupdate_str = statements_str = postupdate_str = NULL; builder = tracker_extract_info_get_metadata_builder (info); if (tracker_sparql_builder_get_length (builder) > 0) { statements_str = tracker_sparql_builder_get_result (builder); } builder = tracker_extract_info_get_preupdate_builder (info); if (tracker_sparql_builder_get_length (builder) > 0) { preupdate_str = tracker_sparql_builder_get_result (builder); } builder = tracker_extract_info_get_postupdate_builder (info); if (tracker_sparql_builder_get_length (builder) > 0) { postupdate_str = tracker_sparql_builder_get_result (builder); } where = tracker_extract_info_get_where_clause (info); g_print ("\n"); g_print ("SPARQL pre-update:\n--\n%s--\n\n", preupdate_str ? preupdate_str : ""); g_print ("SPARQL item:\n--\n%s--\n\n", statements_str ? statements_str : ""); g_print ("SPARQL where clause:\n--\n%s--\n\n", where ? where : ""); g_print ("SPARQL post-update:\n--\n%s--\n\n", postupdate_str ? postupdate_str : ""); tracker_extract_info_unref (info); break; } else { if (!tracker_mimetype_info_iter_next (task->mimetype_handlers)) { break; } task->cur_module = tracker_mimetype_info_get_module (task->mimetype_handlers, &task->cur_func, NULL); } } if (no_modules) { g_print ("No modules found to handle metadata extraction\n\n"); } extract_task_free (task); }