1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
package dbusutil
import (
"bytes"
"fmt"
"github.com/godbus/dbus"
)
type MatchRule struct {
Str string
}
func (mr MatchRule) AddTo(conn *dbus.Conn) error {
return conn.BusObject().Call(orgFreedesktopDBus+".AddMatch", 0, mr.Str).Err
}
func (mr MatchRule) RemoveFrom(conn *dbus.Conn) error {
return conn.BusObject().Call(orgFreedesktopDBus+".RemoveMatch", 0, mr.Str).Err
}
type matchRuleItem struct {
key, value string
}
type MatchRuleBuilder struct {
items []matchRuleItem
}
func (b *MatchRuleBuilder) addItem(k, v string) {
b.items = append(b.items, matchRuleItem{k, v})
}
func NewMatchRuleBuilder() *MatchRuleBuilder {
return &MatchRuleBuilder{}
}
func (b *MatchRuleBuilder) Type(type0 string) *MatchRuleBuilder {
b.addItem("type", type0)
return b
}
func (b *MatchRuleBuilder) Path(path string) *MatchRuleBuilder {
b.addItem("path", path)
return b
}
func (b *MatchRuleBuilder) Sender(sender string) *MatchRuleBuilder {
b.addItem("sender", sender)
return b
}
func (b *MatchRuleBuilder) Interface(interface0 string) *MatchRuleBuilder {
b.addItem("interface", interface0)
return b
}
func (b *MatchRuleBuilder) Member(member string) *MatchRuleBuilder {
b.addItem("member", member)
return b
}
func (b *MatchRuleBuilder) PathNamespace(pathNamespace string) *MatchRuleBuilder {
b.addItem("path_namespace", pathNamespace)
return b
}
func (b *MatchRuleBuilder) Destination(destination string) *MatchRuleBuilder {
b.addItem("destination", destination)
return b
}
func (b *MatchRuleBuilder) Eavesdrop(eavesdrop bool) *MatchRuleBuilder {
val := "false"
if eavesdrop {
val = "true"
}
b.addItem("eavesdrop", val)
return b
}
func (b *MatchRuleBuilder) Arg(idx int, value string) *MatchRuleBuilder {
b.addItem(fmt.Sprintf("arg%d", idx), value)
return b
}
func (b *MatchRuleBuilder) ArgPath(idx int, path string) *MatchRuleBuilder {
b.addItem(fmt.Sprintf("arg%dpath", idx), path)
return b
}
func (b *MatchRuleBuilder) ArgNamespace(idx int, namespace string) *MatchRuleBuilder {
b.addItem(fmt.Sprintf("arg%dnamespace", idx), namespace)
return b
}
func (b *MatchRuleBuilder) ExtPropertiesChanged(path, interfaceName string) *MatchRuleBuilder {
return b.Type("signal").
Path(path).
Interface(orgFreedesktopDBus+".Properties").
Member("PropertiesChanged").
ArgNamespace(0, interfaceName)
}
func (b *MatchRuleBuilder) ExtSignal(path, interfaceName, name string) *MatchRuleBuilder {
return b.Type("signal").
Path(path).
Interface(interfaceName).
Member(name)
}
func (b *MatchRuleBuilder) BuildStr() string {
var buf bytes.Buffer
for _, item := range b.items {
buf.WriteString(item.key)
buf.Write([]byte("='"))
buf.WriteString(item.value)
buf.Write([]byte("',"))
}
data := buf.Bytes()
return string(data[:len(data)-1]) // remove tailing comma
}
func (b *MatchRuleBuilder) Build() MatchRule {
return MatchRule{Str: b.BuildStr()}
}
|