Eo *root;
Eina_List *socket_queue;
Eina_List *plug_queue;
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ Eo *current_socket; // Maybe use Eina_List for multi-widget support
+ //
// TIZEN_ONLY(20171109) : fix for invalid proxy object, when at-spi has been restarted
Eina_List *connected_plugs_sockets;
//
static void _bridge_signal_send(Eo *bridge, Eo *obj, const char *ifc, const Eldbus_Signal *signal, const char *minor, unsigned int det1, unsigned int det2, const char *variant_sig, ...);
static Eo * _bridge_object_from_path(Eo *bridge, const char *path);
static void _bridge_iter_object_reference_append(Eo *bridge, Eldbus_Message_Iter *iter, const Eo *obj);
+//TIZEN_ONLY(20240719): Standardize Socket interface
+static Eina_Bool _bridge_iter_object_address_get(Eo *bridge, Eldbus_Message_Iter *iter, const char **bus, const char **path);
+//
static void _object_get_bus_name_and_path(Eo *bridge, const Eo *obj, const char **bus_name, const char **path);
// TIZEN_ONLY(20170310) - implementation of get object under coordinates for accessibility
static Eo *_calculate_navigable_accessible_at_point(Eo *bridge, Eo *root, Eina_Bool coord_type, int x, int y);
return EINA_TRUE;
}
+//
+
+//TIZEN_ONLY(20240719): Standardize Socket interface
+Eina_Bool
+elm_atspi_bridge_utils_is_socket(Eo *obj)
+{
+ Eo *bridge = _elm_atspi_bridge_get();
+ if (!bridge)
+ return EINA_FALSE;
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(bridge, pd, EINA_FALSE);
+
+ return obj == pd->current_socket;
+}
+
+Eo *
+elm_atspi_bridge_utils_get_socket(void)
+{
+ Eo *bridge = _elm_atspi_bridge_get();
+ if (!bridge)
+ return NULL;
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN_VAL(bridge, pd, NULL);
+
+ return pd->current_socket;
+}
+
+void
+elm_atspi_bridge_utils_set_socket(Eo *obj)
+{
+ Eo *bridge = _elm_atspi_bridge_get();
+ if (!bridge)
+ return;
+ ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
+ pd->current_socket = obj;
+}
+//
+
+//TIZEN_ONLY(20240705): Standardize Socket interface
static Eldbus_Message *
-_socket_embedded(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+_socket_embed(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
- // TIZEN_ONLY(20160705) - enable atspi_proxy to work
const char *obj_path = eldbus_message_path_get(msg);
- //
- const char *path;
+ Eo *bridge = _elm_atspi_bridge_get();
+ const char *bus = NULL;
+ const char *path = NULL;
- if (!eldbus_message_arguments_get(msg, "s", &path))
+ if (!_bridge_iter_object_address_get(bridge, eldbus_message_iter_get(msg), &bus, &path))
return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidArgs", "Plug id expected.");
- Eo *bridge = _elm_atspi_bridge_get();
Eo *obj = _bridge_object_from_path(bridge, obj_path);
- Eo *proxy = evas_object_data_get(obj, "___atspi_socket_proxy");
+ Eo *root = efl_access_object_access_root_get();
+
+ if (obj != root)
+ {
+ ERR("error: Embed must be called on root object");
+ return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidArgs", "Embed must be called on root object");
+ }
+ Eo *socket = elm_atspi_bridge_utils_get_socket();
+ if (!socket)
+ return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.Failed", "Unable to embed object: socket is not set");
+
+ Eo *proxy = evas_object_data_get(socket, "___atspi_socket_proxy");
if (!efl_isa(proxy, ELM_ATSPI_PROXY_CLASS))
- return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.Failed", "Unable to embed object.");
+ return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.Failed", "Unable to embed object: proxy is not set");
- const char *bus = eldbus_message_sender_get(msg);
elm_obj_atspi_proxy_address_set(proxy, bus, path);
+ efl_access_object_access_parent_set(socket, proxy);
+ efl_access_object_access_parent_set(proxy, root);
_bridge_cache_build(bridge, proxy);
- return eldbus_message_method_return_new(msg);
+ Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+ _bridge_iter_object_reference_append(bridge, eldbus_message_iter_get(reply), socket);
+
+ return reply;
}
//
-// TIZEN_ONLY(20160705) - enable atspi_proxy to work
+//TIZEN_ONLY(20240719): Standardize Socket interface
static Eldbus_Message *
_socket_offset_set(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
int x, y;
- Eo *parent;
- Eo *obj = eldbus_service_object_data_get(iface, "_atspi_obj");
- parent = efl_parent_get(obj);
- Evas_Object *top = elm_object_top_widget_get(parent);
+ const char *obj_path = eldbus_message_path_get(msg);
+ Eo *bridge = _elm_atspi_bridge_get();
+ Eo *obj = _bridge_object_from_path(bridge, obj_path);
+ Evas_Object *top = elm_object_top_widget_get(obj);
if (!eldbus_message_arguments_get(msg, "ii", &x, &y))
return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidArgs", "Invalid index type.");
//TIZEN_ONLY(20171108): make atspi_proxy work
static const Eldbus_Method socket_methods[] = {
- { "Embedded", ELDBUS_ARGS({"s", "id"}), ELDBUS_ARGS({NULL, NULL}), _socket_embedded, 0 },
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ { "Embed", ELDBUS_ARGS({"(so)", "address"}), ELDBUS_ARGS({"(so)", "address"}), _socket_embed, 0 },
+ //
// TIZEN_ONLY(20160705) - enable atspi_proxy to work
{ "SetOffset", ELDBUS_ARGS({"i", "x"}, {"i", "y"}), ELDBUS_ARGS({NULL, NULL}), _socket_offset_set, 0 },
//
eldbus_message_iter_container_close(iter, iter_struct);
}
+//TIZEN_ONLY(20240719): Standardize Socket interface
+static Eina_Bool
+_bridge_iter_object_address_get(Eo *bridge EINA_UNUSED, Eldbus_Message_Iter *iter, const char **bus, const char **path)
+{
+ EINA_SAFETY_ON_FALSE_RETURN_VAL(iter && bus && path, EINA_FALSE);
+
+ Eldbus_Message_Iter *iter_struct;
+ Eina_Bool success = eldbus_message_iter_arguments_get(iter, "(so)", &iter_struct);
+ if (success) success = eldbus_message_iter_arguments_get(iter_struct, "so", bus, path);
+ else *bus = *path = NULL;
+
+ return success;
+}
+//
+
static void
_object_desktop_reference_append(Eldbus_Message_Iter *iter)
{
// walk up...
node = CALL(get_parent, node);
+
if (node == NULL || node == root) return NULL;
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ if (CALL(object_is_proxy, node)) break;
+ //
+
// in backward traversing stop the walk up on parent
if (!forward) break;
}
if (eldbus_message_error_get(msg, &err, &txt))
{
- ERR("AT-SPI: Embedded method call failed: %s %s", err, txt);
+ ERR("AT-SPI: Embed method call failed: %s %s", err, txt);
+ efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL);
+
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ elm_obj_atspi_proxy_address_get_retry_timer_add(proxy);
+ //
+ return;
+ }
+
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ const char *bus;
+ const char *path;
+ Eo *bridge = _elm_atspi_bridge_get();
+ if (!_bridge_iter_object_address_get(bridge, eldbus_message_iter_get(msg), &bus, &path))
+ {
+ ERR("AT-SPI: Embed did not return a valid address");
efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL);
return;
}
+
+ elm_obj_atspi_proxy_address_set(proxy, bus, path);
+ //
+
efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_CONNECTED, NULL);
parent = efl_parent_get(proxy);
if (parent)
{
- const char *bus = eldbus_message_sender_get(msg);
efl_access_object_attribute_append(parent, "child_bus", bus);
efl_access_children_changed_added_signal_emit(parent, proxy);
}
static void
_plug_embedded_send(Eldbus_Connection *conn, Eo *proxy, const char *bus, const char *path)
{
- char *obj_path = NULL;
Eo *parent;
Eldbus_Message *msg = NULL;
parent = efl_parent_get(proxy);
if (!parent) goto fail;
- msg = eldbus_message_method_call_new(bus, path, ATSPI_DBUS_INTERFACE_SOCKET, "Embedded");
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ msg = eldbus_message_method_call_new(bus, path, ATSPI_DBUS_INTERFACE_SOCKET, "Embed");
if (!msg) goto fail;
- if (!elm_atspi_bridge_object_address_get(parent, NULL, &obj_path))
- goto fail;
-
- if (!eldbus_message_arguments_append(msg, "s", obj_path))
- goto fail;
-
- //TIZEN_ONLY(20171114) elm_atspi_bridge: fix double free issue (WGID:81393)
- // free(obj_path);
- ELM_SAFE_FREE(obj_path, free);
+ _bridge_iter_object_reference_append(_elm_atspi_bridge_get(), eldbus_message_iter_get(msg), parent);
//
if (!eldbus_connection_send(conn, msg, _embedded_reply_cb, proxy, 100))
fail:
ERR("AT-SPI: Unable to send Embedded request.");
if (msg) eldbus_message_unref(msg);
- //TIZEN_ONLY(20171114) elm_atspi_bridge: fix double free issue (WGID:81393)
- // free(obj_path);
- ELM_SAFE_FREE(obj_path, free);
- //
- efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL);
-}
-
-static void _socket_addr_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
-{
- Eo *proxy = data;
- const char *bus, *path, *err, *txt;
- Eldbus_Message_Iter *iter, *iter_variant, *iter_struct;
-
- //TIZEN_ONLY(20171114) elm_atspi_bridge: ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN should use elm_atspi_bridge object
- // ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(proxy, pd);
- Eo *bridge = _elm_atspi_bridge_get();
- if (!bridge)
- {
- ERR("AT-SPI: Atspi bridge is not enabled.");
- return;
- }
- ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(bridge, pd);
- //
-
- if (eldbus_message_error_get(msg, &err, &txt))
- {
- ERR("Unable to connect to socket: %s %s", err, txt);
- goto retry;
- }
-
- iter = eldbus_message_iter_get(msg);
- if (!eldbus_message_iter_arguments_get(iter, "v", &iter_variant))
- {
- ERR("Unable to get variant parameter");
- goto fail;
- }
-
- if (!eldbus_message_iter_arguments_get(iter_variant, "(so)", &iter_struct))
- {
- ERR("Unable to get so parameters");
- goto fail;
- }
-
- if (!eldbus_message_iter_arguments_get(iter_struct, "so", &bus, &path))
- {
- ERR("Unable to get so parameters");
- goto fail;
- }
-
- elm_obj_atspi_proxy_address_set(proxy, bus, path);
-
- _plug_embedded_send(pd->a11y_bus, proxy, bus, path);
-
- return;
-
-fail:
efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL);
- return;
-
-retry:
- elm_obj_atspi_proxy_address_get_retry_timer_add(proxy);
-}
-
-static void
-_plug_address_discover(Eldbus_Connection *conn, Eo *proxy, const char *svc_bus, const char *svc_path)
-{
- Eldbus_Object *dobj;
- dobj = eldbus_object_get(conn, svc_bus, svc_path);
-
- //TIZEN_ONLY(20171114) atspi: sanitize service name before creating bus
- if (!dobj)
- {
- ERR("Unable to get eldbus object from: %s %s", svc_bus, svc_path);
- return;
- }
- //
-
- Eldbus_Message *msg = eldbus_object_method_call_new(dobj, ELDBUS_FDO_INTERFACE_PROPERTIES, "Get");
- eldbus_message_arguments_append(msg, "ss", ELM_ATSPI_DBUS_INTERFACE_PROXY, "Object");
- eldbus_object_send(dobj, msg, _socket_addr_get_cb, proxy, 100);
}
static void _add_plug_or_socket_to_connected_list_in_bridge(Eo *plug_or_socket)
_add_plug_or_socket_to_connected_list_in_bridge(proxy);
- if (bus && path)
- {
- _plug_address_discover(conn, proxy, bus, path);
- return;
- }
- else
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ if (!bus || !path)
+ //
{
elm_obj_atspi_proxy_address_get(proxy, &bus, &path);
if (!bus || !path)
efl_event_callback_call(proxy, ELM_ATSPI_PROXY_EVENT_DISCONNECTED, NULL);
return;
}
- _plug_embedded_send(conn, proxy, bus, path);
}
+ _plug_embedded_send(conn, proxy, bus, path);
+
return;
}
{
Eo *ret;
- char bus[256], path[256];
+ char bus[256];
int res;
char *svc_sanitized = _sanitize_service_name(svcname);
return NULL;
}
- res = snprintf(path, sizeof(path), "/elm/atspi/proxy/socket/%s/%d", svc_sanitized, svcnum);
- if (res < 0 || (res >= (int)sizeof(path)))
- {
- ERR("Error occured during creating bus name");
- free(svc_sanitized);
- return NULL;
- }
-
ret = efl_add(ELM_ATSPI_PROXY_CLASS, parent, elm_obj_atspi_proxy_ctor(efl_added, type));
if (!ret)
}
char *bus_sanitized = _sanitize_bus_name(bus);
- char *path_sanitized = _sanitize_path_name(path);
- if(!bus_sanitized || !path_sanitized)
+ if(!bus_sanitized)
{
free(svc_sanitized);
free(bus_sanitized);
- free(path_sanitized);
efl_del(ret);
return NULL;
}
}
efl_key_data_set(ret, "__svc_bus", eina_stringshare_add(bus_sanitized));
- efl_key_data_set(ret, "__svc_path", eina_stringshare_add(path_sanitized));
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ efl_key_data_set(ret, "__svc_path", ATSPI_DBUS_PATH_ROOT);
+ //
free(svc_sanitized);
free(bus_sanitized);
- free(path_sanitized);
+
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ if (type == ELM_ATSPI_PROXY_TYPE_SOCKET)
+ elm_atspi_bridge_utils_set_socket(parent);
+ //
return ret;
}
if (!pd->a11y_bus) return;
- bus = efl_key_data_get(proxy, "__svc_bus");
- path = efl_key_data_get(proxy, "__svc_path");
-
- Eldbus_Message *msg = NULL;
-
- msg = eldbus_message_method_call_new(bus, path, ELM_ATSPI_DBUS_INTERFACE_PROXY, "SetOffset");
+ //TIZEN_ONLY(20240719): Standardize Socket interface
+ elm_obj_atspi_proxy_address_get(proxy, &bus, &path);
+ Eldbus_Message *msg = eldbus_message_method_call_new(bus, path, ATSPI_DBUS_INTERFACE_SOCKET, "SetOffset");
+ //
if (!msg) goto fail;
if (!eldbus_message_arguments_append(msg, "i", x))