Получить содержимое GVariant

В настоящее время я пытаюсь связаться с dbus и есть функция, которая вернет array of struct(string, uint32, string, string, object path), У меня есть результат, сохраненный в GVariant и печать этого GVariant показывает, что там есть правильные значения результата.

Более наглядно: я пытаюсь получить результат от Systemd’s Logind Managers ListSessions,

Выходные данные печати:

[('2', uint32 1000, 'nidhoegger', 'seat0', objectpath
'/org/freedesktop/login1/session/_32'), ('6', 1001, 'test', 'seat0',
'/org/freedesktop/login1/session/_36'), ('c2', 111, 'lightdm',
'seat0', '/org/freedesktop/login1/session/c2')]

Сейчас я пытаюсь получить каждый элемент массива в цикле, используя:

for (uint32_t i = 0; i < ::g_variant_n_children(v); ++i)
{
GVariant *child = ::g_variant_get_child_value(v, i);
}

При печати ребенка я получаю:

<('2', uint32 1000, 'nidhoegger', 'seat0', objectpath '/org/freedesktop/login1/session/_32')>

Все идет нормально. Сейчас я пытаюсь получить отдельные предметы, используя g_variant_get сюда:

gchar *id = NULL;
uint32_t uid = 0;
gchar *user = NULL;
gchar *seat = NULL;
gchar *session_path = NULL;

::g_variant_get(v, "(susso)", &id, &uid, &user, &seat, &session_path);

Но это только дает мне это утверждение:

(process:12712): GLib-CRITICAL **: the GVariant format string '(susso)' has a type of '(susso)' but the given value has a type of 'v'

(process:12712): GLib-CRITICAL **: g_variant_get_va: assertion 'valid_format_string (format_string, !endptr, value)' failed

Если это уместно: я сгенерировал код для связи с gdbus-codegen и функция для получения значения имеет эту подпись:

gboolean login1_manager_call_list_sessions_sync (
Login1Manager *proxy,
GVariant **out_unnamed_arg0,
GCancellable *cancellable,
GError **error);

Что я делаю неправильно? Почему он возвращает «v» в качестве значения?

0

Решение

::g_variant_get(v, "(susso)", &id, &uid, &user, &seat, &session_path);

Это выглядит подозрительно. Вы должны звонить на childне v,

Следующий код на C отлично работает для меня:

/* gcc `pkg-config --cflags --libs glib-2.0` -o test test.c */
#include <glib.h>

int
main (void)
{
g_autoptr(GVariant) sessions = NULL;

sessions = g_variant_new_parsed ("[('2', uint32 1000, 'nidhoegger', 'seat0', objectpath '/org/freedesktop/login1/session/_32'), ('6', 1001, 'test', 'seat0', '/org/freedesktop/login1/session/_36'), ('c2', 111, 'lightdm', 'seat0', '/org/freedesktop/login1/session/c2')]");

for (gsize i = 0; i < g_variant_n_children (sessions); i++)
{
g_autoptr(GVariant) child = g_variant_get_child_value (sessions, i);
g_message ("Child %" G_GSIZE_FORMAT ": %s", i, g_variant_get_type_string (child));

guint32 uid;
const gchar *id, *user, *seat, *session_path;

g_variant_get (child, "(&su&s&s&o)", &id, &uid, &user, &seat, &session_path);

g_message ("%s, %u, %s, %s, %s", id, uid, user, seat, session_path);
}

return 0;
}

Он печатает следующее:

** Message: Child 0: (susso)
** Message: 2, 1000, nidhoegger, seat0, /org/freedesktop/login1/session/_32
** Message: Child 1: (susso)
** Message: 6, 1001, test, seat0, /org/freedesktop/login1/session/_36
** Message: Child 2: (susso)
** Message: c2, 111, lightdm, seat0, /org/freedesktop/login1/session/c2
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]