File: introspect.go

package info (click to toggle)
golang-go-dbus 1~bzr20140530-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 224 kB
  • ctags: 293
  • sloc: makefile: 13
file content (137 lines) | stat: -rw-r--r-- 2,749 bytes parent folder | download | duplicates (2)
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 }