From d69429661ad7efb189d2ad8074c867265009d0a4 Mon Sep 17 00:00:00 2001 From: Liu Ming Date: Fri, 12 Aug 2016 14:52:07 +0800 Subject: [PATCH] fix the bug of ssat read --- ole.go | 19 ++++++++++++------- stream_reader.go | 15 ++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/ole.go b/ole.go index bb6ebb4..9a2f96a 100644 --- a/ole.go +++ b/ole.go @@ -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) } @@ -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) { @@ -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) @@ -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 +} diff --git a/stream_reader.go b/stream_reader.go index a26bd93..28a9562 100644 --- a/stream_reader.go +++ b/stream_reader.go @@ -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) @@ -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)