2017-09-28 3 views
0

私はこのようになります「net.connman.Manager.GetServices」機能に応答解析しています。非常に複雑な構造である"a(oa {sv})" dbusタイプを解析するには?

<method name="GetServices"> 
    <arg name="services" type="a(oa{sv})" direction="out"/> 
</method> 

を。

私はこれまでで得たもの:

だから、
GVariant* result = ... // response containing data 
GVariantIter* iter1; 
g_variant_get(result, "a(oa{sv})", &iter1); 

GVariant* child = g_variant_iter_next_value(iter1); 
while (nullptr != child) 
{ 
    gchar* string; 
    GVariant* data; 
    g_variant_get(child, "(oa{sv})", &string, &data); 

    // how to access inner array? 

    g_variant_unref(child); 
    child = g_variant_iter_next_value(iter1); 
} 

g_variant_iter_free(iter1); 

、どのように私は、内側の配列データにアクセスできますか?

私はこれを試しました: GVariantIter * iter2; g_variant_get(data、 "a {sv}"、& iter2); GVariant * child2 = g_variant_iter_next_value(iter2);

が、それはいくつかのアライメントエラーで失敗します。

** 
GLib:ERROR:../../glib-2.48.2/glib/gvarianttypeinfo.c:163:g_variant_type_info_check: assertion failed: (info->alignment == 0 || info->alignment == 1 || info->alignment == 3 || info->alignment == 7) 
Aborted 

答えて

2

dataGVariant Format Stringsのドキュメントごとなど種類GVariantIter*、ないGVariant*、(あなたがg_variant_get()の二番目の引数としてGVariant書式文字列を渡している)を持っている必要があります。

あなたはしかしg_variant_iter_loop()を使用してコードをかなり簡略化することができます。

/* Compile with: `gcc `pkg-config --cflags --libs glib-2.0 gio-2.0` -o test test.c`. 
* Public domain. */ 

#include <glib.h> 
#include <gio/gio.h> 

int 
main (void) 
{ 
    g_autoptr(GVariant) result = g_variant_new_parsed ("@a(oa{sv}) [('/', { 'hello': <'test'>})]"); 

    g_autoptr(GVariantIter) iter1 = NULL; 
    g_variant_get (result, "a(oa{sv})", &iter1); 

    const gchar *string; 
    g_autoptr(GVariantIter) iter2 = NULL; 

    while (g_variant_iter_loop (iter1, "(&oa{sv})", &string, &iter2)) 
    { 
     const gchar *key; 
     g_autoptr(GVariant) value = NULL; 

     while (g_variant_iter_loop (iter2, "{&sv}", &key, &value)) 
     g_message ("%s, %s:%p", string, key, value); 
    } 

    return 0; 
} 
関連する問題