SmartOS/TokenNet/TokenMessage.cpp

160 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "TokenMessage.h"
#include "Net\Socket.h"
#include "Security\RC4.h"
#include "Security\Crc.h"
#define MSG_DEBUG DEBUG
//#define MSG_DEBUG 0
/******************************** TokenMessage ********************************/
// 使用指定功能码初始化令牌消息
TokenMessage::TokenMessage(byte code) : Message(code)
{
Data = _Data;
ErrorCode = NoError;
//OneWay = false;
Seq = 0;
}
// 从数据流中读取消息
bool TokenMessage::Read(Stream& ms)
{
TS("TokenMessage::Read");
if(ms.Remain() < MinSize) return false;
byte temp = ms.ReadByte();
Code = temp & 0x0F;
Reply = temp >> 7;
if(!Reply)
OneWay = (temp >> 6) & 0x01;
else
Error = (temp >> 6) & 0x01;
Seq = ms.ReadByte();
ushort len = ms.ReadEncodeInt();
Length = len;
if(ms.Remain() < len) return false;
// 避免错误指令超长,导致溢出 data后面有crc
if(Data == _Data && (len + 2) > ArrayLength(_Data))
{
debug_printf("错误指令,长度 %d 大于消息数据缓冲区长度 %d \r\n", len, ArrayLength(_Data));
//assert_param(false);
return false;
}
if(len > 0)
{
Buffer bs(Data, len+2); // DATA + CRC 位置
ms.Read(bs);
}
return true;
}
// 把消息写入到数据流中
void TokenMessage::Write(Stream& ms) const
{
TS("TokenMessage::Write");
byte tmp = Code | (Reply << 7);
if((!Reply && OneWay) || (Reply && Error)) tmp |= (1 << 6);
ms.Write(tmp);
ms.Write(Seq);
ms.WriteArray(Buffer(Data, Length));
}
// 验证消息校验码是否有效
bool TokenMessage::Valid() const
{
return true;
}
// 消息总长度,包括头部、负载数据和校验
int TokenMessage::Size() const
{
return HeaderSize + Length;
}
int TokenMessage::MaxDataSize() const
{
return Data == _Data ? ArrayLength(_Data) : Length;
}
// 创建当前消息对应的响应消息。设置序列号、标识位
TokenMessage TokenMessage::CreateReply() const
{
TokenMessage msg;
msg.Code = Code;
msg.Reply = true;
msg.Seq = Seq;
msg.State = State;
return msg;
}
void TokenMessage::Show() const
{
#if MSG_DEBUG
TS("TokenMessage::Show");
byte code = Code;
if(Reply) code |= 0x80;
if((!Reply && OneWay) || (Reply && Error)) code |= (1 << 6);
debug_printf("%02X", code);
if(Reply)
{
if(Error)
debug_printf("$");
else
debug_printf("#");
}
else
{
if(OneWay)
debug_printf("~");
else
debug_printf(" ");
}
debug_printf(" Seq=%02X", Seq);
ushort len = Length;
if(len > 0)
{
//if(Code == 0x08)
{
Stream ms(Data, len);
while(ms.Position() < ms.Length)
{
auto name = ms.ReadString();
auto value = ms.ReadArray();
debug_printf(" ");
name.Show();
debug_printf("=");
if(name == "Action" || name == "ErrorMessage")
value.AsString().Show();
else
{
if (value.Length() > 16)debug_printf("\r\n");
value.Show();
}
}
}
/*else
{
debug_printf(" Data[%d]=",len);
// 大于32字节时反正都要换行显示干脆一开始就换行让它对齐
//if(len > 32) debug_printf("\r\n");
if(len > 32) len = 32;
ByteArray(Data, len).Show();
}*/
}
debug_printf("\r\n");
#endif
}