How to get array[struct type] using sd_bus_message_* API's

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All,

I am a beginner, trying to learn the sd_bus API's.

I am trying to replicate the following busctl call to get information:

$ busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper GetObject sas /xyz/openbmc_project/inventory 0 --verbose
MESSAGE "a{sas}" {
        ARRAY "{sas}" {
                DICT_ENTRY "sas" {
                        STRING "xyz.openbmc_project.EntityManager";
                        ARRAY "s" {
                                STRING "org.freedesktop.DBus.Introspectable";
                                STRING "org.freedesktop.DBus.Peer";
                                STRING "org.freedesktop.DBus.Properties";
                        };
                };
                DICT_ENTRY "sas" {
                        STRING "xyz.openbmc_project.Inventory.Manager";
                        ARRAY "s" {
                                STRING "org.freedesktop.DBus.Introspectable";
                                STRING "org.freedesktop.DBus.ObjectManager";
                                STRING "org.freedesktop.DBus.Peer";
                                STRING "org.freedesktop.DBus.Properties";
                                STRING "xyz.openbmc_project.Inventory.Manager";
                        };
                };
                DICT_ENTRY "sas" {
                        STRING "xyz.openbmc_project.ObjectMapper";
                        ARRAY "s" {
                                STRING "org.freedesktop.DBus.Introspectable";
                                STRING "org.freedesktop.DBus.Peer";
                                STRING "org.freedesktop.DBus.Properties";
                        };
                };
                DICT_ENTRY "sas" {
                        STRING "xyz.openbmc_project.PLDM";
                        ARRAY "s" {
                                STRING "org.freedesktop.DBus.Introspectable";
                                STRING "org.freedesktop.DBus.ObjectManager";
                                STRING "org.freedesktop.DBus.Peer";
                                STRING "org.freedesktop.DBus.Properties";
                        };
                };
        };
};


In the `busctl monitor` i could confirm that i am getting a message of signature a{sas} from the dbus call, and here is the logic that I could come up with to read the data.

    r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sas}");
    if (r < 0)
        goto exit;
    while ((r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY,
                                               "sas")) > 0)
    {
        char* service = NULL;
        r = sd_bus_message_read(reply, "s", &service);
        if (r < 0)
            goto exit;
        printf("service = %s\n", service);
        r = sd_bus_message_enter_container(reply, 'a', "s");
        if (r < 0)
            goto exit;
        for (;;)
        {
            const char* s;
            r = sd_bus_message_read(reply, "s", &s);
            if (r < 0)
                goto exit;
            if (r == 0)
                break;
            printf("%s\n", s);
        }
    }

Output:
service = xyz.openbmc_project.EntityManager
org.freedesktop.DBus.Introspectable
org.freedesktop.DBus.Peer
org.freedesktop.DBus.Properties

But, I was only able to get the data from the first dictionary, can anyone help me to solve this issue? what am I missing?

Thanks,
Manoj





[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux