1 #ifndef DALI_INTERNAL_ACCESSIBILITY_COMMON_H
2 #define DALI_INTERNAL_ACCESSIBILITY_COMMON_H
5 * Copyright (c) 2019 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/integration-api/debug.h>
28 #include <dali/public-api/dali-adaptor-common.h>
29 #include <dali/internal/accessibility/bridge/dbus.h>
30 #include <dali/internal/accessibility/bridge/dbus-locators.h>
31 #include <dali/devel-api/adaptor-framework/accessibility.h>
33 #define A11yDbusName "org.a11y.Bus"
34 #define A11yDbusPath "/org/a11y/bus"
35 #define A11yDbusStatusInterface "org.a11y.Status"
36 #define AtspiDbusNameRegistry "org.a11y.atspi.Registry"
37 #define AtspiDbusPathRoot "/org/a11y/atspi/accessible/root"
38 #define AtspiDbusInterfaceSocket "org.a11y.atspi.Socket"
39 #define AtspiPath "/org/a11y/atspi/accessible"
40 #define AtspiDbusInterfaceAccessible "org.a11y.atspi.Accessible"
41 #define AtspiDbusInterfaceAction "org.a11y.atspi.Action"
42 #define AtspiDbusInterfaceApplication "org.a11y.atspi.Application"
43 #define AtspiDbusInterfaceCollection "org.a11y.atspi.Collection"
44 #define AtspiDbusInterfaceComponent "org.a11y.atspi.Component"
45 #define AtspiDbusInterfaceDocument "org.a11y.atspi.Document"
46 #define AtspiDbusInterfaceEditableText "org.a11y.atspi.EditableText"
47 #define AtspiDbusInterfaceEventKeyboard "org.a11y.atspi.Event.Keyboard"
48 #define AtspiDbusInterfaceEventMouse "org.a11y.atspi.Event.Mouse"
49 #define AtspiDbusInterfaceEventObject "org.a11y.atspi.Event.Object"
50 #define AtspiDbusInterfaceHyperlink "org.a11y.atspi.Hyperlink"
51 #define AtspiDbusInterfaceHypertext "org.a11y.atspi.Hypertext"
52 #define AtspiDbusInterfaceImage "org.a11y.atspi.Image"
53 #define AtspiDbusInterfaceSelection "org.a11y.atspi.Selection"
54 #define AtspiDbusInterfaceTable "org.a11y.atspi.Table"
55 #define AtspiDbusInterfaceTableCell "org.a11y.atspi.TableCell"
56 #define AtspiDbusInterfaceText "org.a11y.atspi.Text"
57 #define AtspiDbusInterfaceValue "org.a11y.atspi.Value"
58 #define AtspiDbusInterfaceSocket "org.a11y.atspi.Socket"
59 #define AtspiDbusInterfaceEventWindow "org.a11y.atspi.Event.Window"
61 #define AtspiDbusPathDec "/org/a11y/atspi/registry/deviceeventcontroller"
62 #define AtspiDbusInterfaceDec "org.a11y.atspi.DeviceEventController"
63 #define AtspiDbusInterfaceDeviceEventListener "org.a11y.atspi.DeviceEventListener"
65 #define DirectReadingDBusName "org.tizen.ScreenReader"
66 #define DirectReadingDBusPath "/org/tizen/DirectReading"
67 #define DirectReadingDBusInterface "org.tizen.DirectReading"
72 * @brief Enumeration used for quering Accessibility objects
74 enum class MatchType : int32_t
79 NONE, //FIXME Underscore was added because "None" has been defined in another library
84 * @brief Enumeration used for quering Accessibility objects
86 * SortOrder::Canonical uses breadth-first search and sort objects in order of indexes in parent
87 * SortOrder::ReverseCanonical uses SortOrder::Canonical and reverse collection
88 * The rest of orders is not supported.
90 enum class SortOrder : uint32_t
104 class CurrentBridgePtr
106 static Dali::Accessibility::Bridge*& get()
108 static thread_local Dali::Accessibility::Bridge* b = nullptr;
111 Dali::Accessibility::Bridge* prev;
112 CurrentBridgePtr( const CurrentBridgePtr& ) = delete;
113 CurrentBridgePtr( CurrentBridgePtr&& ) = delete;
114 CurrentBridgePtr& operator=( const CurrentBridgePtr& ) = delete;
115 CurrentBridgePtr& operator=( CurrentBridgePtr&& ) = delete;
118 CurrentBridgePtr( Dali::Accessibility::Bridge* b ) : prev( get() ) { get() = b; }
119 ~CurrentBridgePtr() { get() = prev; }
121 static Dali::Accessibility::Bridge* current() { return get(); }
126 template < typename T >
127 struct signature_accessible_impl
129 using subtype = std::pair< std::string, ObjectPath >;
132 * @brief Returns name of type marshalled, for informative purposes
134 static std::string name()
136 return "AtspiAccessiblePtr";
140 * @brief Returns DBUS' signature of type marshalled
142 static std::string sig()
148 * @brief Marshals value v as marshalled type into message
150 static void set( const DBusWrapper::MessageIterPtr &iter, T* t )
154 auto v = t->GetAddress();
155 signature< subtype >::set( iter, {v.GetBus(), ObjectPath{std::string{ATSPI_PREFIX_PATH} + v.GetPath()}} );
159 signature< subtype >::set( iter, {"", ObjectPath{ATSPI_NULL_PATH}} );
164 * @brief Marshals value from marshalled type into variable v
166 static bool get( const DBusWrapper::MessageIterPtr &iter, T*& v )
169 if( !signature< subtype >::get( iter, tmp ) )
171 if( tmp.second.value == ATSPI_NULL_PATH )
176 if( tmp.second.value.substr( 0, strlen( ATSPI_PREFIX_PATH ) ) != ATSPI_PREFIX_PATH )
178 auto b = CurrentBridgePtr::current();
179 if( b->GetBusName() != tmp.first )
181 v = b->FindByPath( tmp.second.value.substr( strlen( ATSPI_PREFIX_PATH ) ) );
187 struct signature< Dali::Accessibility::Accessible* > : public signature_accessible_impl< Dali::Accessibility::Accessible >
192 struct signature< Dali::Accessibility::Address >
194 using subtype = std::pair< std::string, ObjectPath >;
197 * @brief Returns name of type marshalled, for informative purposes
199 static std::string name()
201 return "AtspiAccessiblePtr";
205 * @brief Returns DBUS' signature of type marshalled
207 static std::string sig()
213 * @brief Marshals value v as marshalled type into message
215 static void set( const DBusWrapper::MessageIterPtr &iter, const Dali::Accessibility::Address& v )
219 signature< subtype >::set( iter, {v.GetBus(), ObjectPath{std::string{ATSPI_PREFIX_PATH} + v.GetPath()}} );
223 signature< subtype >::set( iter, {v.GetBus(), ObjectPath{ATSPI_NULL_PATH}} );
228 * @brief Marshals value from marshalled type into variable v
230 static bool get( const DBusWrapper::MessageIterPtr &iter, Dali::Accessibility::Address& v )
233 if( !signature< subtype >::get( iter, tmp ) )
235 if( tmp.second.value == ATSPI_NULL_PATH )
240 if( tmp.second.value.substr( 0, strlen( ATSPI_PREFIX_PATH ) ) != ATSPI_PREFIX_PATH )
242 v = {std::move( tmp.first ), tmp.second.value.substr( strlen( ATSPI_PREFIX_PATH ) )};
248 struct signature< Dali::Accessibility::States >
250 using subtype = std::array< uint32_t, 2 >;
253 * @brief Returns name of type marshalled, for informative purposes
255 static std::string name()
257 return signature< subtype >::name();
261 * @brief Returns DBUS' signature of type marshalled
263 static std::string sig()
265 return signature< subtype >::sig();
269 * @brief Marshals value v as marshalled type into message
271 static void set( const DBusWrapper::MessageIterPtr &iter, const Dali::Accessibility::States& v )
273 signature< subtype >::set( iter, v.GetRawData() );
277 * @brief Marshals value from marshalled type into variable v
279 static bool get( const DBusWrapper::MessageIterPtr &iter, Dali::Accessibility::States& v )
282 if( !signature< subtype >::get( iter, tmp ) )
284 v = Dali::Accessibility::States{tmp};
295 std::ostringstream tmp;
297 _Logger( const char* f, int l ) : file( f ), line( l ) {}
301 Dali::Integration::Log::LogMessage( Dali::Integration::Log::DebugInfo, "%s:%d: %s", file, line, tmp.str().c_str() );
304 template < typename T >
305 _Logger& operator<<( T&& t )
307 tmp << std::forward< T >( t );
314 template < typename T >
315 _LoggerEmpty& operator<<( T&& t )
326 _LoggerScope( const char* f, int l ) : file( f ), line( l )
328 Dali::Integration::Log::LogMessage( Dali::Integration::Log::DebugInfo, "%s:%d: +", file, line );
332 Dali::Integration::Log::LogMessage( Dali::Integration::Log::DebugInfo, "%s:%d: -", file, line );
336 #define LOG() _Logger( __FILE__, __LINE__ )
337 #define SCOPE() _LoggerScope _l##__LINE__( __FILE__, __LINE__ )
339 #endif // DALI_INTERNAL_ACCESSIBILITY_COMMON_H