2016-03-24 2 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

Спасибо! Я все еще получаю следующее: (процесс: 4434): GLib-CRITICAL **: 'ub 'не является допустимой строкой формата GVariant (процесс: 4434): GLib-CRITICAL **: g_variant_get: assertion' valid_format_string (format_string, TRUE, value) 'failed Ошибка сегментации – Arn

+0

@Ali Хм, можете ли вы напечатать g_variant_get_type_string (внутренний)? – pmod

+0

@Ali Я добавил отсутствующие скобки, так что теперь должен работать – pmod

Смежные вопросы