/*
 * 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/msgtemplate.cpp.tt>
 ******************************************************************************/ 

#include "[% tempdata.fileName %].h"
#include "../ieClasses/manual/gtpV2Ie.h"
#include "../ieClasses/gtpV2IeFactory.h"
[% FOREACH ieData IN tempdata.ieList -%]
#include "../ieClasses/[% ieData.ieFileName %].h"
[% IF ieData.grouped == 'Yes'-%]
#include "../ieClasses/[% ieData.grpIeInstFileName %].h"
[% END -%]
[% END -%]

[% tempdata.msgClassName %]::[% tempdata.msgClassName %]()
{
    msgType = [% tempdata.msgClassName %]Type;
[% PROCESS MandIeList %]
}

[% tempdata.msgClassName %]::~[% tempdata.msgClassName %]()
{

}

bool [% tempdata.msgClassName %]::encode[% tempdata.msgClassName %](MsgBuffer &buffer,
                        [% tempdata.msgClassName %]Data
							const &data)
{
    bool rc = false;
    GtpV2IeHeader header;
    Uint16 startIndex = 0;
    Uint16 endIndex = 0;
    Uint16 length = 0;
[% FOREACH ieData IN tempdata.ieList -%]

[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
    if (data.[% ieData.ieVarName %]IePresent)
    {
        [% INCLUDE tts/msgEncode.tt FILTER indent%]
        if (!(rc))
        { 
            errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
            return false;
        }
    }
[% ELSE -%]
    [% INCLUDE tts/msgEncode.tt %]
    if (!(rc))
    { 
        errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
        return false;
    }
[% END -%]
[% ELSE -%]
    [% INCLUDE tts/msgEncode.tt %]
    if (!(rc))
    { 
        errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
        return false;
    }
[% END -%]
[% END -%]
    return rc;

}

bool [% tempdata.msgClassName %]::decode[% tempdata.msgClassName %](MsgBuffer &buffer,
 [% tempdata.msgClassName %]Data 
 &data, Uint16 length)
{

    bool rc = false;
    GtpV2IeHeader ieHeader;
  
    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
    while (buffer.lengthLeft() > IE_HEADER_SIZE)
    {
        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
        if (ieHeader.length > buffer.lengthLeft())
        {
            // We do not have enough bytes left in the message for this IE
            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
            errorStream.add((char *)"  Offending IE Type: ");
            errorStream.add(ieHeader.ieType);
            errorStream.add((char *)"\n  Ie Length in Header: ");
            errorStream.add(ieHeader.length);
            errorStream.add((char *)"\n  Bytes left in message: ");
            errorStream.add(buffer.lengthLeft());
            errorStream.endOfLine();
            return false;
        }

        switch (ieHeader.ieType){
[% FOREACH ieTypeEntry IN tempdata.ieTypeList -%]
     
            case [% ieTypeEntry %]IeType:
            {
                [% ieTypeEntry %]Ie ieObject =
                dynamic_cast<
                [% ieTypeEntry %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieTypeEntry %]IeType));
[% SET first = 1 -%]
[% FOREACH ieTypeData IN tempdata.ieList -%]
[% IF ieTypeData.ieType == ieTypeEntry -%] 
[% IF first == 1 -%]
[% SET first = 0 %]
                if(ieHeader.instance == [% ieTypeData.instance %])
[% ELSE -%]
                else if(ieHeader.instance == [% ieTypeData.instance %])
[% END -%]
                {
[% INCLUDE tts/msgDecode.tt %]
[% IF ieTypeData.ieCardinality == 1 -%][% IF ieTypeData.iePresence != "M" -%]
                    data.[% ieTypeData.ieVarName %]IePresent = true;
[% END -%][% END -%]
                    if (!(rc))
                    {
                        errorStream.add((char *)"Failed to decode IE: [% ieTypeData.ieVarName %]\n");
                        return false;
                    }
                }
[% END %][% END %]
                else
                {
                    // Unknown IE instance print error
                    errorStream.add((char *)"Unknown IE Type: ");
                    errorStream.add(ieHeader.ieType);
                    errorStream.endOfLine();
                    buffer.skipBytes(ieHeader.length);
                }
                break;
            }
[% END %]
            default:
            {
                // Unknown IE print error
                errorStream.add((char *)"Unknown IE Type: ");
                errorStream.add(ieHeader.ieType);
                errorStream.endOfLine();
                buffer.skipBytes(ieHeader.length);
            }
        }
    }
    return rc; // TODO validations
}

void [% tempdata.msgClassName %]::
display[% tempdata.msgClassName %]Data_v([% tempdata.msgClassName %]Data const &data, Debug &stream)
{
    stream.incrIndent();
    stream.add((char *)"[% tempdata.msgClassName %]:");
    stream.endOfLine();
    stream.incrIndent();
    
    [%- flag = 0 -%]
    
    
[% FOREACH ieData IN tempdata.ieList -%]
[% IF ieData.ieCardinality != 1 -%]
[%- IF flag == 0 %]
    Uint8 displayCount;
    
[%- flag = 1 %]
[% END -%][% END -%]
[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
    if (data.[% ieData.ieVarName %]IePresent)
    {


        stream.add((char *)"IE - [% ieData.ieVarName %]:");
        stream.endOfLine();
        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
        dynamic_cast<
        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
    [% PROCESS ieDisplay_grp %]
    }
[% ELSE -%]
    displayCount = data.[% ieData.ieVarName %]Count;
    if (displayCount > [% ieData.ieCardinality %])
    {
        stream.add((char *)"Invalid data more than [% ieData.ieCardinality %] instances");
        stream.endOfLine();
        stream.add((char *)"Displaying only [% ieData.ieCardinality %]");
        stream.endOfLine();
        displayCount = [% ieData.ieCardinality %];
    }
    for (Uint8 i = 0; i < displayCount; i++)
    {
        stream.add((char *)"IE -  [% ieData.ieVarName %]:");
        stream.endOfLine();
        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
        dynamic_cast<
        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
        [% PROCESS ieDisplay_grp -%]
    }

    

    
[% END -%]
[% ELSE -%]
[% IF ieData.ieCardinality == 1 -%]
        stream.add((char *)"IE - [% ieData.ieVarName %]:");
        stream.endOfLine();
        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
        dynamic_cast<
        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
    [% PROCESS ieDisplay_grp %]
[% ELSE -%]
    displayCount = data.[% ieData.ieVarName %]Count;
    if (displayCount > [% ieData.ieCardinality %])
    {
        stream.add((char *)"Invalid data more than [% ieData.ieCardinality %] instances");
        stream.endOfLine();
        stream.add((char *)"Displaying only [% ieData.ieCardinality %]");
        stream.endOfLine();
        displayCount = [% ieData.ieCardinality %];
    }
    for (Uint8 i = 0; i < displayCount; i++)
    {
        stream.add((char *)"IE -  [% ieData.ieVarName %]:");
        stream.endOfLine();
        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
        dynamic_cast<
        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
[% PROCESS ieDisplay_grp %]
    }
[% END -%]            
[% END -%]
[% END -%]

    stream.decrIndent();
    stream.decrIndent();
}

[% BLOCK ieDisplay_grp -%]
[% IF ieData.grouped == "Yes" -%]
        [% ieData.grpIeInstClassName %] groupedIeInstance =
        dynamic_cast<
        [% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
        groupedIeInstance.display[% ieData.grpIeInstClassName %]Data_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
[% ELSE -%]
    [% ieData.ieLocalVar %].display[% ieData.ieType %]Ie_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
[% END -%]
[% END -%]

[% BLOCK cardinalIndex -%]
[% IF ieData.ieCardinality != 1 %][i][% END -%]
[% END -%]
[% BLOCK MandIeList -%]
[% SET first = 1 -%]
[% FOREACH ieData IN tempdata.ieList -%]
[% IF ieData.iePresence == 'M' -%]
[% IF first == 1 -%]
    Uint16 mandIe;
[% SET first = 0 -%]
[% END -%]
    mandIe = [% ieData.ieType %]IeType;
    mandIe = (mandIe << 8) | [% ieData.instance %]; // [% ieData.ieVarName %]
    mandatoryIeSet.insert(mandIe);
[%- END -%]
[% END -%]
[% END -%]