Re: Debug a call to method ssa(sv)a(sa(sv)) from libdbus

Lawrence D'Oliveiro <ldo-kC51rjc0cqs1dNLGKZg6taU/[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Organization Geek Central
Message-ID <[email protected]>
On Thu, 10 Mar 2022 19:50:10 +0100, Felip Moll wrote:

> For the real code please check https://pastebin.com/raw/Ev73xzMJ

Maybe not relevant to the actual problem, but I couldn’t help noticing
the endless repetition of abandon-container calls in
_dbus_asv_add_fixed_array. Here is what I think is a simpler way of
writing it (not tested):

static dbus_bool_t _dbus_asv_add_fixed_array
  (
    DBusMessageIter *arr_iter,
    const char *key,
    char element_type,
    const void *value,
    int n_elements
  )
  {
    bool success = false;
    const char type[] = { DBUS_TYPE_ARRAY, element_type, 0 };
    DBusMessageIter entry_iter = DBUS_MESSAGE_ITER_INIT_CLOSED;
    DBusMessageIter var_iter = DBUS_MESSAGE_ITER_INIT_CLOSED;
    DBusMessageIter array_iter = DBUS_MESSAGE_ITER_INIT_CLOSED;

    do /*once*/
      {
        if
          (
            not dbus_message_iter_open_container
              (
                /*iter =*/ arr_iter,
                /*type =*/ DBUS_TYPE_DICT_ENTRY,
                /*contained_signature =*/ NULL,
                /*sub =*/ &entry_iter
              )
          )
            break;
        if
          (
            not dbus_message_iter_append_basic
              (
                /*iter =*/ &entry_iter,
                /*type =*/ DBUS_TYPE_STRING,
                /*value =*/ &key
              )
          )
            break;
        if
          (
            not dbus_message_iter_open_container
              (
                /*iter =*/ &entry_iter,
                /*type =*/ DBUS_TYPE_VARIANT,
                /*contained_signature =*/ type,
                /*sub =*/ &var_iter
              )
          )
            break;
        if
          (
            not dbus_message_iter_open_container
              (
                /*iter =*/ &var_iter,
                /*type =*/ DBUS_TYPE_ARRAY,
                /*contained_signature =*/ type + 1,
                /*sub =*/ &array_iter
              )
          )
            break;
        if
          (
            not dbus_message_iter_append_fixed_array(&array_iter, element_type, &value, n_elements)
          )
            break;
        if (not dbus_message_iter_close_container(&var_iter, &array_iter))
            break;
        if (not dbus_message_iter_close_container(&entry_iter, &var_iter))
            break;
        if (not dbus_message_iter_close_container(arr_iter, &entry_iter))
            break;
      /* all done */
        success = true;
      }
    while (false);

    dbus_message_iter_abandon_container_if_open(var_iter, &array_iter);
    dbus_message_iter_abandon_container_if_open(entry_iter, &var_iter);
    dbus_message_iter_abandon_container_if_open(arr_iter, &entry_iter);

    return success;
  } /*_dbus_asv_add_fixed_array*/

I have an extended discussion of the general technique here
<https://github.com/ldo/a_structured_discipline_of_programming>.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.