diff --git a/Esiur/Data/Codec.cs b/Esiur/Data/Codec.cs
index 4b23db4..c225f01 100644
--- a/Esiur/Data/Codec.cs
+++ b/Esiur/Data/Codec.cs
@@ -41,7 +41,7 @@ public static class Codec
//delegate AsyncReply AsyncParser(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 AsyncParser(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence);
delegate object SyncParser(ParsedTDU tdu, Warehouse warehouse);
static AsyncParser[][] FixedAsyncParsers = new AsyncParser[][]
@@ -107,6 +107,10 @@ public static class Codec
DataDeserializer.ConstantParserAsync,
};
+ static AsyncParser[] ExtendedAsyncParsers = new AsyncParser[]
+ {
+
+ };
static SyncParser[][] FixedParsers = new SyncParser[][]
{
@@ -171,6 +175,11 @@ public static class Codec
DataDeserializer.ConstantParser,
};
+ static SyncParser[] ExtendedParsers = new SyncParser[]
+ {
+
+ };
+
///
/// Parse a value
///
@@ -203,34 +212,56 @@ public static class Codec
if (tt.Class == TDUClass.Fixed)
{
- return (len, FixedAsyncParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
+ return (len, FixedAsyncParsers[tt.Exponent][tt.Index](tt, connection, requestSequence));
}
else if (tt.Class == TDUClass.Dynamic)
{
- return (len, DynamicAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
+ return (len, DynamicAsyncParsers[tt.Index](tt, connection, requestSequence));
}
- else //if (tt.Class == TransmissionDataUnitClass.Typed)
+ else if (tt.Class == TDUClass.Typed)
{
- return (len, TypedAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
+ return (len, TypedAsyncParsers[tt.Index](tt, connection, requestSequence));
+ }
+ else if (tt.Class == TDUClass.Extension)
+ {
+ return (len, ExtendedAsyncParsers[tt.Index](tt, connection, requestSequence));
+
}
}
- public static (uint, object) ParseSync(byte[] data, uint offset, Warehouse warehouse, ParsedTDU? dataType = null)
+ public static (uint, object) ParseSync(ParsedTDU tdu, Warehouse warehouse)
+ {
+ if (tdu.Class == TDUClass.Fixed)
+ {
+ return ((uint)tdu.TotalLength, FixedParsers[tdu.Exponent][tdu.Index](tdu, warehouse));
+ }
+ else if (tdu.Class == TDUClass.Dynamic)
+ {
+ return ((uint)tdu.TotalLength, DynamicParsers[tdu.Index](tdu, warehouse));
+ }
+ else if (tdu.Class == TDUClass.Typed)
+ {
+ return ((uint)tdu.TotalLength, TypedParsers[tdu.Index](tdu, warehouse));
+ }
+ else // Extension
+ {
+ return ((uint)tdu.TotalLength, ExtendedParsers[tdu.Index](tdu, warehouse));
+ }
+
+ }
+
+ public static (uint, object) ParseSync(byte[] data, uint offset, Warehouse warehouse)
{
uint len = 0;
+
+ var (longLen, dataType) = ParsedTDU.Parse(data, offset, (uint)data.Length);
+
if (dataType == null)
- {
- (var longLen, dataType) = ParsedTDU.Parse(data, offset, (uint)data.Length);
+ throw new NullReferenceException("DataType can't be parsed.");
- if (dataType == null)
- throw new NullReferenceException("DataType can't be parsed.");
-
- len = (uint)longLen;
- offset = dataType.Value.Offset;
- }
- else
- len = (uint)dataType.Value.ContentLength;
+ len = (uint)longLen;
+ offset = dataType.Value.Offset;
var tt = dataType.Value;
@@ -242,10 +273,14 @@ public static class Codec
{
return (len, DynamicParsers[tt.Index](tt, warehouse));
}
- else //if (tt.Class == TransmissionDataUnitClass.Typed)
+ else if (tt.Class == TDUClass.Typed)
{
return (len, TypedParsers[tt.Index](tt, warehouse));
}
+ else
+ {
+ return (len, ExtendedParsers[tt.Index](tt, warehouse));
+ }
}
///
/// Check if a resource is local to a given connection.
diff --git a/Esiur/Data/DataDeserializer.cs b/Esiur/Data/DataDeserializer.cs
index 747a226..5c240d7 100644
--- a/Esiur/Data/DataDeserializer.cs
+++ b/Esiur/Data/DataDeserializer.cs
@@ -15,7 +15,7 @@ namespace Esiur.Data;
public static class DataDeserializer
{
- public static object NullParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object NullParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
return null;
}
@@ -25,7 +25,7 @@ public static class DataDeserializer
return null;
}
- public static object BooleanTrueParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object BooleanTrueParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
return true;
}
@@ -35,7 +35,7 @@ public static class DataDeserializer
return true;
}
- public static object BooleanFalseParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object BooleanFalseParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
return false;
}
@@ -45,7 +45,7 @@ public static class DataDeserializer
return false;
}
- public static object NotModifiedParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object NotModifiedParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
return NotModified.Default;
}
@@ -55,27 +55,27 @@ public static class DataDeserializer
return NotModified.Default;
}
- public static object UInt8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object UInt8ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return data[offset];
+ return tdu.Data[tdu.Offset];
}
public static object UInt8Parser(ParsedTDU tdu, Warehouse warehouse)
{
return tdu.Data[tdu.Offset];
}
- public static object Int8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object Int8ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return (sbyte)data[offset];
+ return (sbyte)tdu.Data[tdu.Offset];
}
public static object Int8Parser(ParsedTDU tdu, Warehouse warehouse)
{
return (sbyte)tdu.Data[tdu.Offset];
}
- public static unsafe object Char16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Char16ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(char*)ptr;
}
@@ -85,9 +85,9 @@ public static class DataDeserializer
return *(char*)ptr;
}
- public static object Char8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static object Char8ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return (char)data[offset];
+ return (char)tdu.Data[tdu.Offset];
}
public static object Char8Parser(ParsedTDU tdu, Warehouse warehouse)
@@ -96,9 +96,9 @@ public static class DataDeserializer
}
- public static unsafe object Int16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Int16ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(short*)ptr;
}
@@ -108,9 +108,9 @@ public static class DataDeserializer
return *(short*)ptr;
}
- public static unsafe object UInt16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object UInt16ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(ushort*)ptr;
}
@@ -120,9 +120,9 @@ public static class DataDeserializer
return *(ushort*)ptr;
}
- public static unsafe object Int32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Int32ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(int*)ptr;
}
@@ -132,9 +132,9 @@ public static class DataDeserializer
return *(int*)ptr;
}
- public static unsafe object UInt32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object UInt32ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(uint*)ptr;
}
@@ -145,9 +145,9 @@ public static class DataDeserializer
}
- public static unsafe object Float32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Float32ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(float*)ptr;
}
@@ -157,9 +157,9 @@ public static class DataDeserializer
return *(float*)ptr;
}
- public static unsafe object Float64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Float64ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(double*)ptr;
}
@@ -170,9 +170,9 @@ public static class DataDeserializer
}
- public static unsafe object Decimal128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Decimal128ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(decimal*)ptr;
}
@@ -182,9 +182,9 @@ public static class DataDeserializer
return *(decimal*)ptr;
}
- public static unsafe object UUIDParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object UUIDParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return new UUID(data, offset);
+ return new UUID(tdu.Data, tdu.Offset);
}
public static unsafe object UUIDParser(ParsedTDU tdu, Warehouse warehouse)
@@ -194,10 +194,10 @@ public static class DataDeserializer
- public static unsafe object Int128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Int128ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr1 = &data[offset])
- fixed (byte* ptr2 = &data[offset + 8])
+ fixed (byte* ptr1 = &tdu.Data[tdu.Offset])
+ fixed (byte* ptr2 = &tdu.Data[tdu.Offset + 8])
return new Int128(*(ulong*)ptr1, *(ulong*)ptr2);
}
@@ -208,10 +208,10 @@ public static class DataDeserializer
return new Int128(*(ulong*)ptr1, *(ulong*)ptr2);
}
- public static unsafe object UInt128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object UInt128ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr1 = &data[offset])
- fixed (byte* ptr2 = &data[offset + 8])
+ fixed (byte* ptr1 = &tdu.Data[tdu.Offset])
+ fixed (byte* ptr2 = &tdu.Data[tdu.Offset + 8])
return new UInt128(*(ulong*)ptr1, *(ulong*)ptr2);
}
@@ -222,9 +222,9 @@ public static class DataDeserializer
return new UInt128(*(ulong*)ptr1, *(ulong*)ptr2);
}
- public static unsafe object Int64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object Int64ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(long*)ptr;
}
@@ -235,9 +235,9 @@ public static class DataDeserializer
}
- public static unsafe object UInt64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object UInt64ParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return *(ulong*)ptr;
}
@@ -248,9 +248,9 @@ public static class DataDeserializer
}
- public static unsafe object DateTimeParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object DateTimeParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
return new DateTime(*(long*)ptr, DateTimeKind.Utc);
}
@@ -262,12 +262,12 @@ public static class DataDeserializer
}
- public static unsafe object ResourceParser8Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object ResourceParser8Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
if (connection == null)
- return new ResourceId(false, data[offset]);
+ return new ResourceId(false, tdu.Data[tdu.Offset]);
else
- return connection.Fetch(data[offset], requestSequence);
+ return connection.Fetch(tdu.Data[tdu.Offset], requestSequence);
}
public static unsafe object ResourceParser8(ParsedTDU tdu, Warehouse warehouse)
@@ -275,12 +275,12 @@ public static class DataDeserializer
return new ResourceId(false, tdu.Data[tdu.Offset]);
}
- public static unsafe object LocalResourceParser8Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object LocalResourceParser8Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
if (connection == null)
- return new ResourceId(true, data[offset]);
+ return new ResourceId(true, tdu.Data[tdu.Offset]);
else
- return connection.Instance.Warehouse.GetById(data[offset]);
+ return connection.Instance.Warehouse.GetById(tdu.Data[tdu.Offset]);
}
public static unsafe object LocalResourceParser8(ParsedTDU tdu, Warehouse warehouse)
@@ -288,9 +288,9 @@ public static class DataDeserializer
return new ResourceId(true, tdu.Data[tdu.Offset]);
}
- public static unsafe object ResourceParser16Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object ResourceParser16Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
if (connection == null)
return new ResourceId(false, *(ushort*)ptr);
else
@@ -304,9 +304,9 @@ public static class DataDeserializer
}
- public static unsafe object LocalResourceParser16Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object LocalResourceParser16Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
if (connection == null)
return new ResourceId(true, *(ushort*)ptr);
else
@@ -319,9 +319,9 @@ public static class DataDeserializer
return new ResourceId(true, *(ushort*)ptr);
}
- public static unsafe object ResourceParser32Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object ResourceParser32Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
if (connection == null)
return new ResourceId(false, *(uint*)ptr);
else
@@ -335,9 +335,9 @@ public static class DataDeserializer
}
- public static unsafe object LocalResourceParser32Async(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object LocalResourceParser32Async(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- fixed (byte* ptr = &data[offset])
+ fixed (byte* ptr = &tdu.Data[tdu.Offset])
if (connection == null)
return new ResourceId(true, *(uint*)ptr);
else
@@ -351,9 +351,9 @@ public static class DataDeserializer
}
- public static unsafe object RawDataParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object RawDataParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return data.Clip(offset, length);
+ return tdu.Data.Clip(tdu.Offset, (uint)tdu.ContentLength);
}
public static unsafe object RawDataParser(ParsedTDU tdu, Warehouse warehouse)
@@ -362,9 +362,9 @@ public static class DataDeserializer
}
- public static unsafe object StringParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object StringParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- return data.GetString(offset, length);
+ return tdu.Data.GetString(tdu.Offset, (uint)tdu.ContentLength);
}
public static unsafe object StringParser(ParsedTDU tdu, Warehouse warehouse)
@@ -372,21 +372,18 @@ public static class DataDeserializer
return tdu.Data.GetString(tdu.Offset, (uint)tdu.ContentLength);
}
- public static unsafe object RecordParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object RecordParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
var reply = new AsyncReply();
- var classId = data.GetUUID(offset);
- offset += 16;
- length -= 16;
-
+ var classId = tdu.Metadata.GetUUID(0);
var template = connection.Instance.Warehouse.GetTemplateByClassId(classId, TemplateType.Record);
var initRecord = (TypeTemplate template) =>
{
- ListParserAsync(data, offset, length, connection, requestSequence).Then(r =>
+ ListParserAsync(tdu, connection, requestSequence).Then(r =>
{
var ar = (object[])r;
@@ -497,7 +494,7 @@ public static class DataDeserializer
}
}
- public static unsafe object ConstantParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe object ConstantParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
throw new NotImplementedException();
}
@@ -507,12 +504,13 @@ public static class DataDeserializer
throw new NotImplementedException();
}
- public static unsafe AsyncReply EnumParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static unsafe AsyncReply EnumParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
- var classId = data.GetUUID(offset);
- offset += 16;
- var index = data[offset++];
+ var classId = tdu.Metadata.GetUUID(0);
+
+
+ var index = tdu.Data[tdu.Offset];
var template = connection.Instance.Warehouse.GetTemplateByClassId(classId, TemplateType.Enum);
@@ -554,13 +552,16 @@ public static class DataDeserializer
}
- public static AsyncReply RecordListParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static AsyncReply RecordListParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
var rt = new AsyncBag();
+ var length = tdu.ContentLength;
+ var offset = tdu.Offset;
+
while (length > 0)
{
- var (cs, reply) = Codec.ParseAsync(data, offset, connection, requestSequence);
+ var (cs, reply) = Codec.ParseAsync(tdu.Data, offset, connection, requestSequence);
rt.Add(reply);
@@ -604,13 +605,16 @@ public static class DataDeserializer
return rt.ToArray();
}
- public static AsyncReply ResourceListParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
+ public static AsyncReply ResourceListParserAsync(ParsedTDU tdu, DistributedConnection connection, uint[] requestSequence)
{
var rt = new AsyncBag();
+ var length = tdu.ContentLength;
+ var offset = tdu.Offset;
+
while (length > 0)
{
- var (cs, reply) = Codec.ParseAsync(data, offset, connection, requestSequence);
+ var (cs, reply) = Codec.ParseAsync(tdu.Data, offset, connection, requestSequence);
rt.Add(reply);
@@ -655,13 +659,17 @@ public static class DataDeserializer
return rt.ToArray();
}
- public static AsyncBag