OpenTTCN/Knowledge base/Writing Custom Codec Component/CodecComponentImpl.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


CodecComponentImpl.cs


Back to main article >>

using System;

using OpenTTCN.Sdk;
using OpenTTCN.Sdk.Util;

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

namespace some_app_codec_component
{
    [CodecComponent]
    public class CodecComponentImpl : ICodecComponent
    {
        private EncodeBuffer _encBuffer;
        private DecodeBuffer _decBuffer;

        public string ComponentName
        {
            get { return "http://www.example.com/Codecs/2011/SimpleFrameCodec"; }
        }

        public string ComponentVersion
        {
            get { return "00.00.01.001"; }
        }

        public void SetProperty(string name, object value)
        {
            throw new CodecComponentException(
                "Property '" + name + "' is not supported.");
        }

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

            _decBuffer = new DecodeBuffer(message);

            ITciRecordValue result = (ITciRecordValue) req.GetTypeForName("Message").NewInstance();

            // tag

            byte tag = _decBuffer.Consume();

            ITciIntegerValue tagField = (ITciIntegerValue) req.GetTypeForName("Int8").NewInstance();
            tagField.IntegerValue = tag;

            result.SetField("tag", tagField);

            // length

            ulong length = FormatConverter.ByteArrayToUlong(_decBuffer.ConsumeCopy(16));

            ITciIntegerValue lengthField = (ITciIntegerValue) req.GetTypeForName("Int16").NewInstance();
            lengthField.IntegerValue = (long) length;

            result.SetField("length_", lengthField);

            // content

            byte[] content = _decBuffer.ConsumeCopy((int) (length << 3));

            ITciOctetstringValue contentField =
                (ITciOctetstringValue) req.GetTypeForName("Oct4").NewInstance();

            contentField.StringValue = FormatConverter.ByteArrayToOctetstring(content);

            result.SetField("content", contentField);

            return result;
        }

        public ITriMessage Encode(ITciValue value)
        {
            _encBuffer = new EncodeBuffer();

            ITciRecordValue msg = (ITciRecordValue) value;

            ITciIntegerValue tagField = (ITciIntegerValue) msg.GetField("tag");
            ITciIntegerValue lengthField = (ITciIntegerValue) msg.GetField("length_");
            ITciOctetstringValue contentField = (ITciOctetstringValue) msg.GetField("content");

            _encBuffer.Append((byte) tagField.IntegerValue);
            _encBuffer.Append(FormatConverter.UlongToByteArray((ulong) lengthField.IntegerValue, 2));

            int len = contentField.Length;
            for (int i = 0; i < len; i++) _encBuffer.Append(contentField[i]);

            return _encBuffer.ToTriMessage();
        }
    }
}
Views
Personal tools