dbus std :: vector & lt; & gt; передача данных методом обратного вызова

Мне нравится передавать C ++ std :: vector<…> данные клиенту glib

проблема: Если я отправляю векторные данные, я не получаю обратный вызов в мой обработчик обратного вызова клиента glib.

Векторные данные на шине уверены, потому что я проверил это с помощью клиентского приложения C ++.

Дискретные обратные вызовы передачи данных (int, int, ..) работают нормально. Так что я уверен, что процесс настройки и маршала верен для простых типов.

Определение вектора XML:

 arg name="vectorData" type="a(uuuuuuu)"

bus -inding-tool генерирует:

gboolean com_xxx_yyy_method (DBusGProxy *proxy, const GPtrArray* IN_vectorData, GError **error)
{
return dbus_g_proxy_call (proxy, "Method", error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), IN_vectorData, G_TYPE_INVALID, G_TYPE_INVALID);
}

Настройка маршала и обратного вызова:

void setupVectorCallback(DBusGProxy *proxy)
{
dbus_g_object_register_marshaller(marshal_VOID__BOXED, // parameter
G_TYPE_NONE,         // return type
G_TYPE_BOXED,        // or G_TYPE_POINTER ?
G_TYPE_INVALID);     // end parameter list

dbus_g_proxy_add_signal(proxy, "myVector", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID), G_TYPE_INVALID);

dbus_g_proxy_connect_signal(proxy, "myVector", G_CALLBACK(_VectorEvent_handler), NULL, NULL);
}

Маршал:

Marshal:void marshal_VOID__BOXED (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data)
{
typedef void (*GMarshalFunc_VOID__BOXED) (gpointer data1,
gpointer arg_1,
gpointer data2);
register GMarshalFunc_VOID__BOXED callback;
register GCClosure *cc = (GCClosure*) closure;
register gpointer data1, data2;

//g_return_if_fail (n_param_values == 1+1);

if (G_CCLOSURE_SWAP_DATA (closure))
{
data1 = closure->data;
data2 = g_value_peek_pointer (param_values + 0);
}
else
{
data1 = g_value_peek_pointer (param_values + 0);
data2 = closure->data;
}
callback = (GMarshalFunc_VOID__BOXED) (marshal_data ? marshal_data : cc->callback);

callback (data1,
g_marshal_value_peek_boxed (param_values + 1),
data2);
}

Обработчик обратного вызова:

void _VectorEvent_handler(void *proxy, gpointer *data)
{
}

Кто-нибудь знает, что не так в моем коде и почему DBus не принимает мой формат и обрабатывает мой обратный вызов?

Моя векторная реализация C ++ работает (в клиенте C ++), но не может быть использована в моей библиотеке. Поэтому, пожалуйста, подсказки только для реализации glib.

1

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector