65 lines
1.0 KiB
Go
65 lines
1.0 KiB
Go
package packets
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/zlib"
|
|
"io"
|
|
)
|
|
|
|
type EQ2Compressor struct {
|
|
level int
|
|
}
|
|
|
|
func NewEQ2Compressor() *EQ2Compressor {
|
|
return &EQ2Compressor{level: zlib.DefaultCompression}
|
|
}
|
|
|
|
func (c *EQ2Compressor) Compress(data []byte) ([]byte, error) {
|
|
if len(data) == 0 {
|
|
return data, nil
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
writer, err := zlib.NewWriterLevel(&buf, c.level)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = writer.Write(data)
|
|
if err != nil {
|
|
writer.Close()
|
|
return nil, err
|
|
}
|
|
|
|
err = writer.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
func (c *EQ2Compressor) Decompress(data []byte) ([]byte, error) {
|
|
if len(data) == 0 {
|
|
return data, nil
|
|
}
|
|
|
|
reader, err := zlib.NewReader(bytes.NewReader(data))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer reader.Close()
|
|
|
|
var buf bytes.Buffer
|
|
_, err = io.Copy(&buf, reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
func (c *EQ2Compressor) ShouldCompress(data []byte) bool {
|
|
return len(data) > 100 // EQ2 compression threshold
|
|
}
|