1
0
Protocol/types/packet.go

219 lines
4.8 KiB
Go

package types
import (
"bytes"
"encoding/binary"
"io"
)
// Packet represents a basic EQ2 packet interface
type Packet interface {
Serialize(dest []byte) uint32
Size() uint32
}
// PacketWriter helps with writing packet data
type PacketWriter struct {
buffer *bytes.Buffer
offset uint32
}
// NewPacketWriter creates a new packet writer
func NewPacketWriter() *PacketWriter {
return &PacketWriter{
buffer: new(bytes.Buffer),
offset: 0,
}
}
// WriteUint8 writes a uint8 value
func (pw *PacketWriter) WriteUint8(v uint8) error {
return binary.Write(pw.buffer, binary.LittleEndian, v)
}
// WriteUint16 writes a uint16 value
func (pw *PacketWriter) WriteUint16(v uint16) error {
return binary.Write(pw.buffer, binary.LittleEndian, v)
}
// WriteUint32 writes a uint32 value
func (pw *PacketWriter) WriteUint32(v uint32) error {
return binary.Write(pw.buffer, binary.LittleEndian, v)
}
// WriteUint64 writes a uint64 value
func (pw *PacketWriter) WriteUint64(v uint64) error {
return binary.Write(pw.buffer, binary.LittleEndian, v)
}
// WriteString8 writes a string with 8-bit length prefix
func (pw *PacketWriter) WriteString8(s string) error {
str := EQ2String8(s)
return str.Serialize(pw.buffer)
}
// WriteString16 writes a string with 16-bit length prefix
func (pw *PacketWriter) WriteString16(s string) error {
str := EQ2String16(s)
return str.Serialize(pw.buffer)
}
// WriteString32 writes a string with 32-bit length prefix
func (pw *PacketWriter) WriteString32(s string) error {
str := EQ2String32(s)
return str.Serialize(pw.buffer)
}
// WriteColor writes a color value
func (pw *PacketWriter) WriteColor(c Color) error {
return c.Serialize(pw.buffer)
}
// WriteFloat32 writes a float32 value
func (pw *PacketWriter) WriteFloat32(v float32) error {
f := Float32(v)
return f.Serialize(pw.buffer)
}
// WriteFloat64 writes a float64 value
func (pw *PacketWriter) WriteFloat64(v float64) error {
f := Float64(v)
return f.Serialize(pw.buffer)
}
// Bytes returns the written bytes
func (pw *PacketWriter) Bytes() []byte {
return pw.buffer.Bytes()
}
// Size returns the current size of written data
func (pw *PacketWriter) Size() uint32 {
return uint32(pw.buffer.Len())
}
// PacketReader helps with reading packet data
type PacketReader struct {
reader io.Reader
offset uint32
}
// NewPacketReader creates a new packet reader
func NewPacketReader(data []byte) *PacketReader {
return &PacketReader{
reader: bytes.NewReader(data),
offset: 0,
}
}
// NewPacketReaderFromReader creates a packet reader from an io.Reader
func NewPacketReaderFromReader(r io.Reader) *PacketReader {
return &PacketReader{
reader: r,
offset: 0,
}
}
// ReadUint8 reads a uint8 value
func (pr *PacketReader) ReadUint8() (uint8, error) {
var v uint8
err := binary.Read(pr.reader, binary.LittleEndian, &v)
if err == nil {
pr.offset++
}
return v, err
}
// ReadUint16 reads a uint16 value
func (pr *PacketReader) ReadUint16() (uint16, error) {
var v uint16
err := binary.Read(pr.reader, binary.LittleEndian, &v)
if err == nil {
pr.offset += 2
}
return v, err
}
// ReadUint32 reads a uint32 value
func (pr *PacketReader) ReadUint32() (uint32, error) {
var v uint32
err := binary.Read(pr.reader, binary.LittleEndian, &v)
if err == nil {
pr.offset += 4
}
return v, err
}
// ReadUint64 reads a uint64 value
func (pr *PacketReader) ReadUint64() (uint64, error) {
var v uint64
err := binary.Read(pr.reader, binary.LittleEndian, &v)
if err == nil {
pr.offset += 8
}
return v, err
}
// ReadString8 reads a string with 8-bit length prefix
func (pr *PacketReader) ReadString8() (string, error) {
var s EQ2String8
err := s.Deserialize(pr.reader)
if err == nil {
pr.offset += s.Size()
}
return string(s), err
}
// ReadString16 reads a string with 16-bit length prefix
func (pr *PacketReader) ReadString16() (string, error) {
var s EQ2String16
err := s.Deserialize(pr.reader)
if err == nil {
pr.offset += s.Size()
}
return string(s), err
}
// ReadString32 reads a string with 32-bit length prefix
func (pr *PacketReader) ReadString32() (string, error) {
var s EQ2String32
err := s.Deserialize(pr.reader)
if err == nil {
pr.offset += s.Size()
}
return string(s), err
}
// ReadColor reads a color value
func (pr *PacketReader) ReadColor() (Color, error) {
var c Color
err := c.Deserialize(pr.reader)
if err == nil {
pr.offset += 4
}
return c, err
}
// ReadFloat32 reads a float32 value
func (pr *PacketReader) ReadFloat32() (float32, error) {
var f Float32
err := f.Deserialize(pr.reader)
if err == nil {
pr.offset += 4
}
return float32(f), err
}
// ReadFloat64 reads a float64 value
func (pr *PacketReader) ReadFloat64() (float64, error) {
var f Float64
err := f.Deserialize(pr.reader)
if err == nil {
pr.offset += 8
}
return float64(f), err
}
// Offset returns the current read offset
func (pr *PacketReader) Offset() uint32 {
return pr.offset
}