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 127 128 129 130 131 132 133 134 135 136 137
|
// +build ignore
//
// XXX: The method call logic no longer needs introspection data, so
// this code is currently unused. I've kept it around since it may be
// useful stub generation.
package dbus
import (
"bytes"
"encoding/xml"
"strings"
)
type annotationData struct {
Name string `xml:"name,attr"`
Value string `xml:"value,attr"`
}
type argData struct {
Name string `xml:"name,attr"`
Type string `xml:"type,attr"`
Direction string `xml:"direction,attr"`
}
type methodData struct {
Name string `xml:"name,attr"`
Arg []argData `xml:"arg"`
Annotation annotationData `xml:"annotation"`
}
type signalData struct {
Name string `xml:"name,attr"`
Arg []argData `xml:"arg"`
}
type interfaceData struct {
Name string `xml:"name,attr"`
Method []methodData `xml:"method"`
Signal []signalData `xml:"signal"`
}
type introspect struct {
Name string `xml:"name,attr"`
Interface []interfaceData `xml:"interface"`
Node []*Introspect `xml:"node"`
}
type Introspect interface {
GetInterfaceData(name string) InterfaceData
}
type InterfaceData interface {
GetMethodData(name string) MethodData
GetSignalData(name string) SignalData
GetName() string
}
type MethodData interface {
GetName() string
GetInSignature() Signature
GetOutSignature() Signature
}
type SignalData interface {
GetName() string
GetSignature() Signature
}
func NewIntrospect(xmlIntro string) (Introspect, error) {
intro := new(introspect)
buff := bytes.NewBufferString(xmlIntro)
err := xml.Unmarshal(buff.Bytes(), intro)
if err != nil {
return nil, err
}
return intro, nil
}
func (p introspect) GetInterfaceData(name string) InterfaceData {
for _, v := range p.Interface {
if v.Name == name {
return v
}
}
return nil
}
func (p interfaceData) GetMethodData(name string) MethodData {
for _, v := range p.Method {
if v.GetName() == name {
return v
}
}
return nil
}
func (p interfaceData) GetSignalData(name string) SignalData {
for _, v := range p.Signal {
if v.GetName() == name {
return v
}
}
return nil
}
func (p interfaceData) GetName() string { return p.Name }
func (p methodData) GetInSignature() (sig Signature) {
for _, v := range p.Arg {
if strings.ToUpper(v.Direction) == "IN" {
sig += Signature(v.Type)
}
}
return
}
func (p methodData) GetOutSignature() (sig Signature) {
for _, v := range p.Arg {
if strings.ToUpper(v.Direction) == "OUT" {
sig += Signature(v.Type)
}
}
return
}
func (p methodData) GetName() string { return p.Name }
func (p signalData) GetSignature() (sig Signature) {
for _, v := range p.Arg {
sig += Signature(v.Type)
}
return
}
func (p signalData) GetName() string { return p.Name }
|