OpenTTCN/Knowledge base/Writing Custom Codec Component/CodecComponentImpl.cpp

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.cpp


Back to main article >>

#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
Views
Personal tools