You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
5.6 KiB
Go

package common
import (
"bytes"
"encoding/binary"
"git.cheetah.cat/cheetah/opentetraflex-go/common/tmkind"
)
type TerminalMessageResponse struct {
Length uint16
Kind tmkind.TetraFlexTerminalMessageKinds
Handler uint32
data bytes.Buffer
payload []byte
}
type HandlerResponse struct {
Success bool
Error error
TMR *TerminalMessageResponse
}
func NewTerminalMessageResponse(length uint16, kind tmkind.TetraFlexTerminalMessageKinds, handler uint32, payload []byte) (tm *TerminalMessageResponse, err error) {
tm = &TerminalMessageResponse{
Length: length,
Kind: kind,
Handler: handler,
data: *bytes.NewBuffer(payload),
payload: payload,
}
return tm, nil
}
func (tmr *TerminalMessageResponse) Bytes() []byte {
return tmr.payload
}
func (tmr *TerminalMessageResponse) readUInt32() (result uint32, err error) {
temp := make([]byte, 4)
if _, err = tmr.data.Read(temp); err != nil {
return result, err
}
result = binary.LittleEndian.Uint32(temp)
return result, nil
}
func (tmr *TerminalMessageResponse) readUInt16() (result uint16, err error) {
temp := make([]byte, 2)
if _, err = tmr.data.Read(temp); err != nil {
return result, err
}
result = binary.LittleEndian.Uint16(temp)
return result, nil
}
func (tmr *TerminalMessageResponse) readByte() (result byte, err error) {
result, err = tmr.data.ReadByte()
return result, err
}
func (tmr *TerminalMessageResponse) skipByte() (err error) {
_, err = tmr.data.ReadByte()
return err
}
func (tmr *TerminalMessageResponse) skipBytes(count int) (err error) {
for i := 0; i < count; i++ {
_, err = tmr.data.ReadByte()
if err != nil {
return err
}
}
return nil
}
func (tmr *TerminalMessageResponse) readAddress() (result TetraFlexAddress, err error) {
kindByte, err := tmr.readByte()
if err != nil {
return result, err
}
result.Kind = TetraFlexAddressKind(kindByte)
if err = tmr.skipByte(); err != nil {
return result, err
}
if err = tmr.skipByte(); err != nil {
return result, err
}
if err = tmr.skipByte(); err != nil {
return result, err
}
result.TSI.SSI, err = tmr.readUInt32()
if err != nil {
return result, err
}
result.TSI.MCC, err = tmr.readUInt16()
if err != nil {
return result, err
}
result.TSI.MCC, err = tmr.readUInt16()
if err != nil {
return result, err
}
textLength, err := tmr.readByte()
if err != nil {
return result, err
}
if err = tmr.skipByte(); err != nil {
return result, err
}
if err = tmr.skipByte(); err != nil {
return result, err
}
if err = tmr.skipByte(); err != nil {
return result, err
}
textBytes := make([]byte, textLength)
if _, err = tmr.data.Read(textBytes); err != nil {
return result, err
}
for i := textLength; i < 24; i++ {
if err = tmr.skipByte(); err != nil {
return result, err
}
}
return result, nil
}
func (tmr *TerminalMessageResponse) readString(count int) (result string, err error) {
textBytes := make([]byte, count)
if _, err = tmr.data.Read(textBytes); err != nil {
return result, err
}
return string(textBytes), nil
}
func (tmr *TerminalMessageResponse) AsAuthenticationChallenge() (authChallenge AuthenticationChallenge, err error) {
authChallenge.RandomSeed = make([]byte, 10)
if _, err = tmr.data.Read(authChallenge.RandomSeed); err != nil {
return authChallenge, err
}
tmr.data.ReadByte()
tmr.data.ReadByte()
authChallenge.RandomChallenge = make([]byte, 10)
if _, err = tmr.data.Read(authChallenge.RandomChallenge); err != nil {
return authChallenge, err
}
flagByte, err := tmr.data.ReadByte()
if err != nil {
return authChallenge, err
}
authChallenge.PinRequested = flagByte&1 != 0
authChallenge.SecurityKeyRequested = flagByte&2 != 0
authChallenge.Response = make([]byte, 4)
if _, err = tmr.data.Read(authChallenge.Response); err != nil {
return authChallenge, err
}
return authChallenge, nil
}
func (tmr *TerminalMessageResponse) AsRegistrationInfo() (regInfo RegistrationInfo, err error) {
if regInfo.ConnectionState, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if regInfo.RemoteVersion, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if regInfo.Address, err = tmr.readAddress(); err != nil {
return regInfo, err
}
if regInfo.MyNumber, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if regInfo.MyShortNumber, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if err = tmr.skipBytes(4); err != nil {
return regInfo, err
}
if regInfo.CallCount, err = tmr.readByte(); err != nil {
return regInfo, err
}
if regInfo.StreamCount, err = tmr.readByte(); err != nil {
return regInfo, err
}
if err = tmr.skipBytes(2); err != nil {
return regInfo, err
}
if regInfo.MaxVersion, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if regInfo.RoamingRef, err = tmr.readUInt32(); err != nil {
return regInfo, err
}
if regInfo.Description, err = tmr.readString(64); err != nil {
return regInfo, err
}
if err != nil {
return regInfo, err
}
if regInfo.RemoteVersion > 20120702 {
port1, err := tmr.readUInt16()
if err != nil {
return regInfo, err
}
port2, err := tmr.readUInt16()
if err != nil {
return regInfo, err
}
regInfo.RTPPorts = []uint16{port1, port2}
}
return regInfo, nil
}
func (tmr *TerminalMessageResponse) AsKeepAliveChallenge() (keepAliveChallenge KeepAliveChallenge, err error) {
if keepAliveChallenge.Value1, err = tmr.readUInt16(); err != nil {
return keepAliveChallenge, err
}
if keepAliveChallenge.Value2, err = tmr.readUInt16(); err != nil {
return keepAliveChallenge, err
}
if keepAliveChallenge.Value3, err = tmr.readUInt32(); err != nil {
return keepAliveChallenge, err
}
return keepAliveChallenge, nil
}