使用glib通过DBus发送包含数组的struct数组

时间:2012-03-21 17:09:56

标签: c glib dbus

我正在尝试将此结构的数组发送到DBus服务器:

typedef struct
{
    guint arg1;
    guchar msg[DTC_ACTION_PATH_LENGTH];
} DTC_ErrorMessage;

这是我正在处理的功能:

gint fillMessage(GPtrArray **msg, DTC_ErrorMessage *data)
{
    g_assert(NULL != msg);
    g_assert(NULL == *msg);
    g_assert(NULL != data);

    *msg = g_ptr_array_new();
    g_assert(NULL != *msg);

    GValueArray *container = g_value_array_new(2); // struct of 2 elements
GValue v;

    memset(&v, 0, sizeof(GValue));

    // Insert first element of the struct
    g_value_init(&v, G_TYPE_INT);
    g_value_set_int(&v, data->arg1);
    g_value_array_append(container, &v);
    g_value_unset(&v);

    // Add code here for the second element of the struct

    g_ptr_array_add(*msg, (gpointer) container);

    return 0;
}

问题是:

  • 这是通过DBus发送复杂结构的正确方法吗?因为它对我来说似乎非常“错综复杂”。
  • 如何完成此功能以添加结构的第二个元素?

1 个答案:

答案 0 :(得分:0)

此解决方案似乎有效:

gint fillMessage(GPtrArray **msg, DTC_ErrorMessage *data)
{
    g_assert(NULL != msg);
    g_assert(NULL == *msg);
    g_assert(NULL != data);

    *msg = g_ptr_array_new();
    g_assert(NULL != *msg);

    GValueArray *vals;
    GArray *garray;

    vals = g_value_array_new(2);

    g_value_array_append(vals, NULL);
    g_value_init(g_value_array_get_nth(vals, 0), G_TYPE_UINT);
    g_value_set_uint(g_value_array_get_nth(vals, 0), data->arg1);

    garray = g_array_new(FALSE, TRUE, sizeof(guchar));
    gint i;
    for(i = 0; i < DTC_ACTION_PATH_LENGTH; i++)
    {
        g_array_append_val(garray, data->msg[i]);
    }

    g_value_array_append(vals, NULL);
    g_value_init (g_value_array_get_nth(vals, 1), dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR));
    g_value_take_boxed (g_value_array_get_nth(vals, 1), garray);

    g_ptr_array_add(*msg, vals);

    return 0;
}

任何更好的解决方案都将不胜感激!