decoder.go 2.58 KB
Newer Older
Rob Pike's avatar
Rob Pike committed
1 2 3 4 5 6 7
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package gob

import (
8
	"bytes";
Rob Pike's avatar
Rob Pike committed
9 10 11 12 13
	"io";
	"os";
	"sync";
)

14 15
// A Decoder manages the receipt of type and data information read from the
// remote side of a connection.
Rob Pike's avatar
Rob Pike committed
16
type Decoder struct {
17 18 19 20 21 22 23
	mutex		sync.Mutex;		// each item must be received atomically
	r		io.Reader;		// source of the data
	seen		map[typeId]*wireType;	// which types we've already seen described
	state		*decodeState;		// reads data from in-memory buffer
	countState	*decodeState;		// reads counts from wire
	buf		[]byte;
	oneByte		[]byte;
Rob Pike's avatar
Rob Pike committed
24 25
}

26
// NewDecoder returns a new decoder that reads from the io.Reader.
Rob Pike's avatar
Rob Pike committed
27 28
func NewDecoder(r io.Reader) *Decoder {
	dec := new(Decoder);
29
	dec.r = r;
30
	dec.seen = make(map[typeId]*wireType);
31
	dec.state = newDecodeState(nil);	// buffer set in Decode(); rest is unimportant
32
	dec.oneByte = make([]byte, 1);
Rob Pike's avatar
Rob Pike committed
33 34 35 36

	return dec;
}

37
func (dec *Decoder) recvType(id typeId) {
Rob Pike's avatar
Rob Pike committed
38
	// Have we already seen this type?  That's an error
Russ Cox's avatar
Russ Cox committed
39
	if _, alreadySeen := dec.seen[id]; alreadySeen {
Rob Pike's avatar
Rob Pike committed
40
		dec.state.err = os.ErrorString("gob: duplicate type received");
41
		return;
Rob Pike's avatar
Rob Pike committed
42 43 44 45
	}

	// Type:
	wire := new(wireType);
46
	decode(dec.state.b, tWireType, wire);
Rob Pike's avatar
Rob Pike committed
47 48 49 50
	// Remember we've seen this type.
	dec.seen[id] = wire;
}

51 52
// Decode reads the next value from the connection and stores
// it in the data represented by the empty interface value.
Rob Pike's avatar
Rob Pike committed
53
// The value underlying e must be the correct type for the next
54
// data item received.
Rob Pike's avatar
Rob Pike committed
55 56
func (dec *Decoder) Decode(e interface{}) os.Error {
	// Make sure we're single-threaded through here.
57 58
	dec.mutex.Lock();
	defer dec.mutex.Unlock();
Rob Pike's avatar
Rob Pike committed
59

60 61 62
	dec.state.err = nil;
	for {
		// Read a count.
63 64 65
		var nbytes uint64;
		nbytes, dec.state.err = decodeUintReader(dec.r, dec.oneByte);
		if dec.state.err != nil {
66
			break
67
		}
68 69
		// Allocate the buffer.
		if nbytes > uint64(len(dec.buf)) {
70
			dec.buf = make([]byte, nbytes+1000)
71 72 73
		}
		dec.state.b = bytes.NewBuffer(dec.buf[0:nbytes]);

74
		// Read the data
75
		_, dec.state.err = io.ReadFull(dec.r, dec.buf[0:nbytes]);
76
		if dec.state.err != nil {
77
			if dec.state.err == os.EOF {
78
				dec.state.err = io.ErrUnexpectedEOF
Rob Pike's avatar
Rob Pike committed
79
			}
80
			break;
81 82
		}

Rob Pike's avatar
Rob Pike committed
83
		// Receive a type id.
84
		id := typeId(decodeInt(dec.state));
85
		if dec.state.err != nil {
86
			break
87
		}
Rob Pike's avatar
Rob Pike committed
88

89
		// Is it a new type?
90
		if id < 0 {	// 0 is the error state, handled above
91
			// If the id is negative, we have a type.
92 93
			dec.recvType(-id);
			if dec.state.err != nil {
94
				break
95 96
			}
			continue;
Rob Pike's avatar
Rob Pike committed
97 98
		}

99
		// No, it's a value.
100 101
		dec.state.err = decode(dec.state.b, id, e);
		break;
Rob Pike's avatar
Rob Pike committed
102
	}
103
	return dec.state.err;
Rob Pike's avatar
Rob Pike committed
104
}