Используя gdbus-codegen для вызова метода dbus, серверная сторона работает, но строка ответа на клиентской стороне всегда NULL - PullRequest
0 голосов
/ 30 апреля 2018

Используя gdbus-codegen для вызова метода dbus, серверная сторона работает, но строка ответа на клиентской стороне всегда NULL. В частности, буфер в вызове new_cfg_gdbus_call_receive_new_config_sync (прокси, "new_cfg", buf, NULL и ошибка); NULL, я не уверен, как заполнить это на стороне сервера.

Командная строка:

gdbus-codegen --generate-c-code new_cfg_gen --c-namespace NewCfg --interface-prefix com.new_cfg. com.new_cfg.GDBUS.xml

XML:

<node>
    <interface name="com.new_cfg.GDBUS">
        <method name="ReceiveNewConfig">
            <arg name="greeting" direction="in" type="s"/>
            <arg name="response" direction="out" type="s"/>
        </method>
    </interface>
</node>

Клиент:

NewCfgGDBUS *proxy;
GError *error;
gchar **buf = NULL;
error = NULL;
proxy = new_cfg_gdbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
        "com.new_cfg", "/com/new_cfg/GDBUS", NULL, &error);
new_cfg_gdbus_call_receive_new_config_sync(proxy, "new_cfg", buf, NULL, &error);
if(NULL != buf && NULL != *buf)
{
    g_print("resp: %s\n", *buf);
}
else
{
    g_print("resp is NULL");
}
g_object_unref(proxy);

Сервер:

static gboolean
on_rcv_new_cfg (NewCfgGDBUS *interface, GDBusMethodInvocation *invocation,
                const gchar *greeting, gpointer user_data)
{
    gchar *response;
    response = g_strdup_printf ("New Config %s is valid.", greeting);
    new_cfg_gdbus_complete_receive_new_config (interface, invocation, response);
    g_print("%s\n", response);
    g_free (response);
    return TRUE;
}

static void
on_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data)
{
    NewCfgGDBUS *interface;
    GError *error;
    interface = new_cfg_gdbus_skeleton_new();
    g_signal_connect (interface, "handle-receive-new-config", G_CALLBACK (on_rcv_new_cfg), NULL);
    error = NULL;
    (void)!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (interface), connection, "/com/new_cfg/GDBUS", &error);
}

Серверная петля:

GMainLoop *loop;
loop = g_main_loop_new (NULL, FALSE);
g_bus_own_name(G_BUS_TYPE_SYSTEM, "com.new_cfg", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
            on_name_acquired, NULL, NULL, NULL);
g_main_loop_run (loop);

1 Ответ

0 голосов
/ 30 апреля 2018

Решено: Правильный параметр в этом случае - просто char *, gdbus не генерирует (не выделяет) указатель на строку и строку. Он только распределяет строку, возвращает адрес.

...