Наступил на неприятные грабли...
Пишу на Kubuntu 10.10 (KDE 4.5) пока писал, тестировал и т.д. все было в порядке и нравилось. НО как только, то, что писал, запустил на Debian Lenny (KDE 3.5) несколько расстроился...
Суть проблемы:
В приложении которое отсылает сигналы подключаюсь к DBUS так:
QDBusConnection connection = QDBusConnection::connectToBus(QDBusConnection::SessionBus, DefaultsFilesystem::nameServiceFiscallistener());
if (!connection.isConnected())
Journal::instance()->error(qPrintable(QString(tr("DBus connect false"))));
else
Journal::instance()->debug(qPrintable(QString(tr("DBus connect is successfully"))));
if (!connection.registerService(DefaultsFilesystem::nameServiceFiscallistener()))
Journal::instance()->error(qPrintable(QString(tr("DBus register service false"))));
else
Journal::instance()->debug(qPrintable(QString(tr("DBus register service successfully"))));
if (!connection.registerObject(DefaultsFilesystem::pathServiceFiscallistener(), this, QDBusConnection::ExportAllSignals))
Journal::instance()->error(qPrintable(QString(tr("DBus register object false"))));
else
Journal::instance()->debug(qPrintable(QString(tr("DBus register object successfully"))));
Посылаю сигналы так:
emit makingMoneySignal(sender->id(), summ);
emit removalOfMoneySignal(sender->id(), summ);
emit beginSessionSignal(sender->id(), sessionNumber);
и так далее...
В другом приложении ловлю сигналы так
QDBusConnection::sessionBus().connect(
DefaultsFilesystem::nameServiceFiscallistener(),
DefaultsFilesystem::pathServiceFiscallistener(), "",
"makingMoneySignal", this,
SLOT(makingMoneySlot(const QString, unsigned int)));
QDBusConnection::sessionBus().connect(
DefaultsFilesystem::nameServiceFiscallistener(),
DefaultsFilesystem::pathServiceFiscallistener(), "",
"removalOfMoneySignal", this,
SLOT(removalOfMoneySlot(const QString, unsigned int)));
QDBusConnection::sessionBus().connect(
DefaultsFilesystem::nameServiceFiscallistener(),
DefaultsFilesystem::pathServiceFiscallistener(), "",
"beginSessionSignal", this,
SLOT(beginSessionSlot(const QString, int)));
И результат таков:
В Kubuntu в сессии KDE все работает как часы (без KDE не проверял, но уверен будут грабли)
В Debian без сессии KDE
Получаю сообщения об ошибках
> DBus connect false
> DBus register object false
> DBus register object false
Ну и соответственно ничего не работает.
В Debian в сессии KDE
Подключение проходит успешно, но при отсылке сигнала получаю сообщения типа такого:
process 9565: arguments to dbus_message_new_signal() were incorrect, assertion "interface != NULL" failed in file dbus-message.c line 1287.
This is normally a bug in some application using the D-Bus library.
QDBusConnection: Could not emit signal (null).beginSaleSignal
process 9565: arguments to dbus_message_new_signal() were incorrect, assertion "interface != NULL" failed in file dbus-message.c line 1287.
This is normally a bug in some application using the D-Bus library.
QDBusConnection: Could not emit signal (null).addSalePositionSignal
Идея работы приложения такая:
- Приложение которое будет отсылать сигналы запускается однозначно до всех WindowManager, KDM, GDM и т.д.
- Приложение которое ловит сигналы будет запускаться уже в X сессии
Вопрос как заставить работать DBUS чтобы не было привязки к запущенной сессии не то, что KDE, а вообще к Х11 но чтобы сигналы отправлялись-ловились?
Как правильно вообще такое делать? Впервые столкнулся с DBUS.