Beispiel #1
0
        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));
        }