This repository has been archived on 2025-03-19. You can view files and clone it, but cannot push or open issues or pull requests.
gonetworkmanager/utils.go
meskedal 4c09e115f8 Fixed duplicate entries in nm and utils
After the latest merge there was a duplicate entry of AddAndActivateWirelessConnection in NetworkManager.go
which has been removed. There was also duplicate functions call2 and
callError2 in utils.go. The duplicate of AddAndActivateWirelessConnection referenced
callError2, and both of these duplicates has been removed.
2019-06-29 23:53:31 +02:00

148 lines
3.6 KiB
Go

package gonetworkmanager
import (
"encoding/binary"
"fmt"
"net"
"github.com/godbus/dbus"
)
const (
dbusMethodAddMatch = "org.freedesktop.DBus.AddMatch"
)
type dbusBase struct {
conn *dbus.Conn
obj dbus.BusObject
}
func (d *dbusBase) init(iface string, objectPath dbus.ObjectPath) error {
var err error
d.conn, err = dbus.SystemBus()
if err != nil {
return err
}
d.obj = d.conn.Object(iface, objectPath)
return nil
}
func (d *dbusBase) call(value interface{}, method string, args ...interface{}) error {
return d.obj.Call(method, 0, args...).Store(value)
}
func (d *dbusBase) call2(value1 interface{}, value2 interface{}, method string, args ...interface{}) error {
return d.obj.Call(method, 0, args...).Store(value1, value2)
}
func (d *dbusBase) subscribe(iface, member string) {
rule := fmt.Sprintf("type='signal',interface='%s',path='%s',member='%s'",
iface, d.obj.Path(), NetworkManagerInterface)
d.conn.BusObject().Call(dbusMethodAddMatch, 0, rule)
}
func (d *dbusBase) subscribeNamespace(namespace string) {
rule := fmt.Sprintf("type='signal',path_namespace='%s'", namespace)
d.conn.BusObject().Call(dbusMethodAddMatch, 0, rule)
}
func (d *dbusBase) getProperty(iface string) (interface{}, error) {
variant, err := d.obj.GetProperty(iface)
if err != nil {
return nil, err
}
return variant.Value(), nil
}
func (d *dbusBase) getObjectProperty(iface string) (dbus.ObjectPath, error) {
value, err := d.getProperty(iface)
if err != nil {
return "", makeErrVariantType(iface)
}
return value.(dbus.ObjectPath), nil
}
func (d *dbusBase) getSliceObjectProperty(iface string) ([]dbus.ObjectPath, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.([]dbus.ObjectPath), nil
}
func (d *dbusBase) getStringProperty(iface string) (string, error) {
value, err := d.getProperty(iface)
if err != nil {
return "", makeErrVariantType(iface)
}
return value.(string), nil
}
func (d *dbusBase) getSliceStringProperty(iface string) ([]string, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.([]string), nil
}
func (d *dbusBase) getMapStringVariantProperty(iface string) (map[string]dbus.Variant, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.(map[string]dbus.Variant), nil
}
func (d *dbusBase) getUint8Property(iface string) (uint8, error) {
value, err := d.getProperty(iface)
if err != nil {
return 0, makeErrVariantType(iface)
}
return value.(uint8), nil
}
func (d *dbusBase) getUint32Property(iface string) (uint32, error) {
value, err := d.getProperty(iface)
if err != nil {
return 0, makeErrVariantType(iface)
}
return value.(uint32), nil
}
func (d *dbusBase) getSliceUint32Property(iface string) ([]uint32, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.([]uint32), nil
}
func (d *dbusBase) getSliceSliceUint32Property(iface string) ([][]uint32, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.([][]uint32), nil
}
func (d *dbusBase) getSliceByteProperty(iface string) ([]byte, error) {
value, err := d.getProperty(iface)
if err != nil {
return nil, makeErrVariantType(iface)
}
return value.([]byte), nil
}
func makeErrVariantType(iface string) error {
return fmt.Errorf("unexpected variant type for '%s'", iface)
}
func ip4ToString(ip uint32) string {
bs := []byte{0, 0, 0, 0}
binary.LittleEndian.PutUint32(bs, ip)
return net.IP(bs).String()
}