mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-09-13 12:43:17 +00:00
Codec
This commit is contained in:
@@ -66,7 +66,7 @@ public static class Codec
|
|||||||
DataDeserializer.LocalResourceParser16Async,
|
DataDeserializer.LocalResourceParser16Async,
|
||||||
DataDeserializer.ResourceParser16Async,
|
DataDeserializer.ResourceParser16Async,
|
||||||
},
|
},
|
||||||
new AsyncParser[]{
|
new AsyncParser[]{
|
||||||
DataDeserializer.UInt32ParserAsync,
|
DataDeserializer.UInt32ParserAsync,
|
||||||
DataDeserializer.Int32ParserAsync,
|
DataDeserializer.Int32ParserAsync,
|
||||||
DataDeserializer.Float32ParserAsync,
|
DataDeserializer.Float32ParserAsync,
|
||||||
@@ -80,7 +80,7 @@ public static class Codec
|
|||||||
DataDeserializer.DateTimeParserAsync,
|
DataDeserializer.DateTimeParserAsync,
|
||||||
},
|
},
|
||||||
new AsyncParser[]
|
new AsyncParser[]
|
||||||
{
|
{
|
||||||
DataDeserializer.UInt128ParserAsync, // uint 128
|
DataDeserializer.UInt128ParserAsync, // uint 128
|
||||||
DataDeserializer.Int128ParserAsync, // int 128
|
DataDeserializer.Int128ParserAsync, // int 128
|
||||||
DataDeserializer.Decimal128ParserAsync,
|
DataDeserializer.Decimal128ParserAsync,
|
||||||
@@ -123,28 +123,28 @@ public static class Codec
|
|||||||
DataDeserializer.LocalResourceParser8,
|
DataDeserializer.LocalResourceParser8,
|
||||||
DataDeserializer.ResourceParser8,
|
DataDeserializer.ResourceParser8,
|
||||||
},
|
},
|
||||||
new SyncParser[]{
|
new SyncParser[]{
|
||||||
DataDeserializer.UInt16Parser,
|
DataDeserializer.UInt16Parser,
|
||||||
DataDeserializer.Int16Parser,
|
DataDeserializer.Int16Parser,
|
||||||
DataDeserializer.Char16Parser,
|
DataDeserializer.Char16Parser,
|
||||||
DataDeserializer.LocalResourceParser16,
|
DataDeserializer.LocalResourceParser16,
|
||||||
DataDeserializer.ResourceParser16,
|
DataDeserializer.ResourceParser16,
|
||||||
},
|
},
|
||||||
new SyncParser[]{
|
new SyncParser[]{
|
||||||
DataDeserializer.UInt32Parser,
|
DataDeserializer.UInt32Parser,
|
||||||
DataDeserializer.Int32Parser,
|
DataDeserializer.Int32Parser,
|
||||||
DataDeserializer.Float32Parser,
|
DataDeserializer.Float32Parser,
|
||||||
DataDeserializer.LocalResourceParser32,
|
DataDeserializer.LocalResourceParser32,
|
||||||
DataDeserializer.ResourceParser32,
|
DataDeserializer.ResourceParser32,
|
||||||
},
|
},
|
||||||
new SyncParser[]{
|
new SyncParser[]{
|
||||||
DataDeserializer.UInt64Parser,
|
DataDeserializer.UInt64Parser,
|
||||||
DataDeserializer.Int64Parser,
|
DataDeserializer.Int64Parser,
|
||||||
DataDeserializer.Float64Parser,
|
DataDeserializer.Float64Parser,
|
||||||
DataDeserializer.DateTimeParser,
|
DataDeserializer.DateTimeParser,
|
||||||
},
|
},
|
||||||
new SyncParser[]
|
new SyncParser[]
|
||||||
{
|
{
|
||||||
DataDeserializer.UInt128Parser, // uint 128
|
DataDeserializer.UInt128Parser, // uint 128
|
||||||
DataDeserializer.Int128Parser, // int 128
|
DataDeserializer.Int128Parser, // int 128
|
||||||
DataDeserializer.Decimal128Parser,
|
DataDeserializer.Decimal128Parser,
|
||||||
@@ -203,7 +203,7 @@ public static class Codec
|
|||||||
|
|
||||||
if (tt.Class == TransmissionDataUnitClass.Fixed)
|
if (tt.Class == TransmissionDataUnitClass.Fixed)
|
||||||
{
|
{
|
||||||
return (len, FixedAsyncParsers[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 == TransmissionDataUnitClass.Dynamic)
|
else if (tt.Class == TransmissionDataUnitClass.Dynamic)
|
||||||
{
|
{
|
||||||
@@ -265,7 +265,7 @@ public static class Codec
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate (TransmissionDataUnitIdentifier, byte[]) Composer(object value, Warehouse warehouse, DistributedConnection connection);
|
public delegate TransmissionDataUnit Composer(object value, Warehouse warehouse, DistributedConnection connection);
|
||||||
|
|
||||||
public static Dictionary<Type, Composer> Composers = new Dictionary<Type, Composer>()
|
public static Dictionary<Type, Composer> Composers = new Dictionary<Type, Composer>()
|
||||||
{
|
{
|
||||||
@@ -297,8 +297,8 @@ public static class Codec
|
|||||||
[typeof(double?)] = DataSerializer.Float64Composer,
|
[typeof(double?)] = DataSerializer.Float64Composer,
|
||||||
[typeof(DateTime)] = DataSerializer.DateTimeComposer,
|
[typeof(DateTime)] = DataSerializer.DateTimeComposer,
|
||||||
[typeof(DateTime?)] = DataSerializer.DateTimeComposer,
|
[typeof(DateTime?)] = DataSerializer.DateTimeComposer,
|
||||||
[typeof(decimal)] = DataSerializer.Float128Composer,
|
[typeof(decimal)] = DataSerializer.Decimal128Composer,
|
||||||
[typeof(decimal?)] = DataSerializer.Float128Composer,
|
[typeof(decimal?)] = DataSerializer.Decimal128Composer,
|
||||||
[typeof(byte[])] = DataSerializer.RawDataComposerFromArray,
|
[typeof(byte[])] = DataSerializer.RawDataComposerFromArray,
|
||||||
//[typeof(byte?[])] = DataSerializer.RawDataComposerFromArray,
|
//[typeof(byte?[])] = DataSerializer.RawDataComposerFromArray,
|
||||||
[typeof(List<byte>)] = DataSerializer.RawDataComposerFromList,
|
[typeof(List<byte>)] = DataSerializer.RawDataComposerFromList,
|
||||||
@@ -338,11 +338,11 @@ public static class Codec
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
internal static (TransmissionDataUnitIdentifier identifier, byte[] data, byte[] metadata)
|
internal static TransmissionDataUnit
|
||||||
ComposeInternal(object valueOrSource, Warehouse warehouse, DistributedConnection connection)
|
ComposeInternal(object valueOrSource, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (valueOrSource == null)
|
if (valueOrSource == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, null, null);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
var type = valueOrSource.GetType();
|
var type = valueOrSource.GetType();
|
||||||
|
|
||||||
@@ -369,7 +369,7 @@ public static class Codec
|
|||||||
valueOrSource = ((IUserType)valueOrSource).Get();
|
valueOrSource = ((IUserType)valueOrSource).Get();
|
||||||
|
|
||||||
if (valueOrSource == null)
|
if (valueOrSource == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, null, null);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
type = valueOrSource.GetType();
|
type = valueOrSource.GetType();
|
||||||
@@ -377,20 +377,17 @@ public static class Codec
|
|||||||
|
|
||||||
if (Composers.ContainsKey(type))
|
if (Composers.ContainsKey(type))
|
||||||
{
|
{
|
||||||
var (hdr, data, metadata) = Composers[type](valueOrSource, warehouse, connection);
|
return Composers[type](valueOrSource, warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Codec.ImplementsInterface(type, typeof(IResource)))
|
if (Codec.ImplementsInterface(type, typeof(IResource)))
|
||||||
{
|
{
|
||||||
var (hdr, data, metadata) = DataSerializer.ResourceComposer(valueOrSource, warehouse, connection);
|
return DataSerializer.ResourceComposer(valueOrSource, warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
}
|
}
|
||||||
else if (Codec.ImplementsInterface(type, typeof(IRecord)))
|
else if (Codec.ImplementsInterface(type, typeof(IRecord)))
|
||||||
{
|
{
|
||||||
var (hdr, data, metadata) = DataSerializer.RecordComposer(valueOrSource, warehouse, connection);
|
return DataSerializer.RecordComposer(valueOrSource, warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
}
|
}
|
||||||
else if (type.IsGenericType)
|
else if (type.IsGenericType)
|
||||||
{
|
{
|
||||||
@@ -402,24 +399,21 @@ public static class Codec
|
|||||||
var args = type.GetGenericArguments();
|
var args = type.GetGenericArguments();
|
||||||
//if (Composers.ContainsKey(args[0]))
|
//if (Composers.ContainsKey(args[0]))
|
||||||
//{
|
//{
|
||||||
var (hdr, data, metadata) = DataSerializer.TypedListComposer((IEnumerable)valueOrSource, args[0], warehouse, connection);
|
return DataSerializer.TypedListComposer((IEnumerable)valueOrSource, args[0], warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
else if (genericType == typeof(Map<,>))
|
else if (genericType == typeof(Map<,>))
|
||||||
{
|
{
|
||||||
var args = type.GetGenericArguments();
|
var args = type.GetGenericArguments();
|
||||||
|
|
||||||
var (hdr, data, metadata) = DataSerializer.TypedMapComposer(valueOrSource, args[0], args[1], warehouse, connection);
|
return DataSerializer.TypedMapComposer(valueOrSource, args[0], args[1], warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (genericType == typeof(Dictionary<,>))
|
else if (genericType == typeof(Dictionary<,>))
|
||||||
{
|
{
|
||||||
var args = type.GetGenericArguments();
|
var args = type.GetGenericArguments();
|
||||||
|
|
||||||
var (hdr, data, metadata) = DataSerializer.TypedDictionaryComposer(valueOrSource, args[0], args[1], warehouse, connection);
|
return DataSerializer.TypedDictionaryComposer(valueOrSource, args[0], args[1], warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -431,8 +425,7 @@ public static class Codec
|
|||||||
|| genericType == typeof(ValueTuple<,,,,,,>)
|
|| genericType == typeof(ValueTuple<,,,,,,>)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var (hdr, data, metadata) = DataSerializer.TupleComposer(valueOrSource, warehouse, connection);
|
return DataSerializer.TupleComposer(valueOrSource, warehouse, connection);
|
||||||
return (hdr, data, metadata);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type.IsArray)
|
else if (type.IsArray)
|
||||||
@@ -441,20 +434,18 @@ public static class Codec
|
|||||||
|
|
||||||
//if (Composers.ContainsKey(elementType))
|
//if (Composers.ContainsKey(elementType))
|
||||||
//{
|
//{
|
||||||
var (hdr, data) = DataSerializer.TypedListComposer((IEnumerable)valueOrSource, elementType, warehouse, connection);
|
return DataSerializer.TypedListComposer((IEnumerable)valueOrSource, elementType, warehouse, connection);
|
||||||
return (hdr, data);
|
|
||||||
|
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
else if (type.IsEnum)
|
else if (type.IsEnum)
|
||||||
{
|
{
|
||||||
var (hdr, data) = DataSerializer.EnumComposer(valueOrSource, warehouse, connection);
|
return DataSerializer.EnumComposer(valueOrSource, warehouse, connection);
|
||||||
return (hdr, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.Null, null);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,8 +459,8 @@ public static class Codec
|
|||||||
/// <returns>Array of bytes in the network byte order.</returns>
|
/// <returns>Array of bytes in the network byte order.</returns>
|
||||||
public static byte[] Compose(object valueOrSource, Warehouse warehouse, DistributedConnection connection)//, bool prependType = true)
|
public static byte[] Compose(object valueOrSource, Warehouse warehouse, DistributedConnection connection)//, bool prependType = true)
|
||||||
{
|
{
|
||||||
var (hdr, data) = ComposeInternal(valueOrSource, warehouse, connection);
|
var tdu = ComposeInternal(valueOrSource, warehouse, connection);
|
||||||
return TransmissionDataUnit.Compose(hdr, data);
|
return tdu.Compose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsAnonymous(Type type)
|
public static bool IsAnonymous(Type type)
|
||||||
|
@@ -14,108 +14,116 @@ public static class DataSerializer
|
|||||||
{
|
{
|
||||||
public delegate byte[] Serializer(object value);
|
public delegate byte[] Serializer(object value);
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Int32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Int32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (int)value;
|
var v = (int)value;
|
||||||
var rt = new byte[4];
|
var rt = new byte[4];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((int*)ptr) = v;
|
*((int*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Int32, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Int32, rt, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) UInt32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit UInt32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (uint)value;
|
var v = (uint)value;
|
||||||
var rt = new byte[4];
|
var rt = new byte[4];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((uint*)ptr) = v;
|
*((uint*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.UInt32, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.UInt32, rt, 0, 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Int16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Int16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (short)value;
|
var v = (short)value;
|
||||||
var rt = new byte[2];
|
var rt = new byte[2];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((short*)ptr) = v;
|
*((short*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Int16, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Int16, rt, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) UInt16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit UInt16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (ushort)value;
|
var v = (ushort)value;
|
||||||
var rt = new byte[2];
|
var rt = new byte[2];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((ushort*)ptr) = v;
|
*((ushort*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.UInt16, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.UInt16, rt, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Float32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Float32Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (float)value;
|
var v = (float)value;
|
||||||
var rt = new byte[4];
|
var rt = new byte[4];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((float*)ptr) = v;
|
*((float*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Float32, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Float32, rt, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Float64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Float64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (double)value;
|
var v = (double)value;
|
||||||
var rt = new byte[8];
|
var rt = new byte[8];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((double*)ptr) = v;
|
*((double*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Float64, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Float64, rt, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Int64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Int64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (long)value;
|
var v = (long)value;
|
||||||
var rt = new byte[8];
|
var rt = new byte[8];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((long*)ptr) = v;
|
*((long*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Int64, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Int64, rt, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) UIn64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit UIn64Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (ulong)value;
|
var v = (ulong)value;
|
||||||
var rt = new byte[8];
|
var rt = new byte[8];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((ulong*)ptr) = v;
|
*((ulong*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.UInt64, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.UInt64, rt, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) DateTimeComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit DateTimeComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = ((DateTime)value).ToUniversalTime().Ticks;
|
var v = ((DateTime)value).ToUniversalTime().Ticks;
|
||||||
var rt = new byte[8];
|
var rt = new byte[8];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((long*)ptr) = v;
|
*((long*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.DateTime, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.DateTime, rt, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Float128Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Decimal128Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var v = (decimal)value;
|
var v = (decimal)value;
|
||||||
var rt = new byte[16];
|
var rt = new byte[16];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((decimal*)ptr) = v;
|
*((decimal*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Decimal128, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Decimal128, rt, 0, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) StringComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit StringComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.String, Encoding.UTF8.GetBytes((string)value));
|
var b = Encoding.UTF8.GetBytes((string)value);
|
||||||
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.String, b, 0, (uint)b.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) EnumComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit EnumComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
//var warehouse = connection?.Instance?.Warehouse ?? connection?.Server?.Instance?.Warehouse;
|
//var warehouse = connection?.Instance?.Warehouse ?? connection?.Server?.Instance?.Warehouse;
|
||||||
//if (warehouse == null)
|
//if (warehouse == null)
|
||||||
@@ -128,61 +136,70 @@ public static class DataSerializer
|
|||||||
var ct = template.Constants.FirstOrDefault(x => x.Value.Equals(intVal));
|
var ct = template.Constants.FirstOrDefault(x => x.Value.Equals(intVal));
|
||||||
|
|
||||||
if (ct == null)
|
if (ct == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
var rt = new List<byte>();
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.TypedEnum,
|
||||||
rt.AddRange(template.ClassId.Data);
|
new byte[] { ct.Index }, 0, 1, template.ClassId.Data);
|
||||||
rt.Add(ct.Index);
|
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.TypedEnum, rt.ToArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) UInt8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit UInt8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.UInt8, new byte[] { (byte)value });
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.UInt8,
|
||||||
|
new byte[] { (byte)value }, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) Int8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit Int8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.Int8, new byte[] { (byte)(sbyte)value });
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Int8,
|
||||||
|
new byte[] { (byte)(sbyte)value }, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Char8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit Char8Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.Char8, new byte[] { (byte)(char)value });
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Int8,
|
||||||
|
new byte[] { (byte)(char)value }, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) Char16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit Char16Composer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
|
|
||||||
var v = (char)value;
|
var v = (char)value;
|
||||||
var rt = new byte[2];
|
var rt = new byte[2];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((char*)ptr) = v;
|
*((char*)ptr) = v;
|
||||||
return (TransmissionDataUnitIdentifier.Char16, rt);
|
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Char16, rt, 0, 2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) BoolComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit BoolComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return ((bool)value ? TransmissionDataUnitIdentifier.True : TransmissionDataUnitIdentifier.False, new byte[0]);
|
if ((bool)value)
|
||||||
|
{
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.True, null, 0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.True, null, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) NotModifiedComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit NotModifiedComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.NotModified, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.NotModified, null, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) RawDataComposerFromArray(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit RawDataComposerFromArray(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.RawData, (byte[])value);
|
var b = (byte[])value;
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RawData, b, 0, (uint)b.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) RawDataComposerFromList(dynamic value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit RawDataComposerFromList(dynamic value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.RawData, (value as List<byte>).ToArray());
|
var b = value as List<byte>;
|
||||||
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RawData, b.ToArray(), 0, (uint)b.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
//public static (TransmissionDataUnitIdentifier, byte[]) ListComposerFromArray(dynamic value, DistributedConnection connection)
|
//public static (TransmissionDataUnitIdentifier, byte[]) ListComposerFromArray(dynamic value, DistributedConnection connection)
|
||||||
@@ -196,42 +213,29 @@ public static class DataSerializer
|
|||||||
// return (TransmissionDataUnitIdentifier.List, rt.ToArray());
|
// return (TransmissionDataUnitIdentifier.List, rt.ToArray());
|
||||||
//}
|
//}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) ListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit ListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
|
|
||||||
var rt = ArrayComposer((IEnumerable)value, warehouse, connection);
|
var rt = ArrayComposer((IEnumerable)value, warehouse, connection);
|
||||||
|
|
||||||
if (rt == null)
|
if (rt == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
else
|
else
|
||||||
return (TransmissionDataUnitIdentifier.List, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.List, rt, 0, (uint)rt.Length);
|
||||||
|
|
||||||
|
|
||||||
//var rt = new List<byte>();
|
|
||||||
//var list = (IEnumerable)value;// ((List<object>)value);
|
|
||||||
|
|
||||||
//foreach (var o in list)
|
|
||||||
// rt.AddRange(Codec.Compose(o, connection));
|
|
||||||
|
|
||||||
//return (TransmissionDataUnitIdentifier.List, rt.ToArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) TypedListComposer(IEnumerable value, Type type, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit TypedListComposer(IEnumerable value, Type type, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var composed = ArrayComposer((IEnumerable)value, warehouse, connection);
|
var composed = ArrayComposer((IEnumerable)value, warehouse, connection);
|
||||||
|
|
||||||
if (composed == null)
|
if (composed == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
var header = RepresentationType.FromType(type).Compose();
|
var metadata = RepresentationType.FromType(type).Compose();
|
||||||
|
|
||||||
var rt = new List<byte>();
|
|
||||||
|
|
||||||
rt.AddRange(header);
|
|
||||||
rt.AddRange(composed);
|
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.TypedList, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.TypedList, composed, 0,
|
||||||
|
(uint)composed.Length, metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
//public static byte[] PropertyValueComposer(PropertyValue propertyValue, DistributedConnection connection)//, bool includeAge = true)
|
//public static byte[] PropertyValueComposer(PropertyValue propertyValue, DistributedConnection connection)//, bool includeAge = true)
|
||||||
@@ -245,10 +249,10 @@ public static class DataSerializer
|
|||||||
// .ToArray();
|
// .ToArray();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) PropertyValueArrayComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit PropertyValueArrayComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
var rt = new List<byte>();
|
var rt = new List<byte>();
|
||||||
var ar = value as PropertyValue[];
|
var ar = value as PropertyValue[];
|
||||||
@@ -260,42 +264,41 @@ public static class DataSerializer
|
|||||||
rt.AddRange(Codec.Compose(pv.Value, warehouse, connection));
|
rt.AddRange(Codec.Compose(pv.Value, warehouse, connection));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.RawData, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RawData, rt.ToArray(), 0,
|
||||||
|
(uint)rt.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) TypedMapComposer(object value, Type keyType, Type valueType, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit TypedMapComposer(object value, Type keyType, Type valueType, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
var kt = RepresentationType.FromType(keyType).Compose();
|
var kt = RepresentationType.FromType(keyType).Compose();
|
||||||
var vt = RepresentationType.FromType(valueType).Compose();
|
var vt = RepresentationType.FromType(valueType).Compose();
|
||||||
|
|
||||||
var rt = new List<byte>();
|
var rt = new List<byte>();
|
||||||
|
|
||||||
rt.AddRange(kt);
|
|
||||||
rt.AddRange(vt);
|
|
||||||
|
|
||||||
var map = (IMap)value;
|
var map = (IMap)value;
|
||||||
|
|
||||||
foreach (var el in map.Serialize())
|
foreach (var el in map.Serialize())
|
||||||
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
||||||
|
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.TypedMap, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.TypedMap, rt.ToArray(), 0, (uint)rt.Count,
|
||||||
|
DC.Combine(kt, 0, (uint)kt.Length, vt, 0, (uint)vt.Length));
|
||||||
}
|
}
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) TypedDictionaryComposer(object value, Type keyType, Type valueType, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit TypedDictionaryComposer(object value, Type keyType, Type valueType, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
|
|
||||||
var kt = RepresentationType.FromType(keyType).Compose();
|
var kt = RepresentationType.FromType(keyType).Compose();
|
||||||
var vt = RepresentationType.FromType(valueType).Compose();
|
var vt = RepresentationType.FromType(valueType).Compose();
|
||||||
|
|
||||||
var rt = new List<byte>();
|
var rt = new List<byte>();
|
||||||
|
|
||||||
rt.AddRange(kt);
|
//rt.AddRange(kt);
|
||||||
rt.AddRange(vt);
|
//rt.AddRange(vt);
|
||||||
|
|
||||||
var dic = (IDictionary)value;
|
var dic = (IDictionary)value;
|
||||||
|
|
||||||
@@ -310,7 +313,8 @@ public static class DataSerializer
|
|||||||
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
||||||
|
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.TypedMap, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.TypedMap, rt.ToArray(), 0, (uint)rt.Count,
|
||||||
|
DC.Combine(kt, 0, (uint)kt.Length, vt, 0, (uint)vt.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] ArrayComposer(IEnumerable value, Warehouse warehouse, DistributedConnection connection)
|
public static byte[] ArrayComposer(IEnumerable value, Warehouse warehouse, DistributedConnection connection)
|
||||||
@@ -320,63 +324,57 @@ public static class DataSerializer
|
|||||||
|
|
||||||
var rt = new List<byte>();
|
var rt = new List<byte>();
|
||||||
|
|
||||||
TransmissionDataUnitIdentifier? previous = null;
|
TransmissionDataUnit? previous = null;
|
||||||
byte[]? previousUUID = null;
|
|
||||||
|
|
||||||
foreach (var i in value)
|
foreach (var i in value)
|
||||||
{
|
{
|
||||||
var (hdr, data) = Codec.ComposeInternal(i, warehouse, connection);
|
var tdu = Codec.ComposeInternal(i, warehouse, connection);
|
||||||
if (previous == null)
|
if (tdu.MatchType(previous.Value))
|
||||||
previous = hdr;
|
|
||||||
else if (hdr == previous)
|
|
||||||
{
|
{
|
||||||
if (hdr == TransmissionDataUnitIdentifier.Record)
|
rt.AddRange(TransmissionDataUnit.Compose(TransmissionDataUnitIdentifier.NotModified,
|
||||||
{
|
tdu.Data, null));
|
||||||
var newUUID = data.Take(16).ToArray();
|
|
||||||
// check same uuid
|
|
||||||
if (newUUID.SequenceEqual(previousUUID))
|
|
||||||
rt.AddRange(TransmissionDataUnit.Compose(TransmissionDataUnitIdentifier.Same,
|
|
||||||
data.Skip(16).ToArray()));
|
|
||||||
else
|
|
||||||
rt.AddRange(TransmissionDataUnit.Compose(hdr, data));
|
|
||||||
|
|
||||||
previous = hdr;
|
|
||||||
previousUUID = newUUID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
rt.AddRange(Codec.Compose(i, warehouse, connection));
|
{
|
||||||
|
rt.AddRange(tdu.Compose());
|
||||||
|
}
|
||||||
|
|
||||||
|
previous = tdu;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rt.ToArray();
|
return rt.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) ResourceListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit ResourceListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
|
var composed = ArrayComposer((IEnumerable)value, warehouse, connection);
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.ResourceList, ArrayComposer((IEnumerable)value, warehouse, connection));
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.ResourceList, composed, 0,
|
||||||
|
(uint)composed.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (TransmissionDataUnitIdentifier, byte[]) RecordListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit RecordListComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
|
var composed = ArrayComposer((IEnumerable)value, warehouse, connection);
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.RecordList, ArrayComposer((IEnumerable)value, warehouse, connection));
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RecordList,
|
||||||
|
composed, 0, (uint)composed.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) ResourceComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit ResourceComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var resource = (IResource)value;
|
var resource = (IResource)value;
|
||||||
|
|
||||||
if (resource.Instance == null || resource.Instance.IsDestroyed)
|
if (resource.Instance == null || resource.Instance.IsDestroyed)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, null, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Codec.IsLocalResource(resource, connection))
|
if (Codec.IsLocalResource(resource, connection))
|
||||||
@@ -384,21 +382,21 @@ public static class DataSerializer
|
|||||||
var rid = (resource as DistributedResource).DistributedResourceInstanceId;
|
var rid = (resource as DistributedResource).DistributedResourceInstanceId;
|
||||||
|
|
||||||
if (rid <= 0xFF)
|
if (rid <= 0xFF)
|
||||||
return (TransmissionDataUnitIdentifier.LocalResource8, new byte[] { (byte)rid });
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.LocalResource8, new byte[] { (byte)rid }, 0, 1);
|
||||||
else if (rid <= 0xFFFF)
|
else if (rid <= 0xFFFF)
|
||||||
{
|
{
|
||||||
var rt = new byte[2];
|
var rt = new byte[2];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((ushort*)ptr) = (ushort)rid;
|
*((ushort*)ptr) = (ushort)rid;
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.LocalResource16, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.LocalResource16, rt, 0, 2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var rt = new byte[4];
|
var rt = new byte[4];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((uint*)ptr) = rid;
|
*((uint*)ptr) = rid;
|
||||||
return (TransmissionDataUnitIdentifier.LocalResource32, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.LocalResource32, rt, 0, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -410,29 +408,29 @@ public static class DataSerializer
|
|||||||
var rid = resource.Instance.Id;
|
var rid = resource.Instance.Id;
|
||||||
|
|
||||||
if (rid <= 0xFF)
|
if (rid <= 0xFF)
|
||||||
return (TransmissionDataUnitIdentifier.RemoteResource8, new byte[] { (byte)rid });
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RemoteResource8, new byte[] { (byte)rid }, 0, 1);
|
||||||
else if (rid <= 0xFFFF)
|
else if (rid <= 0xFFFF)
|
||||||
{
|
{
|
||||||
var rt = new byte[2];
|
var rt = new byte[2];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((ushort*)ptr) = (ushort)rid;
|
*((ushort*)ptr) = (ushort)rid;
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.RemoteResource16, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RemoteResource16, rt, 0, 2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var rt = new byte[4];
|
var rt = new byte[4];
|
||||||
fixed (byte* ptr = rt)
|
fixed (byte* ptr = rt)
|
||||||
*((uint*)ptr) = rid;
|
*((uint*)ptr) = rid;
|
||||||
return (TransmissionDataUnitIdentifier.RemoteResource32, rt);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.RemoteResource32, rt, 0, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) MapComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit MapComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 1);
|
||||||
|
|
||||||
var rt = new List<byte>();
|
var rt = new List<byte>();
|
||||||
var map = (IMap)value;
|
var map = (IMap)value;
|
||||||
@@ -440,16 +438,16 @@ public static class DataSerializer
|
|||||||
foreach (var el in map.Serialize())
|
foreach (var el in map.Serialize())
|
||||||
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
rt.AddRange(Codec.Compose(el, warehouse, connection));
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.Map, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Map, rt.ToArray(), 0, (uint)rt.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) UUIDComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit UUIDComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
return (TransmissionDataUnitIdentifier.UUID, ((UUID)value).Data);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.UUID, ((UUID)value).Data, 0, 16);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe (TransmissionDataUnitIdentifier, byte[]) RecordComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static unsafe TransmissionDataUnit RecordComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
var rt = new List<byte>();// BinaryList();
|
var rt = new List<byte>();// BinaryList();
|
||||||
var record = (IRecord)value;
|
var record = (IRecord)value;
|
||||||
@@ -457,15 +455,15 @@ public static class DataSerializer
|
|||||||
var template = warehouse.GetTemplateByType(record.GetType());
|
var template = warehouse.GetTemplateByType(record.GetType());
|
||||||
|
|
||||||
|
|
||||||
rt.AddRange(template.ClassId.Data);
|
|
||||||
|
|
||||||
foreach (var pt in template.Properties)
|
foreach (var pt in template.Properties)
|
||||||
{
|
{
|
||||||
var propValue = pt.PropertyInfo.GetValue(record, null);
|
var propValue = pt.PropertyInfo.GetValue(record, null);
|
||||||
rt.AddRange(Codec.Compose(propValue, warehouse, connection));
|
rt.AddRange(Codec.Compose(propValue, warehouse, connection));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (TransmissionDataUnitIdentifier.Record, rt.ToArray());
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Record, rt.ToArray(), 0,
|
||||||
|
(uint)rt.Count,
|
||||||
|
template.ClassId.Data);
|
||||||
}
|
}
|
||||||
public static byte[] HistoryComposer(KeyList<PropertyTemplate, PropertyValue[]> history, Warehouse warehouse,
|
public static byte[] HistoryComposer(KeyList<PropertyTemplate, PropertyValue[]> history, Warehouse warehouse,
|
||||||
DistributedConnection connection, bool prependLength = false)
|
DistributedConnection connection, bool prependLength = false)
|
||||||
@@ -483,29 +481,28 @@ public static class DataSerializer
|
|||||||
return rt.ToArray();
|
return rt.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TransmissionDataUnitIdentifier TupleComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
public static TransmissionDataUnit TupleComposer(object value, Warehouse warehouse, DistributedConnection connection)
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0], new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
|
|
||||||
var rt = new List<byte>();
|
|
||||||
|
|
||||||
var fields = value.GetType().GetFields();
|
var fields = value.GetType().GetFields();
|
||||||
var list = fields.Select(x => x.GetValue(value)).ToArray();
|
var list = fields.Select(x => x.GetValue(value)).ToArray();
|
||||||
var types = fields.Select(x => RepresentationType.FromType(x.FieldType).Compose()).ToArray();
|
var types = fields.Select(x => RepresentationType.FromType(x.FieldType).Compose()).ToArray();
|
||||||
|
|
||||||
|
|
||||||
|
var metadata = new List<byte>();
|
||||||
foreach (var t in types)
|
foreach (var t in types)
|
||||||
rt.AddRange(t);
|
metadata.AddRange(t);
|
||||||
|
|
||||||
var composed = ArrayComposer(list, warehouse, connection);
|
var composed = ArrayComposer(list, warehouse, connection);
|
||||||
|
|
||||||
if (composed == null)
|
if (composed == null)
|
||||||
return (TransmissionDataUnitIdentifier.Null, new byte[0], new byte[0]);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.Null, new byte[0], 0, 0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rt.AddRange(composed);
|
return new TransmissionDataUnit(TransmissionDataUnitIdentifier.TypedTuple, composed, 0,
|
||||||
return (TransmissionDataUnitIdentifier.TypedTuple, rt.ToArray(), composed);
|
(uint)composed.Length, metadata.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -102,19 +102,7 @@ namespace Esiur.Data
|
|||||||
[TransmissionDataUnitIdentifier.String] = RepresentationTypeIdentifier.String,
|
[TransmissionDataUnitIdentifier.String] = RepresentationTypeIdentifier.String,
|
||||||
};
|
};
|
||||||
|
|
||||||
public bool IsCompatible(TransmissionDataUnit tdu)
|
|
||||||
{
|
|
||||||
var tru = typesMap[tdu.Identifier];
|
|
||||||
|
|
||||||
if (tru != Identifier)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (tdu.Class == TransmissionDataUnitClass.Typed)
|
|
||||||
{
|
|
||||||
if (tdu.Identifier == TransmissionDataUnitIdentifier.)
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetNull(List<byte> flags)
|
public void SetNull(List<byte> flags)
|
||||||
{
|
{
|
||||||
|
@@ -15,18 +15,21 @@ public struct TransmissionDataUnit
|
|||||||
public ulong ContentLength;
|
public ulong ContentLength;
|
||||||
public byte Exponent;
|
public byte Exponent;
|
||||||
public byte[] Data;
|
public byte[] Data;
|
||||||
|
public byte[] Metadata;
|
||||||
public TransmissionDataUnit(byte[] data, TransmissionDataUnitIdentifier identifier,
|
|
||||||
TransmissionDataUnitClass cls, int index, uint offset,
|
public TransmissionDataUnit(TransmissionDataUnitIdentifier identifier,
|
||||||
ulong contentLength, byte exponent = 0)
|
byte[] data, uint offset,
|
||||||
|
ulong length, byte[] metadata = null,
|
||||||
|
byte exponent = 0)
|
||||||
{
|
{
|
||||||
Identifier = identifier;
|
Identifier = identifier;
|
||||||
Index = index;
|
Index = (byte)identifier & 0x7;
|
||||||
Class = cls;
|
Class = (TransmissionDataUnitClass)((byte)identifier >> 6);
|
||||||
Offset=offset;
|
Offset = offset;
|
||||||
ContentLength = contentLength;
|
ContentLength = length;
|
||||||
Exponent = exponent;
|
Exponent = exponent;
|
||||||
Data = data;
|
Data = data;
|
||||||
|
Metadata = metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] GetTypeMetadata()
|
public byte[] GetTypeMetadata()
|
||||||
@@ -38,6 +41,22 @@ public struct TransmissionDataUnit
|
|||||||
return Data.Clip(Offset + 1, size);
|
return Data.Clip(Offset + 1, size);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public bool MatchType(TransmissionDataUnit with)
|
||||||
|
{
|
||||||
|
if (Identifier != with.Identifier)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (Class == TransmissionDataUnitClass.Typed)
|
||||||
|
if (!Metadata.SequenceEqual(with.Metadata))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Compose()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] Compose(TransmissionDataUnitIdentifier identifier, byte[] data, byte[] typeMetadata)
|
public static byte[] Compose(TransmissionDataUnitIdentifier identifier, byte[] data, byte[] typeMetadata)
|
||||||
{
|
{
|
||||||
@@ -57,7 +76,7 @@ public struct TransmissionDataUnit
|
|||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
{
|
{
|
||||||
return new byte[1] { (byte) identifier };
|
return new byte[1] { (byte)identifier };
|
||||||
}
|
}
|
||||||
else if (len <= 0xFF)
|
else if (len <= 0xFF)
|
||||||
{
|
{
|
||||||
@@ -72,7 +91,7 @@ public struct TransmissionDataUnit
|
|||||||
var rt = new byte[3 + len];
|
var rt = new byte[3 + len];
|
||||||
rt[0] = (byte)((byte)identifier | 0x10);
|
rt[0] = (byte)((byte)identifier | 0x10);
|
||||||
rt[1] = (byte)((len >> 8) & 0xFF);
|
rt[1] = (byte)((len >> 8) & 0xFF);
|
||||||
rt[2] = (byte)(len & 0xFF);
|
rt[2] = (byte)(len & 0xFF);
|
||||||
Buffer.BlockCopy(data, 0, rt, 3, (int)len);
|
Buffer.BlockCopy(data, 0, rt, 3, (int)len);
|
||||||
return rt;
|
return rt;
|
||||||
}
|
}
|
||||||
@@ -139,7 +158,7 @@ public struct TransmissionDataUnit
|
|||||||
}
|
}
|
||||||
else if (cls == TransmissionDataUnitClass.Typed)
|
else if (cls == TransmissionDataUnitClass.Typed)
|
||||||
{
|
{
|
||||||
|
|
||||||
var len = 1 + (ulong)typeMetadata.LongLength + (ulong)data.LongLength;
|
var len = 1 + (ulong)typeMetadata.LongLength + (ulong)data.LongLength;
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
@@ -250,7 +269,7 @@ public struct TransmissionDataUnit
|
|||||||
public static (ulong, TransmissionDataUnit?) Parse(byte[] data, uint offset, uint ends)
|
public static (ulong, TransmissionDataUnit?) Parse(byte[] data, uint offset, uint ends)
|
||||||
{
|
{
|
||||||
var h = data[offset++];
|
var h = data[offset++];
|
||||||
|
|
||||||
var cls = (TransmissionDataUnitClass)(h >> 6);
|
var cls = (TransmissionDataUnitClass)(h >> 6);
|
||||||
|
|
||||||
if (cls == TransmissionDataUnitClass.Fixed)
|
if (cls == TransmissionDataUnitClass.Fixed)
|
||||||
@@ -260,9 +279,9 @@ public struct TransmissionDataUnit
|
|||||||
if (exp == 0)
|
if (exp == 0)
|
||||||
return (1, new TransmissionDataUnit(data, (TransmissionDataUnitIdentifier)h, cls, h & 0x7, 0, (byte)exp));
|
return (1, new TransmissionDataUnit(data, (TransmissionDataUnitIdentifier)h, cls, h & 0x7, 0, (byte)exp));
|
||||||
|
|
||||||
ulong cl = (ulong)(1 << (exp -1));
|
ulong cl = (ulong)(1 << (exp - 1));
|
||||||
|
|
||||||
if (ends - offset < cl)
|
if (ends - offset < cl)
|
||||||
return (cl - (ends - offset), null);
|
return (cl - (ends - offset), null);
|
||||||
|
|
||||||
//offset += (uint)cl;
|
//offset += (uint)cl;
|
||||||
@@ -277,14 +296,14 @@ public struct TransmissionDataUnit
|
|||||||
return (cll - (ends - offset), null);
|
return (cll - (ends - offset), null);
|
||||||
|
|
||||||
ulong cl = 0;
|
ulong cl = 0;
|
||||||
|
|
||||||
for (uint i = 0; i < cll; i++)
|
for (uint i = 0; i < cll; i++)
|
||||||
cl = cl << 8 | data[offset++];
|
cl = cl << 8 | data[offset++];
|
||||||
|
|
||||||
if (ends - offset < cl)
|
if (ends - offset < cl)
|
||||||
return (cl - (ends - offset), null);
|
return (cl - (ends - offset), null);
|
||||||
|
|
||||||
|
|
||||||
return (1 + cl + cll, new TransmissionDataUnit(data, (TransmissionDataUnitIdentifier)(h & 0xC7), cls, h & 0x7, offset, cl));
|
return (1 + cl + cll, new TransmissionDataUnit(data, (TransmissionDataUnitIdentifier)(h & 0xC7), cls, h & 0x7, offset, cl));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user