[tracker] libtracker-client: Make it able to cancel individual calls.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-client: Make it able to cancel individual calls.
- Date: Fri, 25 Sep 2009 11:42:15 +0000 (UTC)
commit e27be0c0cb6029adad32106dc69febc8ed948c90
Author: Carlos Garnacho <carlos lanedo com>
Date: Fri Sep 25 13:37:38 2009 +0200
libtracker-client: Make it able to cancel individual calls.
All async functions return a guint which can be used in tracker_cancel_call()
so the call is cancelled, tracker_cancel_last_call() now also uses this
infrastructure, although this function should be deprecated/removed at some
point.
src/libtracker-client/tracker.c | 327 +++++++++++++++++++++++++++------------
src/libtracker-client/tracker.h | 26 ++--
2 files changed, 245 insertions(+), 108 deletions(-)
---
diff --git a/src/libtracker-client/tracker.c b/src/libtracker-client/tracker.c
index 84a7e2c..6cc197c 100644
--- a/src/libtracker-client/tracker.c
+++ b/src/libtracker-client/tracker.c
@@ -34,20 +34,33 @@
#define TRACKER_INTERFACE_STATISTICS "org.freedesktop.Tracker1.Statistics"
typedef struct {
- TrackerReplyArray callback;
- gpointer data;
+ DBusGProxy *proxy;
+ DBusGProxyCall *pending_call;
+} PendingCallData;
+
+typedef struct {
+ TrackerReplyArray callback;
+ gpointer data;
+ TrackerClient *client;
+ guint id;
} CallbackArray;
typedef struct {
- TrackerReplyGPtrArray callback;
- gpointer data;
+ TrackerReplyGPtrArray callback;
+ gpointer data;
+ TrackerClient *client;
+ guint id;
} CallbackGPtrArray;
typedef struct {
- TrackerReplyVoid callback;
- gpointer data;
+ TrackerReplyVoid callback;
+ gpointer data;
+ TrackerClient *client;
+ guint id;
} CallbackVoid;
+static guint pending_call_id = 0;
+
static void
tracker_GPtrArray_reply (DBusGProxy *proxy,
GPtrArray *OUT_result,
@@ -59,6 +72,9 @@ tracker_GPtrArray_reply (DBusGProxy *proxy,
s = user_data;
+ g_hash_table_remove (s->client->pending_calls,
+ GUINT_TO_POINTER (s->id));
+
(*(TrackerReplyGPtrArray) s->callback) (OUT_result,
error,
s->data);
@@ -76,6 +92,9 @@ tracker_void_reply (DBusGProxy *proxy,
s = user_data;
+ g_hash_table_remove (s->client->pending_calls,
+ GUINT_TO_POINTER (s->id));
+
(*(TrackerReplyVoid) s->callback) (error,
s->data);
@@ -168,6 +187,35 @@ start_service (DBusConnection *connection,
return TRUE;
}
+static guint
+pending_call_new (TrackerClient *client,
+ DBusGProxy *proxy,
+ DBusGProxyCall *pending_call)
+{
+ PendingCallData *data;
+ guint id;
+
+ id = ++pending_call_id;
+
+ data = g_slice_new (PendingCallData);
+ data->proxy = proxy;
+ data->pending_call = pending_call;
+
+ g_hash_table_insert (client->pending_calls,
+ GUINT_TO_POINTER (id),
+ data);
+
+ client->last_call = id;
+
+ return id;
+}
+
+static void
+pending_call_free (PendingCallData *data)
+{
+ g_slice_free (PendingCallData, data);
+}
+
TrackerClient *
tracker_connect (gboolean enable_warnings, gint timeout)
{
@@ -195,6 +243,9 @@ tracker_connect (gboolean enable_warnings, gint timeout)
client = g_new0 (TrackerClient, 1);
+ client->pending_calls = g_hash_table_new_full (NULL, NULL, NULL,
+ (GDestroyNotify) pending_call_free);
+
client->proxy_statistics =
dbus_g_proxy_new_for_name (connection,
TRACKER_SERVICE,
@@ -228,12 +279,33 @@ tracker_disconnect (TrackerClient *client)
g_free (client);
}
+gboolean
+tracker_cancel_call (TrackerClient *client,
+ guint call_id)
+{
+ PendingCallData *data;
+
+ data = g_hash_table_lookup (client->pending_calls,
+ GUINT_TO_POINTER (call_id));
+
+ if (!data) {
+ return FALSE;
+ }
+
+ dbus_g_proxy_cancel_call (data->proxy, data->pending_call);
+ g_hash_table_remove (client->pending_calls,
+ GUINT_TO_POINTER (call_id));
+
+ return TRUE;
+}
+
void
tracker_cancel_last_call (TrackerClient *client)
{
-
- dbus_g_proxy_cancel_call (client->pending_proxy,
- client->pending_call);
+ if (client->last_call != 0) {
+ tracker_cancel_call (client, client->last_call);
+ client->last_call = 0;
+ }
}
/* dbus synchronous calls */
@@ -307,120 +379,156 @@ tracker_resources_batch_commit (TrackerClient *client,
&*error);
}
-void
+guint
tracker_statistics_get_async (TrackerClient *client,
TrackerReplyGPtrArray callback,
gpointer user_data)
{
CallbackGPtrArray *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackGPtrArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_statistics;
- client->pending_call =
- org_freedesktop_Tracker1_Statistics_get_async (client->proxy_statistics,
- tracker_GPtrArray_reply,
+ call = org_freedesktop_Tracker1_Statistics_get_async (client->proxy_statistics,
+ tracker_GPtrArray_reply,
s);
+
+ id = pending_call_new (client, client->proxy_statistics, call);
+ s->id = id;
+
+ return id;
}
-void
+guint
tracker_resources_load_async (TrackerClient *client,
const gchar *uri,
TrackerReplyVoid callback,
gpointer user_data)
{
CallbackVoid *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackVoid, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_load_async (client->proxy_resources,
- uri,
- tracker_void_reply,
+ call = org_freedesktop_Tracker1_Resources_load_async (client->proxy_resources,
+ uri,
+ tracker_void_reply,
s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
+
+ return id;
}
-void
+guint
tracker_resources_sparql_query_async (TrackerClient *client,
const gchar *query,
TrackerReplyGPtrArray callback,
gpointer user_data)
{
CallbackGPtrArray *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackGPtrArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
- query,
- tracker_GPtrArray_reply,
+ call = org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
+ query,
+ tracker_GPtrArray_reply,
s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
+
+ return id;
}
-void
+guint
tracker_resources_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data)
{
CallbackVoid *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackVoid, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_update_async (client->proxy_resources,
- query,
- tracker_void_reply,
+ call = org_freedesktop_Tracker1_Resources_sparql_update_async (client->proxy_resources,
+ query,
+ tracker_void_reply,
s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
+
+ return id;
}
-void
+guint
tracker_resources_batch_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data)
{
CallbackVoid *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackVoid, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_batch_sparql_update_async (client->proxy_resources,
- query,
- tracker_void_reply,
+ call = org_freedesktop_Tracker1_Resources_batch_sparql_update_async (client->proxy_resources,
+ query,
+ tracker_void_reply,
s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
+
+ return id;
}
-void
+guint
tracker_resources_batch_commit_async (TrackerClient *client,
TrackerReplyVoid callback,
gpointer user_data)
{
CallbackVoid *s;
+ DBusGProxyCall *call;
+ guint id;
s = g_new0 (CallbackVoid, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_batch_commit_async (client->proxy_resources,
- tracker_void_reply,
+ call = org_freedesktop_Tracker1_Resources_batch_commit_async (client->proxy_resources,
+ tracker_void_reply,
s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
+
+ return id;
}
/* tracker_search_metadata_by_text_async is used by GTK+ */
@@ -438,6 +546,9 @@ tracker_search_reply (DBusGProxy *proxy,
s = user_data;
+ g_hash_table_remove (s->client->pending_calls,
+ GUINT_TO_POINTER (s->id));
+
uris = g_new0 (gchar *, OUT_result->len + 1);
for (i = 0; i < OUT_result->len; i++) {
uris[i] = ((gchar **) OUT_result->pdata[i])[0];
@@ -487,7 +598,7 @@ sparql_append_string_literal (GString *sparql,
g_string_append_c (sparql, '"');
}
-void
+guint
tracker_search_metadata_by_text_async (TrackerClient *client,
const gchar *query,
TrackerReplyArray callback,
@@ -495,30 +606,36 @@ tracker_search_metadata_by_text_async (TrackerClient *client,
{
CallbackArray *s;
GString *sparql;
+ DBusGProxyCall *call;
+ guint id;
- g_return_if_fail (client != NULL);
- g_return_if_fail (query != NULL);
- g_return_if_fail (callback != NULL);
+ g_return_val_if_fail (client != NULL, 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
s = g_new0 (CallbackArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
sparql = g_string_new ("SELECT ?file WHERE { ?file a nfo:FileDataObject ; fts:match ");
sparql_append_string_literal (sparql, query);
g_string_append (sparql, " }");
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
- sparql->str,
- tracker_search_reply,
- s);
+ call = org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
+ sparql->str,
+ tracker_search_reply,
+ s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
g_string_free (sparql, TRUE);
+
+ return id;
}
-void
+guint
tracker_search_metadata_by_text_and_location_async (TrackerClient *client,
const gchar *query,
const gchar *location,
@@ -527,15 +644,18 @@ tracker_search_metadata_by_text_and_location_async (TrackerClient *clien
{
CallbackArray *s;
GString *sparql;
+ DBusGProxyCall *call;
+ guint id;
- g_return_if_fail (client != NULL);
- g_return_if_fail (query != NULL);
- g_return_if_fail (location != NULL);
- g_return_if_fail (callback != NULL);
+ g_return_val_if_fail (client != NULL, 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (location != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
s = g_new0 (CallbackArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
sparql = g_string_new ("SELECT ?file WHERE { ?file a nfo:FileDataObject ; fts:match ");
sparql_append_string_literal (sparql, query);
@@ -543,35 +663,41 @@ tracker_search_metadata_by_text_and_location_async (TrackerClient *clien
sparql_append_string_literal (sparql, location);
g_string_append (sparql, ")) }");
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
- sparql->str,
- tracker_search_reply,
- s);
+ call = org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
+ sparql->str,
+ tracker_search_reply,
+ s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
g_string_free (sparql, TRUE);
+
+ return id;
}
-void
+guint
tracker_search_metadata_by_text_and_mime_async (TrackerClient *client,
- const gchar *query,
- const gchar **mimes,
- TrackerReplyArray callback,
- gpointer user_data)
+ const gchar *query,
+ const gchar **mimes,
+ TrackerReplyArray callback,
+ gpointer user_data)
{
CallbackArray *s;
GString *sparql;
+ DBusGProxyCall *call;
+ guint id;
gint i;
- g_return_if_fail (client != NULL);
- g_return_if_fail (query != NULL);
- g_return_if_fail (mimes != NULL);
- g_return_if_fail (callback != NULL);
+ g_return_val_if_fail (client != NULL, 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (mimes != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
s = g_new0 (CallbackArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
sparql = g_string_new ("SELECT ?file WHERE { ?file a nfo:FileDataObject ; nie:mimeType ?mime ; fts:match ");
sparql_append_string_literal (sparql, query);
@@ -585,37 +711,43 @@ tracker_search_metadata_by_text_and_mime_async (TrackerClient *client,
}
g_string_append (sparql, ") }");
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
- sparql->str,
- tracker_search_reply,
- s);
+ call = org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
+ sparql->str,
+ tracker_search_reply,
+ s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
g_string_free (sparql, TRUE);
+
+ return id;
}
-void
+guint
tracker_search_metadata_by_text_and_mime_and_location_async (TrackerClient *client,
- const gchar *query,
- const gchar **mimes,
- const gchar *location,
- TrackerReplyArray callback,
- gpointer user_data)
+ const gchar *query,
+ const gchar **mimes,
+ const gchar *location,
+ TrackerReplyArray callback,
+ gpointer user_data)
{
CallbackArray *s;
GString *sparql;
+ DBusGProxyCall *call;
+ guint id;
gint i;
- g_return_if_fail (client != NULL);
- g_return_if_fail (query != NULL);
- g_return_if_fail (mimes != NULL);
- g_return_if_fail (location != NULL);
- g_return_if_fail (callback != NULL);
+ g_return_val_if_fail (client != NULL, 0);
+ g_return_val_if_fail (query != NULL, 0);
+ g_return_val_if_fail (mimes != NULL, 0);
+ g_return_val_if_fail (location != NULL, 0);
+ g_return_val_if_fail (callback != NULL, 0);
s = g_new0 (CallbackArray, 1);
s->callback = callback;
s->data = user_data;
+ s->client = client;
sparql = g_string_new ("SELECT ?file WHERE { ?file a nfo:FileDataObject ; nie:mimeType ?mime ; fts:match ");
sparql_append_string_literal (sparql, query);
@@ -633,13 +765,16 @@ tracker_search_metadata_by_text_and_mime_and_location_async (TrackerClient
g_string_append (sparql, ")");
g_string_append (sparql, ") }");
- client->pending_proxy = client->proxy_resources;
- client->pending_call =
- org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
- sparql->str,
- tracker_search_reply,
- s);
+ call = org_freedesktop_Tracker1_Resources_sparql_query_async (client->proxy_resources,
+ sparql->str,
+ tracker_search_reply,
+ s);
+
+ id = pending_call_new (client, client->proxy_resources, call);
+ s->id = id;
g_string_free (sparql, TRUE);
+
+ return id;
}
diff --git a/src/libtracker-client/tracker.h b/src/libtracker-client/tracker.h
index 0f0b9e8..a69674a 100644
--- a/src/libtracker-client/tracker.h
+++ b/src/libtracker-client/tracker.h
@@ -28,8 +28,8 @@ typedef struct {
DBusGProxy *proxy_statistics;
DBusGProxy *proxy_resources;
- DBusGProxy *pending_proxy;
- DBusGProxyCall *pending_call;
+ GHashTable *pending_calls;
+ guint last_call;
} TrackerClient;
typedef void (*TrackerReplyArray) (gchar **result,
@@ -41,6 +41,8 @@ typedef void (*TrackerReplyGPtrArray) (GPtrArray *result,
typedef void (*TrackerReplyVoid) (GError *error,
gpointer user_data);
+gboolean tracker_cancel_call (TrackerClient *client,
+ guint call_id);
void tracker_cancel_last_call (TrackerClient *client);
gchar * tracker_sparql_escape (const gchar *str);
@@ -67,43 +69,43 @@ void tracker_resources_batch_sparql_update (TrackerClient
void tracker_resources_batch_commit (TrackerClient *client,
GError **error);
/* Asynchronous API */
-void tracker_statistics_get_async (TrackerClient *client,
+guint tracker_statistics_get_async (TrackerClient *client,
TrackerReplyGPtrArray callback,
gpointer user_data);
-void tracker_resources_load_async (TrackerClient *client,
+guint tracker_resources_load_async (TrackerClient *client,
const gchar *uri,
TrackerReplyVoid callback,
gpointer user_data);
-void tracker_resources_sparql_query_async (TrackerClient *client,
+guint tracker_resources_sparql_query_async (TrackerClient *client,
const gchar *query,
TrackerReplyGPtrArray callback,
gpointer user_data);
-void tracker_resources_sparql_update_async (TrackerClient *client,
+guint tracker_resources_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data);
-void tracker_resources_batch_sparql_update_async (TrackerClient *client,
+guint tracker_resources_batch_sparql_update_async (TrackerClient *client,
const gchar *query,
TrackerReplyVoid callback,
gpointer user_data);
-void tracker_resources_batch_commit_async (TrackerClient *client,
+guint tracker_resources_batch_commit_async (TrackerClient *client,
TrackerReplyVoid callback,
gpointer user_data);
-void tracker_search_metadata_by_text_async (TrackerClient *client,
+guint tracker_search_metadata_by_text_async (TrackerClient *client,
const gchar *query,
TrackerReplyArray callback,
gpointer user_data);
-void tracker_search_metadata_by_text_and_location_async (TrackerClient *client,
+guint tracker_search_metadata_by_text_and_location_async (TrackerClient *client,
const gchar *query,
const gchar *location,
TrackerReplyArray callback,
gpointer user_data);
-void tracker_search_metadata_by_text_and_mime_async (TrackerClient *client,
+guint tracker_search_metadata_by_text_and_mime_async (TrackerClient *client,
const gchar *query,
const gchar **mimes,
TrackerReplyArray callback,
gpointer user_data);
-void tracker_search_metadata_by_text_and_mime_and_location_async (TrackerClient *client,
+guint tracker_search_metadata_by_text_and_mime_and_location_async (TrackerClient *client,
const gchar *query,
const gchar **mimes,
const gchar *location,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]