Наступил на неприятные грабли...
Пишу на 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.