2016-03-24 5 views
2

私はこのg_varient_new()で遊ぶ方法を学習していて、本当に混乱しています。私はhttps://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-newを読んだが、私はそれを簡単に理解できない。g_varient_new()の結果を取得しています...

私は、コードを持っている:

#define MM_DBUS_SERVICE "org.freedesktop.ModemManager1" 
#define MM_DBUS_PATH "/org/freedesktop/ModemManager1/Modem/0" 
#define MM_DBUS_GET_PROPERTIES "org.freedesktop.DBus.Properties" 
.... 

int i; 
    GError *error = NULL; 
    GVariant *ret; 
    char **paths; 
    ret = g_dbus_proxy_call_sync (proxy, 
          "org.freedesktop.DBus.Properties.Get", 
          g_variant_new ("(ss)", 
             "org.freedesktop.ModemManager1.Modem", 
             "SignalQuality"), 
          G_DBUS_CALL_FLAGS_NONE, -1, 
          NULL, &error); 

    if (!ret) { 
      g_dbus_error_strip_remote_error (error); 
      g_print ("failed: %s\n", error->message); 
      g_error_free (error); 
      return; 
    } 

    g_variant_get (ret, "(v)", &paths); 
    g_variant_unref (ret); 

    for (i = 0; paths[i]; i++) { 
      g_print ("Printing \n"); 
      g_print ("%s\n", paths[i]); 
    } 
    g_strfreev (paths); 

それは罰金コンパイルが、それは実行時に、私はseg_faultを取得します。 TESTING 印刷

印刷 セグメンテーションフォールト

私はこの呼び出しから期待していた結果は次のとおりです。私はコールからそれにバリアントデータ構造とデータを取得するにはどうすればよい

dbus-send --system --print-reply --dest=org.freedesktop.ModemManager1 "/org/freedesktop/ModemManager1/Modem/0" org.freedesktop.DBus.Properties.Get string:org.freedesktop.ModemManager1.Modem string:"SignalQuality" 

method return sender=:1.1 -> dest=:1.121 reply_serial=2 
    variant  struct { 
     uint32 38 
     boolean true 
    } 

?これを達成するためにg_variat_new()コールをどのように形成するのですか?

おかげ

答えて

2

私が最初にあなたがしてタプルを分解する必要がある、と思う:

GVariant *inner; 
g_variant_get (ret, "(v)", &inner); 

し、次いでタプルを分解する:

guint32 num; 
gboolean b; 

g_variant_get (inner, "(ub)", &num, &b); 

チェックthis

することができますまた、機能を使用するg_variant_get_type_string(parameters)g_variant_is_of_type (parameters, G_VARIANT_TYPE (type_string))。最初はデバッグとデータフォーマット、すなわちフォーマット文字列を見つけるのに適しています.2番目はDBus APIが将来変更された場合の予防策であり、クラッシュの代わりに意味のあるを生成してg_warning()を生成し、関数からのエラー)。

+0

ありがとうございます! GLib-CRITICAL **: 'ub 'は有効なGVariant形式の文字列ではありません。 (プロセス:4434):GLib-CRITICAL **:g_variant_get:アサーション' valid_format_string(format_string、 TRUE、value) 'が失敗しました セグメンテーションエラー – Arn

+0

@Aliええと、g_variant_get_type_string(inner)を印刷できますか? – pmod

+0

@Ali括弧が足りないので、今はうまくいくはずです – pmod

関連する問題