Maison  >  Article  >  développement back-end  >  Erreur org.freedesktop.DBus.Error.UnknownMethod : méthode inconnue/invalide 'Notify'

Erreur org.freedesktop.DBus.Error.UnknownMethod : méthode inconnue/invalide 'Notify'

PHPz
PHPzavant
2024-02-06 08:00:171209parcourir

错误 org.freedesktop.DBus.Error.UnknownMethod:未知/无效方法“Notify”

Contenu de la question

J'essaie de créer un serveur de notification à l'aide de Godbus, mais je ne parviens pas à exporter correctement mon objet serveur vers dbus, et dbus ne reconnaît que mon XML d'introspection. J'ai suivi https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html pour l'implémenter. J'utilise également _example/server.go dans le référentiel godbus, que vous remarquerez peut-être dans le code du serveur fourni ci-dessous. Voici le code du serveur :

package main

import (
    "fmt"
    "os"

    "github.com/godbus/dbus/v5"
    "github.com/godbus/dbus/v5/introspect"
)

const xml = `
<node>
    <interface name="org.freedesktop.notifications">
        <method name="notify">
            <arg direction="in" type="s"/>
            <arg direction="in" type="u"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="as"/>
            <arg direction="in" type="a{sv}"/>
            <arg direction="in" type="i"/>
            <arg direction="out" type="u"/>
        </method>

        <method name="getcapabilities">
            <arg direction="out" type="as"/>
        </method>

        <method name="getserverinformation">
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
        </method>

        <method name="closenotification">
            <arg direction="in" type="u"/>
        </method>

        <signal name="notificationclosed">
            <arg type="u" name="id"/>
            <arg type="u" name="reason"/>
        </signal>
    </interface>` + introspect.introspectdatastring + `</node> `

type notificationserver struct {
}

func (s *notificationserver) notify(appname string, replacesid uint32, appicon string, summary string, body string, actions []string, hints map[string]dbus.variant, expiretimeout int32) (uint32, *dbus.error) {
    fmt.printf("new notification: %s\n", body)
    return 0, nil
}

func (s *notificationserver) getcapabilities() ([]string, *dbus.error) {
    return []string{"action-icons", "actions", "body", "body-hyperlinks", "body-images", "body-markup", "icon-multi", "icon-static", "persistence", "sound"}, nil
}

func (s *notificationserver) getserverinformation() (string, string, string, string, *dbus.error) {
    return "antarctica", "antarctica.com", "1.0", "1.2", nil
}

func (s *notificationserver) closenotification(id uint32) *dbus.error {
    s.notificationclosed(id, 0)
    return nil
}
func (s *notificationserver) notificationclosed(id, reason uint32) {

}

func main() {
    conn, err := dbus.connectsessionbus()
    if err != nil {
        panic(err)
    }
    defer conn.close()

    reply, err := conn.requestname("com.antarctica.notification",
        dbus.nameflagdonotqueue)
    if err != nil {
        panic(err)
    }

    if reply != dbus.requestnamereplyprimaryowner {
        fmt.fprintln(os.stderr, "name already taken")
        os.exit(1)
    }
    server := notificationserver{}
    err = conn.export(server,"/org/freedesktop/notifications","org.freedesktop.notifications")
    if err != nil {
        panic(err)
    }
    conn.export(introspect.introspectable(xml), "/org/freedesktop/notifications", "org.freedesktop.dbus.introspectable")
    fmt.println("listening on com.antarctica.notification / /com/antarctica/notification ...")
    select {}
}

Le problème maintenant est que même si le client a accès au XML d'introspection :

$ gdbus introspect --session --dest com.antarctica.notification --object-path /org/freedesktop/notifications --xml

> returns xml

Je ne peux pas utiliser la méthode org.freedesktop.notifications que j'ai écrite dans le code du serveur. Par exemple, notify est inconnu/invalide, ce qui est le même pour chaque méthode :

$ dbus-send --session --print-reply=literal --dest=com.antarctica.notification /org/freedesktop/Notifications org.freedesktop.Notifications.Notify

> Error org.freedesktop.DBus.Error.UnknownMethod: Unknown / invalid method 'Notify'

Également dans qdbusviewer, lorsque j'essaie d'exécuter une méthode, il est indiqué "Impossible de trouver la méthode x au chemin /org/freedesktop/notifications dans l'interface org.freedesktop.notifications"

Ce que j'ai essayé :

  1. Vérifiez si dbus est en cours d'exécution
  2. Vérifiez si mon serveur fonctionne
  3. J'ai également essayé de redémarrer le service dbus et mon ordinateur
  4. Je pense que l'instance (serveur) de notificationserver n'est pas du tout exportée, mais je ne sais pas pourquoi

Bonne réponse


Cela fonctionne. Vous avez fait deux erreurs :

  1. com.antarctica.notification
  2. func (s *serveur de notification)

Vous devez demander "org.freedesktop.notifications" comme nom et vous ne pouvez pas utiliser de pointeurs dans les fonctions.

  1. org.freedesktop.notifications
  2. func (serveur de notifications)
  3. (Vous n'avez pas non plus besoin d'introspection)
package main

import (
    "fmt"
    "os"

    "github.com/godbus/dbus/v5"
)

type notificationServer struct{}

func (s notificationServer) Notify(appName string, replacesID uint32, appIcon string, summary string, body string, actions []string, hints map[string]dbus.Variant, expireTimeout int32) (uint32, *dbus.Error) {
    fmt.Printf("New notification: %s\n", body)
    return 0, nil
}

func (s notificationServer) GetCapabilities() ([]string, *dbus.Error) {
    return []string{"action-icons", "actions", "body", "body-hyperlinks", "body-images", "body-markup", "icon-multi", "icon-static", "persistence", "sound"}, nil
}

func (s notificationServer) GetServerInformation() (string, string, string, string, *dbus.Error) {
    return "antarctica", "antarctica.com", "1.0", "1.2", nil
}

func main() {
    conn, err := dbus.ConnectSessionBus()
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    f := notificationServer{}
    conn.Export(f, "/org/freedesktop/Notifications", "org.freedesktop.Notifications")

    reply, err := conn.RequestName("org.freedesktop.Notifications", dbus.NameFlagDoNotQueue)
    if err != nil {
        panic(err)
    }
    if reply != dbus.RequestNameReplyPrimaryOwner {
        fmt.Fprintln(os.Stderr, "name already taken")
        os.Exit(1)
    }
    fmt.Println("Listening...")
    select {}
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer