public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new Dictionary <short, ITag>(count); } lock (_server.SyncRoot) { for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; DeviceAddress addr = new DeviceAddress(0, 0, 0, meta.ID, meta.Size, 0, meta.DataType); switch (meta.DataType) { case DataType.BOOL: dataItem = new BoolTag(meta.ID, addr, this); break; case DataType.BYTE: dataItem = new ByteTag(meta.ID, addr, this); break; case DataType.WORD: dataItem = new UShortTag(meta.ID, addr, this); break; case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.DWORD: dataItem = new UIntTag(meta.ID, addr, this); break; case DataType.FLOAT: dataItem = new FloatTag(meta.ID, addr, this); break; case DataType.STR: dataItem = new StringTag(meta.ID, addr, this); break; default: dataItem = new BoolTag(meta.ID, addr, this); break; } _items.Add(meta.ID, dataItem); _server.AddItemIndex(meta.Name, dataItem); } } //Init(); return(true); }
private void LoadTag(ListTag tags) { foreach (Tag tag in tags.Tags) { if (tag is EndTag) { this.AddEndTag(); } else if (tag is ByteTag) { ByteTag t = (ByteTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is ShortTag) { ShortTag t = (ShortTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is IntTag) { IntTag t = (IntTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is LongTag) { LongTag t = (LongTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is FloatTag) { FloatTag t = (FloatTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is DoubleTag) { DoubleTag t = (DoubleTag)tag; this.AddTag(t.Data, t.TagType); } //TODO: ByteArrayTag... else if (tag is StringTag) { StringTag t = (StringTag)tag; this.AddTag(t.Data, t.TagType); } else if (tag is ListTag) { ListTag t = (ListTag)tag; this.AddListInListTagHeader(t); this.LoadTag(t); } else if (tag is CompoundTag) { CompoundTag t = (CompoundTag)tag; this.LoadTag(t, false, true); } //TODO: IntArrayTag... //TDDO: LongArrayTag... } }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(); } lock (_server.SyncRoot) { int j = 0; for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; if (meta.GroupID == this._id) { DeviceAddress addr = new DeviceAddress(-1, (ushort)meta.GroupID, (ushort)meta.ID, j++, meta.Size, 0, meta.DataType); switch (meta.DataType) { case DataType.BOOL: dataItem = new BoolTag(meta.ID, addr, this); break; case DataType.BYTE: dataItem = new ByteTag(meta.ID, addr, this); break; case DataType.WORD: case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.TIME: case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.FLOAT: dataItem = new FloatTag(meta.ID, addr, this); break; case DataType.STR: dataItem = new StringTag(meta.ID, addr, this); break; default: dataItem = new BoolTag(meta.ID, addr, this); break; } _items.Add(dataItem); _server.AddItemIndex(meta.Name, dataItem); } } } return(true); }
public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) { this.LengthCipher += inputCount; byte[] output = new byte[inputCount]; byte[] oBuffer = new byte[OutputBlockSize]; if (inputCount > 0) { IncrementCounter(); byte[] iBuffer = new byte[InputBlockSize]; Array.Copy(inputBuffer, inputOffset, iBuffer, 0, InputBlockSize); this.Aes.Encrypt(Counter, 0, oBuffer, 0); oBuffer = iBuffer.Add(oBuffer); if (Encrypt) { Array.Clear(oBuffer, inputCount, oBuffer.Length - inputCount); ByteTag = GaloisMultiplication.GMul128(oBuffer.Add(ByteTag), H); } else { ByteTag = GaloisMultiplication.GMul128(iBuffer.Add(ByteTag), H); } Array.Copy(oBuffer, 0, output, 0, inputCount); } byte[] length = ConvertToByteArray(AdditionalData.Length * 8, LengthCipher * 8); ByteTag = GaloisMultiplication.GMul128(ByteTag.Add(length), H); this.Aes.Encrypt(InitialCounter, 0, oBuffer, 0); ByteTag = oBuffer.Add(ByteTag); if (Encrypt) { SetTag(); } else { AssertAuthentication(); } return(output); }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(count); mapping = new Dictionary <short, ITag>(count); } List <OPCITEMDEF> itemArray = new List <OPCITEMDEF>(count); for (int i = 0; i < count; i++) { if (items[i].GroupID == this._Id) { itemArray.Add(new OPCITEMDEF { hClient = items[i].ID, szItemID = items[i].Address, bActive = true, wReserved = (short)i }); } } IntPtr pAddResults; IntPtr pErrors; if (!HRESULTS.Succeeded(_itemMgt.AddItems(itemArray.Count, itemArray.ToArray(), out pAddResults, out pErrors))) { return(false); } int iStructSize = Marshal.SizeOf(typeof(OPCITEMRESULT)); lock (_server.SyncRoot) { for (int i = 0; i < itemArray.Count; i++) { try { if (Marshal.ReadInt32(pErrors) == 0) { ITag dataItem = null; var itemDef = itemArray[i]; //string addr = string.Concat(_serverId, ',', Marshal.ReadInt32(pAddResults)); DataType type = items[itemDef.wReserved].DataType; switch (type) { case DataType.BOOL: dataItem = new BoolTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 1, 0, DataType.BOOL), this); break; case DataType.BYTE: dataItem = new ByteTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 1, 0, DataType.BYTE), this); break; case DataType.WORD: dataItem = new UShortTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 2, 0, DataType.WORD), this); break; case DataType.SHORT: dataItem = new ShortTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 2, 0, DataType.SHORT), this); break; case DataType.INT: dataItem = new IntTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 4, 0, DataType.INT), this); break; case DataType.DWORD: dataItem = new UIntTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 4, 0, DataType.DWORD), this); break; case DataType.FLOAT: dataItem = new FloatTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 4, 0, DataType.FLOAT), this); break; case DataType.SYS: case DataType.STR: dataItem = new StringTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), 64, 0, DataType.STR), this); break; default: break; //case VarEnum.VT_ARRAY: // dataItem = new ArrayTag((short)itemDef.hClient, new DeviceAddress(-0x100, 0, 0, Marshal.ReadInt32(pAddResults), (byte)Marshal.ReadInt16(pAddResults + 18), 0, DataType.ARRAY), this); // break; } if (dataItem != null) { _items.Add(dataItem); mapping.Add((short)itemDef.hClient, dataItem); _server.AddItemIndex(items[itemDef.wReserved].Name, dataItem); } pAddResults += iStructSize; pErrors += 4; } } catch (Exception err) { if (err.Message != null) { } } } //Marshal.FreeCoTaskMem(pAddResults); //Marshal.FreeCoTaskMem(pErrors); _items.TrimExcess(); return(true); } }
private CompoundTag CreateBigTestNbtTag() { var tag = new CompoundTag() { Name = "Level", }; var longTest = new LongTag() { Name = "longTest", Value = 9223372036854775807L, }; tag.Items.Add(longTest); var shortTest = new ShortTag() { Name = "shortTest", Value = 32767, }; tag.Items.Add(shortTest); var stringTest = new StringTag() { Name = "stringTest", Value = @"HELLO WORLD THIS IS A TEST STRING ÅÄÖ!", }; tag.Items.Add(stringTest); var floatTest = new FloatTag() { Name = "floatTest", Value = 0.49823147F, }; tag.Items.Add(floatTest); var intTest = new IntTag() { Name = "intTest", Value = 2147483647, }; tag.Items.Add(intTest); var nestedCompoundTest = new CompoundTag() { Name = "nested compound test", Items = new List<Tag>() { new CompoundTag() { Name = "ham", Items = new List<Tag>() { new StringTag() { Name = "name", Value = "Hampus", }, new FloatTag() { Name = "value", Value = 0.75F, } }, }, new CompoundTag() { Name = "egg", Items = new List<Tag>() { new StringTag() { Name = "name", Value = "Eggbert", }, new FloatTag() { Name = "value", Value = 0.5F, } }, } }, }; tag.Items.Add(nestedCompoundTest); var listTestLong = new ListTag() { Name = "listTest (long)", ItemType = TagType.Long, Length = 5, Items = new Tag[] { new LongTag() { Value = 11, }, new LongTag() { Value = 12, }, new LongTag() { Value = 13, }, new LongTag() { Value = 14, }, new LongTag() { Value = 15, }, }, }; tag.Items.Add(listTestLong); var listTestCompound = new ListTag() { Name = "listTest (compound)", ItemType = TagType.Compound, Length = 2, Items = new Tag[] { new CompoundTag() { Items = new List<Tag>() { new StringTag() { Name = "name", Value = "Compound tag #0", }, new LongTag() { Name = "created-on", Value = 1264099775885L, }, }, }, new CompoundTag() { Items = new List<Tag>() { new StringTag() { Name = "name", Value = "Compound tag #1", }, new LongTag() { Name = "created-on", Value = 1264099775885L, }, }, }, }, }; tag.Items.Add(listTestCompound); var byteTest = new ByteTag() { Name = "byteTest", Value = 127, }; tag.Items.Add(byteTest); var byteArrayTest = new ByteArrayTag() { Name = "byteArrayTest (the first 1000 values of (n*n*255+n*7)%100, starting with n=0 (0, 62, 34, 16, 8, ...))", Length = 1000, Items = new byte[1000], }; for (int i = 0; i < 1000; ++i) { byteArrayTest.Items[i] = (byte)((i * i * 255 + i * 7) % 100); } tag.Items.Add(byteArrayTest); var doubleTest = new DoubleTag() { Name = "doubleTest", Value = 0.4931287132182315, }; tag.Items.Add(doubleTest); return tag; }
private void LoadTag(CompoundTag tags, bool isRoot = false, bool isList = false) { if (!isRoot) { if (isList) { this.AddListInCompoundTagHeader(tags); } else { this.AddCompoundTagHeader(tags); } } foreach (KeyValuePair <string, Tag> tagKV in tags.Tags) { Tag tag = tagKV.Value; if (tag is EndTag) { this.AddEndTag(); } else if (tag is ByteTag) { ByteTag t = (ByteTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is ShortTag) { ShortTag t = (ShortTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is IntTag) { IntTag t = (IntTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is LongTag) { LongTag t = (LongTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is FloatTag) { FloatTag t = (FloatTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is DoubleTag) { DoubleTag t = (DoubleTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } //TODO: ByteArrayTag... else if (tag is StringTag) { StringTag t = (StringTag)tag; this.AddTag(t.Name, t.Data, t.TagType); } else if (tag is ListTag) { ListTag t = (ListTag)tag; this.AddListTagHeader(t); this.LoadTag(t); } else if (tag is CompoundTag) { CompoundTag t = (CompoundTag)tag; this.LoadTag(t); } //TODO: IntArrayTag... //TDDO: LongArrayTag... } if (!isRoot) { this.AddEndTag(); } }
public void ByteTagTest() { var tag = new ByteTag(); Assert.AreEqual(TagType.Byte, tag.Type); }
/// <summary> /// Write the tag serialized data using the supplied writer. /// </summary> /// <remarks> /// This is a really KLUDGY routine. Even though it deals with primitive /// types it has knowledge of what those types mean. For example the UInt16ArrayTag /// doesn't have a length value written, but the UInt32ArrayTag does. This is /// a very brittle solution to this problem and needs to be fixed. The solution is /// to have a serialize method for each tag type (uggh) - so you see why I took /// this shortcut. /// </remarks> /// <param name="tag"></param> /// <param name="writer"></param> private static void SerializeTag(BBeBTag tag, BBeBinaryWriter writer) { ushort id = (ushort)(0xf500 + tag.Id); if (tag.GetType() == typeof(ByteTag)) { ByteTag t = (ByteTag)tag; writer.Write(id); writer.Write(t.Value); } else if (tag.GetType() == typeof(StreamTagGroup)) { StreamTagSerializer.Serialize(writer, (StreamTagGroup)tag); } else if (tag.GetType() == typeof(ByteArrayTag)) { ByteArrayTag t = (ByteArrayTag)tag; if (t.Id == TagId.StreamStart) { byte[] data = t.Value; writer.Write(BBeBLib.TagId.StreamSize); writer.Write((uint)data.Length); writer.Write(id); writer.Write(data); writer.Write(BBeBLib.TagId.StreamEnd); } else { writer.Write(id); writer.Write(t.Value); } } else if (tag.GetType() == typeof(UInt16Tag)) { UInt16Tag t = (UInt16Tag)tag; writer.Write(id); writer.Write(t.Value); } else if (tag.GetType() == typeof(UInt16ArrayTag)) { UInt16ArrayTag t = (UInt16ArrayTag)tag; writer.Write(id); foreach (ushort val in t.Value) { writer.Write(val); } } else if (tag.GetType() == typeof(UInt32Tag)) { UInt32Tag t = (UInt32Tag)tag; // StreamSize is written out by the StreamStart tag as the data may be compressed if (t.Id != TagId.StreamSize) { writer.Write(id); // Zero byte tags (but have hardcoded data associated with them if (t.Id != TagId.BaseButtonStart && t.Id != TagId.FocusinButtonStart && t.Id != TagId.PushButtonStart && t.Id != TagId.UpButtonStart) { writer.Write(t.Value); } } } else if (tag.GetType() == typeof(UInt32ArrayTag)) { UInt32ArrayTag t = (UInt32ArrayTag)tag; writer.Write(id); // JumpTo doesn't have a length set and is hardcoded to 2! if (t.Id != TagId.JumpTo) { writer.Write((ushort)t.Value.Length); } foreach (uint val in t.Value) { writer.Write(val); } } else if (tag.GetType() == typeof(StringTag)) { StringTag t = (StringTag)tag; writer.Write(id); writer.Write(t.Value); } else if (tag.GetType() == typeof(MessageTag)) { MessageTag t = (MessageTag)tag; writer.Write(id); writer.Write((ushort)t.parameters); byte[] data = System.Text.Encoding.Unicode.GetBytes(t.param1); writer.Write((ushort)data.Length); writer.Write(data); data = System.Text.Encoding.Unicode.GetBytes(t.param2); writer.Write((ushort)data.Length); writer.Write(data); } else if (tag.GetType() == typeof(EmpDotsCodeTag)) { EmpDotsCodeTag t = (EmpDotsCodeTag)tag; writer.Write(id); writer.Write((uint)t.Value); SerializeTag(t.FontFace, writer); writer.Write(t.DotsCode); } else if (tag.GetType() == typeof(IDOnlyTag)) { IDOnlyTag t = (IDOnlyTag)tag; if (t.Id != TagId.StreamEnd) { writer.Write(id); } } else if (tag.GetType() == typeof(BBeBTag)) { BBeBTag t = (BBeBTag)tag; if (t.Id != TagId.StreamEnd) { writer.Write(id); } } else { Debug.Assert(false, "Unknown tag type: " + tag.GetType().ToString()); } }
public bool AddItems(IList <TagMetaData> items) { FxSerialReader fxReader = _plcReader as FxSerialReader; if (fxReader == null) { return(false); } int count = items.Count; if (_items == null) { _items = new List <ITag>(count); } lock (_server.SyncRoot) { for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; if (meta.GroupID == this._id) { DeviceAddress addr = fxReader.GetDeviceAddress(meta); if (addr.DataSize == 0) { addr.DataSize = meta.Size; } if (addr.VarType == DataType.NONE) { addr.VarType = meta.DataType; } if (addr.VarType != DataType.BOOL) { addr.Bit = 0; } switch (meta.DataType) { case DataType.BOOL: dataItem = new BoolTag(meta.ID, addr, this); break; case DataType.BYTE: dataItem = new ByteTag(meta.ID, addr, this); break; case DataType.WORD: dataItem = new UShortTag(meta.ID, addr, this); break; case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.DWORD: dataItem = new UIntTag(meta.ID, addr, this); break; case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.FLOAT: dataItem = new FloatTag(meta.ID, addr, this); break; case DataType.STR: dataItem = new StringTag(meta.ID, addr, this); break; } if (dataItem != null) { //dataItem.Active = meta.Active; _items.Add(dataItem); _server.AddItemIndex(meta.Name, dataItem); } } } } _items.TrimExcess(); _items.Sort((x, y) => x.Address.CompareTo(y.Address)); UpdatePDUArea(); return(true); }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(count); _mapping = new Dictionary <short, string>(count); } lock (_server.SyncRoot) { for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; if (meta.GroupID == this._id) { DeviceAddress addr = new DeviceAddress { Start = meta.ID, DataSize = meta.Size, VarType = meta.DataType }; switch (meta.DataType) { case DataType.BOOL: dataItem = new BoolTag(meta.ID, addr, this); break; case DataType.BYTE: dataItem = new ByteTag(meta.ID, addr, this); break; case DataType.WORD: case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.DWORD: case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.FLOAT: dataItem = new FloatTag(meta.ID, addr, this); break; case DataType.STR: dataItem = new StringTag(meta.ID, addr, this); break; } if (dataItem != null) { //dataItem.Active = meta.Active; _items.Add(dataItem); _plcReader.TransactItem(meta.Name); _mapping.Add(meta.ID, meta.Address); _server.AddItemIndex(meta.Name, dataItem); } } } return(true); } }