OpenTTCN/Knowledge base/Writing Custom Codec Component/CodecComponentImpl.cs
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
CodecComponentImpl.cs
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();
}
}
}
