using System;
using Vinno.IUS.Common.IO;
using Vinno.IUS.Common.Log;
using Vinno.IUS.Common.Network.Leaf;
namespace Vinno.IUS.Common.Network.Transfer
{
public sealed class TransferMessage:DictionaryMessage
{
///
/// Gets the token of this transfer message.
///
public TransferToken Token { get; }
///
/// Gets the data of this transfer message.
///
public Message Data { get; }
public TransferMessage(TransferToken token, Message data) :
base(SystemTags.TransferMessage)
{
Token = token;
Data = data;
var tokenIdMessage = new Message(SystemTags.TransferTokenId, new StringElement(Token.Id));
AddMessage(tokenIdMessage);
var dataBuffer = data.GetBuffer();
var dataMessage = new Message(SystemTags.TransferData,new BufferElement(dataBuffer));
AddMessage(dataMessage);
}
private TransferMessage(Message message) : base(message)
{
var tokenIdElement = GetElement(SystemTags.TransferTokenId);
var tokenId = tokenIdElement.Value;
Token = new TransferToken(tokenId);
var dataElement = GetElement(SystemTags.TransferData);
Data = FromBuffer(dataElement.Value);
}
public static TransferMessage Convert(IBuffer buffer)
{
Message message = null;
try
{
message = FromBuffer(buffer);
}
catch (Exception ex)
{
Logger.WriteLineError($"Get message from buffer failed:{ex}");
}
if (message != null)
{
if (message.Tag != SystemTags.TransferMessage)
{
return null;
}
TransferMessage transferMessage = null;
try
{
transferMessage = new TransferMessage(message);
}
catch (Exception ex)
{
var tagDes = message.Element == null ? "null" : message.Element.TransferType.ToString();
var messageDetail = message.Element?.ToString();
Logger.WriteLineError($"Convert TransferMessage failed:{ex},Message Element:{tagDes}, Message:{messageDetail}");
}
return transferMessage;
}
return null;
}
}
}