Files
mROA/mROA.Cbor/IOrdinaryStructureParser.cs
T

134 lines
5.0 KiB
C#
Raw Normal View History

2025-07-09 17:15:55 +03:00
using System;
2025-07-26 19:51:54 +03:00
using System.Formats.Cbor;
2025-07-09 17:15:55 +03:00
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)
{
2025-07-26 20:44:19 +03:00
var v = value as NetworkMessage;
2025-07-09 17:15:55 +03:00
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();
2025-07-26 20:44:19 +03:00
var value = new NetworkMessage
2025-07-09 17:15:55 +03:00
{
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 = (DefaultCallRequest)value;
2025-07-09 17:15:55 +03:00
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)
{
2025-07-10 10:25:40 +03:00
var v = (FinalCommandExecution<object>)value;
2025-07-09 17:15:55 +03:00
writer.WriteStartArray(2);
writer.WriteByteString(v.Id.ToByteArray());
2025-07-10 10:25:40 +03:00
serialization.WriteData(v.Result, writer, context);
2025-07-09 17:15:55 +03:00
writer.WriteEndArray();
}
public object Read(CborReader reader, IEndPointContext context, CborSerializationToolkit serialization)
{
reader.ReadStartArray();
var result = new FinalCommandExecution<object>
{
2025-07-10 10:25:40 +03:00
Id = new Guid(reader.ReadByteString()),
2025-07-09 17:15:55 +03:00
Result = serialization.ReadData(reader, typeof(object), context),
};
reader.ReadEndArray();
return result;
}
}
public class FinalCommandExecutionResultlessParser : IOrdinaryStructureParser
{
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{
2025-07-10 10:25:40 +03:00
var v = (FinalCommandExecution)value;
2025-07-09 17:15:55 +03:00
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;
}
}
}