stanluk pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=d86ed905a5fe10b2525ee4012c8740fcb3577ef7

commit d86ed905a5fe10b2525ee4012c8740fcb3577ef7
Author: Lukasz Stanislawski <l.stanisl...@samsung.com>
Date:   Thu Jun 26 13:03:33 2014 +0200

    atspi: improve code reusage
    
    atspi d-bus signals have similar signatures, however use dbus variant type
    to encode signal specific data. This patch adds utility function to 
construct
    atspi dbus signal with custom variant data.
---
 src/lib/elm_atspi_bridge.c | 136 +++++++++++++++------------------------------
 1 file changed, 44 insertions(+), 92 deletions(-)

diff --git a/src/lib/elm_atspi_bridge.c b/src/lib/elm_atspi_bridge.c
index 16be166..b26d54f 100644
--- a/src/lib/elm_atspi_bridge.c
+++ b/src/lib/elm_atspi_bridge.c
@@ -83,6 +83,7 @@ static void _cache_build(void *obj);
 static void _object_register(Eo *obj, char *path);
 static void _iter_interfaces_append(Eldbus_Message_Iter *iter, const Eo *obj);
 static Eina_Bool _elm_atspi_bridge_key_down_event_notify(void *data, int type, 
void *event);
+static void _object_signal_send(Eldbus_Service_Interface *infc, int sig_id, 
const char *minor, unsigned int det1, unsigned int det2, const char 
*variant_sig, ...);
 
 EO_CALLBACKS_ARRAY_DEFINE(_events_cb,
    { ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED, 
_property_changed_signal_send},
@@ -546,7 +547,7 @@ _accessible_interfaces_get(const Eldbus_Service_Interface 
*iface, const Eldbus_M
    return ret;
 }
 
-static uint64_t 
+static uint64_t
 _elm_atspi_state_set_to_atspi_state_set(Elm_Atspi_State_Set states)
 {
    uint64_t ret = 0;
@@ -2674,8 +2675,6 @@ _handle_listener_change(void *data EINA_UNUSED, const 
Eldbus_Message *msg)
 static Eina_Bool
 _state_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc EINA_UNUSED, void *event_info)
 {
-   Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter, *viter;
    Eldbus_Service_Interface *events = data;
    Elm_Atspi_Event_State_Changed_Data *state_data = event_info;
    char *type_desc;
@@ -2712,30 +2711,16 @@ _state_changed_signal_send(void *data, Eo *obj 
EINA_UNUSED, const Eo_Event_Descr
          return EINA_FALSE;
    }
 
-   msg = eldbus_service_signal_new(events, ATSPI_OBJECT_EVENT_STATE_CHANGED);
-   iter = eldbus_message_iter_get(msg);
-
-   eldbus_message_iter_arguments_append(iter, "sii", type_desc, 
state_data->new_value, 0);
+   _object_signal_send(events, ATSPI_OBJECT_EVENT_STATE_CHANGED, type_desc, 
state_data->new_value, 0, NULL);
 
-   viter = eldbus_message_iter_container_new(iter, 'v', "i");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(viter, EINA_FALSE);
-
-   eldbus_message_iter_arguments_append(viter, "i", 0);
-   eldbus_message_iter_container_close(iter, viter);
-
-   _iter_object_reference_append(iter, _root);
-
-   eldbus_service_signal_send(events, msg);
    DBG("signal sent StateChanged:%s:%d", type_desc, state_data->new_value);
 
    return EINA_TRUE;
 }
 
 static Eina_Bool
-_property_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description 
*desc EINA_UNUSED, void *event_info)
+_property_changed_signal_send(void *data, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc EINA_UNUSED, void *event_info)
 {
-   Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter, *siter, *viter;
    Eldbus_Service_Interface *events = data;
    const char *property = event_info;
    char *path, *atspi_desc;
@@ -2779,27 +2764,11 @@ _property_changed_signal_send(void *data, Eo *obj, 
const Eo_Event_Description *d
         return EINA_FALSE;
      }
 
-   msg = eldbus_service_signal_new(events, 
ATSPI_OBJECT_EVENT_PROPERTY_CHANGED);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
-
-   iter = eldbus_message_iter_get(msg);
-   siter = eldbus_message_iter_container_new(iter, 'r', NULL);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(siter, EINA_FALSE);
-
-   eldbus_message_iter_arguments_append(siter, "suu", atspi_desc, 0, 0);
-
-   viter = eldbus_message_iter_container_new(siter, 'v', "s");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(viter, EINA_FALSE);
-
    path = _path_from_access_object(obj);
-   eldbus_message_iter_arguments_append(viter, "s", path);
-   free(path);
 
-   eldbus_message_iter_arguments_append(siter, "v", viter);
-   eldbus_message_iter_container_close(siter, viter);
+   _object_signal_send(events, ATSPI_OBJECT_EVENT_PROPERTY_CHANGED, 
atspi_desc, 0, 0, "s", path);
+   free(path);
 
-   eldbus_message_iter_container_close(iter, siter);
-   eldbus_service_signal_send(events, msg);
    DBG("signal sent PropertyChanged:%s", property);
 
    return EINA_TRUE;
@@ -2820,8 +2789,6 @@ static Eina_Bool
 _children_changed_signal_send(void *data, Eo *obj, const Eo_Event_Description 
*desc EINA_UNUSED, void *event_info)
 {
    Eldbus_Service_Interface *events = data;
-   Eldbus_Message_Iter *iter, *viter;
-   Eldbus_Message *msg;
    const char *atspi_desc = NULL;
    Elm_Atspi_Event_Children_Changed_Data *ev_data = event_info;
    int idx;
@@ -2860,32 +2827,17 @@ _children_changed_signal_send(void *data, Eo *obj, 
const Eo_Event_Description *d
 
    if (!atspi_desc) return EINA_FALSE;
 
-   msg = eldbus_service_signal_new(events, 
ATSPI_OBJECT_EVENT_CHILDREN_CHANGED);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
-
-   iter = eldbus_message_iter_get(msg);
-   eldbus_message_iter_arguments_append(iter, "sii", atspi_desc, idx, 0);
-
-   viter = eldbus_message_iter_container_new(iter, 'v', "(so)");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(viter, EINA_FALSE);
-
-   _iter_object_reference_append(viter, ev_data->child);
-   eldbus_message_iter_container_close(iter, viter);
+   _object_signal_send(events, ATSPI_OBJECT_EVENT_CHILDREN_CHANGED, 
atspi_desc, idx, 0, "(so)", eldbus_connection_unique_name_get(_a11y_bus), 
ev_data->child);
 
-   _iter_object_reference_append(iter, _root);
-
-   eldbus_service_signal_send(events, msg);
    DBG("signal sent childrenChanged:%s:%d", atspi_desc, idx);
 
    return EINA_TRUE;
 }
 
 static Eina_Bool
-_window_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, 
void *event_info EINA_UNUSED)
+_window_signal_send(void *data, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc, void *event_info EINA_UNUSED)
 {
    const char *event_desc;
-   Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter, *viter;
    Eldbus_Service_Interface *window = data;
    enum _Atspi_Window_Signals type;
 
@@ -2919,31 +2871,18 @@ _window_signal_send(void *data, Eo *obj, const 
Eo_Event_Description *desc, void
         return EINA_FALSE;
      }
 
-   msg = eldbus_service_signal_new(window, type);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
-
-   iter = eldbus_message_iter_get(msg);
-   eldbus_message_iter_arguments_append(iter, "sii", event_desc, 0, 0);
+   _object_signal_send(window, type, event_desc, 0, 0, "i", 0);
 
-   viter = eldbus_message_iter_container_new(iter, 'v', "i");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(viter, EINA_FALSE);
-
-   eldbus_message_iter_arguments_append(viter, "i", 0);
-   eldbus_message_iter_container_close(iter, viter);
-
-   _iter_object_reference_append(iter, obj);
-
-   eldbus_service_signal_send(window, msg);
    DBG("signal sent Window:%s", event_desc);
+
    return EINA_TRUE;
 }
 
 static Eina_Bool
-_selection_signal_send(void *data, Eo *obj, const Eo_Event_Description *desc, 
void *event_info EINA_UNUSED)
+_selection_signal_send(void *data, Eo *obj EINA_UNUSED, const 
Eo_Event_Description *desc, void *event_info EINA_UNUSED)
 {
    const char *event_desc;
    Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter, *viter;
    Eldbus_Service_Interface *selection = data;
 
    enum _Atspi_Object_Signals type;
@@ -2967,18 +2906,7 @@ _selection_signal_send(void *data, Eo *obj, const 
Eo_Event_Description *desc, vo
    msg = eldbus_service_signal_new(selection, type);
    EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
 
-   iter = eldbus_message_iter_get(msg);
-   eldbus_message_iter_arguments_append(iter, "sii", event_desc, 0, 0);
-
-   viter = eldbus_message_iter_container_new(iter, 'v', "i");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(viter, EINA_FALSE);
-
-   eldbus_message_iter_arguments_append(viter, "i", 0);
-   eldbus_message_iter_container_close(iter, viter);
-
-   _iter_object_reference_append(iter, obj);
-
-   eldbus_service_signal_send(selection, msg);
+   _object_signal_send(selection, type, event_desc, 0, 0, "i", 0);
 
    return EINA_TRUE;
 }
@@ -2986,8 +2914,11 @@ _selection_signal_send(void *data, Eo *obj, const 
Eo_Event_Description *desc, vo
 static void _object_signal_send(Eldbus_Service_Interface *infc, int sig_id, 
const char *minor, unsigned int det1, unsigned int det2, const char 
*variant_sig, ...)
 {
    Eldbus_Message *msg;
-   Eldbus_Message_Iter *iter , *viter;
+   Eldbus_Message_Iter *iter , *iter_stack[64];
    va_list va;
+   Eo *atspi_obj;
+   char *path;
+   int top = 0;
 
    EINA_SAFETY_ON_NULL_RETURN(infc);
    EINA_SAFETY_ON_NULL_RETURN(minor);
@@ -3002,30 +2933,51 @@ static void 
_object_signal_send(Eldbus_Service_Interface *infc, int sig_id, cons
 
    if (variant_sig)
      {
-        viter = eldbus_message_iter_container_new(iter, 'v', variant_sig);
+        iter_stack[top] = eldbus_message_iter_container_new(iter, 'v', 
variant_sig);
+
         const char *tmp = variant_sig;
         while (*tmp)
           {
              switch (*tmp)
                {
+                case '(':
+                   iter_stack[top + 1] = 
eldbus_message_iter_container_new(iter_stack[top], 'r', NULL);
+                   top++;
+                   break;
                 case 's':
-                   eldbus_message_iter_basic_append(viter, 's', va_arg(va, 
char*));
+                   eldbus_message_iter_basic_append(iter_stack[top], 's', 
va_arg(va, char*));
+                   break;
+                case 'i':
+                   eldbus_message_iter_basic_append(iter_stack[top], 'i', 
va_arg(va, int));
+                   break;
+                case 'o':
+                   atspi_obj = va_arg(va, Eo*);
+                   path = _path_from_access_object(atspi_obj);
+                   eldbus_message_iter_basic_append(iter_stack[top], 'o', 
path);
+                   free(path);
+                   break;
+                case ')':
+                   eldbus_message_iter_container_close(iter_stack[top - 1], 
iter_stack[top]);
+                   top--;
                    break;
                 default:
-                   ERR("Not supported type: %c. Invalid variant signature %s. 
", *tmp, variant_sig);
+                   ERR("Not supported d-bus type: %c.", *tmp);
                    break;
                }
              tmp++;
           }
      }
-   else // AT-SPI implementation forces checks on signature even if varint is 
not used.
+   else // AT-SPI implementation forces checks on variant in signature even if 
not used.
      {
-        viter  = eldbus_message_iter_container_new(iter, 'v', "i");
-        eldbus_message_iter_basic_append(viter, 'i', 0);
+        iter_stack[top] = eldbus_message_iter_container_new(iter, 'v', "i");
+        eldbus_message_iter_basic_append(iter_stack[top], 'i', 0);
      }
 
    va_end(va);
-   eldbus_message_iter_container_close(iter, viter);
+   if (top != 0)
+     ERR("Invalid d-bus signature: () do not match.");
+
+   eldbus_message_iter_container_close(iter, iter_stack[0]);
 
    _iter_object_reference_append(iter, _root);
 

-- 


Reply via email to