加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
deliver.go 8.55 KB
一键复制 编辑 原始数据 按行查看 历史
Tony Bai 提交于 2020-07-15 14:09 . add other error errno for deliver msg
// Copyright 2015 Tony Bai.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
package cmpp
import (
"encoding/binary"
"errors"
)
// Packet length const for cmpp deliver request and response packets.
const (
Cmpp2DeliverReqPktMaxLen uint32 = 12 + 233 //245d, 0xf5
Cmpp2DeliverRspPktLen uint32 = 12 + 8 + 1 //21d, 0x15
Cmpp3DeliverReqPktMaxLen uint32 = 12 + 257 //269d, 0x10d
Cmpp3DeliverRspPktLen uint32 = 12 + 8 + 4 //24d, 0x18
)
// Errors for result in deliver resp.
var (
ErrnoDeliverInvalidStruct uint8 = 1
ErrnoDeliverInvalidCommandId uint8 = 2
ErrnoDeliverInvalidSequence uint8 = 3
ErrnoDeliverInvalidMsgLength uint8 = 4
ErrnoDeliverInvalidFeeCode uint8 = 5
ErrnoDeliverExceedMaxMsgLength uint8 = 6
ErrnoDeliverInvalidServiceId uint8 = 7
ErrnoDeliverNotPassFlowControl uint8 = 8
ErrnoDeliverOtherError uint8 = 9
DeliverRspResultErrMap = map[uint8]error{
ErrnoDeliverInvalidStruct: errDeliverInvalidStruct,
ErrnoDeliverInvalidCommandId: errDeliverInvalidCommandId,
ErrnoDeliverInvalidSequence: errDeliverInvalidSequence,
ErrnoDeliverInvalidMsgLength: errDeliverInvalidMsgLength,
ErrnoDeliverInvalidFeeCode: errDeliverInvalidFeeCode,
ErrnoDeliverExceedMaxMsgLength: errDeliverExceedMaxMsgLength,
ErrnoDeliverInvalidServiceId: errDeliverInvalidServiceId,
ErrnoDeliverNotPassFlowControl: errDeliverNotPassFlowControl,
ErrnoDeliverOtherError: errDeliverOtherError,
}
errDeliverInvalidStruct = errors.New("deliver response status: invalid protocol structure")
errDeliverInvalidCommandId = errors.New("deliver response status: invalid command id")
errDeliverInvalidSequence = errors.New("deliver response status: invalid message sequence")
errDeliverInvalidMsgLength = errors.New("deliver response status: invalid message length")
errDeliverInvalidFeeCode = errors.New("deliver response status: invalid fee code")
errDeliverExceedMaxMsgLength = errors.New("deliver response status: exceed max message length")
errDeliverInvalidServiceId = errors.New("deliver response status: invalid service id")
errDeliverNotPassFlowControl = errors.New("deliver response status: not pass the flow control")
errDeliverOtherError = errors.New("deliver response status: other error")
)
type Cmpp2DeliverReqPkt struct {
MsgId uint64
DestId string
ServiceId string
TpPid uint8
TpUdhi uint8
MsgFmt uint8
SrcTerminalId string
RegisterDelivery uint8
MsgLength uint8
MsgContent string
Reserve string
//session info
SeqId uint32
}
type Cmpp2DeliverRspPkt struct {
MsgId uint64
Result uint8
//session info
SeqId uint32
}
type Cmpp3DeliverReqPkt struct {
MsgId uint64
DestId string
ServiceId string
TpPid uint8
TpUdhi uint8
MsgFmt uint8
SrcTerminalId string
SrcTerminalType uint8
RegisterDelivery uint8
MsgLength uint8
MsgContent string
LinkId string
//session info
SeqId uint32
}
type Cmpp3DeliverRspPkt struct {
MsgId uint64
Result uint32
//session info
SeqId uint32
}
// Pack packs the Cmpp2DeliverReqPkt to bytes stream for client side.
func (p *Cmpp2DeliverReqPkt) Pack(seqId uint32) ([]byte, error) {
var pktLen uint32 = CMPP_HEADER_LEN + 65 + uint32(p.MsgLength) + 8
var w = newPacketWriter(pktLen)
// Pack header
w.WriteInt(binary.BigEndian, pktLen)
w.WriteInt(binary.BigEndian, CMPP_DELIVER)
w.WriteInt(binary.BigEndian, seqId)
p.SeqId = seqId
// Pack Body
w.WriteInt(binary.BigEndian, p.MsgId)
w.WriteFixedSizeString(p.DestId, 21)
w.WriteFixedSizeString(p.ServiceId, 10)
w.WriteByte(p.TpPid)
w.WriteByte(p.TpUdhi)
w.WriteByte(p.MsgFmt)
w.WriteFixedSizeString(p.SrcTerminalId, 21)
w.WriteByte(p.RegisterDelivery)
w.WriteByte(p.MsgLength)
w.WriteString(p.MsgContent)
w.WriteFixedSizeString(p.Reserve, 8)
return w.Bytes()
}
// Unpack unpack the binary byte stream to a Cmpp2DeliverReqPkt variable.
// After unpack, you will get all value of fields in
// Cmpp2DeliverReqPkt struct.
func (p *Cmpp2DeliverReqPkt) Unpack(data []byte) error {
var r = newPacketReader(data)
// Sequence Id
r.ReadInt(binary.BigEndian, &p.SeqId)
// Body
r.ReadInt(binary.BigEndian, &p.MsgId)
destId := r.ReadCString(21)
p.DestId = string(destId)
serviceId := r.ReadCString(10)
p.ServiceId = string(serviceId)
p.TpPid = r.ReadByte()
p.TpUdhi = r.ReadByte()
p.MsgFmt = r.ReadByte()
srcTerminalId := r.ReadCString(21)
p.SrcTerminalId = string(srcTerminalId)
p.RegisterDelivery = r.ReadByte()
p.MsgLength = r.ReadByte()
msgContent := make([]byte, p.MsgLength)
r.ReadBytes(msgContent)
p.MsgContent = string(msgContent)
reserve := r.ReadCString(8)
p.Reserve = string(reserve)
return r.Error()
}
// Pack packs the Cmpp2DeliverRspPkt to bytes stream for client side.
func (p *Cmpp2DeliverRspPkt) Pack(seqId uint32) ([]byte, error) {
var pktLen uint32 = Cmpp2DeliverRspPktLen
var w = newPacketWriter(pktLen)
// Pack header
w.WriteInt(binary.BigEndian, pktLen)
w.WriteInt(binary.BigEndian, CMPP_DELIVER_RESP)
w.WriteInt(binary.BigEndian, seqId)
p.SeqId = seqId
// Pack Body
w.WriteInt(binary.BigEndian, p.MsgId)
w.WriteByte(p.Result)
return w.Bytes()
}
// Unpack unpack the binary byte stream to a Cmpp2DeliverRspPkt variable.
// After unpack, you will get all value of fields in
// Cmpp2DeliverRspPkt struct.
func (p *Cmpp2DeliverRspPkt) Unpack(data []byte) error {
var r = newPacketReader(data)
// Sequence Id
r.ReadInt(binary.BigEndian, &p.SeqId)
r.ReadInt(binary.BigEndian, &p.MsgId)
p.Result = r.ReadByte()
return r.Error()
}
// Pack packs the Cmpp3DeliverReqPkt to bytes stream for client side.
func (p *Cmpp3DeliverReqPkt) Pack(seqId uint32) ([]byte, error) {
var pktLen uint32 = CMPP_HEADER_LEN + 77 + uint32(p.MsgLength) + 20
var w = newPacketWriter(pktLen)
// Pack header
w.WriteInt(binary.BigEndian, pktLen)
w.WriteInt(binary.BigEndian, CMPP_DELIVER)
w.WriteInt(binary.BigEndian, seqId)
p.SeqId = seqId
// Pack Body
w.WriteInt(binary.BigEndian, p.MsgId)
w.WriteFixedSizeString(p.DestId, 21)
w.WriteFixedSizeString(p.ServiceId, 10)
w.WriteByte(p.TpPid)
w.WriteByte(p.TpUdhi)
w.WriteByte(p.MsgFmt)
w.WriteFixedSizeString(p.SrcTerminalId, 32)
w.WriteByte(p.SrcTerminalType)
w.WriteByte(p.RegisterDelivery)
w.WriteByte(p.MsgLength)
w.WriteString(p.MsgContent)
w.WriteFixedSizeString(p.LinkId, 20)
return w.Bytes()
}
// Unpack unpack the binary byte stream to a Cmpp3DeliverReqPkt variable.
// After unpack, you will get all value of fields in
// Cmpp3DeliverReqPkt struct.
func (p *Cmpp3DeliverReqPkt) Unpack(data []byte) error {
var r = newPacketReader(data)
// Sequence Id
r.ReadInt(binary.BigEndian, &p.SeqId)
// Body
r.ReadInt(binary.BigEndian, &p.MsgId)
destId := r.ReadCString(21)
p.DestId = string(destId)
serviceId := r.ReadCString(10)
p.ServiceId = string(serviceId)
p.TpPid = r.ReadByte()
p.TpUdhi = r.ReadByte()
p.MsgFmt = r.ReadByte()
srcTerminalId := r.ReadCString(32)
p.SrcTerminalId = string(srcTerminalId)
p.SrcTerminalType = r.ReadByte()
p.RegisterDelivery = r.ReadByte()
p.MsgLength = r.ReadByte()
msgContent := make([]byte, p.MsgLength)
r.ReadBytes(msgContent)
p.MsgContent = string(msgContent)
linkId := r.ReadCString(20)
p.LinkId = string(linkId)
return r.Error()
}
// Pack packs the Cmpp3DeliverRspPkt to bytes stream for client side.
func (p *Cmpp3DeliverRspPkt) Pack(seqId uint32) ([]byte, error) {
var pktLen uint32 = Cmpp3DeliverRspPktLen
var w = newPacketWriter(pktLen)
// Pack header
w.WriteInt(binary.BigEndian, pktLen)
w.WriteInt(binary.BigEndian, CMPP_DELIVER_RESP)
w.WriteInt(binary.BigEndian, seqId)
p.SeqId = seqId
// Pack Body
w.WriteInt(binary.BigEndian, p.MsgId)
w.WriteInt(binary.BigEndian, p.Result)
return w.Bytes()
}
// Unpack unpack the binary byte stream to a Cmpp3DeliverRspPkt variable.
// After unpack, you will get all value of fields in
// Cmpp3DeliverRspPkt struct.
func (p *Cmpp3DeliverRspPkt) Unpack(data []byte) error {
var r = newPacketReader(data)
// Sequence Id
r.ReadInt(binary.BigEndian, &p.SeqId)
r.ReadInt(binary.BigEndian, &p.MsgId)
r.ReadInt(binary.BigEndian, &p.Result)
return r.Error()
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化