private static void ParseTemplates <T>(XmlNodeList nodes, MessageFactory <T> mfact) where T : IsoMessage { List <XmlElement> subs = null; for (var i = 0; i < nodes.Count; i++) { var elem = (XmlElement)nodes.Item(i); if (elem == null) { continue; } var type = ParseType(elem.GetAttribute("type")); if (type == -1) { throw new IOException("Invalid ISO8583 type for template: " + elem.GetAttribute("type")); } if (!elem.GetAttribute("extends").IsEmpty()) { subs ??= new List <XmlElement>(nodes.Count - i); subs.Add(elem); continue; } var m = (T) new IsoMessage(); m.Type = type; m.Encoding = mfact.Encoding; var fields = elem.GetElementsByTagName("field"); for (var j = 0; j < fields.Count; j++) { var f = (XmlElement)fields.Item(j); if (f?.ParentNode != elem) { continue; } var num = int.Parse(f.GetAttribute("num")); var v = GetTemplateField( f, mfact, true); if (v != null) { v.Encoding = mfact.Encoding; } m.SetField( num, v); } mfact.AddMessageTemplate(m); } if (subs == null) { return; } foreach (var elem in subs) { var type = ParseType(elem.GetAttribute("type")); var @ref = ParseType(elem.GetAttribute("extends")); if (@ref == -1) { throw new ArgumentException( "Message template " + elem.GetAttribute("type") + " extends invalid template " + elem.GetAttribute("extends")); } IsoMessage tref = mfact.GetMessageTemplate(@ref); if (tref == null) { throw new ArgumentException( "Message template " + elem.GetAttribute("type") + " extends nonexistent template " + elem.GetAttribute("extends")); } var m = (T) new IsoMessage(); m.Type = type; m.Encoding = mfact.Encoding; for (var i = 2; i <= 128; i++) { if (tref.HasField(i)) { m.SetField( i, (IsoValue)tref.GetField(i).Clone()); } } var fields = elem.GetElementsByTagName("field"); for (var j = 0; j < fields.Count; j++) { var f = (XmlElement)fields.Item(j); var num = int.Parse(f?.GetAttribute("num") ?? string.Empty); if (f?.ParentNode != elem) { continue; } var v = GetTemplateField( f, mfact, true); if (v != null) { v.Encoding = mfact.Encoding; } m.SetField( num, v); } mfact.AddMessageTemplate(m); } }
private void TestFieldType(IsoType type, FieldParseInfo fieldParser, int offset1, int offset2) { var bigintCodec = new BigIntBcdCodec(); var longCodec = new LongBcdCodec(); var mfact = new MessageFactory <IsoMessage>(); var tmpl = new IsoMessage { Binary = true, Type = 0x200 }; tmpl.SetValue(2, 1234567890L, longCodec, type, 0); tmpl.SetValue(3, b29, bigintCodec, type, 0); mfact.AddMessageTemplate(tmpl); mfact.SetCustomField(2, longCodec); mfact.SetCustomField(3, bigintCodec); var parser = new Dictionary <int, FieldParseInfo> { { 2, fieldParser }, { 3, fieldParser } }; mfact.SetParseMap(0x200, parser); mfact.UseBinaryMessages = true; //Test encoding tmpl = mfact.NewMessage(0x200); var buf = tmpl.WriteData(); var message = HexCodec.HexEncode(buf, 0, buf.Length); Console.WriteLine("MESSAGE: " + message); for (var i = 0; i < 5; i++) { var b = longData2[i]; Assert.Equal(b, buf[i + offset1]); } for (var i = 0; i < 15; i++) { Assert.Equal(bigintData1[i], buf[i + offset2]); } //Test parsing tmpl = mfact.ParseMessage(buf, 0); Assert.Equal(1234567890L, tmpl.GetObjectValue(2)); Assert.Equal(b29, tmpl.GetObjectValue(3)); }