FILE / ScuroNeko/mtg

mtproto/rpc/rpc_handshake_response.go

Исходный файл и его история в репозитории.
FILE 90c10519ee601b7c46eff22b9a0fb7533dc65fc8
Files
mtg/mtproto/rpc/rpc_handshake_response.go
T
2018-07-02 15:44:52 +03:00

54 lines
1.2 KiB
Go

package rpc
import (
"bytes"
"github.com/juju/errors"
)
const rpcHandshakeResponseLength = rpcHandshakeRequestLength
type RPCHandshakeResponse struct {
Type [rpcHandshakeTagLength]byte
Flags [rpcHandshakeFlagsLength]byte
SenderPID [rpcHandshakeSenderPIDLength]byte
PeerPID [rpcHandshakePeerPIDLength]byte
}
func (r *RPCHandshakeResponse) Bytes() []byte {
buf := &bytes.Buffer{}
buf.Grow(rpcHandshakeResponseLength)
buf.Write(r.Type[:])
buf.Write(r.Flags[:])
buf.Write(r.SenderPID[:])
buf.Write(r.PeerPID[:])
return buf.Bytes()
}
func (r *RPCHandshakeResponse) Valid(req *RPCHandshakeRequest) error {
if r.Type != rpcHandshakeTag {
return errors.New("Unexpected handshake tag")
}
if r.PeerPID != rpcHandshakeSenderPID {
return errors.New("Incorrect sender PID")
}
return nil
}
func NewRPCHandshakeResponse(data []byte) (*RPCHandshakeResponse, error) {
if len(data) != rpcHandshakeResponseLength {
return nil, errors.New("Incorrect handshake response length")
}
resp := RPCHandshakeResponse{}
copy(resp.Type[:], data[:4])
copy(resp.Flags[:], data[4:8])
copy(resp.SenderPID[:], data[8:20])
copy(resp.PeerPID[:], data[20:])
return &resp, nil
}