summaryrefslogtreecommitdiffstats
path: root/glib/dbus-glib.c
diff options
context:
space:
mode:
Diffstat (limited to 'glib/dbus-glib.c')
-rw-r--r--glib/dbus-glib.c335
1 files changed, 335 insertions, 0 deletions
diff --git a/glib/dbus-glib.c b/glib/dbus-glib.c
index 4250a653..a8708736 100644
--- a/glib/dbus-glib.c
+++ b/glib/dbus-glib.c
@@ -47,6 +47,341 @@ dbus_g_connection_flush (DBusGConnection *connection)
dbus_connection_flush (DBUS_CONNECTION_FROM_G_CONNECTION (connection));
}
+/**
+ * Increment refcount on a #DBusGConnection
+ *
+ * @param connection the connection to ref
+ * @returns the connection that was ref'd
+ */
+DBusGConnection*
+dbus_g_connection_ref (DBusGConnection *gconnection)
+{
+ DBusConnection *c;
+
+ c = DBUS_CONNECTION_FROM_G_CONNECTION (gconnection);
+ dbus_connection_ref (c);
+ return gconnection;
+}
+
+
+/**
+ * Decrement refcount on a #DBusGConnection
+ *
+ * @param connection the connection to unref
+ */
+void
+dbus_g_connection_unref (DBusGConnection *gconnection)
+{
+ DBusConnection *c;
+
+ c = DBUS_CONNECTION_FROM_G_CONNECTION (gconnection);
+ dbus_connection_unref (c);
+}
+
+
+/**
+ * Increment refcount on a #DBusGMessage
+ *
+ * @param message the message to ref
+ * @returns the message that was ref'd
+ */
+DBusGMessage*
+dbus_g_message_ref (DBusGMessage *gmessage)
+{
+ DBusMessage *c;
+
+ c = DBUS_MESSAGE_FROM_G_MESSAGE (gmessage);
+ dbus_message_ref (c);
+ return gmessage;
+}
+
+/**
+ * Decrement refcount on a #DBusGMessage
+ *
+ * @param message the message to unref
+ */
+void
+dbus_g_message_unref (DBusGMessage *gmessage)
+{
+ DBusMessage *c;
+
+ c = DBUS_MESSAGE_FROM_G_MESSAGE (gmessage);
+ dbus_message_unref (c);
+}
+
+/**
+ * Increments refcount on a pending call.
+ *
+ * @param call the call
+ * @returns the same call
+ */
+DBusGPendingCall*
+dbus_g_pending_call_ref (DBusGPendingCall *call)
+{
+ dbus_pending_call_ref (DBUS_PENDING_CALL_FROM_G_PENDING_CALL (call));
+ return call;
+}
+
+/**
+ * Decrements refcount on a pending call.
+ *
+ * @param call the call
+ */
+void
+dbus_g_pending_call_unref (DBusGPendingCall *call)
+{
+ dbus_pending_call_unref (DBUS_PENDING_CALL_FROM_G_PENDING_CALL (call));
+}
+
+/**
+ * The implementation of DBUS_GERROR error domain. See documentation
+ * for GError in GLib reference manual.
+ *
+ * @returns the error domain quark for use with GError
+ */
+GQuark
+dbus_g_error_quark (void)
+{
+ static GQuark quark = 0;
+ if (quark == 0)
+ quark = g_quark_from_static_string ("g-exec-error-quark");
+ return quark;
+}
+
+
+/**
+ * Set a GError return location from a DBusError.
+ *
+ * @todo expand the DBUS_GERROR enum and take advantage of it here
+ *
+ * @param gerror location to store a GError, or #NULL
+ * @param derror the DBusError
+ */
+void
+dbus_set_g_error (GError **gerror,
+ DBusError *derror)
+{
+ g_return_if_fail (derror != NULL);
+ g_return_if_fail (dbus_error_is_set (derror));
+
+ g_set_error (gerror, DBUS_GERROR,
+ DBUS_GERROR_FAILED,
+ _("D-BUS error %s: %s"),
+ derror->name, derror->message);
+}
+
+/**
+ * Get the GLib type ID for a DBusConnection boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_connection_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusConnection",
+ (GBoxedCopyFunc) dbus_connection_ref,
+ (GBoxedFreeFunc) dbus_connection_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the GLib type ID for a DBusMessage boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_message_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusMessage",
+ (GBoxedCopyFunc) dbus_message_ref,
+ (GBoxedFreeFunc) dbus_message_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the GLib type ID for a DBusPendingCall boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_pending_call_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusPendingCall",
+ (GBoxedCopyFunc) dbus_pending_call_ref,
+ (GBoxedFreeFunc) dbus_pending_call_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the GLib type ID for a DBusGConnection boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_g_connection_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusGConnection",
+ (GBoxedCopyFunc) dbus_g_connection_ref,
+ (GBoxedFreeFunc) dbus_g_connection_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the GLib type ID for a DBusGMessage boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_g_message_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusGMessage",
+ (GBoxedCopyFunc) dbus_g_message_ref,
+ (GBoxedFreeFunc) dbus_g_message_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the GLib type ID for a DBusGPendingCall boxed type.
+ *
+ * @returns GLib type
+ */
+GType
+dbus_g_pending_call_get_g_type (void)
+{
+ static GType our_type = 0;
+
+ if (our_type == 0)
+ our_type = g_boxed_type_register_static ("DBusGPendingCall",
+ (GBoxedCopyFunc) dbus_g_pending_call_ref,
+ (GBoxedFreeFunc) dbus_g_pending_call_unref);
+
+ return our_type;
+}
+
+/**
+ * Get the DBusConnection corresponding to this DBusGConnection.
+ * The return value does not have its refcount incremented.
+ *
+ * @returns DBusConnection
+ */
+DBusConnection*
+dbus_g_connection_get_connection (DBusGConnection *gconnection)
+{
+ return DBUS_CONNECTION_FROM_G_CONNECTION (gconnection);
+}
+
+/**
+ * Get the DBusMessage corresponding to this DBusGMessage.
+ * The return value does not have its refcount incremented.
+ *
+ * @returns DBusMessage
+ */
+DBusMessage*
+dbus_g_message_get_message (DBusGMessage *gmessage)
+{
+ return DBUS_MESSAGE_FROM_G_MESSAGE (gmessage);
+}
+
+typedef struct
+{
+ DBusGPendingCallNotify func;
+ void *data;
+ GDestroyNotify free_data_func;
+} GPendingNotifyClosure;
+
+static void
+d_pending_call_notify (DBusPendingCall *dcall,
+ void *data)
+{
+ GPendingNotifyClosure *closure = data;
+ DBusGPendingCall *gcall = DBUS_G_PENDING_CALL_FROM_PENDING_CALL (dcall);
+
+ (* closure->func) (gcall, closure->data);
+}
+
+static void
+d_pending_call_free (void *data)
+{
+ GPendingNotifyClosure *closure = data;
+
+ if (closure->free_data_func)
+ (* closure->free_data_func) (closure->data);
+
+ g_free (closure);
+}
+
+/**
+ * Sets up a notification to be invoked when the pending call
+ * is ready to be ended without blocking.
+ * You can call dbus_g_proxy_end_call() at any time,
+ * but it will block if no reply or error has been received yet.
+ * This function lets you handle the reply asynchronously.
+ *
+ * @param call the pending call
+ * @param callback the callback
+ * @param callback_data data for the callback
+ * @param free_data_func free the callback data with this
+ */
+void
+dbus_g_pending_call_set_notify (DBusGPendingCall *call,
+ DBusGPendingCallNotify callback,
+ void *callback_data,
+ GDestroyNotify free_data_func)
+{
+ GPendingNotifyClosure *closure;
+ DBusPendingCall *dcall;
+
+ g_return_if_fail (callback != NULL);
+
+ closure = g_new (GPendingNotifyClosure, 1);
+
+ closure->func = callback;
+ closure->data = callback_data;
+ closure->free_data_func = free_data_func;
+
+ dcall = DBUS_PENDING_CALL_FROM_G_PENDING_CALL (call);
+ dbus_pending_call_set_notify (dcall, d_pending_call_notify,
+ closure,
+ d_pending_call_free);
+}
+
+/**
+ * Cancels a pending call. Does not affect the reference count
+ * of the call, but it means you will never be notified of call
+ * completion, and can't call dbus_g_proxy_end_call().
+ *
+ * @param call the call
+ */
+void
+dbus_g_pending_call_cancel (DBusGPendingCall *call)
+{
+ DBusPendingCall *dcall;
+
+ dcall = DBUS_PENDING_CALL_FROM_G_PENDING_CALL (call);
+
+ dbus_pending_call_cancel (dcall);
+}
+
/** @} */ /* end of public API */