我一直在努力更新一些旧代码,这些代码使用已弃用的 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 对象没有按预期导出。
我不知道从这里去哪里。任何想法都会非常有帮助。