2015-04-02 825 views
1

在我的應用程序中,我將通過dbus獲得一條消息,該消息必須使用gvariant函數進行解析。對於複雜格式的gvariant解析

格式字符串是G_VARIANT_TYPE( 「一個(YSB((SSS)(SSS)))」

樣品代碼構建一個gVariant是如下

INT ParseVariant(GVariant *值);

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); 
} 

要尋找一個解析器函數使用(ParseVariant(結果)),我可以提取所述變體的結果中的每個元素。

任何幫助是高度appre ciated。

在此先感謝。

+0

?總之,g_variant_get是你需要使用的。 https://developer.gnome.org/glib/stable/glib-GVariant.html#g-variant-get。如果嘗試後仍然有問題,請發佈具體問題。 – kaylum 2015-04-06 04:05:31

回答

3

這裏我提供了關於你的問題GTK的郵件列表,您還提供了一個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)[email protected](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); 
}