///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:		ISUP_EncDec.cc
//  Rev:                R8A
//  Prodnr:             CNL 113 365
//  Updated:            2011-05-10
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
#include "ISUP_Types.hh"

namespace ISUP__Types {

OCTETSTRING enc__PDU__ISUP(const PDU__ISUP& pdu)
{
    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("Encoding PDU_ISUP: ");
	pdu.log();
	TTCN_Logger::end_event();
    }
    
    TTCN_Buffer buf;
    pdu.encode(PDU__ISUP_descr_, buf, TTCN_EncDec::CT_RAW);
    OCTETSTRING ret_val(buf.get_len(), buf.get_data());
    
    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("PDU_ISUP after encoding: ");
	ret_val.log();
	TTCN_Logger::end_event();
    }
    return ret_val;
}

PDU__ISUP dec__PDU__ISUP(const OCTETSTRING& stream)
{
    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("Decoding PDU_ISUP: ");
	stream.log();
	TTCN_Logger::end_event();
    }

    TTCN_Buffer buf;
    buf.put_os(stream);
    PDU__ISUP ret_val;
    ret_val.decode(PDU__ISUP_descr_, buf, TTCN_EncDec::CT_RAW);

    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("Decoded PDU_ISUP: ");
	ret_val.log();
	TTCN_Logger::end_event();
    }
    return ret_val;
}

PDU__ISUP dec__PDU__ISUP__noCIC(const OCTETSTRING& stream)
{
    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("Decoding PDU_ISUP: ");
	stream.log();
	TTCN_Logger::end_event();
    }

    OCTETSTRING mod_stream (int2oct(0,2) + stream);
    TTCN_Buffer buf;
    buf.put_os(mod_stream);
    PDU__ISUP ret_val;
    ret_val.decode(PDU__ISUP_descr_, buf, TTCN_EncDec::CT_RAW);
    PDU__ISUP::union_selection_type msg_type = ret_val.get_selection();
    switch (msg_type)
    {
      case PDU__ISUP::ALT_ISUP__ACM:
      {
        ret_val.ISUP__ACM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__ANM:
      {
        ret_val.ISUP__ANM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__APM:
      {
        ret_val.ISUP__APM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__BLO:
      {
        ret_val.ISUP__BLO().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__BLA:
      {
        ret_val.ISUP__BLA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CPG:
      {
        ret_val.ISUP__CPG().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CGB:
      {
        ret_val.ISUP__CGB().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CGBA:
      {
        ret_val.ISUP__CGBA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CQM:
      {
        ret_val.ISUP__CQM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CQR:
      {
        ret_val.ISUP__CQR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__GRS:
      {
        ret_val.ISUP__GRS().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__GRA:
      {
        ret_val.ISUP__GRA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CGU:
      {
        ret_val.ISUP__CGU().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CGUA:
      {
        ret_val.ISUP__CGUA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CRG:
      {
        ret_val.ISUP__CRG().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CFN:
      {
        ret_val.ISUP__CFN().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CON:
      {
        ret_val.ISUP__CON().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__COT:
      {
        ret_val.ISUP__COT().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__CCR:
      {
        ret_val.ISUP__CCR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__FAC:
      {
        ret_val.ISUP__FAC().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__FAA:
      {
        ret_val.ISUP__FAA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__FRJ:
      {
        ret_val.ISUP__FRJ().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__FAR:
      {
        ret_val.ISUP__FAR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__FOT:
      {
        ret_val.ISUP__FOT().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__IDR:
      {
        ret_val.ISUP__IDR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__IRS:
      {
        ret_val.ISUP__IRS().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__INF:
      {
        ret_val.ISUP__INF().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__INR:
      {
        ret_val.ISUP__INR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__IAM:
      {
        ret_val.ISUP__IAM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__LPA:
      {
        ret_val.ISUP__LPA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__LOP:
      {
        ret_val.ISUP__LOP().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__NRM:
      {
        ret_val.ISUP__NRM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__OLM:
      {
        ret_val.ISUP__OLM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__OPR:
      {
        ret_val.ISUP__OPR().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__PAM:
      {
        ret_val.ISUP__PAM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__PRI:
      {
        ret_val.ISUP__PRI().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__REL:
      {
        ret_val.ISUP__REL().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__RLC:
      {
        ret_val.ISUP__RLC().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__RSC:
      {
        ret_val.ISUP__RSC().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__RES:
      {
        ret_val.ISUP__RES().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__SGM:
      {
        ret_val.ISUP__SGM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__SAM:
      {
        ret_val.ISUP__SAM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__SCB:
      {
        ret_val.ISUP__SCB().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__SDM:
      {
        ret_val.ISUP__SDM().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__SUS:
      {
        ret_val.ISUP__SUS().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__UBL:
      {
        ret_val.ISUP__UBL().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__UBA:
      {
        ret_val.ISUP__UBA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__UCIC:
      {
        ret_val.ISUP__UCIC().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__UPA:
      {
        ret_val.ISUP__UPA().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__UPT:
      {
        ret_val.ISUP__UPT().cic() = OMIT_VALUE; break;
      }
      case PDU__ISUP::ALT_ISUP__USR:
      {
        ret_val.ISUP__USR().cic() = OMIT_VALUE; break;
      }
      default:
        break;
    }
    if (TTCN_Logger::log_this_event(TTCN_DEBUG)) {
	TTCN_Logger::begin_event(TTCN_DEBUG);
	TTCN_Logger::log_event("Decoded PDU_ISUP: ");
	ret_val.log();
	TTCN_Logger::end_event();
    }
    return ret_val;
}

INTEGER dec__PDU__ISUP__backtrack__noCIC(const OCTETSTRING& stream, PDU__ISUP& pdu)
{
	if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_ENCDEC)) {
		TTCN_Logger::begin_event(TTCN_Logger::DEBUG_ENCDEC);
		TTCN_Logger::log_event_str("dec_PDU_ISUP_backtrack(): Stream before decoding: ");
		stream.log();
		TTCN_Logger::end_event();
	}
	TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING);
	TTCN_EncDec::clear_error();
	OCTETSTRING mod_stream (int2oct(0,2) + stream);
    TTCN_Buffer ttcn_buffer;
    ttcn_buffer.put_os(mod_stream);
    pdu.decode(PDU__ISUP_descr_, ttcn_buffer, TTCN_EncDec::CT_RAW);
    	
	
	if (TTCN_EncDec::get_last_error_type() == TTCN_EncDec::ET_NONE) {
		
		PDU__ISUP::union_selection_type msg_type = pdu.get_selection();
	    switch (msg_type)
	    {
	      case PDU__ISUP::ALT_ISUP__ACM:
	      {
	    	  pdu.ISUP__ACM().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__ANM:
	      {
	    	  pdu.ISUP__ANM().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__BLO:
	      {
	    	  pdu.ISUP__BLO().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__BLA:
	      {
	    	  pdu.ISUP__BLA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CPG:
	      {
	    	  pdu.ISUP__CPG().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CGB:
	      {
	    	  pdu.ISUP__CGB().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CGBA:
	      {
	    	  pdu.ISUP__CGBA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__GRS:
	      {
	    	  pdu.ISUP__GRS().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__GRA:
	      {
	    	  pdu.ISUP__GRA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CGU:
	      {
	    	  pdu.ISUP__CGU().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CGUA:
	      {
	    	  pdu.ISUP__CGUA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CQM:
	      {
	    	  pdu.ISUP__CQM().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CQR:
	      {
	    	  pdu.ISUP__CQR().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CFN:
	      {
	    	  pdu.ISUP__CFN().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__COT:
	      {
	    	  pdu.ISUP__COT().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__CCR:
	      {
	    	  pdu.ISUP__CCR().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__FAC:
	      {
	    	  pdu.ISUP__FAC().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__FOT:
	      {
	    	  pdu.ISUP__FOT().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__INF:
	      {
	    	  pdu.ISUP__INF().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__INR:
	      {
	    	  pdu.ISUP__INR().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__IAM:
	      {
	    	  pdu.ISUP__IAM().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__LPA:
	      {
	    	  pdu.ISUP__LPA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__REL:
	      {
	    	  pdu.ISUP__REL().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__RLC:
	      {
	    	  pdu.ISUP__RLC().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__RSC:
	      {
	    	  pdu.ISUP__RSC().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__RES:
	      {
	    	  pdu.ISUP__RES().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__SUS:
	      {
	    	  pdu.ISUP__SUS().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__UBL:
	      {
	    	  pdu.ISUP__UBL().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__UBA:
	      {
	    	  pdu.ISUP__UBA().cic() = OMIT_VALUE; break;
	      }
	      case PDU__ISUP::ALT_ISUP__UCIC:
	      {
	    	  pdu.ISUP__UCIC().cic() = OMIT_VALUE; break;
	      }
	      default:
	        break;
	    }
		
		
		if (TTCN_Logger::log_this_event(TTCN_Logger::DEBUG_ENCDEC)) {
			TTCN_Logger::begin_event(TTCN_Logger::DEBUG_ENCDEC);
			TTCN_Logger::log_event_str("dec_PDU_ISUP_backtrack_noCIC(): Decoded @ISUP_Types.PDU_ISUP: ");
			pdu.log();
			TTCN_Logger::end_event();
		}
		
		if (ttcn_buffer.get_pos() < ttcn_buffer.get_len() && TTCN_Logger::log_this_event(TTCN_WARNING)) {
			ttcn_buffer.cut();
			OCTETSTRING remaining_stream;
			ttcn_buffer.get_string(remaining_stream);
			TTCN_Logger::begin_event(TTCN_WARNING);
			TTCN_Logger::log_event_str("dec_PDU_ISUP_backtrack(): Warning: Data remained at the end of the stream after successful decoding: ");
			remaining_stream.log();
			TTCN_Logger::end_event();
		}
		return 0;
	} else return 1;
}

}//namespace
