OpenTTCN/Knowledge base/Standard codec explained/Custom/C sharp/CD impl.cs

From OpenTTCN

Jump to: navigation, search

  OpenTTCN DocZone

  Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support


CD_impl.cs


Back to main article >>

using System;

using OpenTTCN.Sdk;

using Etsi.Ttcn3.Tci;
using Etsi.Ttcn3.Tri;

namespace CustomCodecExample
{
    class CD_impl : ITciCDProvided
    {
        private ICodecComponent _delegate;

        public CD_impl()
        {
            _delegate = StartHereCD.GetCodecComponent("http://www.openttcn.com/Codecs/2011/Standard");
        }

        public ITriMessage Encode(ITciValue value)
        {
            // Extract address content first if any:

            ITciAddressValue addrVal = value as ITciAddressValue;
            if (addrVal != null) value = addrVal.Address;

            // Console.WriteLine("Encode(): value = " + ((value != null) ? value.ToString() : "null"));

            ITriMessage msg = _delegate.Encode(value);

            // Wrap the encoded message into an envelope preceded by qualified type identifier:

            string typeId = ((Value) value).TypeId.ToString();

            string enc = "type=" + typeId + ";length=" + msg.NumberOfBits.ToString() +
                ";value=" + FormatConverter.ByteArrayToOctetstring(msg.EncodedMessage);

            // Console.WriteLine("Encoded " + value.ToString() + " to " + enc);

            return new TriMessage((new System.Text.UTF8Encoding()).GetBytes(enc));
        }

        public ITciValue Decode(ITriMessage message, ITciType decodingHypothesis)
        {
            ITciCDRequired req = StartHereCD.TciCDRequired;

            if (message.NumberOfBits == 0) return null; // possibly missing address

            string s = (new System.Text.UTF8Encoding()).GetString(message.EncodedMessage);

            string[] elems = s.Split(new char[] { ';' });

            string type = "";
            string length = "";
            string value = "";

            foreach (string elem in elems)
            {
                string[] subelems = elem.Split(new char[] { '=' });

                if (subelems[0] == "type") type = subelems[1];
                else if (subelems[0] == "length") length = subelems[1];
                else if (subelems[0] == "value") value = subelems[1];
                else
                {
                    throw new AdapterException(
                        String.Format("Unrecognized element tag: {0}.", elem));
                }
            }

            ITciType t = req.GetTypeForName(type);
            byte[] v = FormatConverter.OctetstringToByteArray(value);
            ITriMessage msg = new TriMessage(v);

            return _delegate.Decode(msg, t);
        }
    }
}
Views
Personal tools