1

gdbusC のライブラリを使用して、p2p 用の wpa_supplicant の dbus インターフェイスから「InvitationReceived」シグナルを受信するように登録しようとすると、問題が発生します。

P2P dbus インターフェイスへのプロキシ接続を作成してメソッドを呼び出すことはできますが、シグナル ハンドラをプロキシに接続しようとすると、シグナルが無効であることを示す次のエラーが表示されます (コードからの関連する出力サンプル):

(プロセス:6764): GLib-GObject-WARNING **: /tmp/buildd/glib2.0-2.42.1/./gobject/gsignal.c:2461: シグナル 'InvitationReceived' は、タイプのインスタンス '0x909ae0' に対して無効です「GDBusProxy」

「InvitationReceived」はwpa_supplicant dbus apiで定義されているシグナルの名前であるため、これは奇妙です。


コードサンプル:

static void on_wpa_ready (GObject *source_object,
                          GAsyncResult *res,
                          gpointer user_data) {
    g_print("on_wpa_ready\n");

    GError *error = NULL;
    GVariant *output;  

    GDBusProxy *p2p_proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
    if (error) {
        g_print("proxy finish error: %s\n", error->message);
        g_error_free(error);
        return;
    }

    /* call p2p_listen */   
    g_clear_error(&error);
    output = NULL;
    output = g_dbus_proxy_call_sync(p2p_proxy,
                      "Listen",
                      g_variant_new("(i)", 0), //params
                      G_DBUS_CALL_FLAGS_NONE,
                      10, //timeout_msec
                      NULL,
                      &error
    );

    if (error) {
        g_print("Listen call error: %s\n", error->message);
        g_error_free(error);
        g_print("continuing...\n");
    }
    else {
        /* it gets to this print stmt, so the method was able to be called */
        g_print("Listen successful\n");
    }

    /* register for signal from p2p device */
    /* THIS IS WHERE THE ERROR IS */
    error = NULL;
    g_signal_connect(p2p_proxy,
                     "InvitationReceived",
                     G_CALLBACK(on_signal), // stub func that does something simple
                     NULL);

}

int main (int argc, char **argv) {
    GMainLoop *loop;

    /* connect to wpa_supplicant p2p dbus interface */
    g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
                     G_DBUS_PROXY_FLAGS_NONE,
                     NULL,
                     "fi.w1.wpa_supplicant1", //name,
                     "/fi/w1/wpa_supplicant1/Interfaces/0", //object_path,
                     "fi.w1.wpa_supplicant1.Interface.P2PDevice", //interface_name,
                     NULL,
                     on_wpa_ready, //callback,
                     NULL);
    );

    loop = g_main_loop_new(NULL, FALSE);
    g_main_loop_run(loop);
}

シグナル名に追加する必要がある特別なパスはありますか? または、シグナル ハンドラを登録するために、メソッドの呼び出しに使用するプロキシとは別のプロキシを使用する必要がありますか?

4

1 に答える 1