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) {