OpenTTCN/Knowledge base/Writing Custom Codec Component/CodecComponentImpl.cpp
From OpenTTCN
Home | Developer's corner | Knowledge base | Working documents | Documentation | OpenTTCN IDE | Tutorials | Training | How do I | Frequently asked questions | Technical support |
CodecComponentImpl.cpp
#include "CodecComponentImpl.h"
#include <StartHere.h>
#include <StartHereCD.h>
#include <tci/TciValues.h>
#include <isl/FormatConverter.h>
#include <util/CodecHelper.h>
#include <map>
#include <iostream>
#include <stdlib.h>
using namespace ORG_ETSI_TTCN3_TCI;
using ORG_ETSI_TTCN3_TRI::TriMessage;
using OpenTTCN::ISL::FormatConverter;
using OpenTTCN::SDK::Util::EncodeBuffer;
using OpenTTCN::SDK::Util::DecodeBuffer;
using OpenTTCN::SDK::Util::CodecHelper;
using OpenTTCN::SDK::CodecComponent;
using OpenTTCN::SDK::CodecComponentException;
using OpenTTCN::SDK::StartHereCD;
using namespace std;
namespace some_app_codec_component {
CodecComponent* CodecComponentImpl :: create()
{
return new CodecComponentImpl();
}
CodecComponentImpl :: CodecComponentImpl()
{
}
CodecComponentImpl :: ~CodecComponentImpl()
{
}
std::string CodecComponentImpl :: getComponentName()
{
return "http://www.example.com/Codecs/2011/SimpleFrameCodec";
}
std::string CodecComponentImpl :: getComponentVersion()
{
return "00.00.01.001";
}
void CodecComponentImpl :: setProperty
(const std::string& name, void* value)
{
throw CodecComponentException(
"Property '" + name + "' is not supported.");
}
ORG_ETSI_TTCN3_TCI::TciValue* CodecComponentImpl :: decode(
const ORG_ETSI_TTCN3_TRI::TriMessage* message,
const ORG_ETSI_TTCN3_TCI::TciType* decodingHypothesis)
{
TciCdRequired* req = StartHereCD::getTciCdRequired();
_decBuffer = auto_ptr<DecodeBuffer>(new DecodeBuffer(*message));
RecordValue* result =
dynamic_cast<RecordValue*> (req->getTypeForName("Message")->newInstance());
// tag
unsigned char tag = _decBuffer->consume();
IntegerValue* tagField =
dynamic_cast<IntegerValue*> (req->getTypeForName("Int8")->newInstance());
tagField->setInt(tag);
result->setField("tag", *tagField);
// length
unsigned char* buff = _decBuffer->consumeCopy(16);
unsigned long long length = FormatConverter::byteArrayToUlongLong(buff, 2);
free(buff);
IntegerValue* lengthField =
dynamic_cast<IntegerValue*> (req->getTypeForName("Int16")->newInstance());
lengthField->setInt((long) length);
result->setField("length_", *lengthField);
// content
unsigned char* content = _decBuffer->consumeCopy((int) (length << 3));
OctetstringValue* contentField =
dynamic_cast<OctetstringValue*> (req->getTypeForName("Oct4")->newInstance());
contentField->setString("'" +
FormatConverter::charstringToOctetstring(content, (int) length) + "'O");
result->setField("content", *contentField);
free(content);
return result;
}
ORG_ETSI_TTCN3_TRI::TriMessage* CodecComponentImpl :: encode(
const ORG_ETSI_TTCN3_TCI::TciValue* value)
{
_encBuffer = auto_ptr<EncodeBuffer>(new EncodeBuffer());
const RecordValue* msg = dynamic_cast<const RecordValue*> (value);
const IntegerValue* tagField =
dynamic_cast<const IntegerValue*> (&(msg->getField("tag")));
const IntegerValue* lengthField =
dynamic_cast<const IntegerValue*> (&(msg->getField("length_")));
const OctetstringValue* contentField =
dynamic_cast<const OctetstringValue*> (&(msg->getField("content")));
_encBuffer->append((unsigned char) tagField->getInt());
unsigned char lenBuff[2];
FormatConverter::ulongLongToByteArray(lenBuff, lengthField->getInt(), 2);
_encBuffer->append(lenBuff, 16);
int len = contentField->getLength();
for (int i = 0; i < len; i++) _encBuffer->append((unsigned char) contentField->getOctet(i));
return _encBuffer->toTriMessage();
}
} // ns some_app_codec_component
