Skip to content

Commit e3f3768

Browse files
committed
change byte array to reader
1 parent ca55123 commit e3f3768

File tree

3 files changed

+77
-50
lines changed

3 files changed

+77
-50
lines changed

ole.go

+52-32
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ type Ole struct {
1515
SecID []uint32
1616
SSecID []uint32
1717
Files []File
18-
bts []byte
18+
reader io.ReadSeeker
1919
}
2020

21-
func Open(bts []byte, charset string) (ole *Ole, err error) {
21+
func Open(reader io.ReadSeeker, charset string) (ole *Ole, err error) {
2222
var header *Header
23-
if header, err = parseHeader(bts[:512]); err == nil {
23+
var hbts = make([]byte, 512)
24+
reader.Read(hbts)
25+
if header, err = parseHeader(hbts); err == nil {
2426
ole = new(Ole)
25-
ole.bts = bts
27+
ole.reader = reader
2628
ole.header = header
2729
ole.Lsector = 512 //TODO
2830
ole.Lssector = 64 //TODO
29-
ole.bts = bts
30-
ole.readMSAT()
31-
return ole, nil
31+
err = ole.readMSAT()
32+
return ole, err
3233
}
3334

3435
return nil, err
@@ -62,7 +63,7 @@ func (o *Ole) OpenFile(file *File) io.ReadSeeker {
6263
}
6364

6465
// Read MSAT
65-
func (o *Ole) readMSAT() {
66+
func (o *Ole) readMSAT() error {
6667
// int sectorNum;
6768

6869
count := uint32(109)
@@ -71,39 +72,50 @@ func (o *Ole) readMSAT() {
7172
}
7273

7374
for i := uint32(0); i < count; i++ {
74-
sector := o.sector_read(o.header.Msat[i])
75-
sids := sector.AllValues(o.Lsector)
76-
77-
o.SecID = append(o.SecID, sids...)
75+
if sector, err := o.sector_read(o.header.Msat[i]); err == nil {
76+
sids := sector.AllValues(o.Lsector)
77+
o.SecID = append(o.SecID, sids...)
78+
} else {
79+
return err
80+
}
7881
}
7982

8083
for sid := o.header.Difstart; sid != ENDOFCHAIN; {
81-
sector := o.sector_read(sid)
82-
sids := sector.MsatValues(o.Lsector)
84+
if sector, err := o.sector_read(sid); err == nil {
85+
sids := sector.MsatValues(o.Lsector)
8386

84-
for _, sid := range sids {
85-
sector := o.sector_read(sid)
86-
sids := sector.AllValues(o.Lsector)
87+
for _, sid := range sids {
88+
if sector, err := o.sector_read(sid); err == nil {
89+
sids := sector.AllValues(o.Lsector)
8790

88-
o.SecID = append(o.SecID, sids...)
89-
}
91+
o.SecID = append(o.SecID, sids...)
92+
} else {
93+
return err
94+
}
95+
}
9096

91-
sid = sector.NextSid(o.Lsector)
97+
sid = sector.NextSid(o.Lsector)
98+
} else {
99+
return err
100+
}
92101
}
93102

94103
for i := uint32(0); i < o.header.Csfat; i++ {
95104
sid := o.header.Sfatstart
96105

97106
if sid != ENDOFCHAIN {
98-
sector := o.sector_read(sid)
107+
if sector, err := o.sector_read(sid); err == nil {
108+
sids := sector.MsatValues(o.Lsector)
99109

100-
sids := sector.MsatValues(o.Lsector)
110+
o.SSecID = append(o.SSecID, sids...)
101111

102-
o.SSecID = append(o.SSecID, sids...)
103-
104-
sid = sector.NextSid(o.Lsector)
112+
sid = sector.NextSid(o.Lsector)
113+
} else {
114+
return err
115+
}
105116
}
106117
}
118+
return nil
107119

108120
}
109121

@@ -115,15 +127,23 @@ func (o *Ole) short_stream_read(sid uint32, size uint32) *StreamReader {
115127
return &StreamReader{o.SSecID, sid, o, sid, 0, o.Lssector, int64(size), 0}
116128
}
117129

118-
func (o *Ole) sector_read(sid uint32) Sector {
119-
pos := o.sector_pos(sid, o.Lsector)
120-
bts := o.bts[pos : pos+o.Lsector]
121-
return Sector(bts)
130+
func (o *Ole) sector_read(sid uint32) (Sector, error) {
131+
return o.sector_read_internal(sid, o.Lsector)
122132
}
123133

124-
func (o *Ole) short_sector_read(sid uint32) Sector {
125-
pos := o.sector_pos(sid, o.Lssector)
126-
return Sector(o.bts[pos : pos+o.Lssector])
134+
func (o *Ole) short_sector_read(sid uint32) (Sector, error) {
135+
return o.sector_read_internal(sid, o.Lssector)
136+
}
137+
138+
func (o *Ole) sector_read_internal(sid, size uint32) (Sector, error) {
139+
pos := o.sector_pos(sid, size)
140+
if _, err := o.reader.Seek(int64(pos), 0); err == nil {
141+
var bts = make([]byte, size)
142+
o.reader.Read(bts)
143+
return Sector(bts), nil
144+
} else {
145+
return nil, err
146+
}
127147
}
128148

129149
func (o *Ole) sector_pos(sid uint32, size uint32) uint32 {

stream_reader.go

+20-13
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,33 @@ func (r *StreamReader) Read(p []byte) (n int, err error) {
2222
if r.offset_of_sector == ENDOFCHAIN {
2323
return 0, io.EOF
2424
}
25-
for i := 0; i < len(p); i++ {
26-
if r.offset_in_sector >= r.size_sector {
25+
pos := r.ole.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
26+
r.ole.reader.Seek(int64(pos), 0)
27+
readed := uint32(0)
28+
for remainLen := uint32(len(p)) - readed; remainLen > r.size_sector-r.offset_in_sector; remainLen = uint32(len(p)) - readed {
29+
if n, err := r.ole.reader.Read(p[readed : readed+r.size_sector-r.offset_in_sector]); err != nil {
30+
return int(readed) + n, err
31+
} else {
32+
readed += uint32(n)
2733
r.offset_in_sector = 0
2834
r.offset_of_sector = r.sat[r.offset_of_sector]
2935
if r.offset_of_sector == ENDOFCHAIN {
30-
return i, io.EOF
36+
return int(readed), io.EOF
3137
}
32-
}
33-
pos := r.ole.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
34-
p[i] = r.ole.bts[pos]
35-
r.offset_in_sector++
36-
r.offset++
37-
if r.offset == int64(r.size) {
38-
return i + 1, io.EOF
38+
pos := r.ole.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
39+
r.ole.reader.Seek(int64(pos), 0)
3940
}
4041
}
41-
if DEBUG {
42-
log.Printf("pos:%x,bit:% X", r.offset_of_sector, p)
42+
if n, err := r.ole.reader.Read(p[readed:len(p)]); err == nil {
43+
r.offset_in_sector += uint32(n)
44+
if DEBUG {
45+
log.Printf("pos:%x,bit:% X", r.offset_of_sector, p)
46+
}
47+
return len(p), nil
48+
} else {
49+
return int(readed) + n, err
4350
}
44-
return len(p), nil
51+
4552
}
4653

4754
func (r *StreamReader) Seek(offset int64, whence int) (offset_result int64, err error) {

stream_reader_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ole2
22

33
import (
4+
"bytes"
45
"fmt"
56
"testing"
67
)
@@ -10,8 +11,7 @@ func TestRead(t *testing.T) {
1011
for i := 0; i < 1<<10; i++ {
1112
bts[i] = byte(i)
1213
}
13-
fmt.Println(bts)
14-
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bts}
14+
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bytes.NewReader(bts)}
1515
r := ole.stream_read(0, 30)
1616
res := make([]byte, 14)
1717
fmt.Println(r.Read(res))
@@ -23,7 +23,7 @@ func TestSeek(t *testing.T) {
2323
for i := 0; i < 1<<10; i++ {
2424
bts[i] = byte(i)
2525
}
26-
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bts}
26+
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bytes.NewReader(bts)}
2727
r := ole.stream_read(0, 30)
2828
fmt.Println(r.Seek(2, 1))
2929
fmt.Println(r.Seek(2, 1))
@@ -46,12 +46,12 @@ func TestSeek(t *testing.T) {
4646
fmt.Println(r.Seek(2, 1))
4747
}
4848

49-
func TestSeek(t *testing.T) {
49+
func TestSeek1(t *testing.T) {
5050
bts := make([]byte, 1<<10)
5151
for i := 0; i < 1<<10; i++ {
5252
bts[i] = byte(i)
5353
}
54-
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bts}
54+
ole := &Ole{nil, 8, 1, []uint32{2, 1, ENDOFCHAIN}, []uint32{}, []File{}, bytes.NewReader(bts)}
5555
r := ole.stream_read(0, 30)
5656
fmt.Println(r.Seek(2, 1))
5757
fmt.Println(r.Seek(2, 1))

0 commit comments

Comments
 (0)