11 order binary.ByteOrder
15 // newDecoder returns a new decoder that reads values from in. The input is
16 // expected to be in the given byte order.
17 func newDecoder(in io.Reader, order binary.ByteOrder) *decoder {
24 // align aligns the input to the given boundary and panics on error.
25 func (dec *decoder) align(n int) {
27 newpos := (dec.pos + n - 1) & ^(n - 1)
28 empty := make([]byte, newpos-dec.pos)
29 if _, err := io.ReadFull(dec.in, empty); err != nil {
36 // Calls binary.Read(dec.in, dec.order, v) and panics on read errors.
37 func (dec *decoder) binread(v interface{}) {
38 if err := binary.Read(dec.in, dec.order, v); err != nil {
43 func (dec *decoder) Decode(sig Signature) (vs []interface{}, err error) {
47 if err, ok = v.(error); ok {
48 if err == io.EOF || err == io.ErrUnexpectedEOF {
49 err = FormatError("unexpected EOF")
53 vs = make([]interface{}, 0)
56 err, rem := validSingle(s, 0)
60 v := dec.decode(s[:len(s)-len(rem)], 0)
67 func (dec *decoder) decode(s string, depth int) interface{} {
68 dec.align(alignment(typeFor(s)))
72 if _, err := dec.in.Read(b[:]); err != nil {
78 i := dec.decode("u", depth).(uint32)
85 panic(FormatError("invalid value for boolean"))
123 length := dec.decode("u", depth).(uint32)
124 b := make([]byte, int(length)+1)
125 if _, err := io.ReadFull(dec.in, b); err != nil {
128 dec.pos += int(length) + 1
129 return string(b[:len(b)-1])
131 return ObjectPath(dec.decode("s", depth).(string))
133 length := dec.decode("y", depth).(byte)
134 b := make([]byte, int(length)+1)
135 if _, err := io.ReadFull(dec.in, b); err != nil {
138 dec.pos += int(length) + 1
139 sig, err := ParseSignature(string(b[:len(b)-1]))
146 panic(FormatError("input exceeds container depth limit"))
149 sig := dec.decode("g", depth).(Signature)
150 if len(sig.str) == 0 {
151 panic(FormatError("variant signature is empty"))
153 err, rem := validSingle(sig.str, 0)
158 panic(FormatError("variant signature has multiple types"))
161 variant.value = dec.decode(sig.str, depth+1)
164 return UnixFDIndex(dec.decode("u", depth).(uint32))
166 if len(s) > 1 && s[1] == '{' {
168 vsig := s[3 : len(s)-1]
169 v := reflect.MakeMap(reflect.MapOf(typeFor(ksig), typeFor(vsig)))
171 panic(FormatError("input exceeds container depth limit"))
173 length := dec.decode("u", depth).(uint32)
174 // Even for empty maps, the correct padding must be included
177 for dec.pos < spos+int(length) {
179 if !isKeyType(v.Type().Key()) {
180 panic(InvalidTypeError{v.Type()})
182 kv := dec.decode(ksig, depth+2)
183 vv := dec.decode(vsig, depth+2)
184 v.SetMapIndex(reflect.ValueOf(kv), reflect.ValueOf(vv))
189 panic(FormatError("input exceeds container depth limit"))
191 length := dec.decode("u", depth).(uint32)
192 v := reflect.MakeSlice(reflect.SliceOf(typeFor(s[1:])), 0, int(length))
193 // Even for empty arrays, the correct padding must be included
194 dec.align(alignment(typeFor(s[1:])))
196 for dec.pos < spos+int(length) {
197 ev := dec.decode(s[1:], depth+1)
198 v = reflect.Append(v, reflect.ValueOf(ev))
203 panic(FormatError("input exceeds container depth limit"))
206 v := make([]interface{}, 0)
209 err, rem := validSingle(s, 0)
213 ev := dec.decode(s[:len(s)-len(rem)], depth+1)
219 panic(SignatureError{Sig: s})
223 // A FormatError is an error in the wire format.
224 type FormatError string
226 func (e FormatError) Error() string {
227 return "dbus: wire format error: " + string(e)