2016-04-27 17 views
1

existieren finde ich eine App mit dieser com.example.appname.desktop Datei wie folgt implementieren:D-Bus-Methode nicht auf Objektpfad trotz der Tatsache, dass Methode

$ cat /usr/local/share/applications/com.example.appname.desktop 
[Desktop Entry] 
Version=1.0 
Terminal=false 
Type=Application 
Name=appname 
Exec=/opt/app/appname %u 
DBusActivatable=true 
Categories=Network; 
MimeType=x-scheme-handler/itmm; 
NoDisplay=false 

$ cat /usr/share/dbus-1/services/com.example.appname.service 
[D-BUS Service] 
Name=com.example.appname 
Exec=/opt/app/appname 

Introspection XML wie folgt aussieht:

$ qdbus com.example.appname /com/example/appname 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.freedesktop.Application"> 
    <method name="ActivateAction"> 
     <arg name="action_name" type="s" direction="in"/> 
     <arg name="parameter" type="av" direction="in"/> 
     <arg name="platform_data" type="a{sv}" direction="in"/> 
     <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QVariantMap"/> 
    </method> 
    <method name="Activate"> 
     <arg name="platform_data" type="a{sv}" direction="in"/> 
     <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/> 
    </method> 
    <method name="Open"> 
     <arg name="uris" type="as" direction="in"/> 
     <arg name="platform_data" type="a{sv}" direction="in"/> 
     <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/> 
    </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> 
    ----<snipped>----- 

Aber wenn ich versuche, um die Methode starten sie es mir einen Fehler gibt:

$ gapplication launch com.example.appname                            
error sending Activate message to application: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such method 'Activate' in interface 'org.freedesktop.Application' at object path '/com/example/appname' (signature 'a{sv}') 

Ist "Annotation name = .." XML Tag (siehe Introspection XML) der Grund, warum diese Methode nicht gefunden wurde? Browsen zu itmm://192.168.1.1/query?version=1.0 über Browser startet die Anwendung mit Befehlszeilenparameter, aber es wird nicht über D-Bus-Dienst gestartet und das ist, was meine Anforderung ist. Gibt es eine Möglichkeit, dies über Firefox oder Google Chrome Browser zu debuggen?

Antwort

1

Ich benutze QTs D-Bus-Anbindung, um den D-Bus-Dienst zu implementieren. Mein Problem war

  1. Meine Klasse, die D-Bus-Schnittstelle implementierte, erbte nicht QDBusAbstractAdaptor.
  2. Methoden zur wurden als nicht exportierende markiert public slots

Meine ursprüngliche Klasse wie diese unten sah:

class DBusService : public QDBusAbstractAdaptor //<----- Inherit from this class 
{ 
    QOBJECT 
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application") 

    public slots: // <------ mark public slots 
    void Activate(QMap<QString, QVariant> platform_data) 
    { 
     Q_UNUSED(platform_data); 
    }  

    void Open(QStringList uris, QMap<QString, QVariant> platform_data) 
    { 
     Q_UNUSED(platform_data); 
     if(! uris.size()) { 
      return; 
     } 
     QUrl url(uris[0]); 
     qApp->MyCustomMethod(url); 
    } 
} 

D-Bus-Debugging-Tools:

class DBusService : public Application 
{ 
    QOBJECT 
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application") 
    public: 
    void Activate(QMap<QString, QVariant> platform_data) 
    { 
     Q_UNUSED(platform_data); 
    }  

    void Open(QStringList uris, QMap<QString, QVariant> platform_data) 
    { 
     Q_UNUSED(platform_data); 
     if(! uris.size()) { 
      return; 
     } 
     QUrl url(uris[0]); 
     //use url 
    } 
} 

man arbeitet Nach


Diese Tools haben mir geholfen, D-Bus i zu debuggen sues.
dbus-monitor - schnüffelt Verkehr auf dem Bus

gapplication - können Sie DBusActivatable Dienste debuggen.