Skip to content

Commit

Permalink
fix the bug of ssat read
Browse files Browse the repository at this point in the history
  • Loading branch information
extrame committed Aug 12, 2016
1 parent ebc59ec commit d694296
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
19 changes: 12 additions & 7 deletions ole.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ func (o *Ole) ListDir() (dir []*File, err error) {
return
}

func (o *Ole) OpenFile(file *File) io.ReadSeeker {
func (o *Ole) OpenFile(file *File, root *File) io.ReadSeeker {
if file.Size < o.header.Sectorcutoff {
return o.short_stream_read(file.Sstart, file.Size)
return o.short_stream_read(file.Sstart, file.Size, root.Sstart)
} else {
return o.stream_read(file.Sstart, file.Size)
}
Expand Down Expand Up @@ -120,11 +120,12 @@ func (o *Ole) readMSAT() error {
}

func (o *Ole) stream_read(sid uint32, size uint32) *StreamReader {
return &StreamReader{o.SecID, sid, o, sid, 0, o.Lsector, int64(size), 0}
return &StreamReader{o.SecID, sid, o.reader, sid, 0, o.Lsector, int64(size), 0, sector_pos}
}

func (o *Ole) short_stream_read(sid uint32, size uint32) *StreamReader {
return &StreamReader{o.SSecID, sid, o, sid, 0, o.Lssector, int64(size), 0}
func (o *Ole) short_stream_read(sid uint32, size uint32, startSecId uint32) *StreamReader {
ssatReader := &StreamReader{o.SecID, startSecId, o.reader, sid, 0, o.Lsector, int64(uint32(len(o.SSecID)) * o.Lssector), 0, sector_pos}
return &StreamReader{o.SSecID, sid, ssatReader, sid, 0, o.Lssector, int64(size), 0, short_sector_pos}
}

func (o *Ole) sector_read(sid uint32) (Sector, error) {
Expand All @@ -136,7 +137,7 @@ func (o *Ole) short_sector_read(sid uint32) (Sector, error) {
}

func (o *Ole) sector_read_internal(sid, size uint32) (Sector, error) {
pos := o.sector_pos(sid, size)
pos := sector_pos(sid, size)
if _, err := o.reader.Seek(int64(pos), 0); err == nil {
var bts = make([]byte, size)
o.reader.Read(bts)
Expand All @@ -146,6 +147,10 @@ func (o *Ole) sector_read_internal(sid, size uint32) (Sector, error) {
}
}

func (o *Ole) sector_pos(sid uint32, size uint32) uint32 {
func sector_pos(sid uint32, size uint32) uint32 {
return 512 + sid*size
}

func short_sector_pos(sid uint32, size uint32) uint32 {
return sid * size
}
15 changes: 8 additions & 7 deletions stream_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,24 @@ var DEBUG = false
type StreamReader struct {
sat []uint32
start uint32
ole *Ole
reader io.ReadSeeker
offset_of_sector uint32
offset_in_sector uint32
size_sector uint32
size int64
offset int64
sector_pos func(uint32, uint32) uint32
}

func (r *StreamReader) Read(p []byte) (n int, err error) {
if r.offset_of_sector == ENDOFCHAIN {
return 0, io.EOF
}
pos := r.ole.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
r.ole.reader.Seek(int64(pos), 0)
pos := r.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
r.reader.Seek(int64(pos), 0)
readed := uint32(0)
for remainLen := uint32(len(p)) - readed; remainLen > r.size_sector-r.offset_in_sector; remainLen = uint32(len(p)) - readed {
if n, err := r.ole.reader.Read(p[readed : readed+r.size_sector-r.offset_in_sector]); err != nil {
if n, err := r.reader.Read(p[readed : readed+r.size_sector-r.offset_in_sector]); err != nil {
return int(readed) + n, err
} else {
readed += uint32(n)
Expand All @@ -43,11 +44,11 @@ func (r *StreamReader) Read(p []byte) (n int, err error) {
if r.offset_of_sector == ENDOFCHAIN {
return int(readed), io.EOF
}
pos := r.ole.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
r.ole.reader.Seek(int64(pos), 0)
pos := r.sector_pos(r.offset_of_sector, r.size_sector) + r.offset_in_sector
r.reader.Seek(int64(pos), 0)
}
}
if n, err := r.ole.reader.Read(p[readed:len(p)]); err == nil {
if n, err := r.reader.Read(p[readed:len(p)]); err == nil {
r.offset_in_sector += uint32(n)
if DEBUG {
log.Printf("pos:%x,bit:% X", r.offset_of_sector, p)
Expand Down

0 comments on commit d694296

Please sign in to comment.