+get_query_results (GtkSearchEngineTracker *engine,
+ const gchar *sparql,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_connection_call (engine->priv->connection,
+ DBUS_SERVICE_RESOURCES,
+ DBUS_PATH_RESOURCES,
+ DBUS_INTERFACE_RESOURCES,
+ "SparqlQuery",
+ g_variant_new ("(s)", sparql),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ QUERY_TIMEOUT_SECONDS * 1000,
+ engine->priv->cancellable,
+ callback,
+ user_data);
+}
+
+/* Stolen from libtracker-common */
+static GList *
+string_list_to_gslist (gchar **strv)
+{
+ GList *list;
+ gsize i;
+
+ list = NULL;
+
+ for (i = 0; strv[i]; i++)
+ list = g_list_prepend (list, g_strdup (strv[i]));
+
+ return g_list_reverse (list);
+}
+
+/* Stolen from libtracker-sparql */
+static gchar *
+sparql_escape_string (const gchar *literal)
+{
+ GString *str;
+ const gchar *p;
+
+ g_return_val_if_fail (literal != NULL, NULL);
+
+ str = g_string_new ("");
+ p = literal;
+
+ while (TRUE)
+ {
+ gsize len;
+
+ if (!((*p) != '\0'))
+ break;
+
+ len = strcspn ((const gchar *) p, "\t\n\r\b\f\"\\");
+ g_string_append_len (str, (const gchar *) p, (gssize) ((glong) len));
+ p = p + len;
+
+ switch (*p)
+ {
+ case '\t':
+ g_string_append (str, "\\t");
+ break;
+ case '\n':
+ g_string_append (str, "\\n");
+ break;
+ case '\r':
+ g_string_append (str, "\\r");
+ break;
+ case '\b':
+ g_string_append (str, "\\b");
+ break;
+ case '\f':
+ g_string_append (str, "\\f");
+ break;
+ case '"':
+ g_string_append (str, "\\\"");
+ break;
+ case '\\':
+ g_string_append (str, "\\\\");
+ break;
+ default:
+ continue;
+ }
+
+ p++;
+ }
+ return g_string_free (str, FALSE);
+ }
+
+static void
+sparql_append_string_literal (GString *sparql,
+ const gchar *str)
+{
+ gchar *s;
+
+ s = sparql_escape_string (str);
+
+ g_string_append_c (sparql, '"');
+ g_string_append (sparql, s);
+ g_string_append_c (sparql, '"');
+
+ g_free (s);
+}
+
+static void
+sparql_append_string_literal_lower_case (GString *sparql,
+ const gchar *str)
+{
+ gchar *s;
+
+ s = g_utf8_strdown (str, -1);
+ sparql_append_string_literal (sparql, s);
+ g_free (s);
+}
+
+static void
+query_callback (GObject *object,
+ GAsyncResult *res,
+ gpointer user_data)