2016-03-24 71 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。 測試 印刷

印刷 分段故障

我從這個調用期望的結果是:

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))。第一個是調試和查找數據格式的好,即格式字符串,第二個是預防性措施,如果DBus API將來會發生變化,而不是崩潰,您可以生成有意義的g_warning()並採取行動(例如返回一些來自函數的錯誤)。

+0

謝謝!我仍然得到: (process:4434):GLib-CRITICAL **:'ub'不是有效的GVariant格式字符串 (進程:4434):GLib-CRITICAL **:g_variant_get:assertion'valid_format_string(format_string, TRUE,值)'失敗 分割錯誤 – Arn

+0

@Ali嗯,你可以打印然後g_variant_get_type_string(內部)? – pmod

+0

@Ali我加了丟失的括號,所以現在應該可以工作 – pmod