mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2026-06-13 22:48:42 +00:00
Ver 3
This commit is contained in:
+31
-49
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using Esiur.Protocol;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml.Linq;
|
||||
@@ -18,7 +19,7 @@ public struct Tdu
|
||||
public byte[] Composed;
|
||||
//public uint Offset;
|
||||
|
||||
public byte[] Metadata;
|
||||
public Tru Metadata;
|
||||
|
||||
public uint ContentOffset;
|
||||
|
||||
@@ -64,7 +65,7 @@ public struct Tdu
|
||||
}
|
||||
|
||||
public Tdu(TduIdentifier identifier,
|
||||
byte[] data, ulong length, byte[] metadata = null)
|
||||
byte[] data, ulong length, Tru metadata, EpConnection connection)
|
||||
{
|
||||
Identifier = identifier;
|
||||
//Index = (byte)identifier & 0x7;
|
||||
@@ -174,34 +175,20 @@ public struct Tdu
|
||||
if (metadata == null)
|
||||
throw new Exception("Metadata must be provided for types.");
|
||||
|
||||
|
||||
if (metadata.Length > 0xFF)
|
||||
throw new Exception("Metadata can't exceed 255 bytes in length.");
|
||||
|
||||
var metaLen = (byte)metadata.Length;
|
||||
|
||||
var len = 1 + (ulong)metaLen + length;
|
||||
var metadataData = metadata.Compose(connection);
|
||||
|
||||
|
||||
if (length == 0 && (metadata == null || metadata.Length == 0))
|
||||
{
|
||||
Composed = new byte[1] { (byte)Identifier };
|
||||
throw new Exception("Need check");
|
||||
}
|
||||
else if (metadata.Length > 0xFF)
|
||||
{
|
||||
throw new Exception("Metadata can't exceed 255 bytes in length.");
|
||||
}
|
||||
else if (length <= 0xFF)
|
||||
var len = (ulong)metadataData.Length + length;
|
||||
|
||||
if (len <= 0xFF)
|
||||
{
|
||||
Composed = new byte[2 + len];
|
||||
Composed[0] = (byte)((byte)Identifier | 0x8);
|
||||
Composed[1] = (byte)len;
|
||||
Composed[2] = metaLen;
|
||||
ContentOffset = metaLen + (uint)3;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)2;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 3, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 3 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 2, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 2 + metadataData.Length, (int)length);
|
||||
}
|
||||
else if (len <= 0xFF_FF)
|
||||
{
|
||||
@@ -209,11 +196,10 @@ public struct Tdu
|
||||
Composed[0] = (byte)((byte)identifier | 0x10);
|
||||
Composed[1] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[2] = (byte)(len & 0xFF);
|
||||
Composed[3] = metaLen;
|
||||
ContentOffset = metaLen + (uint)4;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)3;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 4, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 4 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 3, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 3 + metadataData.Length, (int)length);
|
||||
}
|
||||
else if (len <= 0xFF_FF_FF)
|
||||
{
|
||||
@@ -222,11 +208,10 @@ public struct Tdu
|
||||
Composed[1] = (byte)((len >> 16) & 0xFF);
|
||||
Composed[2] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[3] = (byte)(len & 0xFF);
|
||||
Composed[4] = metaLen;
|
||||
ContentOffset = metaLen + (uint)5;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)4;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 5, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 5 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 4, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 4 + metadataData.Length, (int)length);
|
||||
|
||||
}
|
||||
else if (len <= 0xFF_FF_FF_FF)
|
||||
@@ -237,11 +222,10 @@ public struct Tdu
|
||||
Composed[2] = (byte)((len >> 16) & 0xFF);
|
||||
Composed[3] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[4] = (byte)(len & 0xFF);
|
||||
Composed[5] = metaLen;
|
||||
ContentOffset = metaLen + (uint)6;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)5;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 6, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 6 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 5, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 5 + metadataData.Length, (int)length);
|
||||
}
|
||||
else if (len <= 0xFF_FF_FF_FF_FF)
|
||||
{
|
||||
@@ -252,11 +236,10 @@ public struct Tdu
|
||||
Composed[3] = (byte)((len >> 16) & 0xFF);
|
||||
Composed[4] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[5] = (byte)(len & 0xFF);
|
||||
Composed[6] = metaLen;
|
||||
ContentOffset = metaLen + (uint)7;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)6;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 7, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 7 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 6, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 6 + metadataData.Length, (int)length);
|
||||
}
|
||||
else if (len <= 0xFF_FF_FF_FF_FF_FF)
|
||||
{
|
||||
@@ -268,11 +251,10 @@ public struct Tdu
|
||||
Composed[4] = (byte)((len >> 16) & 0xFF);
|
||||
Composed[5] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[6] = (byte)(len & 0xFF);
|
||||
Composed[7] = metaLen;
|
||||
ContentOffset = metaLen + (uint)8;
|
||||
ContentOffset = (uint)metadataData.Length + (uint)7;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 8, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 8 + metaLen, (int)length);
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 7, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 7 + metadataData.Length, (int)length);
|
||||
}
|
||||
else //if (len <= 0xFF_FF_FF_FF_FF_FF_FF)
|
||||
{
|
||||
@@ -285,11 +267,11 @@ public struct Tdu
|
||||
Composed[5] = (byte)((len >> 16) & 0xFF);
|
||||
Composed[6] = (byte)((len >> 8) & 0xFF);
|
||||
Composed[7] = (byte)(len & 0xFF);
|
||||
Composed[8] = metaLen;
|
||||
ContentOffset = metaLen + (uint)9;
|
||||
|
||||
Buffer.BlockCopy(metadata, 0, Composed, 9, metaLen);
|
||||
Buffer.BlockCopy(data, 0, Composed, 9 + metaLen, (int)length);
|
||||
ContentOffset = (uint)metadataData.Length + (uint)8;
|
||||
|
||||
Buffer.BlockCopy(metadataData, 0, Composed, 8, metadataData.Length);
|
||||
Buffer.BlockCopy(data, 0, Composed, 8 + metadataData.Length, (int)length);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -305,7 +287,7 @@ public struct Tdu
|
||||
if (Class != TduClass.Typed || with.Class != TduClass.Typed)
|
||||
return false;
|
||||
|
||||
if (!Metadata.SequenceEqual(with.Metadata))
|
||||
if (!Metadata.Match(with.Metadata))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user