don't trust sizes of existing frames, re-calculate

also write new text strings for toc/chap in utf-16
master
joshua stein 2017-05-30 20:36:08 -05:00
rodzic 3685b615b7
commit 1c3fc9101a
3 zmienionych plików z 69 dodań i 8 usunięć

Wyświetl plik

@ -149,3 +149,26 @@ func EncodedDiff(newEncoding byte, newString string, oldEncoding byte, oldString
return len(newEncodedString) - len(oldEncodedString), nil return len(newEncodedString) - len(oldEncodedString), nil
} }
func EncodedStringBytes(s string, encoding byte) ([]byte, error) {
encodedString, err := Encoders[encoding].ConvertString(s)
if err != nil {
return nil, err
}
return []byte(encodedString), nil
}
func EncodedNullTermStringBytes(s string, encoding byte) ([]byte, error) {
encodedBytes, err := EncodedStringBytes(s, encoding)
if err != nil {
return nil, err
}
nullLength := EncodingNullLengthForIndex(encoding)
for x := 0; x < nullLength; x++ {
encodedBytes = append(encodedBytes, byte(0x0))
}
return encodedBytes, nil
}

Wyświetl plik

@ -36,12 +36,12 @@ func (w *Writer) WriteByte(b byte) (err error) {
} }
func (w *Writer) WriteString(s string, encoding byte) (err error) { func (w *Writer) WriteString(s string, encoding byte) (err error) {
encodedString, err := Encoders[encoding].ConvertString(s) encodedBytes, err := EncodedStringBytes(s, encoding)
if err != nil { if err != nil {
return err return err
} }
_, err = w.Write([]byte(encodedString)) _, err = w.Write(encodedBytes)
if err != nil { if err != nil {
return err return err
} }

Wyświetl plik

@ -320,14 +320,25 @@ func ParseDescTextFrame(head FrameHead, data []byte) Framer {
if f.encoding, err = rd.ReadByte(); err != nil { if f.encoding, err = rd.ReadByte(); err != nil {
return nil return nil
} }
f.size = uint32(1)
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil { if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
return nil return nil
} }
l, err := encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
if f.text, err = rd.ReadRestString(f.encoding); err != nil { if f.text, err = rd.ReadRestString(f.encoding); err != nil {
return nil return nil
} }
l, err = encodedbytes.EncodedStringBytes(f.text, f.encoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
return f return f
} }
@ -421,18 +432,30 @@ func ParseUnsynchTextFrame(head FrameHead, data []byte) Framer {
if f.encoding, err = rd.ReadByte(); err != nil { if f.encoding, err = rd.ReadByte(); err != nil {
return nil return nil
} }
f.size = uint32(1)
if f.language, err = rd.ReadNumBytesString(3); err != nil { if f.language, err = rd.ReadNumBytesString(3); err != nil {
return nil return nil
} }
f.size += uint32(3)
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil { if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
return nil return nil
} }
l, err := encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
if f.text, err = rd.ReadRestString(f.encoding); err != nil { if f.text, err = rd.ReadRestString(f.encoding); err != nil {
return nil return nil
} }
l, err = encodedbytes.EncodedStringBytes(f.text, f.encoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
return f return f
} }
@ -497,22 +520,35 @@ func ParseImageFrame(head FrameHead, data []byte) Framer {
if f.encoding, err = rd.ReadByte(); err != nil { if f.encoding, err = rd.ReadByte(); err != nil {
return nil return nil
} }
f.size = uint32(1)
if f.mimeType, err = rd.ReadNullTermString(encodedbytes.NativeEncoding); err != nil { if f.mimeType, err = rd.ReadNullTermString(encodedbytes.NativeEncoding); err != nil {
return nil return nil
} }
l, err := encodedbytes.EncodedNullTermStringBytes(f.mimeType, encodedbytes.NativeEncoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
if f.pictureType, err = rd.ReadByte(); err != nil { if f.pictureType, err = rd.ReadByte(); err != nil {
return nil return nil
} }
f.size += uint32(1)
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil { if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
return nil return nil
} }
l, err = encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
if err != nil {
return nil
}
f.size += uint32(len(l))
if f.data, err = rd.ReadRest(); err != nil { if f.data, err = rd.ReadRest(); err != nil {
return nil return nil
} }
f.size += uint32(len(f.data))
return f return f
} }
@ -606,11 +642,13 @@ func NewChapterFrame(ft FrameType, element string, startTime uint32, endTime uin
if title != "" { if title != "" {
ft := V23FrameTypeMap["TIT2"] ft := V23FrameTypeMap["TIT2"]
titleFrame = NewTextFrame(ft, title) titleFrame = NewTextFrame(ft, title)
titleFrame.(*TextFrame).SetEncoding("UTF-16")
} }
if link != "" { if link != "" {
ft := V23FrameTypeMap["WXXX"] ft := V23FrameTypeMap["WXXX"]
linkFrame = NewDescTextFrame(ft, linkTitle, link) linkFrame = NewDescTextFrame(ft, linkTitle, link)
linkFrame.(*DescTextFrame).SetEncoding("UTF-16")
} }
head := FrameHead{ head := FrameHead{
@ -728,18 +766,18 @@ func (f ChapterFrame) Title() string {
} }
func (f *ChapterFrame) Bytes() []byte { func (f *ChapterFrame) Bytes() []byte {
f.size = uint32(8 + len(f.Element)) f.size = uint32(len(f.Element) + 1 + 4 + 4 + 4 + 4)
var titleBytes []byte var titleBytes []byte
if f.titleFrame != nil { if f.titleFrame != nil {
titleBytes = V23Bytes(f.titleFrame) titleBytes = V23Bytes(f.titleFrame)
f.size += uint32(len(titleBytes)) + FrameHeaderSize f.size += uint32(len(titleBytes))
} }
var linkBytes []byte var linkBytes []byte
if f.linkFrame != nil { if f.linkFrame != nil {
linkBytes = V23Bytes(f.linkFrame) linkBytes = V23Bytes(f.linkFrame)
f.size += uint32(len(linkBytes)) + FrameHeaderSize f.size += uint32(len(linkBytes))
} }
bs := make([]byte, f.size) bs := make([]byte, f.size)
@ -828,13 +866,13 @@ func ParseTOCFrame(head FrameHead, data []byte) Framer {
} }
f.Ordered = (b&(1<<0) != 0) f.Ordered = (b&(1<<0) != 0)
f.TopLevel = (b&(1<<1) != 0) f.TopLevel = (b&(1<<1) != 0)
f.size += 1
b, err = rd.ReadByte() b, err = rd.ReadByte()
if err != nil { if err != nil {
return nil return nil
} }
f.size += 1
f.size += 2
for i := 0; i < int(b); i++ { for i := 0; i < int(b); i++ {
s, err := rd.ReadNullTermString(encodedbytes.NativeEncoding) s, err := rd.ReadNullTermString(encodedbytes.NativeEncoding)
@ -863,7 +901,7 @@ func (f TOCFrame) String() string {
func (f *TOCFrame) Bytes() []byte { func (f *TOCFrame) Bytes() []byte {
var err error var err error
size := uint32(len(f.Element) + 1 + 2 + 1) size := uint32(len(f.Element) + 1 + 1 + 1)
for _, e := range f.ChildElements { for _, e := range f.ChildElements {
size += uint32(len(e) + 1) size += uint32(len(e) + 1)
} }