dbus access problem

Ralf Habacker ralf.habacker at freenet.de
Wed Jul 16 21:28:29 CEST 2008


Christian Ehrlicher schrieb:
> Ralf Habacker schrieb:
>> Jaroslaw Staniek schrieb:
>>> Ralf Habacker said the following, On 2008-07-14 10:28:
>>>  
>>>> Hi,
>>>>
>>>> currently I'm extending kdeinit4 with a save application close 
>>>> feature which calls the quit() method of /MainApplication over dbus 
>>>> using the following code:
>>>>
>>>>     QDBusConnection connection = QDBusConnection::sessionBus();
>>>>     QDBusConnectionInterface *bus = connection.interface();
>>>>     const QStringList services = bus->registeredServiceNames();
>>>>     foreach(const QString &service, services) {
>>>>         if (!service.startsWith("org.kde"))
>>>>             continue;
>>>>         QDBusInterface *iface = new QDBusInterface(service,
>>>>                                QLatin1String("/MainApplication"),
>>>>                                QLatin1String("org.kde.KApplication"),
>>>>                                QDBusConnection::sessionBus());
>>>>         qDebug() << "killing " << service;
>>>>         iface->call("quit");
>>>>         qDebug() << 
>>>> iface->lastError();                                  
>>>> This code worked until yesterday without any problems.  Yesterday I 
>>>> updated to recent dbus svn source and now this code does not work 
>>>> anymore.
>>>>
>>>> [3804] Debug:killing  "org.kde.kate-4724"
>>>> [3804] 
>>>> Debug:QDBusError("org.freedesktop.DBus.Error.UnknownInterface", "No 
>>>> such interface 'org.kde.KApplication' at object path 
>>>> '/MainApplication'")
>>>>
>>>> The same behavior could be reproduced with qdbusviewer.
>>>>     
>>> Did you use the original dbus (without my changes) before yesterday?
>>>   
>> After digging more into this issue it looks that this problem stays 
>> alredy some time
>>
>> - at least in the version i tried, 4.0.73,4.0.80, 4.0.83 and  recent 
>> svn source some interfaces (org.kde and com.trolltech) in the Object 
>> Path /MainApplication are not accessable.
>>
>> This problem could be verifed by running the following commands on a 
>> command shell
>>
>> C:\Programme\kde-4\bin>kdeinit4 --verbose
>> kdeinit4: Launched dbus-launch.exe, pid = 2464
>> kdeinit4: Launched klauncher, pid = 3964
>> create process "C:\Programme\kde-4.0.0\bin\dbus-daemon.exe" 
>> "C:\Programme\kde-4.0.0\bin\dbus-daemon.exe"  --session
>> org.kde.klauncher is registered in dbus
>> kdeinit4: Launched kded4, pid = 1824
>> org.kde.kded is registered in dbus
>>
>> C:\Programme\kde-4\bin>qdbus
>> :1.0
>> :1.1
>>  org.kde.klauncher
>> :1.2
>>  org.kde.kded
>> :1.4
>> org.freedesktop.DBus
>>
>> C:\Programme\kde-4\bin>qdbus org.kde.kded
>> /
>> /MainApplication
>> /kbuildsycoca
>> /kded
>> /modules
>> /modules/winstartmenu
>>
>> C:\Programme\kde-4\bin>qdbus org.kde.kded /MainApplication
>> method void org.kde.KApplication.quit()
>> method void org.kde.KApplication.reparseConfiguration()
>> method void org.kde.KApplication.updateUserTimestamp()
>> method void org.kde.KApplication.updateUserTimestamp(int time)
>> property readwrite int com.trolltech.Qt.QApplication.cursorFlashTime
>> property readwrite int com.trolltech.Qt.QApplication.doubleClickInterval
>> property readwrite QSize com.trolltech.Qt.QApplication.globalStrut
>> property readwrite int 
>> com.trolltech.Qt.QApplication.keyboardInputInterval
>> property readwrite bool 
>> com.trolltech.Qt.QApplication.quitOnLastWindowClosed
>> property readwrite int com.trolltech.Qt.QApplication.startDragDistance
>> property readwrite int com.trolltech.Qt.QApplication.startDragTime
>> property readwrite QString com.trolltech.Qt.QApplication.styleSheet
>> property readwrite int com.trolltech.Qt.QApplication.wheelScrollLines
>> property readwrite QString 
>> com.trolltech.Qt.QCoreApplication.applicationName
>> property readwrite QString 
>> com.trolltech.Qt.QCoreApplication.applicationVersion
>> property readwrite QString 
>> com.trolltech.Qt.QCoreApplication.organizationDomain
>> property readwrite QString 
>> com.trolltech.Qt.QCoreApplication.organizationName
>> method int org.kde.KUniqueApplication.newInstance()
>> method int org.kde.KUniqueApplication.newInstance(QByteArray asn_id)
>> method int org.kde.KUniqueApplication.newInstance(QByteArray asn_id, 
>> QByteArray args)
>> method QDBusVariant org.freedesktop.DBus.Properties.Get(QString 
>> interface_name, QString property_name)
>> method void org.freedesktop.DBus.Properties.Set(QString 
>> interface_name, QString property_name, QDBusVariant value)
>> method QString org.freedesktop.DBus.Introspectable.Introspect()
>>
>> C:\Programme\kde-4\bin>qdbus org.kde.kded /MainApplication 
>> org.freedesktop.DBus.Introspectable.Introspect
>> <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 
>> 1.0//EN"
>> "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
>> <node>
>>   <interface name="org.kde.KApplication">
>>     <method name="updateUserTimestamp">
>>       <arg name="time" type="i" direction="in"/>
>>     </method>
>>     <method name="updateUserTimestamp">
>>     </method>
>>     <method name="reparseConfiguration">
>>     </method>
>>     <method name="quit">
>>     </method>
>>   </interface>
>>   <interface name="com.trolltech.Qt.QApplication">
>>     <property name="cursorFlashTime" type="i" access="readwrite"/>
>>     <property name="doubleClickInterval" type="i" access="readwrite"/>
>>     <property name="keyboardInputInterval" type="i" access="readwrite"/>
>>     <property name="wheelScrollLines" type="i" access="readwrite"/>
>>     <property name="globalStrut" type="(ii)" access="readwrite">
>>       <annotation name="com.trolltech.QtDBus.QtTypeName" value="QSize"/>
>>     </property>
>>     <property name="startDragTime" type="i" access="readwrite"/>
>>     <property name="startDragDistance" type="i" access="readwrite"/>
>>     <property name="quitOnLastWindowClosed" type="b" 
>> access="readwrite"/>
>>     <property name="styleSheet" type="s" access="readwrite"/>
>>   </interface>
>>   <interface name="com.trolltech.Qt.QCoreApplication">
>>     <property name="applicationName" type="s" access="readwrite"/>
>>     <property name="applicationVersion" type="s" access="readwrite"/>
>>     <property name="organizationName" type="s" access="readwrite"/>
>>     <property name="organizationDomain" type="s" access="readwrite"/>
>>   </interface>
>>   <interface name="org.kde.KUniqueApplication">
>>     <method name="newInstance">
>>       <arg type="i" direction="out"/>
>>       <arg name="asn_id" type="ay" direction="in"/>
>>       <arg name="args" type="ay" direction="in"/>
>>     </method>
>>     <method name="newInstance">
>>       <arg type="i" direction="out"/>
>>       <arg name="asn_id" type="ay" direction="in"/>
>>     </method>
>>     <method name="newInstance">
>>       <arg type="i" direction="out"/>
>>     </method>
>>   </interface>
>>   <interface name="org.freedesktop.DBus.Properties">
>>     <method name="Get">
>>       <arg name="interface_name" type="s" direction="in"/>
>>       <arg name="property_name" type="s" direction="in"/>
>>       <arg name="value" type="v" direction="out"/>
>>     </method>
>>     <method name="Set">
>>       <arg name="interface_name" type="s" direction="in"/>
>>       <arg name="property_name" type="s" direction="in"/>
>>       <arg name="value" type="v" direction="in"/>
>>     </method>
>>   </interface>
>>   <interface name="org.freedesktop.DBus.Introspectable">
>>     <method name="Introspect">
>>       <arg name="xml_data" type="s" direction="out"/>
>>     </method>
>>   </interface>
>> </node>
>>
>> C:\Programme\kde-4\bin>qdbus org.kde.kded /MainApplication 
>> org.kde.KApplication.quit
>> Error: org.freedesktop.DBus.Error.UnknownInterface
>> No such interface 'org.kde.KApplication' at object path 
>> '/MainApplication'
>>
>>
>> Does anyone can give me some hints who to find the problem ?
>>
> After some debugging I think you can't access methods registered on 
> the sesion bus. At least in kded4 this seems to be correct.
>
>
I don't believe this - try a method from the /kded object path eg

run first

qdbus org.kde.kded /kded 

and then take one method from the above list

qdbus org.kde.kded /kded   <interface.method-without-()>

they works.

Ralf



More information about the Kde-windows mailing list