/*
 * Copyright (c) 2019, Infosys Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef DGM_BLOCKSTRUCTURES_H
#define DGM_BLOCKSTRUCTURES_H
/**************************************
*
* This is an auto generated file.
 * Please do not edit this file.
 * All edits to be made through template source file
 * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.h.tt>
 ***************************************/
#include "structs.h"
#include "permDataBlock.h"
#include "tempDataBlock.h"
#include <utils/mmeCauseTypes.h>

namespace mme
{
	class UEContext;
	class MmContext;
	class SessionContext;
	class BearerContext;
	class MmeProcedureCtxt;
	class MmeDetachProcedureCtxt;
	class MmeSvcReqProcedureCtxt;
	class MmeTauProcedureCtxt;

	class UEContext:public SM::PermDataBlock
	{
		public:
	
			/****************************************
			* UEContext
			*    constructor
			****************************************/
			UEContext();
			
			/****************************************
			* ~UEContext
			*    destructor
			****************************************/
			~UEContext();
			
			/****************************************
			* setenbFd
			*    set enbFd to UEContext
			****************************************/
			void setEnbFd( int enbFd_i );
			
			/****************************************
			* getenbFd
			*    get enbFd from UEContext
			****************************************/
			int getEnbFd();
			
			/****************************************
			* sets1apEnbUeId
			*    set s1apEnbUeId to UEContext
			****************************************/
			void setS1apEnbUeId( int s1apEnbUeId_i );
			
			/****************************************
			* gets1apEnbUeId
			*    get s1apEnbUeId from UEContext
			****************************************/
			int getS1apEnbUeId();
			
			/****************************************
			* setsubscriptionStatus
			*    set subscriptionStatus to UEContext
			****************************************/
			void setSubscriptionStatus( int subscriptionStatus_i );
			
			/****************************************
			* getsubscriptionStatus
			*    get subscriptionStatus from UEContext
			****************************************/
			int getSubscriptionStatus();
			
			/****************************************
			* setnetAccessMode
			*    set netAccessMode to UEContext
			****************************************/
			void setNetAccessMode( int netAccessMode_i );
			
			/****************************************
			* getnetAccessMode
			*    get netAccessMode from UEContext
			****************************************/
			int getNetAccessMode();
			
			/****************************************
			* setcontextID
			*    set contextID to UEContext
			****************************************/
			void setContextID( uint32_t contextID_i );
			
			/****************************************
			* getcontextID
			*    get contextID from UEContext
			****************************************/
			uint32_t getContextID();
			
			/****************************************
			* setrauTauTimer
			*    set rauTauTimer to UEContext
			****************************************/
			void setRauTauTimer( unsigned int rauTauTimer_i );
			
			/****************************************
			* getrauTauTimer
			*    get rauTauTimer from UEContext
			****************************************/
			unsigned int getRauTauTimer();
			
			/****************************************
			* setaccessRestrictionData
			*    set accessRestrictionData to UEContext
			****************************************/
			void setAccessRestrictionData( unsigned int accessRestrictionData_i );
			
			/****************************************
			* getaccessRestrictionData
			*    get accessRestrictionData from UEContext
			****************************************/
			unsigned int getAccessRestrictionData();
			
			/****************************************
			* setimsi
			*    set imsi to UEContext
			****************************************/
			void setImsi( const DigitRegister15& imsi_i );
			
			/****************************************
			* getimsi
			*    get imsi from UEContext
			****************************************/
			const DigitRegister15& getImsi()const;
			
			/****************************************
			* setmsisdn
			*    set msisdn to UEContext
			****************************************/
			void setMsisdn( const DigitRegister15& msisdn_i );
			
			/****************************************
			* getmsisdn
			*    get msisdn from UEContext
			****************************************/
			const DigitRegister15& getMsisdn()const;
			
			/****************************************
			* setdwnLnkSeqNo
			*    set dwnLnkSeqNo to UEContext
			****************************************/
			void setDwnLnkSeqNo( unsigned short dwnLnkSeqNo_i );
			
			/****************************************
			* getdwnLnkSeqNo
			*    get dwnLnkSeqNo from UEContext
			****************************************/
			unsigned short getDwnLnkSeqNo();
			
			/****************************************
			* setupLnkSeqNo
			*    set upLnkSeqNo to UEContext
			****************************************/
			void setUpLnkSeqNo( unsigned short upLnkSeqNo_i );
			
			/****************************************
			* getupLnkSeqNo
			*    get upLnkSeqNo from UEContext
			****************************************/
			unsigned short getUpLnkSeqNo();
			
			/****************************************
			* setueState
			*    set ueState to UEContext
			****************************************/
			void setUeState( UE_State_e ueState_i );
			
			/****************************************
			* getueState
			*    get ueState from UEContext
			****************************************/
			UE_State_e getUeState();
			
			/****************************************
			* settai
			*    set tai to UEContext
			****************************************/
			void setTai( const Tai& tai_i );
			
			/****************************************
			* gettai
			*    get tai from UEContext
			****************************************/
			const Tai& getTai()const;
			
			/****************************************
			* setutranCgi
			*    set utranCgi to UEContext
			****************************************/
			void setUtranCgi( const Cgi& utranCgi_i );
			
			/****************************************
			* getutranCgi
			*    get utranCgi from UEContext
			****************************************/
			const Cgi& getUtranCgi()const;
			
			/****************************************
			* setmsNetCapab
			*    set msNetCapab to UEContext
			****************************************/
			void setMsNetCapab( const Ms_net_capab& msNetCapab_i );
			
			/****************************************
			* getmsNetCapab
			*    get msNetCapab from UEContext
			****************************************/
			const Ms_net_capab& getMsNetCapab()const;
			
			/****************************************
			* setueNetCapab
			*    set ueNetCapab to UEContext
			****************************************/
			void setUeNetCapab( const Ue_net_capab& ueNetCapab_i );
			
			/****************************************
			* getueNetCapab
			*    get ueNetCapab from UEContext
			****************************************/
			const Ue_net_capab& getUeNetCapab()const;
			
			/****************************************
			* setueSecInfo
			*    set ueSecInfo to UEContext
			****************************************/
			void setUeSecInfo( const Secinfo& ueSecInfo_i );
			
			/****************************************
			* getueSecInfo
			*    get ueSecInfo from UEContext
			****************************************/
			const Secinfo& getUeSecInfo()const;
			
			/****************************************
			* setambr
			*    set ambr to UEContext
			****************************************/
			void setAmbr( const Ambr& ambr_i );
			
			/****************************************
			* getambr
			*    get ambr from UEContext
			****************************************/
			const Ambr& getAmbr()const;
			
			/****************************************
			* setaiaSecInfo
			*    set aiaSecInfo to UEContext
			****************************************/
			void setAiaSecInfo( const E_utran_sec_vector& aiaSecInfo_i );
			
			/****************************************
			* getaiaSecInfo
			*    get aiaSecInfo from UEContext
			****************************************/
			const E_utran_sec_vector& getAiaSecInfo()const;
			
			/****************************************
			* setmTmsi
			*    set mTmsi to UEContext
			****************************************/
			void setMtmsi( uint32_t mTmsi );

			/****************************************
			* getaiaSecInfo
			*    get aiaSecInfo from UEContext
			****************************************/
			uint32_t getMtmsi();
			
			/****************************************
			* setMmContext
			*    set MmContext to UEContext
			****************************************/
			void setMmContext( MmContext* MmContextp ) ;
			
			/****************************************
			* getMmContext
			*    get MmContext to UEContext
			****************************************/
			MmContext* getMmContext();
			
			/****************************************
			* setSessionContext
			*    set SessionContext to UEContext
			****************************************/
			void setSessionContext( SessionContext* SessionContextp ) ;
			
			/****************************************
			* getSessionContext
			*    get SessionContext to UEContext
			****************************************/
			SessionContext* getSessionContext();
			
		
		private:
		
			// DataName
			int enbFd_m;
			
			// DataName
			int s1apEnbUeId_m;
			
			// DataName
			int subscriptionStatus_m;
			
			// DataName
			int netAccessMode_m;
			
			// DataName
			uint32_t contextID_m;
			
			// DataName
			unsigned int rauTauTimer_m;
			
			// DataName
			unsigned int accessRestrictionData_m;
			
			// DataName
			DigitRegister15 imsi_m;
			
			// DataName
			DigitRegister15 msisdn_m;
			
			// DataName
			unsigned short dwnLnkSeqNo_m;
			
			// DataName
			unsigned short upLnkSeqNo_m;
			
			// DataName
			UE_State_e ueState_m;
			
			// DataName
			Tai tai_m;
			
			// DataName
			Cgi utranCgi_m;
			
			// DataName
			Ms_net_capab msNetCapab_m;
			
			// DataName
			Ue_net_capab ueNetCapab_m;
			
			// DataName
			Secinfo ueSecInfo_m;
			
			// DataName
			Ambr ambr_m;
			
			// DataName
			E_utran_sec_vector aiaSecInfo_m;
			
			// DataName
			uint32_t mTmsi_m;

			// MmContext
			MmContext* MmContext_mp;
			
			// SessionContext
			SessionContext* SessionContext_mp;
			
	};
	 
	class MmContext:public SM::PermDataBlock
	{
		public:
	
			/****************************************
			* MmContext
			*    constructor
			****************************************/
			MmContext();
			
			/****************************************
			* ~MmContext
			*    destructor
			****************************************/
			~MmContext();
			
			/****************************************
			* setmmState
			*    set mmState to MmContext
			****************************************/
			void setMmState(EmmState mmState_i );
			
			/****************************************
			* getmmState
			*    get mmState from MmContext
			****************************************/
			EmmState getMmState();
			
			
		private:
		
			// DataName
			EmmState mmState_m;
			
			
	};
	 
	class SessionContext:public SM::PermDataBlock
	{
		public:
	
			/****************************************
			* SessionContext
			*    constructor
			****************************************/
			SessionContext();
			
			/****************************************
			* ~SessionContext
			*    destructor
			****************************************/
			~SessionContext();
			
			/****************************************
			* setsessionId
			*    set sessionId to SessionContext
			****************************************/
			void setSessionId( uint8_t sessionId_i );
			
			/****************************************
			* getsessionId
			*    get sessionId from SessionContext
			****************************************/
			uint8_t getSessionId();
			
			/****************************************
			* sets11SgwCtrlFteid
			*    set s11SgwCtrlFteid to SessionContext
			****************************************/
			void setS11SgwCtrlFteid( const Fteid& s11SgwCtrlFteid_i );
			
			/****************************************
			* gets11SgwCtrlFteid
			*    get s11SgwCtrlFteid from SessionContext
			****************************************/
			const Fteid& getS11SgwCtrlFteid()const;
			
			/****************************************
			* sets5S8PgwCtrlFteid
			*    set s5S8PgwCtrlFteid to SessionContext
			****************************************/
			void setS5S8PgwCtrlFteid( const Fteid& s5S8PgwCtrlFteid_i );
			
			/****************************************
			* gets5S8PgwCtrlFteid
			*    get s5S8PgwCtrlFteid from SessionContext
			****************************************/
			const Fteid& getS5S8PgwCtrlFteid()const;
			
			/****************************************
			* setpdnAddr
			*    set pdnAddr to SessionContext
			****************************************/
			void setPdnAddr( const Paa& pdnAddr_i );
			
			/****************************************
			* getpdnAddr
			*    get pdnAddr from SessionContext
			****************************************/
			const Paa& getPdnAddr()const;
			
			/****************************************
			* setaccessPtName
			*    set accessPtName to SessionContext
			****************************************/
			void setAccessPtName( const Apn_name& accessPtName_i );
			
			/****************************************
			* getaccessPtName
			*    get accessPtName from SessionContext
			****************************************/
			const Apn_name& getAccessPtName()const;
			
			/****************************************
			* geteRabId
			*    get eRabId from SessionContext
			****************************************/
			unsigned short getErabId();
			
			/****************************************
			* setapnConfigProfileCtxId
			*    set apnConfigProfileCtxId to SessionContext
			****************************************/
			void setApnConfigProfileCtxId( unsigned int apnConfigProfileCtxId_i );
			
			/****************************************
			* getapnConfigProfileCtxId
			*    get apnConfigProfileCtxId from SessionContext
			****************************************/
			unsigned int getApnConfigProfileCtxId();

			/****************************************
		        * setpti
			*    set pti to SessionContext
			****************************************/
			void setPti( uint8_t pti_i );

			/****************************************
			* getpti
			*    get pti from SessionContext
			****************************************/
			uint8_t getPti();
			
			/****************************************
			* setBearerContext
			*    set BearerContext to SessionContext
			****************************************/
			void setBearerContext( BearerContext* BearerContextp ) ;
			
			/****************************************
			* getBearerContext
			*    get BearerContext to SessionContext
			****************************************/
			BearerContext* getBearerContext();
		
		
		private:
		
			// DataName
			uint8_t sessionId_m;
			
			// DataName
			Fteid s11SgwCtrlFteid_m;
			
			// DataName
			Fteid s5S8PgwCtrlFteid_m;
			
			// DataName
			Paa pdnAddr_m;
			
			// DataName
			Apn_name accessPtName_m;

			// DataName
			unsigned int apnConfigProfileCtxId_m;
			
			// DataName
			uint8_t pti_m;
			
			// BearerContext
			BearerContext* BearerContext_mp;
			
	};
	 
	class BearerContext:public SM::PermDataBlock
	{
		public:
	
			/****************************************
			* BearerContext
			*    constructor
			****************************************/
			BearerContext();
			
			/****************************************
			* ~BearerContext
			*    destructor
			****************************************/
			~BearerContext();
			
			/****************************************
			* sets1uSgwUserFteid
			*    set s1uSgwUserFteid to BearerContext
			****************************************/
			void setS1uSgwUserFteid( const Fteid& s1uSgwUserFteid_i );
			
			/****************************************
			* gets1uSgwUserFteid
			*    get s1uSgwUserFteid from BearerContext
			****************************************/
			const Fteid& getS1uSgwUserFteid()const;
			
			/****************************************
			* sets5S8PgwUserFteid
			*    set s5S8PgwUserFteid to BearerContext
			****************************************/
			void setS5S8PgwUserFteid( const Fteid& s5S8PgwUserFteid_i );
			
			/****************************************
			* gets5S8PgwUserFteid
			*    get s5S8PgwUserFteid from BearerContext
			****************************************/
			const Fteid& getS5S8PgwUserFteid()const;
			
			/****************************************
			* sets1uEnbUserFteid
			*    set s1uEnbUserFteid to BearerContext
			****************************************/
			void setS1uEnbUserFteid( const Fteid& s1uEnbUserFteid_i );
			
			/****************************************
			* gets1uEnbUserFteid
			*    get s1uEnbUserFteid from BearerContext
			****************************************/
			const Fteid& getS1uEnbUserFteid()const;
			
			/****************************************
			* setbearerId
			*    set bearerId to BearerContext
			****************************************/
			void setBearerId( unsigned char bearerId_i );
			
			/****************************************
			* getbearerId
			*    get bearerId from BearerContext
			****************************************/
			unsigned char getBearerId();
			
			
		
		private:
		
			// DataName
			Fteid s1uSgwUserFteid_m;
			
			// DataName
			Fteid s5S8PgwUserFteid_m;
			
			// DataName
			Fteid s1uEnbUserFteid_m;
			
			// DataName
			unsigned char bearerId_m;
			
			
	};
	 
	class MmeProcedureCtxt:public SM::TempDataBlock
	{
		public:
	
			/****************************************
			* MmeProcedureCtxt
			*    constructor
			****************************************/
			MmeProcedureCtxt();
			
			/****************************************
			* ~MmeProcedureCtxt
			*    destructor
			****************************************/
			~MmeProcedureCtxt();
			
			/****************************************
			* setctxtType
			*    set ctxtType to MmeProcedureCtxt
			****************************************/
			void setCtxtType( ProcedureType ctxtType_i );
			
			/****************************************
			* getctxtType
			*    get ctxtType from MmeProcedureCtxt
			****************************************/
			ProcedureType getCtxtType();

			/****************************************
			* setesmInfoTxRequired
			*    set esmInfoTxRequired to MmeProcedureCtxt
			****************************************/
			void setEsmInfoTxRequired( bool esmInfoTxRequired_i );
			
			/****************************************
			* getesmInfoTxRequired
			*    get esmInfoTxRequired from MmeProcedureCtxt
			****************************************/
			bool getEsmInfoTxRequired();
			
			/****************************************
			* setpti
			*    set pti to MmeProcedureCtxt
			****************************************/
			void setPti( uint8_t pti_i );

			/****************************************
			* getpti
			*    get pti from MmeProcedureCtxt
			****************************************/
			uint8_t getPti();
			
			/****************************************
			* setpcoOptions
			*    set pcoOptions to MmeProcedureCtxt
			****************************************/
			void setPcoOptions(const unsigned short int* pco_options_i);

			/****************************************
			* getpcoOptions
			*    get pcoOptions from MmeProcedureCtxt
			****************************************/
			const unsigned short int* getPcoOptions()const;

			/****************************************
			* setattachType
			*    set attachType to MmeProcedureCtxt
			****************************************/
			void setAttachType( AttachType attachType_i );

			/****************************************
			* getattachType
			*    get attachType from MmeProcedureCtxt
			****************************************/
			AttachType getAttachType();

			/****************************************
			* setMmeErrorCause
			*    set mmeErrorCause to MmeProcedureCtxt
			*******************************************/
			void setMmeErrorCause( MmeErrorCause mmeErrorCause_i );

			/*******************************************
			* getMmeErrorCause
			*    get mmeErrorCause from MmeProcedureCtxt
			*********************************************/
			MmeErrorCause getMmeErrorCause();


		private:
		
			// DataName
			ProcedureType ctxtType_m;

            // DataName
            MmeErrorCause mmeErrorCause_m;
	
			//DataName
			AttachType attachType_m;

			//DataName
			unsigned short int pcoOptions_m[10];

			// DataName
			uint8_t pti_m;

			//DataName
			bool esmInfoTxRequired_m;

	};
	
	class MmeDetachProcedureCtxt:public MmeProcedureCtxt
	{
		public:

			/****************************************
			* MmeDetachProcedureCtxt
			*    constructor
			****************************************/
			MmeDetachProcedureCtxt();

			/****************************************
			* ~MmeDetachProcedureCtxt
			*    destructor
			****************************************/
			~MmeDetachProcedureCtxt();

			/****************************************
			* setdetachType
			*    set detachType to MmeDetachProcedureCtxt
			****************************************/
			void setDetachType(DetachType detachType_i );

			/****************************************
			* getdetachType
			*    get detachType from MmeDetachProcedureCtxt
			****************************************/
			DetachType getDetachType();

			/****************************************
			* setcancellationType
			*    set cancellationType to MmeProcedureCtxt
			****************************************/
			void setCancellationType(CancellationType cancellationType_i );

			/****************************************
			* getcancellationType
			*    get cancellationType from MmeProcedureCtxt
			****************************************/
			CancellationType getCancellationType();

		private:

			// DataName
			DetachType detachType_m;

			//DataName
			CancellationType cancellationType_m;
	};



	class MmeSvcReqProcedureCtxt:public MmeProcedureCtxt
	{
		public:
		    /****************************************
		    * MmeSvcReqProcedureCtxt
		    *    constructor
		    ****************************************/
		    MmeSvcReqProcedureCtxt();

		    /****************************************
		    * ~MmeSvcReqProcedureCtxt
		    *    destructor
		    ****************************************/
		    ~MmeSvcReqProcedureCtxt();
			
		    /****************************************
		    * setseqNo
		    *    set seqNo to MmeSvcReqProcedureCtxt
		    ****************************************/
		    void setDdnSeqNo( uint32_t ddnSeqNum_i );

		    /****************************************
		    * getseqNo
		    *    get seqNo from MmeSvcReqProcedureCtxt
		    ****************************************/
		    uint32_t getDdnSeqNo();

		    /**************************************************
		    * setPagingTrigger
		    *    set pagingTrigger to MmeSvcReqProcedureCtxt
		    **************************************************/
		    void setPagingTrigger( PagingTrigger pagingTrigger_i );
	
		    /****************************************
		    * getPagingTrigger
		    *    get pagingTrigger from MmeSvcReqProcedureCtxt
		    ****************************************/
		    PagingTrigger getPagingTrigger();
	
		    /****************************************
		    * setEpsBearerId
		    *    set epsBearerId to MmeSvcReqProcedureCtxt
		    ****************************************/
		    void setEpsBearerId( unsigned char epsBearerId_i );
	
		    /****************************************
		    * getEpsBearerId
		    *    get epsBearerId from MmeSvcReqProcedureCtxt
		    ****************************************/
		    unsigned char getEpsBearerId();
	
		    /****************************************
		    * setArp
		    *    set arp to MmeSvcReqProcedureCtxt
	   	    ****************************************/
		    void setArp( const Arp& arp_i );
	
		    /****************************************
		    * getArp
		    *    get arp from MmeSvcReqProcedureCtxt
		    ****************************************/
		    const Arp& getArp()const;
	
		    					
	    private:
			// DataName
			PagingTrigger pagingTrigger_m;
			
			// DataName
			unsigned char epsBearerId_m;
			
			// DataName
			Arp arp_m;
			
			// DataName
			uint32_t ddnSeqNum_m;
			
	};
	
	class MmeTauProcedureCtxt:public MmeProcedureCtxt
	{
		public:
			/****************************************
			* MmeTauProcedureCtxt
			*    constructor
			****************************************/
			MmeTauProcedureCtxt();

			/****************************************
			* ~MmeTauProcedureCtxt
			*    destructor
			****************************************/
			~MmeTauProcedureCtxt();
				
			/****************************************
			* sets1apEnbUeId
			*    set s1apEnbUeId to MmeTauProcedureCtxt
			****************************************/
			void setS1apEnbUeId( int s1apEnbUeId_i );
			
			/****************************************
			* gets1apEnbUeId
			*    get s1apEnbUeId from MmeTauProcedureCtxt
			****************************************/
			int getS1apEnbUeId();
			
			/****************************************
			* settai
			*    set tai to MmeTauProcedureCtxt
			****************************************/
			void setTai( const Tai& tai_i );
			
			/****************************************
			* gettai
			*    get tai from MmeTauProcedureCtxt
			****************************************/
			const Tai& getTai()const;
			
			/****************************************
			* setenbFd
			*    set enbFd to MmeTauProcedureCtxt
			****************************************/
			void setEnbFd( int enbFd_i );
			
			/****************************************
			* getenbFd
			*    get enbFd from MmeTauProcedureCtxt
			****************************************/
			int getEnbFd();		
			
			
				
		private:
			int s1apEnbUeId_m;
			Tai tai_m;
			int enbFd_m;			
			
	};
	
} // mme
#endif
