2017-11-03 8 views
0

私はC++のコードスニペットを使用してdbusのインターフェイスからプロパティを取得するためのアプローチ/コードスニペットを知っていただきたいと思います。C++ gdbus - gdbusライブラリを使用してインタフェースのプロパティを取得する方法は?

私はエラーで、次のアプローチを試してみました。

アプローチ#1 g_dbus_proxy_get_cached_property を使用していますが、常に返すnullを

ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
             flags, 
             NULL, 
             "org.freedesktop.NetworkManager", 
             "org/freedesktop/NetworkManager/Device/0", 
             "org.freedesktop.NetworkManager.Device", 
             NULL, 
             &error); 
ret = g_dbus_proxy_get_cached_property(ifproxy, "State") 

アプローチ#2 g_dbus_proxy_call_syncされる - この1つは言う、 "org.freedesktop.networkmanager" エクスポートされていない(または存在しない可能性があります)、プロパティ "インタフェース"にアクセスできません。

ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              G_DBUS_PROXY_FLAGS_NONE, 
              NULL, 
              "org.freedesktop.NetworkManager", 
              "org/freedesktop/NetworkManager/Device/0", 
              "org.freedesktop.DBus.Properties", 
              NULL, NULL); 
    g_assert (ifproxy); 

    /* Get the object path of the Connection details */ 
    ret = g_dbus_proxy_call_sync (ifproxy, 
            "Get", 
            g_variant_new ("(ss)", 
               "org/freedesktop/NetworkManager/Device/0", 
               "Interface"), 
            G_DBUS_CALL_FLAGS_NONE, -1, 
            NULL, &error); 
    if (!ret) { 
     g_dbus_error_strip_remote_error (error); 
     g_warning ("Failed to get property: %s\n", 
        error->message); 
     g_error_free (error); 
     return; 
    } 

    name = g_variant_get_string(ret, NULL); 

    //g_assert(ret != NULL); 

    g_variant_get (ret, "s", &name); 
    g_variant_unref (ret); 

答えて

0

おかげでたくさんの@jku。

私はエンコードの問題を解決できました。 以下の作業コードを他の人と共有します。

static void 
list_connections (GDBusProxy *proxy) 
{ 
    int i; 
    GError *error = NULL; 
    GVariant *ret, *ret1; 
    char **paths; 
    gchar *name; 
    GDBusProxy *ifproxy; 
    GDBusProxyFlags flags; 

    /* Call ListConnections D-Bus method */ 
    ret = g_dbus_proxy_call_sync (proxy, 
            "GetDevices", 
            NULL, 
            G_DBUS_CALL_FLAGS_NONE, -1, 
            NULL, &error); 
    if (!ret) { 
     g_dbus_error_strip_remote_error (error); 
     g_print ("ListConnections failed: %s\n", error->message); 
     g_error_free (error); 
     return; 
    } 

    g_variant_get (ret, "(^ao)", &paths); 
    g_variant_unref (ret); 

    flags = static_cast<GDBusProxyFlags> (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START); 

    for (i = 0; paths[i]; i++) 
    { 
     g_print ("%s\n", paths[i]); 
     /*ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              flags, 
              NULL, 
              "org.freedesktop.NetworkManager", 
              paths[i],//"/org/freedesktop/NetworkManager/Devices/0" 
              "org.freedesktop.NetworkManager.Device", 
              NULL, 
              &error); 

     //name = g_dbus_proxy_get_interface_name(ifproxy); 
     ret = g_dbus_proxy_get_cached_property(ifproxy, "FirmwareVersion");*/ 

     ifproxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
               G_DBUS_PROXY_FLAGS_NONE, 
               NULL, 
               "org.freedesktop.NetworkManager", 
               "/org/freedesktop/NetworkManager/Devices/0", 
               "org.freedesktop.DBus.Properties", 
               NULL, NULL); 
     g_assert (ifproxy); 

     ret = g_dbus_proxy_call_sync (ifproxy, 
             "Get", 
             g_variant_new ("(ss)", 
                "org.freedesktop.NetworkManager.Device", 
                "Interface"), 
             G_DBUS_CALL_FLAGS_NONE, -1, 
             NULL, &error); 
     if (!ret) { 
      g_dbus_error_strip_remote_error (error); 
      g_warning ("Failed to get property: %s\n", 
         error->message); 
      g_error_free (error); 
      return; 
     } 

     g_print("\nType String of Variant:- %s\n", g_variant_get_type_string (ret)); 

     g_variant_get (ret, "(v)", &ret1); 
     g_variant_unref (ret); 

     g_print("\nType String of Variant:- %s\n", g_variant_get_type_string (ret1)); 
     g_variant_get (ret1, "s", &name); 
     g_variant_unref (ret1); 


     g_print ("Interface name:- %s\n", name); 
    } 
    g_strfreev (paths); 
} 

int 
main (int argc, char *argv[]) 
{ 
    GDBusProxy *proxy; 
    GDBusProxyFlags flags; 
    GError *error = NULL; 
    flags = static_cast<GDBusProxyFlags> (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START); 

#if !GLIB_CHECK_VERSION (2, 35, 0) 
    /* Initialize GType system */ 
    g_type_init(); 
#endif 

    proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, 
              flags, 
              NULL, /* GDBusInterfaceInfo */ 
              "org.freedesktop.NetworkManager", 
              "/org/freedesktop/NetworkManager", 
              "org.freedesktop.NetworkManager", 
              NULL, /* GCancellable */ 
              &error); 
    g_assert (proxy != NULL); 

    /* List connections of system settings service */ 
    list_connections (proxy); 

    g_object_unref (proxy); 

    return 0; 
} 
1

少なくとも最初のフォームは動作するはずです(実際のコードでエラーを処理すると仮定します)が、D-Busオブジェクトパスに問題があります。

それはNetworkManagerが使用するパスではないよう除いて、あなたはおそらく... /org/freedesktop/NetworkManager/Device/0を望んでいたので、まず、有効なオブジェクトパスが「/」で始まります。

APIリファレンスを見ると、実際には/org/freedesktop/NetworkManager/Devices/N(複数の「デバイス」に注意してください)が必要になるかもしれませんが、パス(N)の最後の部分がどうなるかは分かりません。適切なコードでは、デバイスがorg.freedesktop.NetworkManagerからのパスオブジェクトが、あなただけのパスが利用可能であり、それらを使用するどのオブジェクトを見つけるためにD-足のようなツールを使用する場合がありますデバッグするために取得する必要があります。

+0

入力していただきありがとうございます。 "Devices/0"のprpoerty "Interface"の出力が出てきました。出力はインターフェイス名です: - 1 \ xedI \ x89 \ XD1^H \ x89 \ xe2H \ X83 \ xe4 \ xf0PTI \ xc7 \ XC0。私はこの文字列が何を表しているのか分かりません(それは私にとってはヘキサ-10進数ではないようです)。これをASCII文字列に変換する際に私を助けてください。 –

関連する問題