112 lines
2.4 KiB
C++
112 lines
2.4 KiB
C++
#include "DataMessage.h"
|
|
|
|
DataMessage::DataMessage(const Message& msg, Stream* dest, bool isTokenMsg) : _Src(msg.ToStream())
|
|
{
|
|
_Dest = dest;
|
|
|
|
// TokenMassge 数据区第一个字节是目的地址
|
|
if(isTokenMsg)_Dest->Write(_Src.ReadByte());
|
|
|
|
Offset = _Src.ReadEncodeInt();
|
|
Length = 0;
|
|
|
|
// 读取请求、写入响应、错误响应 等包含偏移和长度
|
|
byte code = msg.Code & 0x0F;
|
|
if((code == 0x05 && !msg.Reply) || (code == 0x06 && msg.Reply) || msg.Error)
|
|
Length = _Src.ReadEncodeInt();
|
|
}
|
|
|
|
// 读取数据
|
|
bool DataMessage::ReadData(const DataStore& ds)
|
|
{
|
|
return ReadData(ds.Data);
|
|
}
|
|
|
|
// 读取数据
|
|
bool DataMessage::ReadData(const Buffer& bs)
|
|
{
|
|
if(!_Dest) return false;
|
|
|
|
TS("DataMessage::ReadData");
|
|
|
|
auto& ms = *_Dest;
|
|
int remain = bs.Length() - Offset;
|
|
if(remain < 0)
|
|
{
|
|
ms.Write((byte)2);
|
|
ms.WriteEncodeInt(Offset);
|
|
ms.WriteEncodeInt(Length);
|
|
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
ms.WriteEncodeInt(Offset);
|
|
if(Length > remain) Length = remain;
|
|
//if(Length > 0) ms.Write(bs.GetBuffer(), Offset, Length);
|
|
if(Length > 0) ms.Write(bs.Sub(Offset, Length));
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// 写入数据
|
|
bool DataMessage::WriteData(DataStore& ds, bool withData)
|
|
{
|
|
TS("DataMessage::WriteData");
|
|
|
|
Length = _Src.Remain();
|
|
if(_Dest && !Write(ds.Data.Length() - Offset)) return false;
|
|
|
|
Buffer dat(_Src.Current(), Length);
|
|
ds.Write(Offset, dat);
|
|
|
|
// 如果携带数据,则把这一段数据附加到后面
|
|
if(_Dest && withData) _Dest->Write(ds.Data.Sub(Offset, Length));
|
|
|
|
return true;
|
|
}
|
|
|
|
// 写入数据
|
|
bool DataMessage::WriteData(Buffer& bs, bool withData)
|
|
{
|
|
TS("DataMessage::WriteData");
|
|
|
|
// 剩余可写字节数
|
|
Length = _Src.Remain();
|
|
if(_Dest && !Write(bs.Length() - Offset)) return false;
|
|
|
|
//Buffer dat(_Src.Current(), Length);
|
|
//bs.Copy(Offset, dat, 0, -1);
|
|
bs.Copy(Offset, _Src.Current(), Length);
|
|
|
|
// 如果携带数据,则把这一段数据附加到后面
|
|
if(_Dest && withData) _Dest->Write(bs.Sub(Offset, Length));
|
|
|
|
return true;
|
|
}
|
|
|
|
// 写入数据
|
|
bool DataMessage::Write(int remain)
|
|
{
|
|
auto& ms = *_Dest;
|
|
// 剩余可写字节数
|
|
if(remain < 0)
|
|
{
|
|
ms.Write((byte)2);
|
|
ms.WriteEncodeInt(Offset);
|
|
ms.WriteEncodeInt(Length);
|
|
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
ms.WriteEncodeInt(Offset);
|
|
|
|
if(Length > remain) Length = remain;
|
|
ms.WriteEncodeInt(Length);
|
|
|
|
return true;
|
|
}
|
|
}
|