/*
 * Copyright 2019-present Infosys Limited  
 *   
 * SPDX-License-Identifier: Apache-2.0    
 */
/******************************************************************************
 *
 * This is an auto generated file.
 * Please do not edit this file.
 * All edits to be made through template source file
 * <TOP-DIR/scripts/GtpV2StackCodeGen/tts/ietemplate.cpp.tt>
 ******************************************************************************/

#include "[% tempdata.fileName %].h"
#include "dataTypeCodecUtils.h"

[% tempdata.className %]::[% tempdata.className %]() 
{
    ieType = [% tempdata.ieTypeVal %];
    // TODO

}

[% tempdata.className %]::~[% tempdata.className %]() {
    // TODO Auto-generated destructor stub
}

bool [% tempdata.className %]::encode[% tempdata.className %](MsgBuffer &buffer, [% tempdata.className %]Data const &data)
{
[% IF validationPresent == "y" -%]
    if (!([% validationRule %]))
    {
        errorStream.add((char *)"Data validation failure at IE : [% tempdata.className %]\n");
        return false; 
    }[% END -%]
[% FOREACH Item IN tempdata.sequence -%]
[% IF Item -%]
[% IF Item.skipType == "y" -%]
    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);

[% ELSE -%]
[% IF Item.presence == "optional" -%]
    if (data.[% Item.fieldName %]Present)
    {
[% IF Item.encodeConditional == "y" -%]
        if ([% Item.encodeCondition %])
        {
[% IF Item.leafType == "y" -%]
[% IF Item.validationPresent == "y" -%]
            if (!([% Item.validationRule %]))
            {
                errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
                return false; 
            }
[% END -%]
[% IF Item.bitField == "y" -%]
            if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
            {
                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
                return false;
            }
[% ELSE -%]
            if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
            {
                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
                return false;
            }
[% END -%]
[% ELSE -%]
[% IF Item.validationPresent == "y" -%]
            if (!([% Item.validationRule %]))
            {
                errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
                return false; 
            }
[% END -%]
            if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
            {
                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
                return false;
            }
[% END -%]
        }
    }
[% ELSE -%]
[% IF Item.leafType == "y" -%]
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
            return false; 
        }
[% END -%]
[% IF Item.bitField == "y" -%]
        if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
        {
            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
            return false;
        }
[% ELSE -%]
        if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
        {
            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
            return false;
        }
[% END -%]
[% ELSE -%]
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
            return false; 
        }
[% END -%]
        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
        {
            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
            return false;
        }
[% END -%]
    }
[% END -%]
[% ELSE -%]
[% IF Item.encodeConditional == "y" -%]
    if ([% Item.encodeCondition %])
    {
[% IF Item.leafType == "y" -%]
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
            return false; 
        }
[% END -%]
[% IF Item.bitField == "y" -%]
        if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
        {
            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
            return false;
        }
[% ELSE -%]
        if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
        {
    errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
    return false;
        }
[% END -%]
[% ELSE -%]
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
            return false; 
        }
[% END -%]
        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
        {
            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
            return false;
        }
[% END -%]
    }
[% ELSE -%]
[% IF Item.leafType == "y" -%]
[% IF Item.validationPresent == "y" -%]
    if (!([% Item.validationRule %]))
    {
        errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
        return false; 
    }
[% END -%]
[% IF Item.bitField == "y" -%]
    if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
    {
        errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
        return false;
    }
[% ELSE -%]
    if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
    {
        errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
        return false;
    }
[% END -%]
[% ELSE -%]
[% IF Item.validationPresent == "y" -%]
    if (!([% Item.validationRule %]))
    {
        errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
        return false; 
    }
[% END -%]
    if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
    {
    errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
    return false;
    }
[% END -%]
[% END -%]
[% END -%]
[% END -%]
[% END -%]
[% END %]
    return true;
}

bool [% tempdata.className %]::decode[% tempdata.className %](MsgBuffer &buffer, [% tempdata.className %]Data &data, Uint16 length)
{ 
[%- flag = 0 -%]
    
    // TODO optimize the length checks
    
    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
[% FOREACH Item IN tempdata.sequence -%]
[% IF Item.length == "lengthLeft" -%][%- IF flag == 0 %]
    Uint16 lengthLeft = length;
    [%- flag = 1 %]
[% END -%][% END -%]
[% IF Item.skipType == "y" -%]
    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);
    if (buffer.getCurrentIndex() > ieBoundary)
    {
        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
        return false;
    }

[% ELSE -%]
[% IF Item.decodeConditional == "y" %]
    if ([% Item.decodeCondition %])
    {
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
        data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
        // confirm that we are not reading beyond the IE boundary
        if (buffer.getCurrentIndex() > ieBoundary)
        {
            errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
            return false;
        }
[% ELSE %]
        buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
        if (buffer.getCurrentIndex() > ieBoundary)
        {
            errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
            return false;
        }
[% END -%]
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
            return false; //TODO need to add validations
        }
[% END -%]
[% ELSE -%]
[% IF Item.length == "lengthLeft" -%]
        lengthLeft = ieBoundary - buffer.getCurrentIndex();
[% END -%]
[% IF Item.arrayType == "y" -%]
        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
[% ELSE -%]
        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
[% END -%]
        {
            errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
            return false;
        }
[% IF Item.validationPresent == "y" -%]
        if (!([% Item.validationRule %]))
        {
            errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
            return false; //TODO need to add validations
        }
[% END -%]
[% END -%]
[% IF Item.presence == "optional" -%]
        data.[% Item.fieldName %]Present = true;
[% END -%]
    }
[% ELSE -%]
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
    data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
    // confirm that we are not reading beyond the IE boundary
    if (buffer.getCurrentIndex() > ieBoundary)
    {
        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
        return false;
    }
[% ELSE %]
    buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
    if (buffer.getCurrentIndex() > ieBoundary)
    {
        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
        return false;
    }
[% END -%]
[% IF Item.validationPresent == "y" -%]
    if (!([% Item.validationRule %]))
    {
        errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
        return false; //TODO need to add validations
    }
[% END -%]
[% ELSE -%]
[% IF Item.length == "lengthLeft" -%]
    lengthLeft = ieBoundary - buffer.getCurrentIndex();
[% END -%]
[% IF Item.arrayType == "y" -%]
    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
[% ELSE -%]
    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
[% END -%]
    {
        errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
        return false;
    }
[% IF Item.validationPresent == "y" -%]
    if (!([% Item.validationRule %]))
    {
        errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
        return false; //TODO need to add validations
    }
[% END -%]
[% END -%]
[% IF Item.presence == "optional" -%]
    data.[% Item.fieldName %]Present = true;
[% END -%]
[% END -%]
[% END -%]
[% END -%]
[% IF validationPresent == "y" -%]
    if (!([% validationRule %]))
    {
        errorStream.add((char *)"Data validation failure at IE: [% tempdata.className %]\n");
        return false;
    }
[% END -%]

    // The IE is decoded now. The buffer index should be pointing to the 
    // IE Boundary. If not, we have some more data left for the IE which we don't know
    // how to decode
    if (ieBoundary == buffer.getCurrentIndex())
    {
        return true;
    }
    else
    {
        errorStream.add((char *)"Unable to decode IE [% tempdata.className %]\n");
        return false;
    }
}
void [% tempdata.className %]::display[% tempdata.className %]_v([% tempdata.className %]Data const &data, Debug &stream)
{
    stream.incrIndent();
    stream.add((char *)"[% tempdata.className %]Data:");
    stream.incrIndent();
    stream.endOfLine();
[% FOREACH Item IN tempdata.sequence -%]
[% IF Item.skipType != "y" -%]
  
[% IF Item.presence == "optional" -%]  
    if (data.[% Item.fieldName %]Present)
    {
[% IF Item.encodeConditional == "y" -%]
        if ([% Item.encodeCondition %])
        {
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
            stream.add((char *) "[% Item.fieldName %]: "); 
            stream.add((Uint8)data.[% Item.fieldName %]);
            stream.endOfLine();
[% ELSE -%]
            stream.add((char *)"[% Item.fieldName %]: ");
            stream.add(data.[% Item.fieldName %]);
            stream.endOfLine();
[% END -%]
[% ELSE -%]
            stream.add((char *)"[% Item.fieldName %]:");
            stream.endOfLine();
            DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
[% END -%]
        }
    }
[% ELSE -%] 
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
        stream.add((char *) "[% Item.fieldName %]: "); 
        stream.add((Uint8)data.[% Item.fieldName %]);
        stream.endOfLine();
[% ELSE -%]
        stream.add((char *)"[% Item.fieldName %]: ");
        stream.add(data.[% Item.fieldName %]);
        stream.endOfLine();
[% END -%]
[% ELSE -%]
        stream.add((char *)"[% Item.fieldName %]:");
        stream.endOfLine();
        DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
[% END -%]
    }   
[% END -%]
[% ELSE -%]
[% IF Item.encodeConditional == "y" -%]
    if ([% Item.encodeCondition %])
    {
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
        stream.add( (char *)"[% Item.fieldName %]: "); 
        stream.add((Uint8)data.[% Item.fieldName %]);
        stream.endOfLine();
[% ELSE -%]
        stream.add((char *)"[% Item.fieldName %]: ");
        stream.add(data.[% Item.fieldName %]);
        stream.endOfLine();
[% END -%]
[% ELSE -%]
        stream.add((char *)"[% Item.fieldName %]:");
        stream.endOfLine();
        DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
[% END -%]
    }
[% ELSE -%] 
[% IF Item.leafType == "y" -%]
[% IF Item.bitField == "y" -%]
    stream.add( (char *)"[% Item.fieldName %]: "); 
    stream.add((Uint8)data.[% Item.fieldName %]);
    stream.endOfLine();
[% ELSE -%]
    stream.add((char *)"[% Item.fieldName %]: ");
    stream.add(data.[% Item.fieldName %]);
    stream.endOfLine();
[% END -%]
[% ELSE -%]
    stream.add((char *)"[% Item.fieldName %]:");
    stream.endOfLine();
    DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
[% END -%]
[% END -%]
[% END -%]
[% END -%]
[% END -%]
    stream.decrIndent();
    stream.decrIndent();
}
