123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- Copyright 2015 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package dbus
- import (
- godbus "github.com/godbus/dbus"
- )
- // Interface is an interface that presents a subset of the godbus/dbus API. Use this
- // when you want to inject fakeable/mockable D-Bus behavior.
- type Interface interface {
- // SystemBus returns a connection to the system bus, connecting to it
- // first if necessary
- SystemBus() (Connection, error)
- // SessionBus returns a connection to the session bus, connecting to it
- // first if necessary
- SessionBus() (Connection, error)
- }
- // Connection represents a D-Bus connection
- type Connection interface {
- // Returns an Object representing the bus itself
- BusObject() Object
- // Object creates a representation of a remote D-Bus object
- Object(name, path string) Object
- // Signal registers or unregisters a channel to receive D-Bus signals
- Signal(ch chan<- *godbus.Signal)
- }
- // Object represents a remote D-Bus object
- type Object interface {
- // Call synchronously calls a D-Bus method
- Call(method string, flags godbus.Flags, args ...interface{}) Call
- }
- // Call represents a pending or completed D-Bus method call
- type Call interface {
- // Store returns a completed call's return values, or an error
- Store(retvalues ...interface{}) error
- }
- // Implements Interface in terms of actually talking to D-Bus
- type dbusImpl struct {
- systemBus *connImpl
- sessionBus *connImpl
- }
- // Implements Connection as a godbus.Conn
- type connImpl struct {
- conn *godbus.Conn
- }
- // Implements Object as a godbus.Object
- type objectImpl struct {
- object godbus.BusObject
- }
- // Implements Call as a godbus.Call
- type callImpl struct {
- call *godbus.Call
- }
- // New returns a new Interface which will use godbus to talk to D-Bus
- func New() Interface {
- return &dbusImpl{}
- }
- // SystemBus is part of Interface
- func (db *dbusImpl) SystemBus() (Connection, error) {
- if db.systemBus == nil {
- bus, err := godbus.SystemBus()
- if err != nil {
- return nil, err
- }
- db.systemBus = &connImpl{bus}
- }
- return db.systemBus, nil
- }
- // SessionBus is part of Interface
- func (db *dbusImpl) SessionBus() (Connection, error) {
- if db.sessionBus == nil {
- bus, err := godbus.SessionBus()
- if err != nil {
- return nil, err
- }
- db.sessionBus = &connImpl{bus}
- }
- return db.sessionBus, nil
- }
- // BusObject is part of the Connection interface
- func (conn *connImpl) BusObject() Object {
- return &objectImpl{conn.conn.BusObject()}
- }
- // Object is part of the Connection interface
- func (conn *connImpl) Object(name, path string) Object {
- return &objectImpl{conn.conn.Object(name, godbus.ObjectPath(path))}
- }
- // Signal is part of the Connection interface
- func (conn *connImpl) Signal(ch chan<- *godbus.Signal) {
- conn.conn.Signal(ch)
- }
- // Call is part of the Object interface
- func (obj *objectImpl) Call(method string, flags godbus.Flags, args ...interface{}) Call {
- return &callImpl{obj.object.Call(method, flags, args...)}
- }
- // Store is part of the Call interface
- func (call *callImpl) Store(retvalues ...interface{}) error {
- return call.call.Store(retvalues...)
- }
|