From 47a9b96b64e9fd949adf4dd1fbd26c5d75a5df30 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 Jan 2009 16:26:34 +0100 Subject: add some helpers for dealing with DBusPendingCall based on Mrc-Andre's work in module-bluetooth-discover --- src/modules/dbus-util.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/modules/dbus-util.h | 24 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+) (limited to 'src/modules') diff --git a/src/modules/dbus-util.c b/src/modules/dbus-util.c index 1fc1e86f..f6a986a5 100644 --- a/src/modules/dbus-util.c +++ b/src/modules/dbus-util.c @@ -382,3 +382,51 @@ void pa_dbus_remove_matches(DBusConnection *c, ...) { } va_end(ap); } + +pa_dbus_pending *pa_dbus_pending_new(DBusMessage *m, DBusPendingCall *pending, void *context_data, void *call_data) { + pa_dbus_pending *p; + + pa_assert(pending); + + p = pa_xnew(pa_dbus_pending, 1); + p->message = m; + p->pending = pending; + p->context_data = context_data; + p->call_data = call_data; + + PA_LLIST_INIT(pa_dbus_pending, p); + + return p; +} + +void pa_dbus_pending_free(pa_dbus_pending *p) { + pa_assert(p); + + if (p->pending) { + dbus_pending_call_cancel(p->pending); + dbus_pending_call_unref(p->pending); + } + + if (p->message) + dbus_message_unref(p->message); + + pa_xfree(p); +} + +void pa_dbus_sync_pending_list(pa_dbus_pending **p) { + pa_assert(p); + + while (*p) + dbus_pending_call_block((*p)->pending); +} + +void pa_dbus_free_pending_list(pa_dbus_pending **p) { + pa_dbus_pending *i; + + pa_assert(p); + + while ((i = *p)) { + PA_LLIST_REMOVE(pa_dbus_pending, *p, i); + pa_dbus_pending_free(i); + } +} diff --git a/src/modules/dbus-util.h b/src/modules/dbus-util.h index 0ab87809..fd974673 100644 --- a/src/modules/dbus-util.h +++ b/src/modules/dbus-util.h @@ -25,6 +25,7 @@ #include #include +#include typedef struct pa_dbus_connection pa_dbus_connection; @@ -40,4 +41,27 @@ void pa_dbus_connection_unref(pa_dbus_connection *conn); int pa_dbus_add_matches(DBusConnection *c, DBusError *error, ...) PA_GCC_SENTINEL; void pa_dbus_remove_matches(DBusConnection *c, ...) PA_GCC_SENTINEL; +typedef struct pa_dbus_pending pa_dbus_pending; + +struct userdata; /* We leave the actual definition to the caller */ + +struct pa_dbus_pending { + DBusMessage *message; + DBusPendingCall *pending; + + void *context_data; + void *call_data; + + PA_LLIST_FIELDS(pa_dbus_pending); +}; + +pa_dbus_pending *pa_dbus_pending_new(DBusMessage *m, DBusPendingCall *pending, void *context_data, void *call_data); +void pa_dbus_pending_free(pa_dbus_pending *p); + +/* Sync up a list of pa_dbus_pending_call objects */ +void pa_dbus_sync_pending_list(pa_dbus_pending **p); + +/* Free up a list of pa_dbus_pending_call objects */ +void pa_dbus_free_pending_list(pa_dbus_pending **p); + #endif -- cgit