855 lines
9.1 KiB
Go
855 lines
9.1 KiB
Go
package storage
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
_ = unsafe.Sizeof(0)
|
|
_ = io.ReadFull
|
|
_ = time.Now()
|
|
)
|
|
|
|
func (d *User) Size() (s uint64) {
|
|
|
|
{
|
|
l := uint64(len(d.Username))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
s += 8
|
|
return
|
|
}
|
|
func (d *User) Marshal(buf []byte) ([]byte, error) {
|
|
size := d.Size()
|
|
{
|
|
if uint64(cap(buf)) >= size {
|
|
buf = buf[:size]
|
|
} else {
|
|
buf = make([]byte, size)
|
|
}
|
|
}
|
|
i := uint64(0)
|
|
|
|
{
|
|
|
|
*(*uint64)(unsafe.Pointer(&buf[0])) = d.ID
|
|
|
|
}
|
|
{
|
|
l := uint64(len(d.Username))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+8] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+8] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+8:], d.Username)
|
|
i += l
|
|
}
|
|
return buf[:i+8], nil
|
|
}
|
|
|
|
func (d *User) Unmarshal(buf []byte) (uint64, error) {
|
|
i := uint64(0)
|
|
|
|
{
|
|
|
|
d.ID = *(*uint64)(unsafe.Pointer(&buf[i+0]))
|
|
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+8] & 0x7F)
|
|
for buf[i+8]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+8]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Username = string(buf[i+8 : i+8+l])
|
|
i += l
|
|
}
|
|
return i + 8, nil
|
|
}
|
|
|
|
func (d *Server) Size() (s uint64) {
|
|
|
|
{
|
|
l := uint64(len(d.Name))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Host))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Port))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Password))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Nick))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Username))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Realname))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
s += 1
|
|
return
|
|
}
|
|
func (d *Server) Marshal(buf []byte) ([]byte, error) {
|
|
size := d.Size()
|
|
{
|
|
if uint64(cap(buf)) >= size {
|
|
buf = buf[:size]
|
|
} else {
|
|
buf = make([]byte, size)
|
|
}
|
|
}
|
|
i := uint64(0)
|
|
|
|
{
|
|
l := uint64(len(d.Name))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Name)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Host))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Host)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Port))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Port)
|
|
i += l
|
|
}
|
|
{
|
|
if d.TLS {
|
|
buf[i+0] = 1
|
|
} else {
|
|
buf[i+0] = 0
|
|
}
|
|
}
|
|
{
|
|
l := uint64(len(d.Password))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+1] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+1] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+1:], d.Password)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Nick))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+1] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+1] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+1:], d.Nick)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Username))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+1] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+1] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+1:], d.Username)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Realname))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+1] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+1] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+1:], d.Realname)
|
|
i += l
|
|
}
|
|
return buf[:i+1], nil
|
|
}
|
|
|
|
func (d *Server) Unmarshal(buf []byte) (uint64, error) {
|
|
i := uint64(0)
|
|
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Name = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Host = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Port = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
{
|
|
d.TLS = buf[i+0] == 1
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+1] & 0x7F)
|
|
for buf[i+1]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+1]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Password = string(buf[i+1 : i+1+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+1] & 0x7F)
|
|
for buf[i+1]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+1]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Nick = string(buf[i+1 : i+1+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+1] & 0x7F)
|
|
for buf[i+1]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+1]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Username = string(buf[i+1 : i+1+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+1] & 0x7F)
|
|
for buf[i+1]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+1]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Realname = string(buf[i+1 : i+1+l])
|
|
i += l
|
|
}
|
|
return i + 1, nil
|
|
}
|
|
|
|
func (d *Channel) Size() (s uint64) {
|
|
|
|
{
|
|
l := uint64(len(d.Server))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Name))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Topic))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
return
|
|
}
|
|
func (d *Channel) Marshal(buf []byte) ([]byte, error) {
|
|
size := d.Size()
|
|
{
|
|
if uint64(cap(buf)) >= size {
|
|
buf = buf[:size]
|
|
} else {
|
|
buf = make([]byte, size)
|
|
}
|
|
}
|
|
i := uint64(0)
|
|
|
|
{
|
|
l := uint64(len(d.Server))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Server)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Name))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Name)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Topic))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+0] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+0] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+0:], d.Topic)
|
|
i += l
|
|
}
|
|
return buf[:i+0], nil
|
|
}
|
|
|
|
func (d *Channel) Unmarshal(buf []byte) (uint64, error) {
|
|
i := uint64(0)
|
|
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Server = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Name = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+0] & 0x7F)
|
|
for buf[i+0]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+0]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Topic = string(buf[i+0 : i+0+l])
|
|
i += l
|
|
}
|
|
return i + 0, nil
|
|
}
|
|
|
|
func (d *Message) Size() (s uint64) {
|
|
|
|
{
|
|
l := uint64(len(d.From))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Content))
|
|
|
|
{
|
|
|
|
t := l
|
|
for t >= 0x80 {
|
|
t >>= 7
|
|
s++
|
|
}
|
|
s++
|
|
|
|
}
|
|
s += l
|
|
}
|
|
s += 16
|
|
return
|
|
}
|
|
func (d *Message) Marshal(buf []byte) ([]byte, error) {
|
|
size := d.Size()
|
|
{
|
|
if uint64(cap(buf)) >= size {
|
|
buf = buf[:size]
|
|
} else {
|
|
buf = make([]byte, size)
|
|
}
|
|
}
|
|
i := uint64(0)
|
|
|
|
{
|
|
|
|
*(*uint64)(unsafe.Pointer(&buf[0])) = d.ID
|
|
|
|
}
|
|
{
|
|
l := uint64(len(d.From))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+8] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+8] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+8:], d.From)
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(len(d.Content))
|
|
|
|
{
|
|
|
|
t := uint64(l)
|
|
|
|
for t >= 0x80 {
|
|
buf[i+8] = byte(t) | 0x80
|
|
t >>= 7
|
|
i++
|
|
}
|
|
buf[i+8] = byte(t)
|
|
i++
|
|
|
|
}
|
|
copy(buf[i+8:], d.Content)
|
|
i += l
|
|
}
|
|
{
|
|
|
|
*(*int64)(unsafe.Pointer(&buf[i+8])) = d.Time
|
|
|
|
}
|
|
return buf[:i+16], nil
|
|
}
|
|
|
|
func (d *Message) Unmarshal(buf []byte) (uint64, error) {
|
|
i := uint64(0)
|
|
|
|
{
|
|
|
|
d.ID = *(*uint64)(unsafe.Pointer(&buf[i+0]))
|
|
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+8] & 0x7F)
|
|
for buf[i+8]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+8]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.From = string(buf[i+8 : i+8+l])
|
|
i += l
|
|
}
|
|
{
|
|
l := uint64(0)
|
|
|
|
{
|
|
|
|
bs := uint8(7)
|
|
t := uint64(buf[i+8] & 0x7F)
|
|
for buf[i+8]&0x80 == 0x80 {
|
|
i++
|
|
t |= uint64(buf[i+8]&0x7F) << bs
|
|
bs += 7
|
|
}
|
|
i++
|
|
|
|
l = t
|
|
|
|
}
|
|
d.Content = string(buf[i+8 : i+8+l])
|
|
i += l
|
|
}
|
|
{
|
|
|
|
d.Time = *(*int64)(unsafe.Pointer(&buf[i+8]))
|
|
|
|
}
|
|
return i + 16, nil
|
|
}
|