#define DALI_INTERNAL_ATSPI_ACCESSIBILITY_COMMON_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <string>
// INTERNAL INCLUDES
-#include <dali/devel-api/adaptor-framework/accessibility-impl.h>
-#include <dali/internal/accessibility/bridge/dbus-locators.h>
-#include <dali/internal/accessibility/bridge/dbus.h>
+#include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/internal/accessibility/bridge/dbus/dbus-locators.h>
+#include <dali/internal/accessibility/bridge/dbus/dbus.h>
#include <dali/public-api/dali-adaptor-common.h>
+// DBus names
+
#define A11yDbusName "org.a11y.Bus"
-#define A11yDbusPath "/org/a11y/bus"
#define A11yDbusStatusInterface "org.a11y.Status"
#define AtspiDbusNameRegistry "org.a11y.atspi.Registry"
-#define AtspiDbusPathRoot "/org/a11y/atspi/accessible/root"
-#define AtspiDbusInterfaceSocket "org.a11y.atspi.Socket"
-#define AtspiPath "/org/a11y/atspi/accessible"
-#define AtspiDbusInterfaceAccessible "org.a11y.atspi.Accessible"
-#define AtspiDbusInterfaceAction "org.a11y.atspi.Action"
-#define AtspiDbusInterfaceApplication "org.a11y.atspi.Application"
-#define AtspiDbusInterfaceCollection "org.a11y.atspi.Collection"
-#define AtspiDbusInterfaceComponent "org.a11y.atspi.Component"
-#define AtspiDbusInterfaceDocument "org.a11y.atspi.Document"
-#define AtspiDbusInterfaceEditableText "org.a11y.atspi.EditableText"
-#define AtspiDbusInterfaceEventKeyboard "org.a11y.atspi.Event.Keyboard"
-#define AtspiDbusInterfaceEventMouse "org.a11y.atspi.Event.Mouse"
-#define AtspiDbusInterfaceEventObject "org.a11y.atspi.Event.Object"
-#define AtspiDbusInterfaceHyperlink "org.a11y.atspi.Hyperlink"
-#define AtspiDbusInterfaceHypertext "org.a11y.atspi.Hypertext"
-#define AtspiDbusInterfaceImage "org.a11y.atspi.Image"
-#define AtspiDbusInterfaceSelection "org.a11y.atspi.Selection"
-#define AtspiDbusInterfaceTable "org.a11y.atspi.Table"
-#define AtspiDbusInterfaceTableCell "org.a11y.atspi.TableCell"
-#define AtspiDbusInterfaceText "org.a11y.atspi.Text"
-#define AtspiDbusInterfaceValue "org.a11y.atspi.Value"
-#define AtspiDbusInterfaceSocket "org.a11y.atspi.Socket"
-#define AtspiDbusInterfaceEventWindow "org.a11y.atspi.Event.Window"
+#define DirectReadingDBusName "org.tizen.ScreenReader"
+#define DirectReadingDBusInterface "org.tizen.DirectReading"
-#define AtspiDbusPathDec "/org/a11y/atspi/registry/deviceeventcontroller"
-#define AtspiDbusInterfaceDec "org.a11y.atspi.DeviceEventController"
-#define AtspiDbusInterfaceDeviceEventListener "org.a11y.atspi.DeviceEventListener"
+// DBus paths
-#define DirectReadingDBusName "org.tizen.ScreenReader"
+#define A11yDbusPath "/org/a11y/bus"
+#define AtspiDbusPathCache "/org/a11y/atspi/cache"
+#define AtspiDbusPathDec "/org/a11y/atspi/registry/deviceeventcontroller"
+#define AtspiDbusPathRegistry "/org/a11y/atspi/registry"
+#define AtspiDbusPathRoot "/org/a11y/atspi/accessible/root"
+#define AtspiPath "/org/a11y/atspi/accessible"
#define DirectReadingDBusPath "/org/tizen/DirectReading"
-#define DirectReadingDBusInterface "org.tizen.DirectReading"
struct ObjectPath;
namespace DBus
{
+/**
+ * @brief The CurrentBridgePtr class is to save the current Accessibility Bridge.
+ */
class CurrentBridgePtr
{
- static Dali::Accessibility::Bridge*& get()
+ static Dali::Accessibility::Bridge*& Get()
{
- static thread_local Dali::Accessibility::Bridge* b = nullptr;
- return b;
+ static thread_local Dali::Accessibility::Bridge* bridge = nullptr;
+ return bridge;
}
- Dali::Accessibility::Bridge* prev;
+ Dali::Accessibility::Bridge* mPrev;
CurrentBridgePtr(const CurrentBridgePtr&) = delete;
CurrentBridgePtr(CurrentBridgePtr&&) = delete;
CurrentBridgePtr& operator=(const CurrentBridgePtr&) = delete;
CurrentBridgePtr& operator=(CurrentBridgePtr&&) = delete;
public:
- CurrentBridgePtr(Dali::Accessibility::Bridge* b)
- : prev(get())
+ CurrentBridgePtr(Dali::Accessibility::Bridge* bridge)
+ : mPrev(Get())
{
- get() = b;
+ Get() = bridge;
}
~CurrentBridgePtr()
{
- get() = prev;
+ Get() = mPrev;
}
- static Dali::Accessibility::Bridge* current()
+ static Dali::Accessibility::Bridge* GetCurrentBridge()
{
- return get();
+ return Get();
}
-};
+}; // CurrentBridgePtr
+// Templates for setting and getting Accessible values
namespace detail
{
-template<typename T>
-struct signature_accessible_impl : signature_helper<signature_accessible_impl<T>>
+template<>
+struct signature<Dali::Accessibility::Address> : signature_helper<signature<Dali::Accessibility::Address>>
{
using subtype = std::pair<std::string, ObjectPath>;
static constexpr auto name_v = concat("AtspiAccessiblePtr");
- static constexpr auto sig_v = concat("(so)");
+ static constexpr auto sig_v = signature<subtype>::sig_v; // "(so)"
/**
- * @brief Marshals value v as marshalled type into message
+ * @brief Marshals value address as marshalled type into message
*/
- static void set(const DBusWrapper::MessageIterPtr& iter, T* t)
+ static void set(const DBusWrapper::MessageIterPtr& iter, const Dali::Accessibility::Address& address)
{
- if(t)
+ if(address)
{
- auto v = t->GetAddress();
- signature<subtype>::set(iter, {v.GetBus(), ObjectPath{std::string{ATSPI_PREFIX_PATH} + v.GetPath()}});
+ signature<subtype>::set(iter, {address.GetBus(), ObjectPath{std::string{ATSPI_PREFIX_PATH} + address.GetPath()}});
}
else
{
- signature<subtype>::set(iter, {"", ObjectPath{ATSPI_NULL_PATH}});
+ signature<subtype>::set(iter, {address.GetBus(), ObjectPath{ATSPI_NULL_PATH}});
}
}
/**
- * @brief Marshals value from marshalled type into variable v
+ * @brief Marshals value from marshalled type into variable address
*/
- static bool get(const DBusWrapper::MessageIterPtr& iter, T*& v)
+ static bool get(const DBusWrapper::MessageIterPtr& iter, Dali::Accessibility::Address& address)
{
subtype tmp;
if(!signature<subtype>::get(iter, tmp))
if(tmp.second.value == ATSPI_NULL_PATH)
{
- v = nullptr;
+ address = {};
return true;
}
-
if(tmp.second.value.substr(0, strlen(ATSPI_PREFIX_PATH)) != ATSPI_PREFIX_PATH)
{
return false;
}
- auto b = CurrentBridgePtr::current();
- if(b->GetBusName() != tmp.first)
- {
- return false;
- }
-
- v = b->FindByPath(tmp.second.value.substr(strlen(ATSPI_PREFIX_PATH)));
- return v != nullptr;
+ address = {std::move(tmp.first), tmp.second.value.substr(strlen(ATSPI_PREFIX_PATH))};
+ return true;
}
};
-template<>
-struct signature<Dali::Accessibility::Accessible*> : public signature_accessible_impl<Dali::Accessibility::Accessible>
-{
-};
-
-template<>
-struct signature<Dali::Accessibility::Address> : signature_helper<signature<Dali::Accessibility::Address>>
+template<typename T>
+struct SignatureAccessibleImpl : signature_helper<SignatureAccessibleImpl<T>>
{
- using subtype = std::pair<std::string, ObjectPath>;
+ using subtype = Dali::Accessibility::Address;
- static constexpr auto name_v = concat("AtspiAccessiblePtr");
- static constexpr auto sig_v = concat("(so)");
+ static constexpr auto name_v = signature<subtype>::name_v;
+ static constexpr auto sig_v = signature<subtype>::sig_v;
/**
- * @brief Marshals value v as marshalled type into message
+ * @brief Marshals value address as marshalled type into message
*/
- static void set(const DBusWrapper::MessageIterPtr& iter, const Dali::Accessibility::Address& v)
+ static void set(const DBusWrapper::MessageIterPtr& iter, T* accessible)
{
- if(v)
- {
- signature<subtype>::set(iter, {v.GetBus(), ObjectPath{std::string{ATSPI_PREFIX_PATH} + v.GetPath()}});
- }
- else
- {
- signature<subtype>::set(iter, {v.GetBus(), ObjectPath{ATSPI_NULL_PATH}});
- }
+ signature<subtype>::set(iter, accessible ? accessible->GetAddress() : subtype{});
}
/**
- * @brief Marshals value from marshalled type into variable v
+ * @brief Marshals value from marshalled type into variable path
*/
- static bool get(const DBusWrapper::MessageIterPtr& iter, Dali::Accessibility::Address& v)
+ static bool get(const DBusWrapper::MessageIterPtr& iter, T*& path)
{
- subtype tmp;
- if(!signature<subtype>::get(iter, tmp))
- {
- return false;
- }
+ subtype address;
- if(tmp.second.value == ATSPI_NULL_PATH)
- {
- v = {};
- return true;
- }
- if(tmp.second.value.substr(0, strlen(ATSPI_PREFIX_PATH)) != ATSPI_PREFIX_PATH)
+ signature<subtype>::get(iter, address);
+
+ auto currentBridge = CurrentBridgePtr::GetCurrentBridge();
+ if(currentBridge->GetBusName() != address.GetBus())
{
return false;
}
- v = {std::move(tmp.first), tmp.second.value.substr(strlen(ATSPI_PREFIX_PATH))};
- return true;
+ path = currentBridge->FindByPath(address.GetPath());
+ return path != nullptr;
}
};
template<>
+struct signature<Dali::Accessibility::Accessible*> : public SignatureAccessibleImpl<Dali::Accessibility::Accessible>
+{
+};
+
+template<>
struct signature<Dali::Accessibility::States> : signature_helper<signature<Dali::Accessibility::States>>
{
using subtype = std::array<uint32_t, 2>;
static constexpr auto sig_v = signature<subtype>::sig_v;
/**
- * @brief Marshals value v as marshalled type into message
+ * @brief Marshals value state as marshalled type into message
*/
- static void set(const DBusWrapper::MessageIterPtr& iter, const Dali::Accessibility::States& v)
+ static void set(const DBusWrapper::MessageIterPtr& iter, const Dali::Accessibility::States& states)
{
- signature<subtype>::set(iter, v.GetRawData());
+ signature<subtype>::set(iter, states.GetRawData());
}
/**
- * @brief Marshals value from marshalled type into variable v
+ * @brief Marshals value from marshalled type into variable state
*/
- static bool get(const DBusWrapper::MessageIterPtr& iter, Dali::Accessibility::States& v)
+ static bool get(const DBusWrapper::MessageIterPtr& iter, Dali::Accessibility::States& state)
{
subtype tmp;
if(!signature<subtype>::get(iter, tmp))
{
return false;
}
- v = Dali::Accessibility::States{tmp};
+ state = Dali::Accessibility::States{tmp};
return true;
}
};
struct _Logger
{
- const char* file;
- int line;
- std::ostringstream tmp;
+ const char* mFile;
+ int mLine;
+ std::ostringstream mTmp;
- _Logger(const char* f, int l)
- : file(f),
- line(l)
+ _Logger(const char* file, int line)
+ : mFile(file),
+ mLine(line)
{
}
~_Logger()
{
- Dali::Integration::Log::LogMessage(Dali::Integration::Log::DebugInfo, "%s:%d: %s", file, line, tmp.str().c_str());
+ Dali::Integration::Log::LogMessage(Dali::Integration::Log::INFO, "%s:%d: %s", mFile, mLine, mTmp.str().c_str());
}
template<typename T>
_Logger& operator<<(T&& t)
{
- tmp << std::forward<T>(t);
+ mTmp << std::forward<T>(t);
return *this;
}
};
struct _LoggerScope
{
- const char* file;
- int line;
+ const char* mFile;
+ int mLine;
- _LoggerScope(const char* f, int l)
- : file(f),
- line(l)
+ _LoggerScope(const char* file, int line)
+ : mFile(file),
+ mLine(line)
{
- Dali::Integration::Log::LogMessage(Dali::Integration::Log::DebugInfo, "%s:%d: +", file, line);
+ Dali::Integration::Log::LogMessage(Dali::Integration::Log::INFO, "%s:%d: +", mFile, mLine);
}
~_LoggerScope()
{
- Dali::Integration::Log::LogMessage(Dali::Integration::Log::DebugInfo, "%s:%d: -", file, line);
+ Dali::Integration::Log::LogMessage(Dali::Integration::Log::INFO, "%s:%d: -", mFile, mLine);
}
};