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/signals/connection-tracker.h>
26 #include <dali/internal/accessibility/bridge/accessibility-common.h>
28 class AppAccessible : public virtual Dali::Accessibility::Accessible, public virtual Dali::Accessibility::Collection
31 Dali::Accessibility::EmptyAccessibleWithAddress parent;
32 std::vector<Dali::Accessibility::Accessible*> children;
35 std::string GetName() override
40 std::string GetDescription() override
45 Dali::Accessibility::Accessible* GetParent() override
50 size_t GetChildCount() override
52 return children.size();
55 Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override
57 auto s = children.size();
59 throw std::domain_error{"invalid index " + std::to_string(index) + " for object with " + std::to_string(s) + " children"};
60 return children[index];
63 size_t GetIndexInParent() override
65 throw std::domain_error{"can't call GetIndexInParent on application object"};
68 Dali::Accessibility::Role GetRole() override
70 return Dali::Accessibility::Role::APPLICATION;
73 Dali::Accessibility::States GetStates() override
78 Dali::Accessibility::Attributes GetAttributes() override
83 Dali::Accessibility::Accessible* getActiveWindow()
85 return children.empty() ? nullptr : children[0];
88 bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override
93 std::vector<Dali::Accessibility::Relation> GetRelationSet() override
98 Dali::Accessibility::Address GetAddress() override
104 enum class FilteredEvents
112 struct hash<std::pair<FilteredEvents, Dali::Accessibility::Accessible*>>
114 size_t operator()(std::pair<FilteredEvents, Dali::Accessibility::Accessible*> v) const
116 return (static_cast<size_t>(v.first) * 131) ^ reinterpret_cast<size_t>(v.second);
121 class BridgeBase : public Dali::Accessibility::Bridge, public Dali::ConnectionTracker
123 std::unordered_map<std::pair<FilteredEvents, Dali::Accessibility::Accessible*>, std::pair<unsigned int, std::function<void()>>> filteredEvents;
125 bool tickFilteredEvents();
128 void addFilteredEvent(FilteredEvents kind, Dali::Accessibility::Accessible* obj, float delay, std::function<void()> functor);
130 const std::string& GetBusName() const override;
131 void AddTopLevelWindow(Dali::Accessibility::Accessible* window) override;
132 void RemoveTopLevelWindow(Dali::Accessibility::Accessible* window) override;
133 void AddPopup(Dali::Accessibility::Accessible*) override;
134 void RemovePopup(Dali::Accessibility::Accessible*) override;
136 Dali::Accessibility::Accessible* GetApplication() const override
141 template<typename SELF, typename... RET, typename... ARGS>
142 void AddFunctionToInterface(
143 DBus::DBusInterfaceDescription& desc, const std::string& funcName, DBus::ValueOrError<RET...> (SELF::*funcPtr)(ARGS...))
145 if(auto self = dynamic_cast<SELF*>(this))
146 desc.addMethod<DBus::ValueOrError<RET...>(ARGS...)>(funcName,
147 [=](ARGS... args) -> DBus::ValueOrError<RET...> {
150 return (self->*funcPtr)(std::move(args)...);
152 catch(std::domain_error& e)
154 return DBus::Error{e.what()};
159 template<typename T, typename SELF>
160 void AddGetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
161 const std::string& funcName,
162 T (SELF::*funcPtr)())
164 if(auto self = dynamic_cast<SELF*>(this))
165 desc.addProperty<T>(funcName,
166 [=]() -> DBus::ValueOrError<T> {
169 return (self->*funcPtr)();
171 catch(std::domain_error& e)
173 return DBus::Error{e.what()};
179 template<typename T, typename SELF>
180 void AddSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
181 const std::string& funcName,
182 void (SELF::*funcPtr)(T))
184 if(auto self = dynamic_cast<SELF*>(this))
185 desc.addProperty<T>(funcName, {}, [=](T t) -> DBus::ValueOrError<void> {
188 (self->*funcPtr)(std::move(t));
191 catch(std::domain_error& e)
193 return DBus::Error{e.what()};
198 template<typename T, typename T1, typename SELF>
199 void AddGetSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
200 const std::string& funcName,
201 T1 (SELF::*funcPtrGet)(),
202 DBus::ValueOrError<void> (SELF::*funcPtrSet)(T))
204 if(auto self = dynamic_cast<SELF*>(this))
207 [=]() -> DBus::ValueOrError<T> {
210 return (self->*funcPtrGet)();
212 catch(std::domain_error& e)
214 return DBus::Error{e.what()};
217 [=](T t) -> DBus::ValueOrError<void> {
220 (self->*funcPtrSet)(std::move(t));
223 catch(std::domain_error& e)
225 return DBus::Error{e.what()};
229 template<typename T, typename T1, typename SELF>
230 void AddGetSetPropertyToInterface(DBus::DBusInterfaceDescription& desc,
231 const std::string& funcName,
232 T1 (SELF::*funcPtrGet)(),
233 void (SELF::*funcPtrSet)(T))
235 if(auto self = dynamic_cast<SELF*>(this))
238 [=]() -> DBus::ValueOrError<T> {
241 return (self->*funcPtrGet)();
243 catch(std::domain_error& e)
245 return DBus::Error{e.what()};
248 [=](T t) -> DBus::ValueOrError<void> {
251 (self->*funcPtrSet)(std::move(t));
254 catch(std::domain_error& e)
256 return DBus::Error{e.what()};
260 static std::string StripPrefix(const std::string& path);
262 Dali::Accessibility::Accessible* Find(const std::string& path) const;
263 Dali::Accessibility::Accessible* Find(const Dali::Accessibility::Address& ptr) const;
264 Dali::Accessibility::Accessible* FindSelf() const;
265 Dali::Accessibility::Accessible* FindByPath(const std::string& name) const override;
266 void SetApplicationName(std::string name) override
268 application.name = std::move(name);
272 mutable AppAccessible application;
273 std::vector<Dali::Accessibility::Accessible*> popups;
279 using CacheElementType = std::tuple<
280 Dali::Accessibility::Address,
281 Dali::Accessibility::Address,
282 Dali::Accessibility::Address,
283 std::vector<Dali::Accessibility::Address>,
284 std::vector<std::string>,
286 Dali::Accessibility::Role,
288 std::array<uint32_t, 2>>;
289 DBus::ValueOrError<std::vector<CacheElementType>> GetItems();
290 CacheElementType CreateCacheElement(Dali::Accessibility::Accessible* item);
294 virtual ~BridgeBase();
296 ForceUpResult ForceUp() override;
297 void ForceDown() override;
299 DBus::DBusServer dbusServer;
300 DBusWrapper::ConnectionPtr con;
304 #endif // DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H