Search code examples
linuxgtkglibdbus

gvariant parsing for a complex format


In my application i will be getting a message over dbus which has to be parsed using gvariant functions.

The format string is G_VARIANT_TYPE ("a(ysb((sss)(sss)))"

A sample code to construct a gVariant is as below

int ParseVariant (GVariant *value);

int main()
{

GVariantBuilder *builder;
GVariant *value;


builder = g_variant_builder_new (G_VARIANT_TYPE ("a(ysb((sss)(sss)))"));
g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test1", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test2", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
//g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test3", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");


GVariant *result = g_variant_new ("((yu)ya(ysb((sss)(sss))))", 'R', 23, 'E', builder);

g_variant_builder_unref (builder);
ParseVariant (result);
}

Am looking for a parser function (ParseVariant (result)) using which I can extract each element of the variant result.

Any help on this is highly appreciated.

Thanks in advance.


Solution

  • Here's the answer I provided on your question on the Gtk mailing list where you also supplied a ParseVariant():

    #include <glib.h>
    #include <glib/gstdio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <gio/gio.h>
    
    int ParseVariant (GVariant *value)
    {
        GVariant * list;
        gchar ch1,ch2,ch3;
        gchar *str1,*str2,*str3,*str4,*str5,*str6,*str7;
        gboolean bool1;
        gint x;
        GVariantIter iter;
    
        g_print ("Inside Parse\n");
    
        g_variant_get (value, "((yu)y@a(ysb((sss)(sss))))", &ch1, &x, &ch2, &list);
        g_variant_iter_init (&iter, list); 
        while (g_variant_iter_loop (&iter, "(ysb((sss)(sss)))", &ch3, &str1, &bool1, &str2, &str3, &str4, &str5, &str6, &str7))
        {
            g_print ("%s\n", str1);
        }
        g_variant_unref(list);
    }
    
    int main()
    {
        GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE ("a(ysb((sss)(sss)))"));
        g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test1", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
        g_variant_builder_add (builder, "(ysb((sss)(sss)))", 'J', "Test2", TRUE, "Hn", "di", "hedfs", "dd", "dr", "hdf");
    
        GVariant * result = g_variant_new ("((yu)ya(ysb((sss)(sss))))", 'R', 23, 'E', builder);
    
        g_variant_builder_unref (builder);
        ParseVariant (result);
    }