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() } }