2021-10-11 13:55:54 +08:00

233 lines
4.8 KiB
Go

package DBUS
import (
"fmt"
"strings"
//"strconv"
"github.com/godbus/dbus"
)
type DbusInterface struct {
Dest string
Path dbus.ObjectPath
Iface string
Obj *dbus.Object
SigFuncs map[string]interface{}
}
func NewDbusInterface(conn *dbus.Conn, dest string, path dbus.ObjectPath, iface string) *DbusInterface {
m := &DbusInterface{}
o := conn.Object(dest, path)
m.Obj = o.(*dbus.Object)
m.Dest = dest
m.Path = path
m.SigFuncs = make(map[string]interface{})
if len(iface) > 2 {
m.Iface = iface
}
return m
}
func (self *DbusInterface) Method(name string, args ...interface{}) *dbus.Call {
var method string
if self.Iface != "" {
method = fmt.Sprintf("%s.%s.%s", self.Dest, self.Iface, name)
} else {
method = fmt.Sprintf("%s.%s", self.Dest, name)
}
if args != nil {
return self.Obj.Call(method, 0, args...)
} else {
return self.Obj.Call(method, 0)
}
}
func (self *DbusInterface) Get(thecall *dbus.Call, retvalues ...interface{}) error {
if len(thecall.Body) == 0 {
return nil
}
err := thecall.Store(retvalues...)
if err != nil {
panic(fmt.Sprintf("Failed: %s,%s", err, thecall.Method))
}
return err
}
func (self *DbusInterface) EnableSignal(signame string) {
iface := self.Dest
if self.Iface != "" {
iface = iface + "." + self.Iface
}
self.Obj.AddMatchSignal(iface, signame)
}
func (self *DbusInterface) HandleSignal(sig *dbus.Signal) {
iface := self.Dest
if self.Iface != "" {
iface = iface + "." + self.Iface
}
if strings.HasPrefix(sig.Name, iface) {
func_name := strings.Replace(sig.Name, iface, "", -1)[1:]
for k, v := range self.SigFuncs {
if k == func_name {
v.(func([]interface{}))(sig.Body)
break
}
}
}
}
type DBusInterface interface {
WifiStrength() int
IsWifiConnectedNow() bool
}
type DBus struct {
Conn *dbus.Conn
Daemon *DbusInterface
Wifi *DbusInterface
}
func NewDBus() *DBus {
d := &DBus{}
return d
}
func (self *DBus) Init() {
//conn_option := dbus.WithSignalHandler(self)
conn, err := dbus.SystemBus()
//conn,err := dbus.SystemBusPrivate(conn_option)
if err != nil {
panic(fmt.Sprintf("Failed to connect to system bus:", err))
}
self.Conn = conn
self.Daemon = NewDbusInterface(conn, "org.wicd.daemon", "/org/wicd/daemon", "")
self.Wifi = NewDbusInterface(conn, "org.wicd.daemon", "/org/wicd/daemon/wireless", "wireless")
}
func (self *DBus) WifiStrength() int {
var fast bool
var iwconfig string
var sig_display_type int
var strength int
self.Daemon.Get(self.Daemon.Method("NeedsExternalCalls"), &fast)
if fast == false {
self.Wifi.Get(self.Wifi.Method("GetIwconfig"), &iwconfig)
} else {
iwconfig = ""
}
self.Daemon.Get(self.Daemon.Method("GetSignalDisplayType"), &sig_display_type)
if sig_display_type == 0 {
self.Wifi.Get(self.Wifi.Method("GetCurrentSignalStrength", iwconfig), &strength)
} else {
self.Wifi.Get(self.Wifi.Method("GetCurrentDBMStrength", iwconfig), &strength)
}
return strength
}
func (self *DBus) check_for_wireless(iwconfig string, wireless_ip string) bool {
var network string
var sig_display_type int
var strength int
if wireless_ip == "" {
return false
}
self.Wifi.Get(self.Wifi.Method("GetCurrentNetwork", iwconfig), &network)
self.Daemon.Get(self.Daemon.Method("GetSignalDisplayType"), &sig_display_type)
if sig_display_type == 0 {
self.Wifi.Get(self.Wifi.Method("GetCurrentSignalStrength", iwconfig), &strength)
} else {
self.Wifi.Get(self.Wifi.Method("GetCurrentDBMStrength", iwconfig), &strength)
}
if strength == 0 {
return false
}
strength_str := ""
self.Daemon.Get(self.Daemon.Method("FormatSignalForPrinting", strength), &strength_str)
return true
}
func (self *DBus) GetWifiIP() string {
var wireless_ip string
if self.Wifi != nil {
self.Wifi.Get(self.Wifi.Method("GetWirelessIP", ""), &wireless_ip)
}
return wireless_ip
}
func (self *DBus) IsWifiConnectedNow() bool {
var fast bool
var iwconfig string
var wireless_connecting bool
var wireless_ip string
self.Wifi.Get(self.Wifi.Method("CheckIfWirelessConnecting"), &wireless_connecting)
self.Daemon.Get(self.Daemon.Method("NeedsExternalCalls"), &fast)
if wireless_connecting == true {
return false
} else {
if fast == false {
self.Wifi.Get(self.Wifi.Method("GetIwconfig"), &iwconfig)
} else {
iwconfig = ""
}
self.Wifi.Get(self.Wifi.Method("GetWirelessIP", iwconfig), &wireless_ip)
if self.check_for_wireless(iwconfig, wireless_ip) == true {
return true
} else {
return false
}
}
}
func (self *DBus) ListenSignal() {
c := make(chan *dbus.Signal, 10)
self.Conn.Signal(c)
for v := range c {
//fmt.Printf("%+v %#v\n",v,v)
//fmt.Printf("body len:%d \n\n",len(v.Body))
self.Wifi.HandleSignal(v)
self.Daemon.HandleSignal(v)
}
}
var DBusHandler *DBus //global
func init() {
if DBusHandler == nil {
DBusHandler = NewDBus()
DBusHandler.Init()
go DBusHandler.ListenSignal()
}
}