Co-authored-by: matst80 <mats.tornberg@gmail.com> Reviewed-on: https://git.tornberg.me/mats/go-cart-actor/pulls/1
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
const (
|
|
RemoteGetState = uint16(0x01)
|
|
RemoteHandleMessage = uint16(0x02)
|
|
ResponseBody = uint16(0x03)
|
|
)
|
|
|
|
type CartPacket struct {
|
|
Version uint16
|
|
MessageType uint16
|
|
Id CartId
|
|
DataLength uint16
|
|
}
|
|
|
|
type ResponsePacket struct {
|
|
Version uint16
|
|
MessageType uint16
|
|
DataLength uint16
|
|
}
|
|
|
|
func SendCartPacket(conn io.Writer, id CartId, messageType uint16, datafn func(w io.Writer) error) error {
|
|
data, err := GetData(datafn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
binary.Write(conn, binary.LittleEndian, CartPacket{
|
|
Version: 2,
|
|
MessageType: messageType,
|
|
Id: id,
|
|
DataLength: uint16(len(data)),
|
|
})
|
|
_, err = conn.Write(data)
|
|
return err
|
|
}
|
|
|
|
func SendPacket(conn io.Writer, messageType uint16, datafn func(w io.Writer) error) error {
|
|
data, err := GetData(datafn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
binary.Write(conn, binary.LittleEndian, ResponsePacket{
|
|
Version: 1,
|
|
MessageType: messageType,
|
|
DataLength: uint16(len(data)),
|
|
})
|
|
_, err = conn.Write(data)
|
|
return err
|
|
}
|
|
|
|
// func ReceiveCartPacket(conn io.Reader) (CartPacket, []byte, error) {
|
|
// var packet CartPacket
|
|
// err := binary.Read(conn, binary.LittleEndian, &packet)
|
|
// if err != nil {
|
|
// return packet, nil, err
|
|
// }
|
|
// data := make([]byte, packet.DataLength)
|
|
// _, err = conn.Read(data)
|
|
// return packet, data, err
|
|
// }
|
|
|
|
func ReceivePacket(conn io.Reader) (uint16, []byte, error) {
|
|
var packet ResponsePacket
|
|
err := binary.Read(conn, binary.LittleEndian, &packet)
|
|
if err != nil {
|
|
return packet.MessageType, nil, err
|
|
}
|
|
data := make([]byte, packet.DataLength)
|
|
_, err = conn.Read(data)
|
|
return packet.MessageType, data, err
|
|
}
|