1 #ifndef DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H
2 #define DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H
5 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/dali-adaptor-version.h>
23 #include <dali/public-api/signals/connection-tracker.h>
27 #include <dali/internal/accessibility/bridge/accessibility-common.h>
29 class AppAccessible : public virtual Dali::Accessibility::Accessible, public virtual Dali::Accessibility::Collection, public virtual Dali::Accessibility::Application
32 Dali::Accessibility::EmptyAccessibleWithAddress parent;
33 std::vector<Dali::Accessibility::Accessible*> children;
36 std::string GetName() override
41 std::string GetDescription() override
46 Dali::Accessibility::Accessible* GetParent() override
51 size_t GetChildCount() override
53 return children.size();
56 Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override
58 auto s = children.size();
60 throw std::domain_error{"invalid index " + std::to_string(index) + " for object with " + std::to_string(s) + " children"};
61 return children[index];
64 size_t GetIndexInParent() override
66 throw std::domain_error{"can't call GetIndexInParent on application object"};
69 Dali::Accessibility::Role GetRole() override
71 return Dali::Accessibility::Role::APPLICATION;
74 Dali::Accessibility::States GetStates() override
79 Dali::Accessibility::Attributes GetAttributes() override
84 Dali::Accessibility::Accessible* getActiveWindow()
86 return children.empty() ? nullptr : children[0];
89 bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override
94 std::vector<Dali::Accessibility::Relation> GetRelationSet() override
99 Dali::Accessibility::Address GetAddress() override
104 std::string GetToolkitName() override
109 std::string GetVersion() override
111 return std::to_string(Dali::ADAPTOR_MAJOR_VERSION) + "." + std::to_string(Dali::ADAPTOR_MINOR_VERSION);
115 enum class FilteredEvents
123 struct hash<std::pair<FilteredEvents, Dali::Accessibility::Accessible*>>
125 size_t operator()(std::pair<FilteredEvents, Dali::Accessibility::Accessible*> v) const
127 return (static_cast<size_t>(v.first) * 131) ^ reinterpret_cast<size_t>(v.second);
132 class BridgeBase : public Dali::Accessibility::Bridge, public Dali::ConnectionTracker
134 std::unordered_map<std::pair<FilteredEvents, Dali::Accessibility::Accessible*>, std::pair<unsigned int, std::function<void()>>> filteredEvents;
136 bool tickFilteredEvents();
139 void addFilteredEvent(FilteredEvents kind, Dali::Accessibility::Accessible* obj, float delay, std::function<void()> functor);
141 const std::string& GetBusName() const override;
142 void AddTopLevelWindow(Dali::Accessibility::Accessible* window) override;
143 void RemoveTopLevelWindow(Dali::Accessibility::Accessible* window) override;
144 void AddPopup(Dali::Accessibility::Accessible* object) override;
145 void RemovePopup(Dali::Accessibility::Accessible* object) override;
147 Dali::Accessibility::Accessible* GetApplication() const override
152 template<typename SELF, typename... RET, typename... ARGS>
153 void AddFunctionToInterface(
154 DBus::DBusInterfaceDescription& desc, const std::string& funcName, DBus::ValueOrError<RET...> (SELF::*funcPtr)(ARGS...))
156 if(auto self = dynamic_cast<SELF*>(this))
157 desc.addMethod<DBus::ValueOrError<RET...>(ARGS...)>(
159 [=](ARGS... args) -> DBus::ValueOrError<RET...> {
162 return (self->*funcPtr)(std::move(args)...);
164 catch(std::domain_error& e)
166 return DBus::Error{e.what()};
171 template<typename T, typename SELF>
172 void AddGetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
173 const std::string& funcName,
174 T (SELF::*funcPtr)())
176 if(auto self = dynamic_cast<SELF*>(this))
177 desc.addProperty<T>(funcName,
178 [=]() -> DBus::ValueOrError<T> {
181 return (self->*funcPtr)();
183 catch(std::domain_error& e)
185 return DBus::Error{e.what()};
191 template<typename T, typename SELF>
192 void AddSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
193 const std::string& funcName,
194 void (SELF::*funcPtr)(T))
196 if(auto self = dynamic_cast<SELF*>(this))
197 desc.addProperty<T>(funcName, {}, [=](T t) -> DBus::ValueOrError<void> {
200 (self->*funcPtr)(std::move(t));
203 catch(std::domain_error& e)
205 return DBus::Error{e.what()};
210 template<typename T, typename T1, typename SELF>
211 void AddGetSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
212 const std::string& funcName,
213 T1 (SELF::*funcPtrGet)(),
214 DBus::ValueOrError<void> (SELF::*funcPtrSet)(T))
216 if(auto self = dynamic_cast<SELF*>(this))
219 [=]() -> DBus::ValueOrError<T> {
222 return (self->*funcPtrGet)();
224 catch(std::domain_error& e)
226 return DBus::Error{e.what()};
229 [=](T t) -> DBus::ValueOrError<void> {
232 (self->*funcPtrSet)(std::move(t));
235 catch(std::domain_error& e)
237 return DBus::Error{e.what()};
241 template<typename T, typename T1, typename SELF>
242 void AddGetSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
243 const std::string& funcName,
244 T1 (SELF::*funcPtrGet)(),
245 void (SELF::*funcPtrSet)(T))
247 if(auto self = dynamic_cast<SELF*>(this))
250 [=]() -> DBus::ValueOrError<T> {
253 return (self->*funcPtrGet)();
255 catch(std::domain_error& e)
257 return DBus::Error{e.what()};
260 [=](T t) -> DBus::ValueOrError<void> {
263 (self->*funcPtrSet)(std::move(t));
266 catch(std::domain_error& e)
268 return DBus::Error{e.what()};
272 static std::string StripPrefix(const std::string& path);
274 Dali::Accessibility::Accessible* Find(const std::string& path) const;
275 Dali::Accessibility::Accessible* Find(const Dali::Accessibility::Address& ptr) const;
276 Dali::Accessibility::Accessible* FindSelf() const;
277 Dali::Accessibility::Accessible* FindByPath(const std::string& name) const override;
278 void SetApplicationName(std::string name) override
280 application.name = std::move(name);
284 mutable AppAccessible application;
285 std::vector<Dali::Accessibility::Accessible*> popups;
290 void RegisteredEventsUpdate();
292 using CacheElementType = std::tuple<
293 Dali::Accessibility::Address,
294 Dali::Accessibility::Address,
295 Dali::Accessibility::Address,
296 std::vector<Dali::Accessibility::Address>,
297 std::vector<std::string>,
299 Dali::Accessibility::Role,
301 std::array<uint32_t, 2>>;
302 DBus::ValueOrError<std::vector<CacheElementType>> GetItems();
303 CacheElementType CreateCacheElement(Dali::Accessibility::Accessible* item);
307 virtual ~BridgeBase();
309 ForceUpResult ForceUp() override;
310 void ForceDown() override;
312 DBus::DBusServer dbusServer;
313 DBusWrapper::ConnectionPtr con;
315 DBus::DBusClient registry;
316 bool allowObjectBoundsChangedEvent{false};
319 #endif // DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H