From 3bfb666b1703fcf03c3d3fc789d5a93dcaf79804 Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Sun, 17 Aug 2025 00:43:02 +0300 Subject: [PATCH] =?UTF-8?q?=D8=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Esiur/Data/Codec.cs | 88 +++++++++++++------- Esiur/Data/DataDeserializer.cs | 146 +++++++++++++++++++++++++++++---- 2 files changed, 188 insertions(+), 46 deletions(-) diff --git a/Esiur/Data/Codec.cs b/Esiur/Data/Codec.cs index 19b1c50..d37cc7d 100644 --- a/Esiur/Data/Codec.cs +++ b/Esiur/Data/Codec.cs @@ -41,44 +41,45 @@ public static class Codec //delegate AsyncReply AsyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence); - delegate object SyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence); + delegate object AsyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence); + delegate object SyncParser(byte[] data, uint offset, uint length); - static SyncParser[][] FixedParsers = new SyncParser[][] + static AsyncParser[][] FixedAsyncParsers = new AsyncParser[][] { - new SyncParser[]{ + new AsyncParser[]{ DataDeserializer.NullParser, DataDeserializer.BooleanFalseParser, DataDeserializer.BooleanTrueParser, DataDeserializer.NotModifiedParser, }, - new SyncParser[]{ + new AsyncParser[]{ DataDeserializer.ByteParser, DataDeserializer.SByteParser, DataDeserializer.Char8Parser, DataDeserializer.LocalResourceParser8, DataDeserializer.ResourceParser8, }, - new SyncParser[]{ + new AsyncParser[]{ DataDeserializer.Int16Parser, DataDeserializer.UInt16Parser, DataDeserializer.Char16Parser, DataDeserializer.LocalResourceParser16, DataDeserializer.ResourceParser16, }, - new SyncParser[]{ + new AsyncParser[]{ DataDeserializer.Int32Parser, DataDeserializer.UInt32Parser, DataDeserializer.Float32Parser, DataDeserializer.LocalResourceParser32, DataDeserializer.ResourceParser32, }, - new SyncParser[]{ + new AsyncParser[]{ DataDeserializer.Int64Parser, DataDeserializer.UInt64Parser, DataDeserializer.Float64Parser, DataDeserializer.DateTimeParser, }, - new SyncParser[] + new AsyncParser[] { DataDeserializer.Int128Parser, // int 128 DataDeserializer.UInt128Parser, // uint 128 @@ -86,7 +87,7 @@ public static class Codec } }; - static SyncParser[] DynamicParsers = new SyncParser[] + static AsyncParser[] DynamicAsyncParsers = new AsyncParser[] { DataDeserializer.RawDataParser, DataDeserializer.StringParser, @@ -95,7 +96,7 @@ public static class Codec DataDeserializer.RecordListParser, }; - static SyncParser[] TypedParsers = new SyncParser[] + static AsyncParser[] TypedAsyncParsers = new AsyncParser[] { DataDeserializer.RecordParser, DataDeserializer.TypedListParser, @@ -136,19 +137,50 @@ public static class Codec if (tt.Class == TransmissionTypeClass.Fixed) { - return (len, FixedParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); + return (len, FixedAsyncParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); } else if (tt.Class == TransmissionTypeClass.Dynamic) { - return (len, DynamicParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); + return (len, DynamicAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); } else //if (tt.Class == TransmissionTypeClass.Typed) { - return (len, TypedParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); + return (len, TypedAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); } } + public static (uint, object) ParseSync(byte[] data, uint offset, TransmissionType? dataType = null) + { + uint len = 0; + if (dataType == null) + { + (var longLen, dataType) = TransmissionType.Parse(data, offset, (uint)data.Length); + + if (dataType == null) + throw new NullReferenceException("DataType can't be parsed."); + + len = (uint)longLen; + offset = dataType.Value.Offset; + } + else + len = (uint)dataType.Value.ContentLength; + + var tt = dataType.Value; + + if (tt.Class == TransmissionTypeClass.Fixed) + { + return (len, FixedParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength)); + } + else if (tt.Class == TransmissionTypeClass.Dynamic) + { + return (len, DynamicParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength)); + } + else //if (tt.Class == TransmissionTypeClass.Typed) + { + return (len, TypedParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength)); + } + } /// /// Check if a resource is local to a given connection. /// @@ -208,21 +240,21 @@ public static class Codec [typeof(string)] = DataSerializer.StringComposer, // Special - [typeof(object[])] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromArray, - [typeof(List)] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromList, - [typeof(VarList)] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromList, - [typeof(IResource[])] = DataSerializer.ResourceListComposer,// (value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(IResource?[])] = DataSerializer.ResourceListComposer,// (value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(List)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(List)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(VarList)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(VarList)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), - [typeof(IRecord[])] = DataSerializer.RecordListComposer,// (value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), - [typeof(IRecord?[])] = DataSerializer.RecordListComposer,// (value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), - [typeof(List)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), - [typeof(List)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), - [typeof(VarList)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), - [typeof(VarList)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), + [typeof(object[])] = DataSerializer.ListComposer, + [typeof(List)] = DataSerializer.ListComposer, + [typeof(VarList)] = DataSerializer.ListComposer, + [typeof(IResource[])] = DataSerializer.ResourceListComposer, + [typeof(IResource?[])] = DataSerializer.ResourceListComposer, + [typeof(List)] = DataSerializer.ResourceListComposer, + [typeof(List)] = DataSerializer.ResourceListComposer, + [typeof(VarList)] = DataSerializer.ResourceListComposer, + [typeof(VarList)] = DataSerializer.ResourceListComposer, + [typeof(IRecord[])] = DataSerializer.RecordListComposer, + [typeof(IRecord?[])] = DataSerializer.RecordListComposer, + [typeof(List)] = DataSerializer.RecordListComposer, + [typeof(List)] = DataSerializer.RecordListComposer, + [typeof(VarList)] = DataSerializer.RecordListComposer, + [typeof(VarList)] = DataSerializer.RecordListComposer, [typeof(Map)] = DataSerializer.MapComposer, [typeof(Map)] = DataSerializer.MapComposer, [typeof(Map)] = DataSerializer.MapComposer, diff --git a/Esiur/Data/DataDeserializer.cs b/Esiur/Data/DataDeserializer.cs index c644d7a..6e139e3 100644 --- a/Esiur/Data/DataDeserializer.cs +++ b/Esiur/Data/DataDeserializer.cs @@ -14,83 +14,168 @@ namespace Esiur.Data; public static class DataDeserializer { - public static object NullParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object NullParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return null; } - public static object BooleanTrueParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object NullParser(byte[] data, uint offset, uint length) + { + return null; + } + + public static object BooleanTrueParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return true; } - public static object BooleanFalseParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object BooleanTrueParser(byte[] data, uint offset, uint length) + { + return true; + } + + public static object BooleanFalseParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return false; } - public static object NotModifiedParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object BooleanFalseParser(byte[] data, uint offset, uint length) + { + return false; + } + + public static object NotModifiedParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return NotModified.Default; } - public static object ByteParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object NotModifiedParser(byte[] data, uint offset, uint length) + { + return NotModified.Default; + } + + public static object UInt8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return data[offset]; } - public static object SByteParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object UInt8Parser(byte[] data, uint offset, uint length) + { + return data[offset]; + } + + public static object Int8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { return (sbyte)data[offset]; } - public static unsafe object Char16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static object Int8Parser(byte[] data, uint offset, uint length) + { + return (sbyte)data[offset]; + } + + public static unsafe object Char16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(char*)ptr; } - public static object Char8Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Char16Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(char*)ptr; + } + + public static object Char8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + { + return (char)data[offset]; + } + + public static object Char8Parser(byte[] data, uint offset, uint length) { return (char)data[offset]; } - public static unsafe object Int16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Int16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(short*)ptr; } - public static unsafe object UInt16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Int16Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(short*)ptr; + } + + public static unsafe object UInt16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(ushort*)ptr; } - public static unsafe object Int32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object UInt16Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(ushort*)ptr; + } + + public static unsafe object Int32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(int*)ptr; } - public static unsafe object UInt32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Int32Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(int*)ptr; + } + + public static unsafe object UInt32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(uint*)ptr; } - public static unsafe object Float32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object UInt32Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(uint*)ptr; + } + + + public static unsafe object Float32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(float*)ptr; } - public static unsafe object Float64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Float32Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(float*)ptr; + } + + public static unsafe object Float64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(double*)ptr; } - public static unsafe object Float128Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Float64Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(double*)ptr; + } + + + public static unsafe object Float128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + { + fixed (byte* ptr = &data[offset]) + return *(decimal*)ptr; + } + + public static unsafe object Float128Parser(byte[] data, uint offset, uint length) { fixed (byte* ptr = &data[offset]) return *(decimal*)ptr; @@ -102,26 +187,51 @@ public static class DataDeserializer return *(decimal*)ptr; } - - public static unsafe object UInt128Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object Int128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(decimal*)ptr; } - public static unsafe object Int64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + public static unsafe object UInt128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + { + fixed (byte* ptr = &data[offset]) + return *(decimal*)ptr; + } + + public static unsafe object UInt128Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(decimal*)ptr; + } + + public static unsafe object Int64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(long*)ptr; } + public static unsafe object Int64Parser(byte[] data, uint offset, uint length) + { + fixed (byte* ptr = &data[offset]) + return *(long*)ptr; + } + + public static unsafe object UInt64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset]) return *(ulong*)ptr; } + public static unsafe object DateTimeParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) + { + fixed (byte* ptr = &data[offset]) + return new DateTime(*(long*)ptr, DateTimeKind.Utc); + + } + public static unsafe object DateTimeParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed (byte* ptr = &data[offset])