Files
mROA/mROA.Cbor/IOrdinaryStructureParser.cs
T

135 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Formats.Cbor;
using mROA.Abstract;
using mROA.Implementation;
using mROA.Implementation.CommandExecution;
namespace mROA.Cbor
{
public interface IOrdinaryStructureParser
{
void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization);
object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization);
}
public class NetworkMessageHeaderParser : IOrdinaryStructureParser
{
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
var v = value as NetworkMessageHeader;
writer.WriteStartArray(3);
writer.WriteByteString(v.Id.ToByteArray());
writer.WriteInt32((int)v.MessageType);
writer.WriteByteString(v.Data);
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var value = new NetworkMessageHeader
{
Id = new Guid(reader.ReadByteString()),
MessageType = (EMessageType)reader.ReadInt32(),
Data = reader.ReadByteString()
};
return value;
}
}
public class DefaultCallRequestParser : IOrdinaryStructureParser
{
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
var v = value as DefaultCallRequest;
writer.WriteStartArray(4);
writer.WriteByteString(v.Id.ToByteArray());
writer.WriteInt32(v.CommandId);
writer.WriteStartArray(1);
writer.WriteUInt64(v.ObjectId.Flat);
writer.WriteEndArray();
serialization.WriteData(v.Parameters, writer, context);
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var value = new DefaultCallRequest
{
Id = new Guid(reader.ReadByteString()),
CommandId = reader.ReadInt32(),
ObjectId = (ComplexObjectIdentifier)ComplexObjectIdentifierParser.Instance.Read(reader, context, serialization),
Parameters = serialization.ReadData(reader, typeof(object[]), context) as object[]
};
reader.ReadEndArray();
return value;
}
}
public class ComplexObjectIdentifierParser : IOrdinaryStructureParser
{
public static readonly ComplexObjectIdentifierParser Instance = new();
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
writer.WriteStartArray(1);
writer.WriteUInt64(((ComplexObjectIdentifier)value).Flat);
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var value = new ComplexObjectIdentifier { Flat = reader.ReadUInt64() };
reader.ReadEndArray();
return value;
}
}
public class FinalCommandExecutionParser : IOrdinaryStructureParser
{
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
var v = value as FinalCommandExecution<object>;
writer.WriteStartArray(2);
serialization.WriteData(v.Result, writer, context);
writer.WriteByteString(v.Id.ToByteArray());
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var result = new FinalCommandExecution<object>
{
Result = serialization.ReadData(reader, typeof(object), context),
Id = new Guid(reader.ReadByteString())
};
reader.ReadEndArray();
return result;
}
}
public class FinalCommandExecutionResultlessParser : IOrdinaryStructureParser
{
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
var v = value as FinalCommandExecution;
writer.WriteStartArray(1);
writer.WriteByteString(v.Id.ToByteArray());
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var result = new FinalCommandExecution
{
Id = new Guid(reader.ReadByteString())
};
reader.ReadEndArray();
return result;
}
}
}