From 1d8a2eceeb751f05a94e2dc8397bbb40b3904deb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Fri, 20 May 2022 11:07:51 +0200 Subject: [PATCH] [AT-SPI] Add Bridge::SetPreferredBusName() This API allows an application to register a string identifier as a bus name alias on the AT-SPI bus (e.g. "org.tizen.AppName") that remains constant across a series of activations and deactivations of AT-SPI, in contrast to the numeric bus name, which changes every time (e.g. ":1.23", ":1.27", ":1.31" etc.). Change-Id: Idaec55df4bcd73bc26befa5c03c3c1c9e3972781 --- .../adaptor-framework/accessibility-bridge.h | 12 ++++++ dali/internal/accessibility/bridge/bridge-impl.cpp | 43 ++++++++++++++++++++++ dali/internal/accessibility/bridge/dbus-tizen.cpp | 20 ++++++++++ dali/internal/accessibility/bridge/dbus.h | 4 ++ dali/internal/accessibility/bridge/dummy-atspi.h | 4 ++ 5 files changed, 83 insertions(+) diff --git a/dali/devel-api/adaptor-framework/accessibility-bridge.h b/dali/devel-api/adaptor-framework/accessibility-bridge.h index 1b59436..23af622 100644 --- a/dali/devel-api/adaptor-framework/accessibility-bridge.h +++ b/dali/devel-api/adaptor-framework/accessibility-bridge.h @@ -401,6 +401,18 @@ struct DALI_ADAPTOR_API Bridge virtual void UnembedSocket(const Address& plug, const Address& socket) = 0; /** + * @brief Sets the preferred bus name. + * + * If the Bridge is enabled, it will immediately release the previous name and request the new one. + * + * Otherwise, the Bridge will request this name on AT-SPI activation (and release it on deactivation). + * It is up to the caller to determine whether a given name will be available in the system. + * + * @param preferredBusName The preferred bus name + */ + virtual void SetPreferredBusName(std::string_view preferredBusName) = 0; + + /** * @brief Returns instance of bridge singleton object. * * @return The current bridge object diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 4cde992..f0f381b 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -27,6 +27,7 @@ // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -84,6 +85,7 @@ class BridgeImpl : public virtual BridgeBase, Dali::Timer mReadIsEnabledTimer; Dali::Timer mReadScreenReaderEnabledTimer; Dali::Timer mForceUpTimer; + std::string mPreferredBusName; public: BridgeImpl() @@ -227,6 +229,7 @@ public: mDisabledSignal.Emit(); UnembedSocket(mApplication.GetAddress(), {AtspiDbusNameRegistry, "root"}); + ReleaseBusName(mPreferredBusName); } mHighlightedActor = {}; @@ -352,6 +355,8 @@ public: } }); + RequestBusName(mPreferredBusName); + auto parentAddress = EmbedSocket(mApplication.GetAddress(), {AtspiDbusNameRegistry, "root"}); mApplication.mParent.SetAddress(std::move(parentAddress)); mEnabledSignal.Emit(); @@ -712,11 +717,49 @@ public: client.method("Unembed").call(plug); } + void SetPreferredBusName(std::string_view preferredBusName) override + { + if(preferredBusName == mPreferredBusName) + { + return; + } + + std::string oldPreferredBusName = std::move(mPreferredBusName); + mPreferredBusName = std::string{preferredBusName}; + + if(IsUp()) + { + ReleaseBusName(oldPreferredBusName); + RequestBusName(mPreferredBusName); + } + // else: request/release will be handled by ForceUp/ForceDown, respectively + } + private: DBus::DBusClient CreateSocketClient(const Address& socket) { return {socket.GetBus(), ATSPI_PREFIX_PATH + socket.GetPath(), Accessible::GetInterfaceName(AtspiInterface::SOCKET), mConnectionPtr}; } + + void RequestBusName(const std::string& busName) + { + if(busName.empty()) + { + return; + } + + DBus::requestBusName(mConnectionPtr, busName); + } + + void ReleaseBusName(const std::string& busName) + { + if(busName.empty()) + { + return; + } + + DBus::releaseBusName(mConnectionPtr, busName); + } }; // BridgeImpl namespace // unnamed namespace diff --git a/dali/internal/accessibility/bridge/dbus-tizen.cpp b/dali/internal/accessibility/bridge/dbus-tizen.cpp index bbb265d..5aaba13 100644 --- a/dali/internal/accessibility/bridge/dbus-tizen.cpp +++ b/dali/internal/accessibility/bridge/dbus-tizen.cpp @@ -169,6 +169,16 @@ std::string DBus::getConnectionName(const DBusWrapper::ConnectionPtr& c) return DBUS_W->eldbus_connection_unique_name_get_impl(c); } +void DBus::requestBusName(const DBusWrapper::ConnectionPtr& conn, const std::string& bus) +{ + DBUS_W->eldbus_name_request_impl(conn, bus); +} + +void DBus::releaseBusName(const DBusWrapper::ConnectionPtr& conn, const std::string& bus) +{ + DBUS_W->eldbus_name_release_impl(conn, bus); +} + bool DBus::DBusClient::getFromEinaValue(const _Eina_Value* v, void* dst) { return eina_value_get(const_cast(v), dst); @@ -544,6 +554,16 @@ struct DefaultDBusWrapper : public DBusWrapper return create(get(ptr), false); } + void eldbus_name_request_impl(const ConnectionPtr& conn, const std::string& bus) override + { + eldbus_name_request(get(conn), bus.c_str(), ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, nullptr, nullptr); + } + + void eldbus_name_release_impl(const ConnectionPtr& conn, const std::string& bus) override + { + eldbus_name_release(get(conn), bus.c_str(), nullptr, nullptr); + } + struct Implementation { Eldbus_Service_Interface_Desc dsc; diff --git a/dali/internal/accessibility/bridge/dbus.h b/dali/internal/accessibility/bridge/dbus.h index d43c009..c23cd53 100644 --- a/dali/internal/accessibility/bridge/dbus.h +++ b/dali/internal/accessibility/bridge/dbus.h @@ -125,6 +125,8 @@ struct DALI_ADAPTOR_API DBusWrapper virtual ObjectPtr eldbus_object_get_impl(const ConnectionPtr& conn, const std::string& bus, const std::string& path) = 0; virtual ProxyPtr eldbus_proxy_get_impl(const ObjectPtr& obj, const std::string& interface) = 0; virtual ProxyPtr eldbus_proxy_copy_impl(const ProxyPtr& ptr) = 0; + virtual void eldbus_name_request_impl(const ConnectionPtr& conn, const std::string& bus) = 0; + virtual void eldbus_name_release_impl(const ConnectionPtr& conn, const std::string& bus) = 0; class StringStorage { @@ -2699,6 +2701,8 @@ private: DBusWrapper::ConnectionPtr getDBusConnectionByType(ConnectionType tp); DBusWrapper::ConnectionPtr getDBusConnectionByName(const std::string& name); std::string getConnectionName(const DBusWrapper::ConnectionPtr&); +void requestBusName(const DBusWrapper::ConnectionPtr& conn, const std::string& bus); +void releaseBusName(const DBusWrapper::ConnectionPtr& conn, const std::string& bus); } // namespace DBus namespace std diff --git a/dali/internal/accessibility/bridge/dummy-atspi.h b/dali/internal/accessibility/bridge/dummy-atspi.h index 911b9da..57db35d 100644 --- a/dali/internal/accessibility/bridge/dummy-atspi.h +++ b/dali/internal/accessibility/bridge/dummy-atspi.h @@ -193,6 +193,10 @@ struct DummyBridge : Dali::Accessibility::Bridge void UnembedSocket(const Address& plug, const Address& socket) override { } + + void SetPreferredBusName(std::string_view preferredBusName) override + { + } }; } // namespace Dali::Accessibility -- 2.7.4