///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2020 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:               IFW_MQTT_Client_Definitions.ttcn
//  Description:
//  Rev:                <RnXnn>
//  Prodnr:             CNL 113 910
//  Updated:            2020-02-06
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
module IFW_MQTT_Client_Definitions {

	import from MQTT_v3_1_1_Types all;
	import from IPL4asp_PortType all;
	import from IFW_Common all;

	type component IFW_MQTT_Client_CT extends IFW_BASE_CT
	{
	    var MqttClientContext ctx := c_MqttClientContext_empty; 
	    
		var MQTT_v3_1_1_ReqResp msgToSend := c_MQTTMessage_empty;
		var MQTT_v3_1_1_ReqResp lastReceived := c_MQTTMessage_empty;
	  
    	port IPL4asp_PT IPL4_PCO;
	}

	type record MqttClientContext
	{
		integer connId,
		charstring remoteHost,
		integer remotePort,
		charstring localHost,
		integer localPort
	}	
	with { extension "done" }

	const MqttClientContext c_MqttClientContext_empty :=
	{
		connId := -1,
		remoteHost := "",
		remotePort := -1,
		localHost := "",
		localPort := -1
	}
	
	const MQTT_v3_1_1_ReqResp c_MQTTMessage_empty :=
	{
	  pingreq :=
	  {
	    header := {
	      flags := '0000'B
        }
	  }
	}
}
