From 8ecd30d578ebac46bbdf5f6d5c0b7cad1187f84f Mon Sep 17 00:00:00 2001 From: davemds Date: Thu, 28 Feb 2013 20:33:29 +0100 Subject: [PATCH] Add a new API to edbus to let it create an EDbus session from an existing DBus connection. This is needed by the python bindings, was done the same way in edbus1, so it should fit here also NOTE: I did not test this yet, and I'm not into the edbus code, so I please who know the code to give a look. thanks NOTE2: I don't think this need Changelog and stuff as we are probably the only users of this function, let me know if i'm wrong --- src/lib/edbus/edbus_connection.h | 11 +++++++++++ src/lib/edbus/edbus_core.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/lib/edbus/edbus_connection.h b/src/lib/edbus/edbus_connection.h index 5573f204a4..72152321c9 100644 --- a/src/lib/edbus/edbus_connection.h +++ b/src/lib/edbus/edbus_connection.h @@ -58,6 +58,17 @@ EAPI EDBus_Connection *edbus_connection_ref(EDBus_Connection *conn) EINA_ARG_NON */ EAPI void edbus_connection_unref(EDBus_Connection *conn) EINA_ARG_NONNULL(1); +/** + * Integrate an existing DBus connection with the ecore main loop + * + * @param type - type of bus + * @param conn - a dbus connection (must be a DBusConnection *) + * + * @note this is a low-level function, it is meant to be used by language + * bindings, don't use unless you know what are you doing! + */ +EAPI EDBus_Connection *edbus_connection_from_dbus_connection(EDBus_Connection_Type type, void *conn); + /** * @brief Add a callback function to be called when connection is freed * diff --git a/src/lib/edbus/edbus_core.c b/src/lib/edbus/edbus_core.c index 2fb5c6dc33..6f8daf8d7f 100644 --- a/src/lib/edbus/edbus_core.c +++ b/src/lib/edbus/edbus_core.c @@ -975,6 +975,34 @@ _connection_get(EDBus_Connection_Type type) return conn; } +EAPI EDBus_Connection * +edbus_connection_from_dbus_connection(EDBus_Connection_Type type, void *conn) +{ + EDBus_Connection *econn; + EDBus_Object *obj; + + EINA_SAFETY_ON_FALSE_RETURN_VAL((type < EDBUS_CONNECTION_TYPE_LAST) && + (type > EDBUS_CONNECTION_TYPE_UNKNOWN), NULL); + + econn = calloc(1, sizeof(EDBus_Connection)); + EINA_SAFETY_ON_NULL_RETURN_VAL(econn, NULL); + + econn->dbus_conn = (DBusConnection*) conn; + edbus_connection_setup(econn); + econn->type = type; + econn->refcount = 1; + EINA_MAGIC_SET(econn, EDBUS_CONNECTION_MAGIC); + econn->names = eina_hash_string_superfast_new(NULL); + + edbus_signal_handler_add(econn, NULL, DBUS_PATH_LOCAL, DBUS_INTERFACE_LOCAL, + "Disconnected", _disconnected, econn); + obj = edbus_object_get(econn, EDBUS_FDO_BUS, EDBUS_FDO_PATH); + econn->fdo_proxy = edbus_proxy_get(obj, EDBUS_FDO_INTERFACE); + + DBG("Attached to connection at %p", conn); + return econn; +} + EAPI EDBus_Connection * edbus_private_connection_get(EDBus_Connection_Type type) {