| 97 | } |
| 98 | |
| 99 | func (r *reader) Read() (*super.Value, error) { |
| 100 | for { |
| 101 | if r.meta == nil { |
| 102 | hdr, err := r.readHeader() |
| 103 | if err != nil { |
| 104 | if err == io.EOF { |
| 105 | err = nil |
| 106 | } |
| 107 | return nil, err |
| 108 | } |
| 109 | r.meta = bsupio.NewReader(r.sctx, io.LimitReader(r.reader, int64(hdr.MetaSize))) |
| 110 | r.dataSize = int(hdr.DataSize) + int(hdr.TypeSize) //XXX should read types |
| 111 | val, err := r.marshaler.Marshal(hdr) |
| 112 | return val.Ptr(), err |
| 113 | } |
| 114 | val, err := r.meta.Read() |
| 115 | if val != nil || err != nil { |
| 116 | return val, err |
| 117 | } |
| 118 | if err := r.meta.Close(); err != nil { |
| 119 | return nil, err |
| 120 | } |
| 121 | r.meta = nil |
| 122 | r.skip(r.dataSize) |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | func (r *reader) readHeader() (csup.Header, error) { |
| 127 | var bytes [csup.HeaderSize]byte |