mirror of
https://github.com/prometheus/node_exporter.git
synced 2025-02-02 08:42:31 -08:00
Update vendoring for github.com/godbus/dbus
This commit is contained in:
parent
ed9acc935c
commit
84c6c66a35
1
vendor/github.com/godbus/dbus/MAINTAINERS
generated
vendored
1
vendor/github.com/godbus/dbus/MAINTAINERS
generated
vendored
|
@ -1,2 +1,3 @@
|
||||||
Brandon Philips <brandon@ifup.org> (@philips)
|
Brandon Philips <brandon@ifup.org> (@philips)
|
||||||
Brian Waldon <brian@waldon.cc> (@bcwaldon)
|
Brian Waldon <brian@waldon.cc> (@bcwaldon)
|
||||||
|
John Southworth <jsouthwo@brocade.com> (@jsouthworth)
|
||||||
|
|
2
vendor/github.com/godbus/dbus/README.markdown
generated
vendored
2
vendor/github.com/godbus/dbus/README.markdown
generated
vendored
|
@ -1,3 +1,5 @@
|
||||||
|
[![Build Status](https://travis-ci.org/godbus/dbus.svg?branch=master)](https://travis-ci.org/godbus/dbus)
|
||||||
|
|
||||||
dbus
|
dbus
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
167
vendor/github.com/godbus/dbus/conn.go
generated
vendored
167
vendor/github.com/godbus/dbus/conn.go
generated
vendored
|
@ -16,6 +16,7 @@ var (
|
||||||
systemBusLck sync.Mutex
|
systemBusLck sync.Mutex
|
||||||
sessionBus *Conn
|
sessionBus *Conn
|
||||||
sessionBusLck sync.Mutex
|
sessionBusLck sync.Mutex
|
||||||
|
sessionEnvLck sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrClosed is the error returned by calls on a closed connection.
|
// ErrClosed is the error returned by calls on a closed connection.
|
||||||
|
@ -46,15 +47,13 @@ type Conn struct {
|
||||||
calls map[uint32]*Call
|
calls map[uint32]*Call
|
||||||
callsLck sync.RWMutex
|
callsLck sync.RWMutex
|
||||||
|
|
||||||
handlers map[ObjectPath]map[string]exportWithMapping
|
handler Handler
|
||||||
handlersLck sync.RWMutex
|
|
||||||
|
|
||||||
out chan *Message
|
out chan *Message
|
||||||
closed bool
|
closed bool
|
||||||
outLck sync.RWMutex
|
outLck sync.RWMutex
|
||||||
|
|
||||||
signals []chan<- *Signal
|
signalHandler SignalHandler
|
||||||
signalsLck sync.Mutex
|
|
||||||
|
|
||||||
eavesdropped chan<- *Message
|
eavesdropped chan<- *Message
|
||||||
eavesdroppedLck sync.Mutex
|
eavesdroppedLck sync.Mutex
|
||||||
|
@ -89,14 +88,33 @@ func SessionBus() (conn *Conn, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionBusPrivate returns a new private connection to the session bus.
|
func getSessionBusAddress() (string, error) {
|
||||||
func SessionBusPrivate() (*Conn, error) {
|
sessionEnvLck.Lock()
|
||||||
|
defer sessionEnvLck.Unlock()
|
||||||
address := os.Getenv("DBUS_SESSION_BUS_ADDRESS")
|
address := os.Getenv("DBUS_SESSION_BUS_ADDRESS")
|
||||||
if address != "" && address != "autolaunch:" {
|
if address != "" && address != "autolaunch:" {
|
||||||
return Dial(address)
|
return address, nil
|
||||||
|
}
|
||||||
|
return getSessionBusPlatformAddress()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SessionBusPrivate returns a new private connection to the session bus.
|
||||||
|
func SessionBusPrivate() (*Conn, error) {
|
||||||
|
address, err := getSessionBusAddress()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return sessionBusPlatform()
|
return Dial(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SessionBusPrivate returns a new private connection to the session bus.
|
||||||
|
func SessionBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
|
||||||
|
address, err := getSessionBusAddress()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return DialHandler(address, handler, signalHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SystemBus returns a shared connection to the system bus, connecting to it if
|
// SystemBus returns a shared connection to the system bus, connecting to it if
|
||||||
|
@ -128,13 +146,22 @@ func SystemBus() (conn *Conn, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// SystemBusPrivate returns a new private connection to the system bus.
|
func getSystemBusAddress() string {
|
||||||
func SystemBusPrivate() (*Conn, error) {
|
|
||||||
address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
|
address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
|
||||||
if address != "" {
|
if address != "" {
|
||||||
return Dial(address)
|
return address
|
||||||
}
|
}
|
||||||
return Dial(defaultSystemBusAddress)
|
return defaultSystemBusAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
// SystemBusPrivate returns a new private connection to the system bus.
|
||||||
|
func SystemBusPrivate() (*Conn, error) {
|
||||||
|
return Dial(getSystemBusAddress())
|
||||||
|
}
|
||||||
|
|
||||||
|
// SystemBusPrivateHandler returns a new private connection to the system bus, using the provided handlers.
|
||||||
|
func SystemBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
|
||||||
|
return DialHandler(getSystemBusAddress(), handler, signalHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial establishes a new private connection to the message bus specified by address.
|
// Dial establishes a new private connection to the message bus specified by address.
|
||||||
|
@ -143,21 +170,36 @@ func Dial(address string) (*Conn, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return newConn(tr)
|
return newConn(tr, newDefaultHandler(), newDefaultSignalHandler())
|
||||||
|
}
|
||||||
|
|
||||||
|
// DialHandler establishes a new private connection to the message bus specified by address, using the supplied handlers.
|
||||||
|
func DialHandler(address string, handler Handler, signalHandler SignalHandler) (*Conn, error) {
|
||||||
|
tr, err := getTransport(address)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return newConn(tr, handler, signalHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConn creates a new private *Conn from an already established connection.
|
// NewConn creates a new private *Conn from an already established connection.
|
||||||
func NewConn(conn io.ReadWriteCloser) (*Conn, error) {
|
func NewConn(conn io.ReadWriteCloser) (*Conn, error) {
|
||||||
return newConn(genericTransport{conn})
|
return NewConnHandler(conn, newDefaultHandler(), newDefaultSignalHandler())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewConnHandler creates a new private *Conn from an already established connection, using the supplied handlers.
|
||||||
|
func NewConnHandler(conn io.ReadWriteCloser, handler Handler, signalHandler SignalHandler) (*Conn, error) {
|
||||||
|
return newConn(genericTransport{conn}, handler, signalHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newConn creates a new *Conn from a transport.
|
// newConn creates a new *Conn from a transport.
|
||||||
func newConn(tr transport) (*Conn, error) {
|
func newConn(tr transport, handler Handler, signalHandler SignalHandler) (*Conn, error) {
|
||||||
conn := new(Conn)
|
conn := new(Conn)
|
||||||
conn.transport = tr
|
conn.transport = tr
|
||||||
conn.calls = make(map[uint32]*Call)
|
conn.calls = make(map[uint32]*Call)
|
||||||
conn.out = make(chan *Message, 10)
|
conn.out = make(chan *Message, 10)
|
||||||
conn.handlers = make(map[ObjectPath]map[string]exportWithMapping)
|
conn.handler = handler
|
||||||
|
conn.signalHandler = signalHandler
|
||||||
conn.nextSerial = 1
|
conn.nextSerial = 1
|
||||||
conn.serialUsed = map[uint32]bool{0: true}
|
conn.serialUsed = map[uint32]bool{0: true}
|
||||||
conn.busObj = conn.Object("org.freedesktop.DBus", "/org/freedesktop/DBus")
|
conn.busObj = conn.Object("org.freedesktop.DBus", "/org/freedesktop/DBus")
|
||||||
|
@ -185,16 +227,21 @@ func (conn *Conn) Close() error {
|
||||||
close(conn.out)
|
close(conn.out)
|
||||||
conn.closed = true
|
conn.closed = true
|
||||||
conn.outLck.Unlock()
|
conn.outLck.Unlock()
|
||||||
conn.signalsLck.Lock()
|
|
||||||
for _, ch := range conn.signals {
|
if term, ok := conn.signalHandler.(Terminator); ok {
|
||||||
close(ch)
|
term.Terminate()
|
||||||
}
|
}
|
||||||
conn.signalsLck.Unlock()
|
|
||||||
|
if term, ok := conn.handler.(Terminator); ok {
|
||||||
|
term.Terminate()
|
||||||
|
}
|
||||||
|
|
||||||
conn.eavesdroppedLck.Lock()
|
conn.eavesdroppedLck.Lock()
|
||||||
if conn.eavesdropped != nil {
|
if conn.eavesdropped != nil {
|
||||||
close(conn.eavesdropped)
|
close(conn.eavesdropped)
|
||||||
}
|
}
|
||||||
conn.eavesdroppedLck.Unlock()
|
conn.eavesdroppedLck.Unlock()
|
||||||
|
|
||||||
return conn.transport.Close()
|
return conn.transport.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,17 +378,7 @@ func (conn *Conn) inWorker() {
|
||||||
conn.namesLck.Unlock()
|
conn.namesLck.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
signal := &Signal{
|
go conn.handleSignal(msg)
|
||||||
Sender: sender,
|
|
||||||
Path: msg.Headers[FieldPath].value.(ObjectPath),
|
|
||||||
Name: iface + "." + member,
|
|
||||||
Body: msg.Body,
|
|
||||||
}
|
|
||||||
conn.signalsLck.Lock()
|
|
||||||
for _, ch := range conn.signals {
|
|
||||||
ch <- signal
|
|
||||||
}
|
|
||||||
conn.signalsLck.Unlock()
|
|
||||||
case TypeMethodCall:
|
case TypeMethodCall:
|
||||||
go conn.handleCall(msg)
|
go conn.handleCall(msg)
|
||||||
}
|
}
|
||||||
|
@ -362,6 +399,21 @@ func (conn *Conn) inWorker() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (conn *Conn) handleSignal(msg *Message) {
|
||||||
|
iface := msg.Headers[FieldInterface].value.(string)
|
||||||
|
member := msg.Headers[FieldMember].value.(string)
|
||||||
|
// as per http://dbus.freedesktop.org/doc/dbus-specification.html ,
|
||||||
|
// sender is optional for signals.
|
||||||
|
sender, _ := msg.Headers[FieldSender].value.(string)
|
||||||
|
signal := &Signal{
|
||||||
|
Sender: sender,
|
||||||
|
Path: msg.Headers[FieldPath].value.(ObjectPath),
|
||||||
|
Name: iface + "." + member,
|
||||||
|
Body: msg.Body,
|
||||||
|
}
|
||||||
|
conn.signalHandler.DeliverSignal(iface, member, signal)
|
||||||
|
}
|
||||||
|
|
||||||
// Names returns the list of all names that are currently owned by this
|
// Names returns the list of all names that are currently owned by this
|
||||||
// connection. The slice is always at least one element long, the first element
|
// connection. The slice is always at least one element long, the first element
|
||||||
// being the unique name of the connection.
|
// being the unique name of the connection.
|
||||||
|
@ -452,7 +504,19 @@ func (conn *Conn) Send(msg *Message, ch chan *Call) *Call {
|
||||||
|
|
||||||
// sendError creates an error message corresponding to the parameters and sends
|
// sendError creates an error message corresponding to the parameters and sends
|
||||||
// it to conn.out.
|
// it to conn.out.
|
||||||
func (conn *Conn) sendError(e Error, dest string, serial uint32) {
|
func (conn *Conn) sendError(err error, dest string, serial uint32) {
|
||||||
|
var e *Error
|
||||||
|
switch em := err.(type) {
|
||||||
|
case Error:
|
||||||
|
e = &em
|
||||||
|
case *Error:
|
||||||
|
e = em
|
||||||
|
case DBusError:
|
||||||
|
name, body := em.DBusError()
|
||||||
|
e = NewError(name, body)
|
||||||
|
default:
|
||||||
|
e = MakeFailedError(err)
|
||||||
|
}
|
||||||
msg := new(Message)
|
msg := new(Message)
|
||||||
msg.Type = TypeError
|
msg.Type = TypeError
|
||||||
msg.serial = conn.getSerial()
|
msg.serial = conn.getSerial()
|
||||||
|
@ -495,6 +559,14 @@ func (conn *Conn) sendReply(dest string, serial uint32, values ...interface{}) {
|
||||||
conn.outLck.RUnlock()
|
conn.outLck.RUnlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (conn *Conn) defaultSignalAction(fn func(h *defaultSignalHandler, ch chan<- *Signal), ch chan<- *Signal) {
|
||||||
|
if !isDefaultSignalHandler(conn.signalHandler) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
handler := conn.signalHandler.(*defaultSignalHandler)
|
||||||
|
fn(handler, ch)
|
||||||
|
}
|
||||||
|
|
||||||
// Signal registers the given channel to be passed all received signal messages.
|
// Signal registers the given channel to be passed all received signal messages.
|
||||||
// The caller has to make sure that ch is sufficiently buffered; if a message
|
// The caller has to make sure that ch is sufficiently buffered; if a message
|
||||||
// arrives when a write to c is not possible, it is discarded.
|
// arrives when a write to c is not possible, it is discarded.
|
||||||
|
@ -505,22 +577,12 @@ func (conn *Conn) sendReply(dest string, serial uint32, values ...interface{}) {
|
||||||
// channel for eavesdropped messages, this channel receives all signals, and
|
// channel for eavesdropped messages, this channel receives all signals, and
|
||||||
// none of the channels passed to Signal will receive any signals.
|
// none of the channels passed to Signal will receive any signals.
|
||||||
func (conn *Conn) Signal(ch chan<- *Signal) {
|
func (conn *Conn) Signal(ch chan<- *Signal) {
|
||||||
conn.signalsLck.Lock()
|
conn.defaultSignalAction((*defaultSignalHandler).addSignal, ch)
|
||||||
conn.signals = append(conn.signals, ch)
|
|
||||||
conn.signalsLck.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveSignal removes the given channel from the list of the registered channels.
|
// RemoveSignal removes the given channel from the list of the registered channels.
|
||||||
func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
|
func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
|
||||||
conn.signalsLck.Lock()
|
conn.defaultSignalAction((*defaultSignalHandler).removeSignal, ch)
|
||||||
for i := len(conn.signals) - 1; i >= 0; i-- {
|
|
||||||
if ch == conn.signals[i] {
|
|
||||||
copy(conn.signals[i:], conn.signals[i+1:])
|
|
||||||
conn.signals[len(conn.signals)-1] = nil
|
|
||||||
conn.signals = conn.signals[:len(conn.signals)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
conn.signalsLck.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SupportsUnixFDs returns whether the underlying transport supports passing of
|
// SupportsUnixFDs returns whether the underlying transport supports passing of
|
||||||
|
@ -621,16 +683,11 @@ func dereferenceAll(vs []interface{}) []interface{} {
|
||||||
|
|
||||||
// getKey gets a key from a the list of keys. Returns "" on error / not found...
|
// getKey gets a key from a the list of keys. Returns "" on error / not found...
|
||||||
func getKey(s, key string) string {
|
func getKey(s, key string) string {
|
||||||
i := strings.Index(s, key)
|
for _, keyEqualsValue := range strings.Split(s, ",") {
|
||||||
if i == -1 {
|
keyValue := strings.SplitN(keyEqualsValue, "=", 2)
|
||||||
return ""
|
if len(keyValue) == 2 && keyValue[0] == key {
|
||||||
|
return keyValue[1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if i+len(key)+1 >= len(s) || s[i+len(key)] != '=' {
|
return ""
|
||||||
return ""
|
|
||||||
}
|
|
||||||
j := strings.Index(s, ",")
|
|
||||||
if j == -1 {
|
|
||||||
j = len(s)
|
|
||||||
}
|
|
||||||
return s[i+len(key)+1 : j]
|
|
||||||
}
|
}
|
||||||
|
|
8
vendor/github.com/godbus/dbus/conn_darwin.go
generated
vendored
8
vendor/github.com/godbus/dbus/conn_darwin.go
generated
vendored
|
@ -5,17 +5,17 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
func sessionBusPlatform() (*Conn, error) {
|
func getSessionBusPlatformAddress() (string, error) {
|
||||||
cmd := exec.Command("launchctl", "getenv", "DBUS_LAUNCHD_SESSION_BUS_SOCKET")
|
cmd := exec.Command("launchctl", "getenv", "DBUS_LAUNCHD_SESSION_BUS_SOCKET")
|
||||||
b, err := cmd.CombinedOutput()
|
b, err := cmd.CombinedOutput()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(b) == 0 {
|
if len(b) == 0 {
|
||||||
return nil, errors.New("dbus: couldn't determine address of session bus")
|
return "", errors.New("dbus: couldn't determine address of session bus")
|
||||||
}
|
}
|
||||||
|
|
||||||
return Dial("unix:path=" + string(b[:len(b)-1]))
|
return "unix:path=" + string(b[:len(b)-1]), nil
|
||||||
}
|
}
|
||||||
|
|
12
vendor/github.com/godbus/dbus/conn_other.go
generated
vendored
12
vendor/github.com/godbus/dbus/conn_other.go
generated
vendored
|
@ -5,23 +5,27 @@ package dbus
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
func sessionBusPlatform() (*Conn, error) {
|
func getSessionBusPlatformAddress() (string, error) {
|
||||||
cmd := exec.Command("dbus-launch")
|
cmd := exec.Command("dbus-launch")
|
||||||
b, err := cmd.CombinedOutput()
|
b, err := cmd.CombinedOutput()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
i := bytes.IndexByte(b, '=')
|
i := bytes.IndexByte(b, '=')
|
||||||
j := bytes.IndexByte(b, '\n')
|
j := bytes.IndexByte(b, '\n')
|
||||||
|
|
||||||
if i == -1 || j == -1 {
|
if i == -1 || j == -1 {
|
||||||
return nil, errors.New("dbus: couldn't determine address of session bus")
|
return "", errors.New("dbus: couldn't determine address of session bus")
|
||||||
}
|
}
|
||||||
|
|
||||||
return Dial(string(b[i+1 : j]))
|
env, addr := string(b[0:i]), string(b[i+1:j])
|
||||||
|
os.Setenv(env, addr)
|
||||||
|
|
||||||
|
return addr, nil
|
||||||
}
|
}
|
||||||
|
|
219
vendor/github.com/godbus/dbus/dbus.go
generated
vendored
219
vendor/github.com/godbus/dbus/dbus.go
generated
vendored
|
@ -58,67 +58,164 @@ func store(src, dest interface{}) error {
|
||||||
reflect.ValueOf(dest).Elem().Set(reflect.ValueOf(src))
|
reflect.ValueOf(dest).Elem().Set(reflect.ValueOf(src))
|
||||||
return nil
|
return nil
|
||||||
} else if hasStruct(dest) {
|
} else if hasStruct(dest) {
|
||||||
rv := reflect.ValueOf(dest).Elem()
|
return storeStruct(src, dest)
|
||||||
switch rv.Kind() {
|
} else if hasInterface(dest) {
|
||||||
case reflect.Struct:
|
return storeInterfaceContainer(src, dest)
|
||||||
vs, ok := src.([]interface{})
|
|
||||||
if !ok {
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
t := rv.Type()
|
|
||||||
ndest := make([]interface{}, 0, rv.NumField())
|
|
||||||
for i := 0; i < rv.NumField(); i++ {
|
|
||||||
field := t.Field(i)
|
|
||||||
if field.PkgPath == "" && field.Tag.Get("dbus") != "-" {
|
|
||||||
ndest = append(ndest, rv.Field(i).Addr().Interface())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(vs) != len(ndest) {
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
err := Store(vs, ndest...)
|
|
||||||
if err != nil {
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
case reflect.Slice:
|
|
||||||
sv := reflect.ValueOf(src)
|
|
||||||
if sv.Kind() != reflect.Slice {
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
rv.Set(reflect.MakeSlice(rv.Type(), sv.Len(), sv.Len()))
|
|
||||||
for i := 0; i < sv.Len(); i++ {
|
|
||||||
if err := store(sv.Index(i).Interface(), rv.Index(i).Addr().Interface()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case reflect.Map:
|
|
||||||
sv := reflect.ValueOf(src)
|
|
||||||
if sv.Kind() != reflect.Map {
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
keys := sv.MapKeys()
|
|
||||||
rv.Set(reflect.MakeMap(sv.Type()))
|
|
||||||
for _, key := range keys {
|
|
||||||
v := reflect.New(sv.Type().Elem())
|
|
||||||
if err := store(v, sv.MapIndex(key).Interface()); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
rv.SetMapIndex(key, v.Elem())
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return errors.New("dbus.Store: type mismatch")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
} else {
|
} else {
|
||||||
return errors.New("dbus.Store: type mismatch")
|
return errors.New("dbus.Store: type mismatch")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func storeStruct(src, dest interface{}) error {
|
||||||
|
rv := reflect.ValueOf(dest)
|
||||||
|
if rv.Kind() == reflect.Interface || rv.Kind() == reflect.Ptr {
|
||||||
|
rv = rv.Elem()
|
||||||
|
}
|
||||||
|
switch rv.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
vs, ok := src.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
t := rv.Type()
|
||||||
|
ndest := make([]interface{}, 0, rv.NumField())
|
||||||
|
for i := 0; i < rv.NumField(); i++ {
|
||||||
|
field := t.Field(i)
|
||||||
|
if field.PkgPath == "" && field.Tag.Get("dbus") != "-" {
|
||||||
|
ndest = append(ndest, rv.Field(i).Addr().Interface())
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(vs) != len(ndest) {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
err := Store(vs, ndest...)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
sv := reflect.ValueOf(src)
|
||||||
|
if sv.Kind() != reflect.Slice {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
rv.Set(reflect.MakeSlice(rv.Type(), sv.Len(), sv.Len()))
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
if err := store(sv.Index(i).Interface(), rv.Index(i).Addr().Interface()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case reflect.Map:
|
||||||
|
sv := reflect.ValueOf(src)
|
||||||
|
if sv.Kind() != reflect.Map {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
keys := sv.MapKeys()
|
||||||
|
rv.Set(reflect.MakeMap(sv.Type()))
|
||||||
|
for _, key := range keys {
|
||||||
|
v := reflect.New(sv.Type().Elem())
|
||||||
|
if err := store(v, sv.MapIndex(key).Interface()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rv.SetMapIndex(key, v.Elem())
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func storeInterfaceContainer(src, dest interface{}) error {
|
||||||
|
rv := reflect.ValueOf(dest).Elem()
|
||||||
|
switch rv.Kind() {
|
||||||
|
case reflect.Interface:
|
||||||
|
return storeInterfaceValue(src, dest)
|
||||||
|
case reflect.Slice:
|
||||||
|
sv := reflect.ValueOf(src)
|
||||||
|
if sv.Kind() != reflect.Slice {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
rv.Set(reflect.MakeSlice(rv.Type(), sv.Len(), sv.Len()))
|
||||||
|
for i := 0; i < sv.Len(); i++ {
|
||||||
|
v := newInterfaceImplValue(sv.Index(i))
|
||||||
|
err := store(getVariantValue(sv.Index(i)),
|
||||||
|
v.Interface())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rv.Index(i).Set(v.Elem())
|
||||||
|
}
|
||||||
|
case reflect.Map:
|
||||||
|
sv := reflect.ValueOf(src)
|
||||||
|
if sv.Kind() != reflect.Map {
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
keys := sv.MapKeys()
|
||||||
|
rv.Set(reflect.MakeMap(rv.Type()))
|
||||||
|
for _, key := range keys {
|
||||||
|
elemv := sv.MapIndex(key)
|
||||||
|
v := newInterfaceImplValue(elemv)
|
||||||
|
err := store(getVariantValue(elemv),
|
||||||
|
v.Interface())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rv.SetMapIndex(key, v.Elem())
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return errors.New("dbus.Store: type mismatch")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getVariantValue(in reflect.Value) interface{} {
|
||||||
|
if in.Type() == variantType {
|
||||||
|
return in.Interface().(Variant).Value()
|
||||||
|
}
|
||||||
|
return in.Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
func newInterfaceImplValue(val reflect.Value) reflect.Value {
|
||||||
|
ifaceType := reflect.TypeOf((*interface{})(nil)).Elem()
|
||||||
|
if !hasVariant(val.Type()) {
|
||||||
|
return reflect.New(val.Type())
|
||||||
|
}
|
||||||
|
switch val.Kind() {
|
||||||
|
case reflect.Map:
|
||||||
|
return reflect.New(reflect.MapOf(val.Type().Key(),
|
||||||
|
ifaceType))
|
||||||
|
case reflect.Slice:
|
||||||
|
return reflect.New(reflect.SliceOf(ifaceType))
|
||||||
|
default:
|
||||||
|
return newInterfaceImplValue(
|
||||||
|
reflect.ValueOf(
|
||||||
|
val.Interface().(Variant).Value()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func storeInterfaceValue(src, dest interface{}) error {
|
||||||
|
sv := reflect.ValueOf(src)
|
||||||
|
if sv.Type() == variantType {
|
||||||
|
store(src.(Variant).Value(), dest)
|
||||||
|
} else {
|
||||||
|
reflect.ValueOf(dest).Elem().Set(
|
||||||
|
reflect.ValueOf(src))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func hasStruct(v interface{}) bool {
|
func hasStruct(v interface{}) bool {
|
||||||
|
return hasKind(v, reflect.Struct)
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasInterface(v interface{}) bool {
|
||||||
|
return hasKind(v, reflect.Interface)
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasKind(v interface{}, kind reflect.Kind) bool {
|
||||||
t := reflect.TypeOf(v)
|
t := reflect.TypeOf(v)
|
||||||
for {
|
for {
|
||||||
switch t.Kind() {
|
switch t.Kind() {
|
||||||
case reflect.Struct:
|
case kind:
|
||||||
return true
|
return true
|
||||||
case reflect.Slice, reflect.Ptr, reflect.Map:
|
case reflect.Slice, reflect.Ptr, reflect.Map:
|
||||||
t = t.Elem()
|
t = t.Elem()
|
||||||
|
@ -128,6 +225,20 @@ func hasStruct(v interface{}) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasVariant(t reflect.Type) bool {
|
||||||
|
for {
|
||||||
|
if t == variantType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
switch t.Kind() {
|
||||||
|
case reflect.Slice, reflect.Ptr, reflect.Map:
|
||||||
|
t = t.Elem()
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// An ObjectPath is an object path as defined by the D-Bus spec.
|
// An ObjectPath is an object path as defined by the D-Bus spec.
|
||||||
type ObjectPath string
|
type ObjectPath string
|
||||||
|
|
||||||
|
@ -177,8 +288,8 @@ func alignment(t reflect.Type) int {
|
||||||
return 4
|
return 4
|
||||||
case signatureType:
|
case signatureType:
|
||||||
return 1
|
return 1
|
||||||
case interfacesType: // sometimes used for structs
|
case interfacesType:
|
||||||
return 8
|
return 4
|
||||||
}
|
}
|
||||||
switch t.Kind() {
|
switch t.Kind() {
|
||||||
case reflect.Uint8:
|
case reflect.Uint8:
|
||||||
|
|
283
vendor/github.com/godbus/dbus/default_handler.go
generated
vendored
Normal file
283
vendor/github.com/godbus/dbus/default_handler.go
generated
vendored
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
package dbus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newIntrospectIntf(h *defaultHandler) *exportedIntf {
|
||||||
|
methods := make(map[string]Method)
|
||||||
|
methods["Introspect"] = exportedMethod{
|
||||||
|
reflect.ValueOf(func(msg Message) (string, *Error) {
|
||||||
|
path := msg.Headers[FieldPath].value.(ObjectPath)
|
||||||
|
return h.introspectPath(path), nil
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
return newExportedIntf(methods, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newDefaultHandler() *defaultHandler {
|
||||||
|
h := &defaultHandler{
|
||||||
|
objects: make(map[ObjectPath]*exportedObj),
|
||||||
|
defaultIntf: make(map[string]*exportedIntf),
|
||||||
|
}
|
||||||
|
h.defaultIntf["org.freedesktop.DBus.Introspectable"] = newIntrospectIntf(h)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
type defaultHandler struct {
|
||||||
|
sync.RWMutex
|
||||||
|
objects map[ObjectPath]*exportedObj
|
||||||
|
defaultIntf map[string]*exportedIntf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *defaultHandler) PathExists(path ObjectPath) bool {
|
||||||
|
_, ok := h.objects[path]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *defaultHandler) introspectPath(path ObjectPath) string {
|
||||||
|
subpath := make(map[string]struct{})
|
||||||
|
var xml bytes.Buffer
|
||||||
|
xml.WriteString("<node>")
|
||||||
|
for obj, _ := range h.objects {
|
||||||
|
p := string(path)
|
||||||
|
if p != "/" {
|
||||||
|
p += "/"
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(string(obj), p) {
|
||||||
|
node_name := strings.Split(string(obj[len(p):]), "/")[0]
|
||||||
|
subpath[node_name] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for s, _ := range subpath {
|
||||||
|
xml.WriteString("\n\t<node name=\"" + s + "\"/>")
|
||||||
|
}
|
||||||
|
xml.WriteString("\n</node>")
|
||||||
|
return xml.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *defaultHandler) LookupObject(path ObjectPath) (ServerObject, bool) {
|
||||||
|
h.RLock()
|
||||||
|
defer h.RUnlock()
|
||||||
|
object, ok := h.objects[path]
|
||||||
|
if ok {
|
||||||
|
return object, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an object wasn't found for this exact path,
|
||||||
|
// look for a matching subtree registration
|
||||||
|
subtreeObject := newExportedObject()
|
||||||
|
path = path[:strings.LastIndex(string(path), "/")]
|
||||||
|
for len(path) > 0 {
|
||||||
|
object, ok = h.objects[path]
|
||||||
|
if ok {
|
||||||
|
for name, iface := range object.interfaces {
|
||||||
|
// Only include this handler if it registered for the subtree
|
||||||
|
if iface.isFallbackInterface() {
|
||||||
|
subtreeObject.interfaces[name] = iface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
path = path[:strings.LastIndex(string(path), "/")]
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, intf := range h.defaultIntf {
|
||||||
|
if _, exists := subtreeObject.interfaces[name]; exists {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
subtreeObject.interfaces[name] = intf
|
||||||
|
}
|
||||||
|
|
||||||
|
return subtreeObject, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *defaultHandler) AddObject(path ObjectPath, object *exportedObj) {
|
||||||
|
h.Lock()
|
||||||
|
h.objects[path] = object
|
||||||
|
h.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *defaultHandler) DeleteObject(path ObjectPath) {
|
||||||
|
h.Lock()
|
||||||
|
delete(h.objects, path)
|
||||||
|
h.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
type exportedMethod struct {
|
||||||
|
reflect.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m exportedMethod) Call(args ...interface{}) ([]interface{}, error) {
|
||||||
|
t := m.Type()
|
||||||
|
|
||||||
|
params := make([]reflect.Value, len(args))
|
||||||
|
for i := 0; i < len(args); i++ {
|
||||||
|
params[i] = reflect.ValueOf(args[i]).Elem()
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := m.Value.Call(params)
|
||||||
|
|
||||||
|
err := ret[t.NumOut()-1].Interface().(*Error)
|
||||||
|
ret = ret[:t.NumOut()-1]
|
||||||
|
out := make([]interface{}, len(ret))
|
||||||
|
for i, val := range ret {
|
||||||
|
out[i] = val.Interface()
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
//concrete type to interface nil is a special case
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
return out, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m exportedMethod) NumArguments() int {
|
||||||
|
return m.Value.Type().NumIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m exportedMethod) ArgumentValue(i int) interface{} {
|
||||||
|
return reflect.Zero(m.Type().In(i)).Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m exportedMethod) NumReturns() int {
|
||||||
|
return m.Value.Type().NumOut()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m exportedMethod) ReturnValue(i int) interface{} {
|
||||||
|
return reflect.Zero(m.Type().Out(i)).Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
func newExportedObject() *exportedObj {
|
||||||
|
return &exportedObj{
|
||||||
|
interfaces: make(map[string]*exportedIntf),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type exportedObj struct {
|
||||||
|
interfaces map[string]*exportedIntf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedObj) LookupInterface(name string) (Interface, bool) {
|
||||||
|
if name == "" {
|
||||||
|
return obj, true
|
||||||
|
}
|
||||||
|
intf, exists := obj.interfaces[name]
|
||||||
|
return intf, exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedObj) AddInterface(name string, iface *exportedIntf) {
|
||||||
|
obj.interfaces[name] = iface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedObj) DeleteInterface(name string) {
|
||||||
|
delete(obj.interfaces, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedObj) LookupMethod(name string) (Method, bool) {
|
||||||
|
for _, intf := range obj.interfaces {
|
||||||
|
method, exists := intf.LookupMethod(name)
|
||||||
|
if exists {
|
||||||
|
return method, exists
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedObj) isFallbackInterface() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func newExportedIntf(methods map[string]Method, includeSubtree bool) *exportedIntf {
|
||||||
|
return &exportedIntf{
|
||||||
|
methods: methods,
|
||||||
|
includeSubtree: includeSubtree,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type exportedIntf struct {
|
||||||
|
methods map[string]Method
|
||||||
|
|
||||||
|
// Whether or not this export is for the entire subtree
|
||||||
|
includeSubtree bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedIntf) LookupMethod(name string) (Method, bool) {
|
||||||
|
out, exists := obj.methods[name]
|
||||||
|
return out, exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func (obj *exportedIntf) isFallbackInterface() bool {
|
||||||
|
return obj.includeSubtree
|
||||||
|
}
|
||||||
|
|
||||||
|
func newDefaultSignalHandler() *defaultSignalHandler {
|
||||||
|
return &defaultSignalHandler{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isDefaultSignalHandler(handler SignalHandler) bool {
|
||||||
|
_, ok := handler.(*defaultSignalHandler)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
type defaultSignalHandler struct {
|
||||||
|
sync.RWMutex
|
||||||
|
closed bool
|
||||||
|
signals []chan<- *Signal
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sh *defaultSignalHandler) DeliverSignal(intf, name string, signal *Signal) {
|
||||||
|
sh.RLock()
|
||||||
|
defer sh.RUnlock()
|
||||||
|
if sh.closed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, ch := range sh.signals {
|
||||||
|
ch <- signal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sh *defaultSignalHandler) Init() error {
|
||||||
|
sh.Lock()
|
||||||
|
sh.signals = make([]chan<- *Signal, 0)
|
||||||
|
sh.Unlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sh *defaultSignalHandler) Terminate() {
|
||||||
|
sh.Lock()
|
||||||
|
sh.closed = true
|
||||||
|
for _, ch := range sh.signals {
|
||||||
|
close(ch)
|
||||||
|
}
|
||||||
|
sh.signals = nil
|
||||||
|
sh.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sh *defaultSignalHandler) addSignal(ch chan<- *Signal) {
|
||||||
|
sh.Lock()
|
||||||
|
defer sh.Unlock()
|
||||||
|
if sh.closed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sh.signals = append(sh.signals, ch)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sh *defaultSignalHandler) removeSignal(ch chan<- *Signal) {
|
||||||
|
sh.Lock()
|
||||||
|
defer sh.Unlock()
|
||||||
|
if sh.closed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for i := len(sh.signals) - 1; i >= 0; i-- {
|
||||||
|
if ch == sh.signals[i] {
|
||||||
|
copy(sh.signals[i:], sh.signals[i+1:])
|
||||||
|
sh.signals[len(sh.signals)-1] = nil
|
||||||
|
sh.signals = sh.signals[:len(sh.signals)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
vendor/github.com/godbus/dbus/encoder.go
generated
vendored
2
vendor/github.com/godbus/dbus/encoder.go
generated
vendored
|
@ -202,6 +202,8 @@ func (enc *encoder) encode(v reflect.Value, depth int) {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
enc.pos += length
|
enc.pos += length
|
||||||
|
case reflect.Interface:
|
||||||
|
enc.encode(reflect.ValueOf(MakeVariant(v.Interface())), depth)
|
||||||
default:
|
default:
|
||||||
panic(InvalidTypeError{v.Type()})
|
panic(InvalidTypeError{v.Type()})
|
||||||
}
|
}
|
||||||
|
|
346
vendor/github.com/godbus/dbus/export.go
generated
vendored
346
vendor/github.com/godbus/dbus/export.go
generated
vendored
|
@ -8,167 +8,73 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errmsgInvalidArg = Error{
|
ErrMsgInvalidArg = Error{
|
||||||
"org.freedesktop.DBus.Error.InvalidArgs",
|
"org.freedesktop.DBus.Error.InvalidArgs",
|
||||||
[]interface{}{"Invalid type / number of args"},
|
[]interface{}{"Invalid type / number of args"},
|
||||||
}
|
}
|
||||||
errmsgNoObject = Error{
|
ErrMsgNoObject = Error{
|
||||||
"org.freedesktop.DBus.Error.NoSuchObject",
|
"org.freedesktop.DBus.Error.NoSuchObject",
|
||||||
[]interface{}{"No such object"},
|
[]interface{}{"No such object"},
|
||||||
}
|
}
|
||||||
errmsgUnknownMethod = Error{
|
ErrMsgUnknownMethod = Error{
|
||||||
"org.freedesktop.DBus.Error.UnknownMethod",
|
"org.freedesktop.DBus.Error.UnknownMethod",
|
||||||
[]interface{}{"Unknown / invalid method"},
|
[]interface{}{"Unknown / invalid method"},
|
||||||
}
|
}
|
||||||
|
ErrMsgUnknownInterface = Error{
|
||||||
|
"org.freedesktop.DBus.Error.UnknownInterface",
|
||||||
|
[]interface{}{"Object does not implement the interface"},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// exportWithMapping represents an exported struct along with a method name
|
func MakeFailedError(err error) *Error {
|
||||||
// mapping to allow for exporting lower-case methods, etc.
|
return &Error{
|
||||||
type exportWithMapping struct {
|
"org.freedesktop.DBus.Error.Failed",
|
||||||
export interface{}
|
[]interface{}{err.Error()},
|
||||||
|
}
|
||||||
// Method name mapping; key -> struct method, value -> dbus method.
|
|
||||||
mapping map[string]string
|
|
||||||
|
|
||||||
// Whether or not this export is for the entire subtree
|
|
||||||
includeSubtree bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sender is a type which can be used in exported methods to receive the message
|
// Sender is a type which can be used in exported methods to receive the message
|
||||||
// sender.
|
// sender.
|
||||||
type Sender string
|
type Sender string
|
||||||
|
|
||||||
func exportedMethod(export exportWithMapping, name string) reflect.Value {
|
func computeMethodName(name string, mapping map[string]string) string {
|
||||||
if export.export == nil {
|
newname, ok := mapping[name]
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If a mapping was included in the export, check the map to see if we
|
|
||||||
// should be looking for a different method in the export.
|
|
||||||
if export.mapping != nil {
|
|
||||||
for key, value := range export.mapping {
|
|
||||||
if value == name {
|
|
||||||
name = key
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Catch the case where a method is aliased but the client is calling
|
|
||||||
// the original, e.g. the "Foo" method was exported mapped to
|
|
||||||
// "foo," and dbus client called the original "Foo."
|
|
||||||
if key == name {
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
value := reflect.ValueOf(export.export)
|
|
||||||
m := value.MethodByName(name)
|
|
||||||
|
|
||||||
// Catch the case of attempting to call an unexported method
|
|
||||||
method, ok := value.Type().MethodByName(name)
|
|
||||||
|
|
||||||
if !m.IsValid() || !ok || method.PkgPath != "" {
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
t := m.Type()
|
|
||||||
if t.NumOut() == 0 ||
|
|
||||||
t.Out(t.NumOut()-1) != reflect.TypeOf(&errmsgInvalidArg) {
|
|
||||||
|
|
||||||
return reflect.Value{}
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
// searchHandlers will look through all registered handlers looking for one
|
|
||||||
// to handle the given path. If a verbatim one isn't found, it will check for
|
|
||||||
// a subtree registration for the path as well.
|
|
||||||
func (conn *Conn) searchHandlers(path ObjectPath) (map[string]exportWithMapping, bool) {
|
|
||||||
conn.handlersLck.RLock()
|
|
||||||
defer conn.handlersLck.RUnlock()
|
|
||||||
|
|
||||||
handlers, ok := conn.handlers[path]
|
|
||||||
if ok {
|
if ok {
|
||||||
return handlers, ok
|
name = newname
|
||||||
}
|
}
|
||||||
|
return name
|
||||||
// If handlers weren't found for this exact path, look for a matching subtree
|
|
||||||
// registration
|
|
||||||
handlers = make(map[string]exportWithMapping)
|
|
||||||
path = path[:strings.LastIndex(string(path), "/")]
|
|
||||||
for len(path) > 0 {
|
|
||||||
var subtreeHandlers map[string]exportWithMapping
|
|
||||||
subtreeHandlers, ok = conn.handlers[path]
|
|
||||||
if ok {
|
|
||||||
for iface, handler := range subtreeHandlers {
|
|
||||||
// Only include this handler if it registered for the subtree
|
|
||||||
if handler.includeSubtree {
|
|
||||||
handlers[iface] = handler
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
path = path[:strings.LastIndex(string(path), "/")]
|
|
||||||
}
|
|
||||||
|
|
||||||
return handlers, ok
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleCall handles the given method call (i.e. looks if it's one of the
|
func getMethods(in interface{}, mapping map[string]string) map[string]reflect.Value {
|
||||||
// pre-implemented ones and searches for a corresponding handler if not).
|
if in == nil {
|
||||||
func (conn *Conn) handleCall(msg *Message) {
|
return nil
|
||||||
name := msg.Headers[FieldMember].value.(string)
|
}
|
||||||
path := msg.Headers[FieldPath].value.(ObjectPath)
|
methods := make(map[string]reflect.Value)
|
||||||
ifaceName, hasIface := msg.Headers[FieldInterface].value.(string)
|
val := reflect.ValueOf(in)
|
||||||
sender, hasSender := msg.Headers[FieldSender].value.(string)
|
typ := val.Type()
|
||||||
serial := msg.serial
|
for i := 0; i < typ.NumMethod(); i++ {
|
||||||
if ifaceName == "org.freedesktop.DBus.Peer" {
|
methtype := typ.Method(i)
|
||||||
switch name {
|
method := val.Method(i)
|
||||||
case "Ping":
|
t := method.Type()
|
||||||
conn.sendReply(sender, serial)
|
// only track valid methods must return *Error as last arg
|
||||||
case "GetMachineId":
|
// and must be exported
|
||||||
conn.sendReply(sender, serial, conn.uuid)
|
if t.NumOut() == 0 ||
|
||||||
default:
|
t.Out(t.NumOut()-1) != reflect.TypeOf(&ErrMsgInvalidArg) ||
|
||||||
conn.sendError(errmsgUnknownMethod, sender, serial)
|
methtype.PkgPath != "" {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
return
|
// map names while building table
|
||||||
}
|
methods[computeMethodName(methtype.Name, mapping)] = method
|
||||||
if len(name) == 0 {
|
|
||||||
conn.sendError(errmsgUnknownMethod, sender, serial)
|
|
||||||
}
|
}
|
||||||
|
return methods
|
||||||
|
}
|
||||||
|
|
||||||
// Find the exported handler (if any) for this path
|
func standardMethodArgumentDecode(m Method, sender string, msg *Message, body []interface{}) ([]interface{}, error) {
|
||||||
handlers, ok := conn.searchHandlers(path)
|
pointers := make([]interface{}, m.NumArguments())
|
||||||
if !ok {
|
decode := make([]interface{}, 0, len(body))
|
||||||
conn.sendError(errmsgNoObject, sender, serial)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var m reflect.Value
|
for i := 0; i < m.NumArguments(); i++ {
|
||||||
if hasIface {
|
tp := reflect.TypeOf(m.ArgumentValue(i))
|
||||||
iface := handlers[ifaceName]
|
|
||||||
m = exportedMethod(iface, name)
|
|
||||||
} else {
|
|
||||||
for _, v := range handlers {
|
|
||||||
m = exportedMethod(v, name)
|
|
||||||
if m.IsValid() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !m.IsValid() {
|
|
||||||
conn.sendError(errmsgUnknownMethod, sender, serial)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t := m.Type()
|
|
||||||
vs := msg.Body
|
|
||||||
pointers := make([]interface{}, t.NumIn())
|
|
||||||
decode := make([]interface{}, 0, len(vs))
|
|
||||||
for i := 0; i < t.NumIn(); i++ {
|
|
||||||
tp := t.In(i)
|
|
||||||
val := reflect.New(tp)
|
val := reflect.New(tp)
|
||||||
pointers[i] = val.Interface()
|
pointers[i] = val.Interface()
|
||||||
if tp == reflect.TypeOf((*Sender)(nil)).Elem() {
|
if tp == reflect.TypeOf((*Sender)(nil)).Elem() {
|
||||||
|
@ -180,26 +86,73 @@ func (conn *Conn) handleCall(msg *Message) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(decode) != len(vs) {
|
if len(decode) != len(body) {
|
||||||
conn.sendError(errmsgInvalidArg, sender, serial)
|
return nil, ErrMsgInvalidArg
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := Store(body, decode...); err != nil {
|
||||||
|
return nil, ErrMsgInvalidArg
|
||||||
|
}
|
||||||
|
|
||||||
|
return pointers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *Conn) decodeArguments(m Method, sender string, msg *Message) ([]interface{}, error) {
|
||||||
|
if decoder, ok := m.(ArgumentDecoder); ok {
|
||||||
|
return decoder.DecodeArguments(conn, sender, msg, msg.Body)
|
||||||
|
}
|
||||||
|
return standardMethodArgumentDecode(m, sender, msg, msg.Body)
|
||||||
|
}
|
||||||
|
|
||||||
|
// handleCall handles the given method call (i.e. looks if it's one of the
|
||||||
|
// pre-implemented ones and searches for a corresponding handler if not).
|
||||||
|
func (conn *Conn) handleCall(msg *Message) {
|
||||||
|
name := msg.Headers[FieldMember].value.(string)
|
||||||
|
path := msg.Headers[FieldPath].value.(ObjectPath)
|
||||||
|
ifaceName, _ := msg.Headers[FieldInterface].value.(string)
|
||||||
|
sender, hasSender := msg.Headers[FieldSender].value.(string)
|
||||||
|
serial := msg.serial
|
||||||
|
if ifaceName == "org.freedesktop.DBus.Peer" {
|
||||||
|
switch name {
|
||||||
|
case "Ping":
|
||||||
|
conn.sendReply(sender, serial)
|
||||||
|
case "GetMachineId":
|
||||||
|
conn.sendReply(sender, serial, conn.uuid)
|
||||||
|
default:
|
||||||
|
conn.sendError(ErrMsgUnknownMethod, sender, serial)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(name) == 0 {
|
||||||
|
conn.sendError(ErrMsgUnknownMethod, sender, serial)
|
||||||
|
}
|
||||||
|
|
||||||
|
object, ok := conn.handler.LookupObject(path)
|
||||||
|
if !ok {
|
||||||
|
conn.sendError(ErrMsgNoObject, sender, serial)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := Store(vs, decode...); err != nil {
|
iface, exists := object.LookupInterface(ifaceName)
|
||||||
conn.sendError(errmsgInvalidArg, sender, serial)
|
if !exists {
|
||||||
|
conn.sendError(ErrMsgUnknownInterface, sender, serial)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extract parameters
|
m, exists := iface.LookupMethod(name)
|
||||||
params := make([]reflect.Value, len(pointers))
|
if !exists {
|
||||||
for i := 0; i < len(pointers); i++ {
|
conn.sendError(ErrMsgUnknownMethod, sender, serial)
|
||||||
params[i] = reflect.ValueOf(pointers[i]).Elem()
|
return
|
||||||
|
}
|
||||||
|
args, err := conn.decodeArguments(m, sender, msg)
|
||||||
|
if err != nil {
|
||||||
|
conn.sendError(err, sender, serial)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call method
|
ret, err := m.Call(args...)
|
||||||
ret := m.Call(params)
|
if err != nil {
|
||||||
if em := ret[t.NumOut()-1].Interface().(*Error); em != nil {
|
conn.sendError(err, sender, serial)
|
||||||
conn.sendError(*em, sender, serial)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,13 +165,11 @@ func (conn *Conn) handleCall(msg *Message) {
|
||||||
reply.Headers[FieldDestination] = msg.Headers[FieldSender]
|
reply.Headers[FieldDestination] = msg.Headers[FieldSender]
|
||||||
}
|
}
|
||||||
reply.Headers[FieldReplySerial] = MakeVariant(msg.serial)
|
reply.Headers[FieldReplySerial] = MakeVariant(msg.serial)
|
||||||
reply.Body = make([]interface{}, len(ret)-1)
|
reply.Body = make([]interface{}, len(ret))
|
||||||
for i := 0; i < len(ret)-1; i++ {
|
for i := 0; i < len(ret); i++ {
|
||||||
reply.Body[i] = ret[i].Interface()
|
reply.Body[i] = ret[i]
|
||||||
}
|
|
||||||
if len(ret) != 1 {
|
|
||||||
reply.Headers[FieldSignature] = MakeVariant(SignatureOf(reply.Body...))
|
|
||||||
}
|
}
|
||||||
|
reply.Headers[FieldSignature] = MakeVariant(SignatureOf(reply.Body...))
|
||||||
conn.outLck.RLock()
|
conn.outLck.RLock()
|
||||||
if !conn.closed {
|
if !conn.closed {
|
||||||
conn.out <- reply
|
conn.out <- reply
|
||||||
|
@ -303,7 +254,7 @@ func (conn *Conn) Export(v interface{}, path ObjectPath, iface string) error {
|
||||||
// The keys in the map are the real method names (exported on the struct), and
|
// The keys in the map are the real method names (exported on the struct), and
|
||||||
// the values are the method names to be exported on DBus.
|
// the values are the method names to be exported on DBus.
|
||||||
func (conn *Conn) ExportWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
|
func (conn *Conn) ExportWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
|
||||||
return conn.exportWithMap(v, mapping, path, iface, false)
|
return conn.export(getMethods(v, mapping), path, iface, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExportSubtree works exactly like Export but registers the given value for
|
// ExportSubtree works exactly like Export but registers the given value for
|
||||||
|
@ -326,38 +277,89 @@ func (conn *Conn) ExportSubtree(v interface{}, path ObjectPath, iface string) er
|
||||||
// The keys in the map are the real method names (exported on the struct), and
|
// The keys in the map are the real method names (exported on the struct), and
|
||||||
// the values are the method names to be exported on DBus.
|
// the values are the method names to be exported on DBus.
|
||||||
func (conn *Conn) ExportSubtreeWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
|
func (conn *Conn) ExportSubtreeWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string) error {
|
||||||
return conn.exportWithMap(v, mapping, path, iface, true)
|
return conn.export(getMethods(v, mapping), path, iface, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportMethodTable like Export registers the given methods as an object
|
||||||
|
// on the message bus. Unlike Export the it uses a method table to define
|
||||||
|
// the object instead of a native go object.
|
||||||
|
//
|
||||||
|
// The method table is a map from method name to function closure
|
||||||
|
// representing the method. This allows an object exported on the bus to not
|
||||||
|
// necessarily be a native go object. It can be useful for generating exposed
|
||||||
|
// methods on the fly.
|
||||||
|
//
|
||||||
|
// Any non-function objects in the method table are ignored.
|
||||||
|
func (conn *Conn) ExportMethodTable(methods map[string]interface{}, path ObjectPath, iface string) error {
|
||||||
|
return conn.exportMethodTable(methods, path, iface, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Like ExportSubtree, but with the same caveats as ExportMethodTable.
|
||||||
|
func (conn *Conn) ExportSubtreeMethodTable(methods map[string]interface{}, path ObjectPath, iface string) error {
|
||||||
|
return conn.exportMethodTable(methods, path, iface, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *Conn) exportMethodTable(methods map[string]interface{}, path ObjectPath, iface string, includeSubtree bool) error {
|
||||||
|
out := make(map[string]reflect.Value)
|
||||||
|
for name, method := range methods {
|
||||||
|
rval := reflect.ValueOf(method)
|
||||||
|
if rval.Kind() != reflect.Func {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
t := rval.Type()
|
||||||
|
// only track valid methods must return *Error as last arg
|
||||||
|
if t.NumOut() == 0 ||
|
||||||
|
t.Out(t.NumOut()-1) != reflect.TypeOf(&ErrMsgInvalidArg) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out[name] = rval
|
||||||
|
}
|
||||||
|
return conn.export(out, path, iface, includeSubtree)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *Conn) unexport(h *defaultHandler, path ObjectPath, iface string) error {
|
||||||
|
if h.PathExists(path) {
|
||||||
|
obj := h.objects[path]
|
||||||
|
obj.DeleteInterface(iface)
|
||||||
|
if len(obj.interfaces) == 0 {
|
||||||
|
h.DeleteObject(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// exportWithMap is the worker function for all exports/registrations.
|
// exportWithMap is the worker function for all exports/registrations.
|
||||||
func (conn *Conn) exportWithMap(v interface{}, mapping map[string]string, path ObjectPath, iface string, includeSubtree bool) error {
|
func (conn *Conn) export(methods map[string]reflect.Value, path ObjectPath, iface string, includeSubtree bool) error {
|
||||||
|
h, ok := conn.handler.(*defaultHandler)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf(
|
||||||
|
`dbus: export only allowed on the default hander handler have %T"`,
|
||||||
|
conn.handler)
|
||||||
|
}
|
||||||
|
|
||||||
if !path.IsValid() {
|
if !path.IsValid() {
|
||||||
return fmt.Errorf(`dbus: Invalid path name: "%s"`, path)
|
return fmt.Errorf(`dbus: Invalid path name: "%s"`, path)
|
||||||
}
|
}
|
||||||
|
|
||||||
conn.handlersLck.Lock()
|
|
||||||
defer conn.handlersLck.Unlock()
|
|
||||||
|
|
||||||
// Remove a previous export if the interface is nil
|
// Remove a previous export if the interface is nil
|
||||||
if v == nil {
|
if methods == nil {
|
||||||
if _, ok := conn.handlers[path]; ok {
|
return conn.unexport(h, path, iface)
|
||||||
delete(conn.handlers[path], iface)
|
|
||||||
if len(conn.handlers[path]) == 0 {
|
|
||||||
delete(conn.handlers, path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is the first handler for this path, make a new map to hold all
|
// If this is the first handler for this path, make a new map to hold all
|
||||||
// handlers for this path.
|
// handlers for this path.
|
||||||
if _, ok := conn.handlers[path]; !ok {
|
if !h.PathExists(path) {
|
||||||
conn.handlers[path] = make(map[string]exportWithMapping)
|
h.AddObject(path, newExportedObject())
|
||||||
|
}
|
||||||
|
|
||||||
|
exportedMethods := make(map[string]Method)
|
||||||
|
for name, method := range methods {
|
||||||
|
exportedMethods[name] = exportedMethod{method}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, save this handler
|
// Finally, save this handler
|
||||||
conn.handlers[path][iface] = exportWithMapping{export: v, mapping: mapping, includeSubtree: includeSubtree}
|
obj := h.objects[path]
|
||||||
|
obj.AddInterface(iface, newExportedIntf(exportedMethods, includeSubtree))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
9
vendor/github.com/godbus/dbus/message.go
generated
vendored
9
vendor/github.com/godbus/dbus/message.go
generated
vendored
|
@ -22,6 +22,13 @@ const (
|
||||||
// FlagNoAutoStart signals that the message bus should not automatically
|
// FlagNoAutoStart signals that the message bus should not automatically
|
||||||
// start an application when handling this message.
|
// start an application when handling this message.
|
||||||
FlagNoAutoStart
|
FlagNoAutoStart
|
||||||
|
// FlagAllowInteractiveAuthorization may be set on a method call
|
||||||
|
// message to inform the receiving side that the caller is prepared
|
||||||
|
// to wait for interactive authorization, which might take a
|
||||||
|
// considerable time to complete. For instance, if this flag is set,
|
||||||
|
// it would be appropriate to query the user for passwords or
|
||||||
|
// confirmation via Polkit or a similar framework.
|
||||||
|
FlagAllowInteractiveAuthorization
|
||||||
)
|
)
|
||||||
|
|
||||||
// Type represents the possible types of a D-Bus message.
|
// Type represents the possible types of a D-Bus message.
|
||||||
|
@ -248,7 +255,7 @@ func (msg *Message) EncodeTo(out io.Writer, order binary.ByteOrder) error {
|
||||||
// IsValid checks whether msg is a valid message and returns an
|
// IsValid checks whether msg is a valid message and returns an
|
||||||
// InvalidMessageError if it is not.
|
// InvalidMessageError if it is not.
|
||||||
func (msg *Message) IsValid() error {
|
func (msg *Message) IsValid() error {
|
||||||
if msg.Flags & ^(FlagNoAutoStart|FlagNoReplyExpected) != 0 {
|
if msg.Flags & ^(FlagNoAutoStart|FlagNoReplyExpected|FlagAllowInteractiveAuthorization) != 0 {
|
||||||
return InvalidMessageError("invalid flags")
|
return InvalidMessageError("invalid flags")
|
||||||
}
|
}
|
||||||
if msg.Type == 0 || msg.Type >= typeMax {
|
if msg.Type == 0 || msg.Type >= typeMax {
|
||||||
|
|
89
vendor/github.com/godbus/dbus/server_interfaces.go
generated
vendored
Normal file
89
vendor/github.com/godbus/dbus/server_interfaces.go
generated
vendored
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
package dbus
|
||||||
|
|
||||||
|
// Terminator allows a handler to implement a shutdown mechanism that
|
||||||
|
// is called when the connection terminates.
|
||||||
|
type Terminator interface {
|
||||||
|
Terminate()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler is the representation of a D-Bus Application.
|
||||||
|
//
|
||||||
|
// The Handler must have a way to lookup objects given
|
||||||
|
// an ObjectPath. The returned object must implement the
|
||||||
|
// ServerObject interface.
|
||||||
|
type Handler interface {
|
||||||
|
LookupObject(path ObjectPath) (ServerObject, bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerObject is the representation of an D-Bus Object.
|
||||||
|
//
|
||||||
|
// Objects are registered at a path for a given Handler.
|
||||||
|
// The Objects implement D-Bus interfaces. The semantics
|
||||||
|
// of Interface lookup is up to the implementation of
|
||||||
|
// the ServerObject. The ServerObject implementation may
|
||||||
|
// choose to implement empty string as a valid interface
|
||||||
|
// represeting all methods or not per the D-Bus specification.
|
||||||
|
type ServerObject interface {
|
||||||
|
LookupInterface(name string) (Interface, bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Interface is the representation of a D-Bus Interface.
|
||||||
|
//
|
||||||
|
// Interfaces are a grouping of methods implemented by the Objects.
|
||||||
|
// Interfaces are responsible for routing method calls.
|
||||||
|
type Interface interface {
|
||||||
|
LookupMethod(name string) (Method, bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Method represents the exposed methods on D-Bus.
|
||||||
|
type Method interface {
|
||||||
|
// Call requires that all arguments are decoded before being passed to it.
|
||||||
|
Call(args ...interface{}) ([]interface{}, error)
|
||||||
|
NumArguments() int
|
||||||
|
NumReturns() int
|
||||||
|
// ArgumentValue returns a representative value for the argument at position
|
||||||
|
// it should be of the proper type. reflect.Zero would be a good mechanism
|
||||||
|
// to use for this Value.
|
||||||
|
ArgumentValue(position int) interface{}
|
||||||
|
// ReturnValue returns a representative value for the return at position
|
||||||
|
// it should be of the proper type. reflect.Zero would be a good mechanism
|
||||||
|
// to use for this Value.
|
||||||
|
ReturnValue(position int) interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Argument Decoder can decode arguments using the non-standard mechanism
|
||||||
|
//
|
||||||
|
// If a method implements this interface then the non-standard
|
||||||
|
// decoder will be used.
|
||||||
|
//
|
||||||
|
// Method arguments must be decoded from the message.
|
||||||
|
// The mechanism for doing this will vary based on the
|
||||||
|
// implementation of the method. A normal approach is provided
|
||||||
|
// as part of this library, but may be replaced with
|
||||||
|
// any other decoding scheme.
|
||||||
|
type ArgumentDecoder interface {
|
||||||
|
// To decode the arguments of a method the sender and message are
|
||||||
|
// provided incase the semantics of the implementer provides access
|
||||||
|
// to these as part of the method invocation.
|
||||||
|
DecodeArguments(conn *Conn, sender string, msg *Message, args []interface{}) ([]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A SignalHandler is responsible for delivering a signal.
|
||||||
|
//
|
||||||
|
// Signal delivery may be changed from the default channel
|
||||||
|
// based approach by Handlers implementing the SignalHandler
|
||||||
|
// interface.
|
||||||
|
type SignalHandler interface {
|
||||||
|
DeliverSignal(iface, name string, signal *Signal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A DBusError is used to convert a generic object to a D-Bus error.
|
||||||
|
//
|
||||||
|
// Any custom error mechanism may implement this interface to provide
|
||||||
|
// a custom encoding of the error on D-Bus. By default if a normal
|
||||||
|
// error is returned, it will be encoded as the generic
|
||||||
|
// "org.freedesktop.DBus.Error.Failed" error. By implementing this
|
||||||
|
// interface as well a custom encoding may be provided.
|
||||||
|
type DBusError interface {
|
||||||
|
DBusError() (string, []interface{})
|
||||||
|
}
|
4
vendor/github.com/godbus/dbus/sig.go
generated
vendored
4
vendor/github.com/godbus/dbus/sig.go
generated
vendored
|
@ -101,6 +101,8 @@ func getSignature(t reflect.Type) string {
|
||||||
panic(InvalidTypeError{t})
|
panic(InvalidTypeError{t})
|
||||||
}
|
}
|
||||||
return "a{" + getSignature(t.Key()) + getSignature(t.Elem()) + "}"
|
return "a{" + getSignature(t.Key()) + getSignature(t.Elem()) + "}"
|
||||||
|
case reflect.Interface:
|
||||||
|
return "v"
|
||||||
}
|
}
|
||||||
panic(InvalidTypeError{t})
|
panic(InvalidTypeError{t})
|
||||||
}
|
}
|
||||||
|
@ -162,7 +164,7 @@ func (e SignatureError) Error() string {
|
||||||
return fmt.Sprintf("dbus: invalid signature: %q (%s)", e.Sig, e.Reason)
|
return fmt.Sprintf("dbus: invalid signature: %q (%s)", e.Sig, e.Reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to read a single type from this string. If it was successfull, err is nil
|
// Try to read a single type from this string. If it was successful, err is nil
|
||||||
// and rem is the remaining unparsed part. Otherwise, err is a non-nil
|
// and rem is the remaining unparsed part. Otherwise, err is a non-nil
|
||||||
// SignatureError and rem is "". depth is the current recursion depth which may
|
// SignatureError and rem is "". depth is the current recursion depth which may
|
||||||
// not be greater than 64 and should be given as 0 on the first call.
|
// not be greater than 64 and should be given as 0 on the first call.
|
||||||
|
|
43
vendor/github.com/godbus/dbus/transport_tcp.go
generated
vendored
Normal file
43
vendor/github.com/godbus/dbus/transport_tcp.go
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//+build !windows
|
||||||
|
|
||||||
|
package dbus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
transports["tcp"] = newTcpTransport
|
||||||
|
}
|
||||||
|
|
||||||
|
func tcpFamily(keys string) (string, error) {
|
||||||
|
switch getKey(keys, "family") {
|
||||||
|
case "":
|
||||||
|
return "tcp", nil
|
||||||
|
case "ipv4":
|
||||||
|
return "tcp4", nil
|
||||||
|
case "ipv6":
|
||||||
|
return "tcp6", nil
|
||||||
|
default:
|
||||||
|
return "", errors.New("dbus: invalid tcp family (must be ipv4 or ipv6)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTcpTransport(keys string) (transport, error) {
|
||||||
|
host := getKey(keys, "host")
|
||||||
|
port := getKey(keys, "port")
|
||||||
|
if host == "" || port == "" {
|
||||||
|
return nil, errors.New("dbus: unsupported address (must set host and port)")
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol, err := tcpFamily(keys)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
socket, err := net.Dial(protocol, net.JoinHostPort(host, port))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewConn(socket)
|
||||||
|
}
|
2
vendor/github.com/godbus/dbus/transport_unix.go
generated
vendored
2
vendor/github.com/godbus/dbus/transport_unix.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
//+build !windows
|
//+build !windows,!solaris
|
||||||
|
|
||||||
package dbus
|
package dbus
|
||||||
|
|
||||||
|
|
14
vendor/github.com/godbus/dbus/transport_unixcred_openbsd.go
generated
vendored
Normal file
14
vendor/github.com/godbus/dbus/transport_unixcred_openbsd.go
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package dbus
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
func (t *unixTransport) SendNullByte() error {
|
||||||
|
n, _, err := t.UnixConn.WriteMsgUnix([]byte{0}, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if n != 1 {
|
||||||
|
return io.ErrShortWrite
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
5
vendor/vendor.json
vendored
5
vendor/vendor.json
vendored
|
@ -27,9 +27,10 @@
|
||||||
"revisionTime": "2016-11-09T15:11:19Z"
|
"revisionTime": "2016-11-09T15:11:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"checksumSHA1": "Y03oV8ua8TBsSFozViEo7U4dXCE=",
|
||||||
"path": "github.com/godbus/dbus",
|
"path": "github.com/godbus/dbus",
|
||||||
"revision": "e4593d66e29678c26f84166fe231a03e0268ced5",
|
"revision": "4b24ebee04561bf8a3bcc09aead82062edc56778",
|
||||||
"revisionTime": "2016-01-07T17:08:41+05:30"
|
"revisionTime": "2016-12-02T21:35:00Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "github.com/golang/protobuf/proto",
|
"path": "github.com/golang/protobuf/proto",
|
||||||
|
|
Loading…
Reference in a new issue