LINUX.ORG.RU

Список сервисов DBus через gdbus

 , , gdbus, ,


0

1

Собственно в Qt я делаю так:

QStringList serviceList =
      QDBusConnection::systemBus().interface()->registeredServiceNames().value();
Не могу найти, есть что-нибудь подобное в gio/glib или нужно самому ручками послать сообщение и парсить?

★★★★★
Ответ на: комментарий от invy

Посмотри исходники dbus-monitor'а

А смысл? Там нет этой функции.

или bustle.

Что за зверь? Не гуглится чё-то.

UVV ★★★★★
() автор топика
Ответ на: комментарий от invy

lol, ну в тех тредах я тоже был. В общем, если кому надо, можете использовать:

#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"

using DeviceList = std::vector<std::string>;

DeviceList getServiceList()
{
   DeviceList deviceList;
   GError* pError = 0;
   GDBusConnection* pDbusConnection =
      g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &pError);
   g_clear_error(&pError);

   GDBusMessage* pRequestMessage =
      g_dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS,
                                     DBUS_INTERFACE_DBUS, "ListNames");
   GDBusMessage* pResponseMessage =
      g_dbus_connection_send_message_with_reply_sync(pDbusConnection, pRequestMessage,
                                                     G_DBUS_SEND_MESSAGE_FLAGS_NONE,
                                                     -1, NULL, NULL, &pError);
   g_object_unref(pRequestMessage);

   GVariant* pVariantResponse = g_dbus_message_get_body(pResponseMessage);

   if (!pVariantResponse) return deviceList;

   GVariant* pChildVariant = g_variant_get_child_value(pVariantResponse, 0);
   GVariantIter* iter = g_variant_iter_new(pChildVariant);
   gchar* serviceName;
   
   while (g_variant_iter_loop (iter, "&s", &serviceName)) {
      deviceList.push_back(serviceName);
   }

   return deviceList;
}

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Проблема в том, что gdbus-codegen генерит сишный код и, насколько я знаю, его нельзя заставить использовать giomm :(

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

По-моему, он уже годы не меняется.

Я так-то им и не пользовался никогда, но раз есть C++ обёртка, с ней должно быть попроще за ресурсами следить? Хотя возможны нюансы, конечно.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Вероятно, но я говорю, что смысл пропадает, поскольку gdbus-codegen генерит только сишный код.

UVV ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Чё-то я смотрю сейчас сюда и у меня закрадывается подозрение, что gdbus-codegen может и не понадобиться.. Как у glibmm с лицензией? Такая же как и у glib?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Как у glibmm с лицензией?

Эээ, тут же написано:

https://git.gnome.org/browse/glibmm/tree/examples/dbus/client_bus_listnames.c...

LGPL v2.1 или любая версия выше, по желанию.

Upd. Упс, это же пример. Вот тут надо смотреть: https://git.gnome.org/browse/glibmm/tree/COPYING. Хотя там всё равно LGPL.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Ну собсно, тоже самое, что и у glib, так что норм. Сейчас переписываю свой сервис на glibmm, вроде бы становится красивее. Спасибо за наводку.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.