dbus.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package DBUS
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/godbus/dbus"
  6. )
  7. type DbusInterface struct {
  8. Dest string
  9. Path dbus.ObjectPath
  10. Iface string
  11. Obj *dbus.Object
  12. }
  13. func NewDbusInterface(conn *dbus.Conn,dest string, path dbus.ObjectPath ,iface string) *DbusInterface {
  14. m := &DbusInterface{}
  15. o := conn.Object(dest,path)
  16. m.Obj = o.(*dbus.Object)
  17. m.Dest = dest
  18. m.Path = path
  19. if len(iface) > 2 {
  20. m.Iface = iface
  21. }
  22. return m
  23. }
  24. func (self *DbusInterface) Method(name string, args...interface{} ) *dbus.Call {
  25. var method string
  26. if self.Iface != "" {
  27. method = fmt.Sprintf("%s.%s.%s", self.Dest, self.Iface,name)
  28. }else {
  29. method = fmt.Sprintf("%s.%s", self.Dest,name)
  30. }
  31. if args != nil {
  32. return self.Obj.Call( method , 0,args...)
  33. }else {
  34. return self.Obj.Call( method, 0)
  35. }
  36. }
  37. func (self *DbusInterface) Get( thecall *dbus.Call, retvalues ...interface{}) {
  38. if len(thecall.Body) == 0 {
  39. return
  40. }
  41. err:= thecall.Store(retvalues...)
  42. if err != nil {
  43. panic(fmt.Sprintf("Failed: %s",err))
  44. }
  45. }
  46. type DBusInterface interface {
  47. WifiStrength() int
  48. IsWifiConnectedNow() bool
  49. }
  50. type DBus struct {
  51. Conn *dbus.Conn
  52. Daemon *DbusInterface
  53. Wifi *DbusInterface
  54. }
  55. func NewDBus() *DBus {
  56. d := &DBus{}
  57. return d
  58. }
  59. func (self *DBus) Init() {
  60. conn, err := dbus.SystemBus()
  61. if err != nil {
  62. panic(fmt.Sprintf("Failed to connect to system bus:", err))
  63. }
  64. self.Conn = conn
  65. self.Daemon = NewDbusInterface(conn, "org.wicd.daemon","/org/wicd/daemon" ,"",)
  66. self.Wifi = NewDbusInterface(conn, "org.wicd.daemon","/org/wicd/daemon/wireless","wireless")
  67. }
  68. func (self *DBus) WifiStrength() int {
  69. var fast bool
  70. var iwconfig string
  71. var sig_display_type int
  72. var strength int
  73. self.Daemon.Get( self.Daemon.Method("NeedsExternalCalls"), &fast)
  74. if fast == false {
  75. self.Wifi.Get( self.Wifi.Method("GetIwconfig"), &iwconfig )
  76. }else{
  77. iwconfig = ""
  78. }
  79. self.Daemon.Get( self.Daemon.Method("GetSignalDisplayType"), &sig_display_type )
  80. if sig_display_type == 0 {
  81. self.Wifi.Get( self.Wifi.Method("GetCurrentSignalStrength",iwconfig), &strength)
  82. } else{
  83. self.Wifi.Get( self.Wifi.Method("GetCurrentDBMStrength",iwconfig), &strength)
  84. }
  85. return strength
  86. }
  87. func (self *DBus) check_for_wireless(iwconfig string, wireless_ip string) bool {
  88. var network string
  89. var sig_display_type int
  90. var strength int
  91. if wireless_ip == "" {
  92. return false
  93. }
  94. self.Wifi.Get( self.Wifi.Method("GetCurrentNetwork",iwconfig), &network)
  95. self.Daemon.Get( self.Daemon.Method("GetSignalDisplayType"), &sig_display_type )
  96. if sig_display_type == 0 {
  97. self.Wifi.Get( self.Wifi.Method("GetCurrentSignalStrength",iwconfig), &strength)
  98. }else {
  99. self.Wifi.Get( self.Wifi.Method("GetCurrentDBMStrength",iwconfig), &strength)
  100. }
  101. if strength == 0 {
  102. return false
  103. }
  104. strength_str := strconv.Itoa(strength)
  105. self.Daemon.Get( self.Daemon.Method("FormatSignalForPrinting",strength_str), &strength_str)
  106. return true
  107. }
  108. func (self *DBus) IsWifiConnectedNow() bool {
  109. var fast bool
  110. var iwconfig string
  111. var wireless_connecting bool
  112. var wireless_ip string
  113. self.Wifi.Get( self.Wifi.Method("CheckIfWirelessConnecting"), &wireless_connecting )
  114. self.Daemon.Get( self.Daemon.Method("NeedsExternalCalls"), &fast)
  115. if wireless_connecting == true {
  116. return false
  117. }else {
  118. if fast == false {
  119. self.Wifi.Get( self.Wifi.Method("GetIwconfig"), &iwconfig )
  120. }else {
  121. iwconfig = ""
  122. }
  123. self.Wifi.Get( self.Wifi.Method("GetWirelessIP", iwconfig), &wireless_ip)
  124. if self.check_for_wireless(iwconfig,wireless_ip) == true {
  125. return true
  126. }else {
  127. return false
  128. }
  129. }
  130. }
  131. func (self *DBus) ListenSignal() {
  132. c := make(chan *dbus.Signal, 10)
  133. self.Conn.Signal(c)
  134. for v := range c {
  135. fmt.Printf("%+v %#v\n",v,v)
  136. }
  137. }