将代码从已弃用的 dbus-glib 迁移到 GDBus

问题描述 投票:0回答:0

我一直在努力更新一些旧代码,这些代码使用已弃用的 dbus-glib DBUS 绑定 Glib。这个想法是改用 GDBus。这是原始代码: `

static gpointer afpstats_thread(gpointer _data) { 
  DBusGConnection *bus;
  DBusGProxy *bus_proxy;
  GError *error = NULL;
  GMainContext *ctxt;
  GMainLoop *thread_loop;
  guint request_name_result; 
  sigset_t sigs;

/* Block all signals in this thread */
sigfillset(&sigs);
pthread_sigmask(SIG_BLOCK, &sigs, NULL);

ctxt = g_main_context_new();
thread_loop = g_main_loop_new(ctxt, FALSE);

dbus_g_object_type_install_info(AFPSTATS_TYPE_OBJECT, &dbus_glib_afpstats_obj_object_info);

if (!(bus = dbus_g_bus_get_private(DBUS_BUS_SYSTEM, ctxt, &error))) {
    LOG(log_error, logtype_afpd,"Couldn't connect to system bus: %s", error->message);
    return NULL;
}

if (!(bus_proxy = dbus_g_proxy_new_for_name(bus, "org.freedesktop.DBus",
                                            "/org/freedesktop/DBus",
                                            "org.freedesktop.DBus"))) {
    LOG(log_error, logtype_afpd,"Couldn't create bus proxy");
    return NULL;
}

if (!dbus_g_proxy_call(bus_proxy, "RequestName", &error,
                       G_TYPE_STRING, "org.netatalk.AFPStats",
                       G_TYPE_UINT, 0,
                       G_TYPE_INVALID,
                       G_TYPE_UINT, &request_name_result,
                       G_TYPE_INVALID)) {
    LOG(log_error, logtype_afpd, "Failed to acquire DBUS name: %s", error->message);
    return NULL;
}

AFPStatsObj *obj = g_object_new(AFPSTATS_TYPE_OBJECT, NULL);
dbus_g_connection_register_g_object(bus, "/org/netatalk/AFPStats", G_OBJECT(obj));

g_main_loop_run(thread_loop);
return thread_loop;
}

我已尝试根据指南这里

用它们的 GDBus 等价物替换已弃用的函数

这是我到目前为止所取得的成就:

static gpointer afpstats_thread(gpointer _data) { 
  GDBusGonnection *bus;
  GDBusProxy *bus_proxy;
  GError *error = NULL;
  GMainContext *ctxt;
  GMainLoop *thread_loop;
  guint request_name_result; 
  sigset_t sigs;

/* Block all signals in this thread */
sigfillset(&sigs);
pthread_sigmask(SIG_BLOCK, &sigs, NULL);

ctxt = g_main_context_new();
thread_loop = g_main_loop_new(ctxt, FALSE);

if (!(bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM,
                           NULL,
                           &error))) {
    LOG(log_error, logtype_afpd,"Couldn't connect to system bus: %s", error->message);
    return NULL;
}

if (!(bus_proxy = g_dbus_proxy_new_sync(bus,
                                                G_DBUS_PROXY_FLAGS_NONE,
                                                NULL, /* GDBusInterfaceInfo */
                                                "org.freedesktop.DBus",
                                                "/org/freedesktop/DBus",
                                                "org.freedesktop.DBus",
                                                NULL, /* GCancellable */
                                                &error))) {
    LOG(log_error, logtype_afpd,"Couldn't create bus proxy");
    return NULL;
}

if (!g_dbus_proxy_call_sync(bus_proxy,
                            "RequestName",
                            g_variant_new("(su)", "org.netatalk.AFPStats", 0),
                            G_DBUS_CALL_FLAGS_NONE,
                            -1, /* timeout */
                            NULL,
                            &error)) {
    LOG(log_error, logtype_afpd, "Failed to acquire DBUS name: %s", error->message);
    return NULL;
}

static const gchar introspection_xml[] =
    "<node>"
    "  <interface name='org.netatalk.AFPStats'>"
    "    <method name='GetUsers'>"
    "      <arg name='ret' type='as' direction='out'/>"
    "    </method>"
    "  </interface>"
    "</node>";

  introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
  g_assert (introspection_data != NULL);

AFPStatsObj *obj = g_object_new(AFPSTATS_TYPE_OBJECT, NULL);

g_dbus_connection_register_object(bus,
                                  "/org/netatalk/AFPStats",
                                  introspection_data->interfaces[0],
                                  NULL,
                                  G_OBJECT(obj),
                                  NULL,
                                  &error);

g_main_loop_run(thread_loop);
return thread_loop;

}

测试代码时,我没有收到有关尚未创建总线代理或尚未获取 DBUS 名称的错误消息。但是,在运行编译后的代码时,我收到一条错误消息:

dbus.exceptions.DBusException:org.freedesktop.DBus.Error.UnknownMethod:对象不存在于路径“/org/netatalk/AFPStats”

这表明 AFPStats 对象没有按预期导出。

我不知道从这里去哪里。任何想法都会非常有帮助。

migration dbus gdbus
© www.soinside.com 2019 - 2024. All rights reserved.