joy4/atom/writer.go
2015-11-21 19:49:03 +08:00

81 lines
1.4 KiB
Go

package atom
import (
"io"
"log"
)
func WriteBytes(w io.Writer, b []byte) (err error) {
_, err = w.Write(b)
return
}
func WriteUInt(w io.Writer, val uint, n int) (err error) {
var b [8]byte
for i := n-1; i >= 0; i-- {
b[i] = byte(val)
val >>= 8
}
return WriteBytes(w, b[0:n])
}
func WriteInt(w io.Writer, val int, n int) (err error) {
return WriteUInt(w, uint(val), n)
}
func WriteTimeStamp(w io.Writer, ts TimeStamp, n int) (err error) {
return WriteUInt(w, uint(ts), n)
}
func WriteString(w io.Writer, val string) (err error) {
return WriteBytes(w, []byte(val))
}
func WriteDummy(w io.Writer, n int) (err error) {
return WriteBytes(w, make([]byte, n))
}
type Writer struct {
io.WriteSeeker
sizePos int64
}
func (self *Writer) Close() (err error) {
var curPos int64
if curPos, err = self.Seek(0, 1); err != nil {
return
}
if _, err = self.Seek(self.sizePos, 0); err != nil {
return
}
if err = WriteInt(self, int(curPos - self.sizePos), 4); err != nil {
return
}
if _, err = self.Seek(curPos, 0); err != nil {
return
}
if false {
log.Println("writeback", self.sizePos, curPos, curPos-self.sizePos)
}
return
}
func WriteAtomHeader(w io.WriteSeeker, cc4 string) (res *Writer, err error) {
self := &Writer{WriteSeeker: w}
if self.sizePos, err = w.Seek(0, 1); err != nil {
return
}
if err = WriteDummy(self, 4); err != nil {
return
}
if err = WriteString(self, cc4); err != nil {
return
}
res = self
return
}