MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt
new file mode 100644
index 0000000..ceef7ae
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt
@@ -0,0 +1,273 @@
+/*
+ * 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 -%]
\ No newline at end of file