@@ -15,20 +15,21 @@ type Ole struct {
15
15
SecID []uint32
16
16
SSecID []uint32
17
17
Files []File
18
- bts [] byte
18
+ reader io. ReadSeeker
19
19
}
20
20
21
- func Open (bts [] byte , charset string ) (ole * Ole , err error ) {
21
+ func Open (reader io. ReadSeeker , charset string ) (ole * Ole , err error ) {
22
22
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 {
24
26
ole = new (Ole )
25
- ole .bts = bts
27
+ ole .reader = reader
26
28
ole .header = header
27
29
ole .Lsector = 512 //TODO
28
30
ole .Lssector = 64 //TODO
29
- ole .bts = bts
30
- ole .readMSAT ()
31
- return ole , nil
31
+ err = ole .readMSAT ()
32
+ return ole , err
32
33
}
33
34
34
35
return nil , err
@@ -62,7 +63,7 @@ func (o *Ole) OpenFile(file *File) io.ReadSeeker {
62
63
}
63
64
64
65
// Read MSAT
65
- func (o * Ole ) readMSAT () {
66
+ func (o * Ole ) readMSAT () error {
66
67
// int sectorNum;
67
68
68
69
count := uint32 (109 )
@@ -71,39 +72,50 @@ func (o *Ole) readMSAT() {
71
72
}
72
73
73
74
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
+ }
78
81
}
79
82
80
83
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 )
83
86
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 )
87
90
88
- o .SecID = append (o .SecID , sids ... )
89
- }
91
+ o .SecID = append (o .SecID , sids ... )
92
+ } else {
93
+ return err
94
+ }
95
+ }
90
96
91
- sid = sector .NextSid (o .Lsector )
97
+ sid = sector .NextSid (o .Lsector )
98
+ } else {
99
+ return err
100
+ }
92
101
}
93
102
94
103
for i := uint32 (0 ); i < o .header .Csfat ; i ++ {
95
104
sid := o .header .Sfatstart
96
105
97
106
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 )
99
109
100
- sids := sector . MsatValues (o .Lsector )
110
+ o . SSecID = append (o .SSecID , sids ... )
101
111
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
+ }
105
116
}
106
117
}
118
+ return nil
107
119
108
120
}
109
121
@@ -115,15 +127,23 @@ func (o *Ole) short_stream_read(sid uint32, size uint32) *StreamReader {
115
127
return & StreamReader {o .SSecID , sid , o , sid , 0 , o .Lssector , int64 (size ), 0 }
116
128
}
117
129
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 )
122
132
}
123
133
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
+ }
127
147
}
128
148
129
149
func (o * Ole ) sector_pos (sid uint32 , size uint32 ) uint32 {
0 commit comments