OpenTTCN/Knowledge base/Standard codec explained/Custom/C sharp/CD impl.cs
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
CD_impl.cs
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);
}
}
}
