blob: ceef7aebbb1d4f59f12bbb83cea33ad47f2fb424 [file] [log] [blame]
/*
* 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 -%]