blob: 9a44b12052480bc9db5d3fac0c09db1a8604e5e1 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
// 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: EPTF_HTTP_Transport_Functions.ttcn
// Rev: <RnXnn>
// Prodnr: CNL 113 618
// Updated: 2014-03-21
// Contact: http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Module: EPTF_HTTP_Transport_Functions
//
// Purpose:
// This module contains the HTTP transport layer functions
//
// Module Parameters:
// See <EPTF_HTTP_Transport_Definitions>
//
// Module depends on:
// <EPTF_CLL_TransportRouting_Functions>
//
// <EPTF_CLL_TransportMessageBufferManager_Functions>
//
// <EPTF_CLL_Base_Definitions>
//
// <EPTF_CLL_Base_Functions>
//
// <EPTF_CLL_Variable_Functions>
//
// <EPTF_CLL_Logging_Definitions>
//
// <EPTF_CLL_Logging_Functions>
//
// <EPTF_CLL_TransportCommPortIPL4_Definitions>
//
// <EPTF_CLL_TransportCommPortIPL4_Functions>
//
// <EPTF_CLL_Common_Definitions>
//
// <EPTF_CLL_LGenBase_Functions>
//
// <EPTF_CLL_LGenBase_Definitions>
//
// <EPTF_CLL_HashMapStr2Int_Functions>
//
// <EPTF_CLL_HashMapInt2Int_Functions>
//
// <EPTF_CLL_FBQ_Definitions>
//
// <EPTF_CLL_FBQ_Functions>
//
// <EPTF_HTTP_Definitions>
//
// <EPTF_HTTP_Transport_Definitions>
//
// <IPL4asp_Types>
//
// <TCCMessageHandling_Functions>
//
// Current Owner:
// EAKOPER
//
// Last Review Date:
// 2009-08-10
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
module EPTF_HTTP_Transport_Functions {
//=============================================================================
// Imports
//=============================================================================
import from EPTF_CLL_TransportRouting_Functions all;
import from EPTF_CLL_TransportMessageBufferManager_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Logging_Functions all;
import from EPTF_CLL_TransportCommPortIPL4_Definitions all;
import from EPTF_CLL_TransportCommPortIPL4_Functions all;
import from EPTF_CLL_HashMapStr2Int_Functions all;
import from EPTF_CLL_HashMapInt2Int_Functions all;
import from EPTF_CLL_FBQ_Functions all;
import from EPTF_CLL_HashMap_Functions all;
import from EPTF_HTTP_Definitions all; // events
import from EPTF_HTTP_Transport_Definitions all;
import from IPL4asp_Types all;
import from TCCMessageHandling_Functions all;
//=============================================================================
// Functions
//=============================================================================
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_LocalTransport
//
// Purpose:
// Functions of the EPTF HTTP Local Transport
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_LocalTransport
{
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_init_CT
//
// Purpose:
// Function to init The LocalTransprot component
//
// Parameters:
// - pl_selfName - *in* *charstring* - self name of the component
// - pl_receiveFunction - *in* <EPTF_HTTP_messageProcess_FT> - the
// receive callback function to handle received messages
// - pl_eventReceiveFunction - *in* <EPTF_HTTP_eventReceive_FT> - the
// receive event callback function to handle received events
// - pl_socketErrorReceiveFunction - *in* <EPTF_HTTP_socketErrorReceive_FT> - the
// socket error receive callback function to handle received socket error events and messages
// - pl_interfaceInformationList - *in* <EPTF_CommPort_IPL4_InterfaceInformationList> -
// the defined interfaces for IPL4 (can be used only with root rights)
//
// Return Value:
// *integer* - if the component is initialized already the return value
// will be -1
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_init_CT(
in charstring pl_selfName := "EPTF_HTTP_LocalTransport",
in EPTF_HTTP_messageProcess_FT pl_receiveFunction := null,
in EPTF_HTTP_eventReceive_FT pl_eventReceiveFunction := null,
in EPTF_HTTP_socketErrorReceive_FT pl_socketErrorReceiveFunction := null,
in EPTF_CommPort_IPL4_InterfaceInformationList pl_interfaceInformationList := {},
in EPTF_HTTP_listenSocketEvent_FT pl_listenSocketEvent := null,
in EPTF_HTTP_listenSocketError_FT pl_listenSocketError := null)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (v_EPTF_HTTP_LocalTransport_initialized)
{
log(%definitionId & // intentionally simple log
": The HTTP LocalTransport component already initialized!");
return -1;
}
v_EPTF_HTTP_LocalTransport_selfName := pl_selfName
f_EPTF_Logging_init_CT(pl_selfName);
v_EPTF_HTTP_Transport_loggingMaskId :=
f_EPTF_Logging_registerComponentMasks(
tsp_EPTF_HTTP_Transport_loggingComponentMask,
c_EPTF_HTTP_Transport_loggingEventClasses,
EPTF_Logging_CLL);
if (tsp_EPTF_HTTP_Transport_loggingEnable)
{
f_EPTF_Logging_enableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_Debug);
}
else
{
f_EPTF_Logging_disableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_Debug);
}
if (tsp_EPTF_HTTP_Transport_bufferLogEnable)
{
f_EPTF_Logging_enableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_BufferDebug);
}else
{
f_EPTF_Logging_disableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_BufferDebug);
}
vf_getGroupAndPort := refers(f_EPTF_HTTP_LocalTransport_getGroupAndPort_default);
vf_getGroup := refers(f_EPTF_HTTP_LocalTransport_getGroup_default);
vf_EPTF_HTTP_LocalTransport_receive := pl_receiveFunction;
vf_EPTF_HTTP_LocalTransport_eventReceive := pl_eventReceiveFunction;
vf_EPTF_HTTP_LocalTransport_socketErrorReceive := pl_socketErrorReceiveFunction;
vf_EPTF_HTTP_LocalTransport_listenSocketEvent := pl_listenSocketEvent;
vf_EPTF_HTTP_LocalTransport_listenSocketError := pl_listenSocketError;
f_EPTF_CommPort_IPL4_init(pl_interfaceInformationList,true);
f_EPTF_CommPort_IPL4_setReceive(
{ asp_RecvFrom := ? },refers(f_EPTF_HTTP_LocalTransport_receiveMessage), pl_selfName);
f_EPTF_CommPort_IPL4_setReceive(
{ asp_Event := ? },refers(f_EPTF_HTTP_LocalTransport_receiveEvent), pl_selfName);
f_EPTF_CommPort_IPL4_activateDefaultBufferingHandler(pl_selfName);
f_EPTF_CommPort_IPL4_setMsgLen(-1,
refers(f_EPTF_HTTP_LocalTransport_getMessageLength), {});
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_groupQueue);
f_EPTF_int2int_HashMap_Init();
f_EPTF_str2int_HashMap_Init();
v_EPTF_HTTP_Transport_groupName2Idx_HM :=
f_EPTF_str2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_groupName2Idx);
v_EPTF_HTTP_Transport_functions2Idx_HM :=
f_EPTF_str2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_fnGrp2Idx);
v_EPTF_HTTP_Transport_localHostHashMap :=
f_EPTF_str2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_localHost);
v_EPTF_HTTP_Transport_remoteHostHashMap :=
f_EPTF_str2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_remoteHost);
v_EPTF_HTTP_Transport_connId2GroupId_HM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_connId2PortGrp);
v_EPTF_HTTP_Transport_connId2PortId_HM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_connId2Port);
v_EPTF_HTTP_Transport_sessId2PortId_HM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_sessId2Port);
v_EPTF_HTTP_Transport_portId2Idx_HM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_portId2Idx);
f_EPTF_Base_init_CT(pl_selfName);
f_EPTF_Base_registerCleanup(refers(f_EPTF_HTTP_LocalTransport_cleanup_CT));
if (tsp_EPTF_HTTP_Transport_messageBufferEnable == true) {
f_EPTF_MessageBufferManager_init_CT();
}
v_EPTF_HTTP_LocalTransport_initialized := true;
f_EPTF_HTTP_Transport_debug(%definitionId & "The initialization of the " &
"HTTP LocalTransport component is ready");
return 1;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_cleanup_CT
//
// Purpose:
// Function to clean The LocalTransport component
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_cleanup_CT()
runs on EPTF_HTTP_LocalTransport_CT
{
if (not v_EPTF_HTTP_LocalTransport_initialized) {
return;
}
v_EPTF_HTTP_LocalTransport_initialized:= false;
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
vf_EPTF_HTTP_LocalTransport_receive := null;
vf_EPTF_HTTP_LocalTransport_eventReceive := null;
vf_EPTF_HTTP_LocalTransport_socketErrorReceive := null
v_EPTF_HTTP_LocalTransport_loggingEnabled := -1;
// delate all ports and port groups
var integer vl_group;
while (f_EPTF_FBQ_getBusyHeadIdx(vl_group, v_EPTF_HTTP_Transport_groupQueue)) {
f_EPTF_HTTP_LocalTransport_deletePortGroup(vl_group);
}
f_EPTF_str2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_groupName2Idx);
f_EPTF_str2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_fnGrp2Idx);
f_EPTF_str2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_localHost);
f_EPTF_str2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_remoteHost);
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_connId2PortGrp);
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_connId2Port);
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_sessId2Port);
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_portId2Idx);
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_groupQueue);
f_EPTF_HTTP_Transport_debug(%definitionId &
": The cleanup of the LocalTransport component is ready");
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_newPortGroup
//
// Purpose:
// Function to create a new port group
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group data
// - pl_portmode - *in* *boolean* - port mode / group mode selector
//
// Return Value:
// *integer* - index of the new port group if creation successful,
// otherwise -1
//
// Errors:
// -
//
// Detailed Comments:
// Function creats a new port group based on the given port group data.
// This includes creation of port database objects within the group
// and optionally open ports (based on port group data)
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_newPortGroup(
in EPTF_HTTP_Transport_GroupMode pl_group,
in boolean pl_portmode := false)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var charstring vl_groupName := "";
var integer i, vl_dummy, vl_fGIdx, vl_newGrpIdx;
vl_newGrpIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_groupQueue);
f_EPTF_HTTP_Transport_debug(%definitionId &
": New group index: " & int2str(vl_newGrpIdx));
// if group name not presented a unique one is generated
if (not ispresent(pl_group.name) or pl_group.name == "") {
vl_groupName := f_EPTF_HTTP_LocalTransport_createUniqueGroupName(
v_EPTF_HTTP_LocalTransport_selfName);
}
// if group name presented, then it must be unique
else {
vl_groupName := pl_group.name;
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_groupName2Idx_HM,
vl_groupName, vl_dummy))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Group name: " & vl_groupName & " is not unique!");
return -1;
}
}
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_newGrpIdx, v_EPTF_HTTP_Transport_groupQueue); // only if name unique
// insert new group index into group name - group index hashmap
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_groupName2Idx_HM,
vl_groupName, vl_newGrpIdx);
// set group database
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx] := c_HTTP_Transport_initPortGroup;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].name := vl_groupName;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].localportStep := pl_group.localportStep;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].remoteportStep := pl_group.remoteportStep;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].baseLocalHostInformation := pl_group.localHostInformation;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].baseRemoteHostInformation := pl_group.remoteHostInformation;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].useSSL := pl_group.useSSL; // FIXME
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].instantConnOpen := pl_group.instantConnOpen;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].instantConnClose := pl_group.instantConnClose;
// overdefine functionality if user functions are presented
if (ispresent(pl_group.userFunctions))
{
vl_fGIdx := f_EPTF_HTTP_LocalTransport_registerGroupFunctions(
vl_newGrpIdx, pl_portmode, pl_group.userFunctions);
} else
{
vl_fGIdx := f_EPTF_HTTP_LocalTransport_registerGroupFunctions(
vl_newGrpIdx, pl_portmode, c_EPTF_HTTP_initUserFunctions);
}
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].defaultFIdx := vl_fGIdx;
// init queues
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].portQueue);
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].portStateQueue);
// add group (and open ports if necessary)
var boolean vl_success := true;
for (i := 0; i < pl_group.numberOfPorts; i:= i + 1) {
if (not v_EPTF_HTTP_Transport_functionDB[vl_fGIdx].addPort.apply(vl_newGrpIdx)) {
vl_success := false;
i := pl_group.numberOfPorts;
}
}
// evaluate result
if (vl_success)
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Group added successfully: " &
int2str(vl_newGrpIdx) & " - " & v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].name);
return vl_newGrpIdx;
}
else
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Group addition unsuccessful: " &
int2str(vl_newGrpIdx) & " - " & v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].name);
f_EPTF_HTTP_LocalTransport_deletePortGroup(vl_newGrpIdx);
return -1;
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_deletePortGroup
//
// Purpose:
// Function to delete an existing port group
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Function deletes a port group based on the given port group index.
// This includes closure and deletion of ports within the port group.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_deletePortGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_fGrpIdx := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx;
// remove prots
while (v_EPTF_HTTP_Transport_functionDB[vl_fGrpIdx].removePort.apply(pl_group)) { };
for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase); i := i + 1)
{
if (omit != v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].messageBuffer)
{
f_EPTF_HTTP_MsgBuffer_erase(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].messageBuffer, i);
}
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].messageBuffer := omit;
}
// remove name
f_EPTF_str2int_HashMap_Erase(v_EPTF_HTTP_Transport_groupName2Idx_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].name);
// unset database
v_EPTF_HTTP_Transport_portDB[pl_group] := c_HTTP_Transport_initPortGroup;
// free group in FBQ
f_EPTF_FBQ_moveFromBusyToFreeTail(pl_group, v_EPTF_HTTP_Transport_groupQueue);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Group deleted successfully: " &
int2str(pl_group));
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_newPort
//
// Purpose:
// Function to create a new port group object
//
// Parameters:
// - pl_portInfo - *in* <EPTF_HTTP_Transport_PortMode> - port data
//
// Return Value:
// *integer* - index of the new port group
//
// Errors:
// -
//
// Detailed Comments:
// Function creats a new port based on the given port data.
// It optionally opens the port (based on port group data)
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_newPort(
in EPTF_HTTP_Transport_PortMode pl_portInfo)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_group;
var EPTF_HTTP_Transport_GroupMode vl_groupInfo;
// convert port to group
vl_groupInfo := {
name := pl_portInfo.name,
localHostInformation := pl_portInfo.localHostInformation,
remoteHostInformation := pl_portInfo.remoteHostInformation,
numberOfPorts := 1,
localportStep := 0,
remoteportStep := 0,
instantConnOpen := pl_portInfo.instantConnOpen,
instantConnClose := pl_portInfo.instantConnClose,
useSSL := pl_portInfo.useSSL,
userFunctions := pl_portInfo.userFunctions
};
vl_group := f_EPTF_HTTP_LocalTransport_newPortGroup(vl_groupInfo, true);
if (vl_group != -1)
{
var EPTF_HTTP_Transport_Function vl_funcs := v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx];
vl_funcs.addPort := refers(f_EPTF_HTTP_LocalTransport_addRemovePortToGroup_dummy);
//vl_funcs.addPort := refers(f_EPTF_HTTP_LocalTransport_addRemovePortToGroup_dummy);
// function database index must be updated!!
var integer vl_index;
// creates a hash map key from the function group
var charstring vl_key := log2str(vl_funcs)
// if function group is already existing, then return id
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index))
{
v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx := vl_index;
}
else {
// if function group was not existing, then add new element
vl_index := sizeof(v_EPTF_HTTP_Transport_functionDB);
f_EPTF_HTTP_Transport_debug(%definitionId & ": New database index: " & int2str(vl_index) &
" for functions: " & vl_key);
v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx := vl_index;
v_EPTF_HTTP_Transport_functionDB[vl_index] := vl_funcs;
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Functions are registered to group (" &
int2str(vl_group) & " - " & v_EPTF_HTTP_Transport_portDB[vl_group].name & ": " & vl_key &
" at position " & int2str(vl_index) & " in function database!");
}
f_EPTF_HTTP_Transport_debug(%definitionId & ": Port created (" &
int2str(vl_group) & ") - " & v_EPTF_HTTP_Transport_portDB[vl_group].name);
}
else {
f_EPTF_HTTP_Transport_debug(%definitionId & ": Port not created!");
}
return vl_group;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_newServerPort
//
// Purpose:
// Function to create a new server port group
//
// Parameters:
// - pl_portInfo - *in* <EPTF_HTTP_Transport_ServerPortMode> - port mode / group mode selector
//
// Return Value:
// *integer* - index of the new port group if creation successful,
// otherwise -1
//
// Errors:
// -
//
// Detailed Comments:
// Function creats a new port group based on the given port group data.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_newServerPort(
in EPTF_HTTP_Transport_ServerPortMode pl_portInfo)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_newGrpIdx := -1;
v_boolNoWarning := f_EPTF_HTTP_LocalTransport_createServerPort(pl_portInfo, vl_newGrpIdx)
return vl_newGrpIdx;
}
function f_EPTF_HTTP_LocalTransport_createServerPort(
in EPTF_HTTP_Transport_ServerPortMode pl_portInfo,
inout integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_fGIdx, vl_newGrpIdx;
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_groupName2Idx_HM,
pl_portInfo.name, pl_groupId))
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Server group already exists.");
return false;
}
vl_newGrpIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_groupQueue);
f_EPTF_HTTP_Transport_debug(%definitionId &
": New group index: " & int2str(vl_newGrpIdx));
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_newGrpIdx, v_EPTF_HTTP_Transport_groupQueue);
// insert new group index into group name - group index hashmap
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_groupName2Idx_HM,
pl_portInfo.name, vl_newGrpIdx);
// set group database
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx] := c_HTTP_Transport_initPortGroup;
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].portQueue);
f_EPTF_FBQ_initFreeBusyQueue(v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].portStateQueue);
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].name := pl_portInfo.name;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].baseLocalHostInformation := pl_portInfo.localHostInformation;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].instantConnClose := pl_portInfo.instantConnClose;
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].buffer := pl_portInfo.buffer;
if(ispresent(pl_portInfo.useSSL) and pl_portInfo.useSSL) {
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].useSSL := true;
}
else {
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].useSSL := false;
}
// overdefine functionality if user functions are presented
if (ispresent(pl_portInfo.userFunctions))
{
vl_fGIdx := f_EPTF_HTTP_LocalTransport_registerServerGroupFunctions(
vl_newGrpIdx, pl_portInfo.userFunctions);
} else
{
vl_fGIdx := f_EPTF_HTTP_LocalTransport_registerServerGroupFunctions(
vl_newGrpIdx, c_EPTF_HTTP_initServerUserFunctions);
}
v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].defaultFIdx := vl_fGIdx;
f_EPTF_HTTP_Transport_debug(%definitionId & ": Group added successfully: " &
int2str(vl_newGrpIdx) & " - " & v_EPTF_HTTP_Transport_portDB[vl_newGrpIdx].name);
pl_groupId := vl_newGrpIdx;
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_deletePort
//
// Purpose:
// Function to delete an existing port
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Function deletes a port group based on the given port group index.
// This includes closure and deletion of ports within the port group.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_deletePort(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
f_EPTF_HTTP_LocalTransport_deletePortGroup(pl_group);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Port deleted (" &
int2str(pl_group) & ") - " & v_EPTF_HTTP_Transport_portDB[pl_group].name);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_addPortToGroup_default
//
// Purpose:
// Function to add a single port to an existing port group
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group index
//
// Return Value:
// *boolean* - result of the operation
//
// Errors:
// -
//
// Detailed Comments:
// The new port added to the port group will be created according to
// port group data. Set local and remote IP addresses won't be changed,
// but local and remote ports will be calculated according to:
// (<number of ports in port group> + 1) * (<local/remote port step>).
//
// Addition of new port optionally opens connection on port group data
// to which the port is added (if instant connection open is enabled,
// then ports won't be opened, otherwise they will be).
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_addPortToGroup_default(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
var EPTF_HTTP_HostInformation vl_lhostInformation, vl_rhostInformation;
var integer vl_lhIdx, vl_rhIdx, vl_fbqIdx;
f_EPTF_FBQ_createFreeSlots(1, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
vl_fbqIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
//vl_fbqStateIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
//f_EPTF_Base_assert(%definitionId & "FBQ index mismatch", vl_fbqIdx == vl_fbqStateIdx);
//f_EPTF_FBQ_setQueueDidx(vl_fbqStateIdx, {vl_fbqIdx}, v_EPTF_HTTP_Transport_portDB[pl_portGrpIdx].portStateQueue);
// calculate next port data according (local)
vl_lhostInformation := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation;
vl_lhostInformation.hostPort := vl_lhostInformation.hostPort +
v_EPTF_HTTP_Transport_portDB[pl_group].localportStep * v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts;
vl_lhIdx := f_EPTF_HTTP_LocalTransport_addLocalHostInformation(vl_lhostInformation);
// calculate next port data according (remote)
vl_rhostInformation := v_EPTF_HTTP_Transport_portDB[pl_group].baseRemoteHostInformation;
vl_rhostInformation.hostPort := vl_rhostInformation.hostPort +
v_EPTF_HTTP_Transport_portDB[pl_group].remoteportStep * v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts;
vl_rhIdx := f_EPTF_HTTP_LocalTransport_addRemoteHostInformation(vl_rhostInformation);
// set port data to port info database
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx] := c_EPTF_HTTP_LocalTransport_initPortInfo;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].groupIndex := pl_group; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portIndex := vl_fbqIdx; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].localhostInfoIdx := vl_lhIdx;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].remotehostInfoIdx := vl_rhIdx;
f_EPTF_HTTP_Transport_debug(%definitionId & ": New port added to " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_fbqIdx));
// InstantConnOpen == true means that a send request on the group will
// automatically trigger a port open -> this case no ports are opened
// initially, otherwise ports are opened previosly
if (not v_EPTF_HTTP_Transport_portDB[pl_group].instantConnOpen)
{
if (not f_EPTF_HTTP_LocalTransport_openPortInGroup(pl_group, vl_fbqIdx)) {
return false;
}
}
// move to busy (only if everything was previously successful)
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_fbqIdx,
v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
// administrate new port opening
v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts := v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts + 1;
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_removePortFromGroup_default
//
// Purpose:
// Function to remove a single port from an existing port group
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group index
//
// Return Value:
// *boolean* - result of the operation
//
// Errors:
// -
//
// Detailed Comments:
// The port which is choosen to be removed is the first one added to
// the port group from which the port is removed.
//
// If the port has an open connection, then the connection will be closed.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_removePortFromGroup_default(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
var EPTF_HTTP_Transport_ConnectionState vl_state;
var integer vl_connId, vl_busyHeadIdx := -1;
// the first removed port is the oldest one (busy head)
if (f_EPTF_FBQ_getBusyHeadIdx(vl_busyHeadIdx, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue))
{
vl_connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_busyHeadIdx].connectionId;
vl_state := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_busyHeadIdx].state;
// when port removed, it must be closed
// it can be closed if connId != -1 and state is OPENING/OPENED/HALFCLOSED
f_EPTF_Base_assert(%definitionId & ": Invalid state of port in " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_busyHeadIdx),
vl_connId != -1 or vl_state == IDLE);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Removing port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_busyHeadIdx));
if (vl_connId != -1)
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Closing connection on port " &
"to be removed!");
// close port
f_EPTF_HTTP_Transport_closePortInGroup(pl_group, vl_busyHeadIdx);
}
// deleted port will be allocated again (if necessary) at last time (free tail)
f_EPTF_FBQ_moveFromBusyToFreeTail(vl_busyHeadIdx,
v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_busyHeadIdx] := c_EPTF_HTTP_LocalTransport_initPortInfo;
v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts := v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts - 1;
return true;
}
//else
//{
// f_EPTF_HTTP_Transport_warning(%definitionId &
// ": No more ports to remove from group: " &
// int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name);
//
return false;
//}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_removePortFromGroupServer_default
//
// Purpose:
// Function to remove a single port from an existing server port group
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group index
//
// Return Value:
// *boolean* - result of the operation
//
// Errors:
// -
//
// Detailed Comments:
// The port which is choosen to be removed is the first one added to
// the port group from which the port is removed.
//
// If the port has an open connection, then the connection will be closed.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_removePortFromGroupServer_default(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
var integer vl_busyHeadIdx := -1;
if (f_EPTF_FBQ_getBusyHeadIdx(vl_busyHeadIdx, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue))
{
f_EPTF_HTTP_LocalTransport_removeServerPort(pl_group, vl_busyHeadIdx);
return true;
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_addRemovePortToGroup_dummy
//
// Purpose:
// Dummy function to disable add/remove port
//
// Parameters:
// - pl_group - *in* <EPTF_HTTP_Transport_GroupMode> - group index
//
// Return Value:
// *boolean* - result of the operation
//
// Errors:
// -
//
// Detailed Comments:
// Application of this function can disable addition or deletion of
// new ports from port group
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_addRemovePortToGroup_dummy(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
f_EPTF_HTTP_Transport_warning(%definitionId &
": Cannot add/remove ports to port groups created in Port mode");
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultGroup
//
// Purpose:
// Function to select a port in the group on which user intends to perform
// an send operation
//
// Parameters:
// - pl_group - *in* *integer* - group index
//
// Return Value:
// *integer* - index of the selected port within the port group
//
// Errors:
// -
//
// Detailed Comments:
// State of ports within a port group are maintained. If someone sends
// an a port, its state is busy for further send. This function selects
// a port within the port group that is not busy for sending.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return -1; };
var integer vl_nextFreePortIdx;
if (f_EPTF_FBQ_getFreeTailIdx(vl_nextFreePortIdx, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue))
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Selected port is " &
int2str(vl_nextFreePortIdx) & " for group: " & int2str(pl_group));
return vl_nextFreePortIdx;
}
f_EPTF_HTTP_Transport_warning(%definitionId & ": Port selection unsuccessful"
& " for group: " & int2str(pl_group));
return -1;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultPort
//
// Purpose:
// Function to select a port in the group on which user intends to perform
// an send operation.
//
// Parameters:
// - pl_group - *in* *integer* - group index
//
// Return Value:
// *integer* - index of the selected port within the port group
//
// Errors:
// -
//
// Detailed Comments:
// The function is the default function for port operation mode and
// therefore it will always provide port 0 as in port operation mode
// only one port is located within the port group.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultPort(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_FBQ_itemIsBusy(pl_group, v_EPTF_HTTP_Transport_groupQueue)) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Group already deleted: " &
int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name);
return -1;
}
if (f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Already sending " &
"group: " & int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name);
return -1;
}
f_EPTF_HTTP_Transport_debug(%definitionId & ": Selected port is 0" &
" for group: " & int2str(pl_group));
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_getGroupAndPort_defaultGroup
//
// Purpose:
// Function to acquire port and group index for a connection id
//
// Parameters:
// - pl_connId - *in* *integer* - connection id
// - pl_group - *in* *integer* - port group index
// - pl_port - *in* *integer* - port index within the group id
//
// Return Value:
// *boolean* - true if group and port index successfully retrieved
//
// Errors:
// -
//
// Detailed Comments:
// Default function for group operation mode
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_getGroupAndPort_default(
in integer pl_connId,
inout integer pl_group,
inout integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_connId2GroupId_HM,
pl_connId, pl_group))
{
if (f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_connId2PortId_HM,
pl_connId, pl_port))
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Connection id mapped " &
" to port: " & int2str(pl_port) & " and group: " & int2str(pl_group));
return true;
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection id was " &
"not found in Connection id to port id hash map. Message dropped!");
pl_group := -1; pl_port := -1;
return false;
}
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection id was " &
"not found in Connection id to group id hash map. Message dropped!");
pl_group := -1; pl_port := -1;
return false;
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_getGroup_default
//
// Purpose:
// Function to acquire group index for a connection id
//
// Parameters:
// - pl_connId - *in* *integer* - connection id
// - pl_groupId - *inout* *integer* - port group index
//
// Return Value:
// *boolean* - true if group index is successfully retrieved
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_getGroup_default(
in integer pl_connId,
inout integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_connId2GroupId_HM,
pl_connId, pl_groupId))
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection id "& int2str(pl_connId) &" was " &
"not found in Connection id to group id hash map. Message dropped!");
pl_groupId := -1
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendMessage_default_IC
//
// Purpose:
// Function to send message and open connection instantly
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_sessionId - *in* *integer* - unique session id of current send
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// The function selects a port within the port group which it has
// been applied to, then tries to open the port's connection instantly. If
// both of these operations have finished successfully, finally sends
// the message.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendMessage_default_IC(
in integer pl_group,
in integer pl_sessionId,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_port :=
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx].selectPort.apply(pl_group);
if (vl_port == -1)
{
if (tsp_EPTF_HTTP_Transport_messageBufferEnable == false) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": No more free ports available!");
}
else {
f_EPTF_MessageBufferManager_setMessageToBuffer(pl_msg, int2str(pl_sessionId), pl_group);
}
}
else
{
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state != IDLE and v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state != OPENED)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection is not in Idle state, state: " &
log2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state));
}
else
{
if (f_EPTF_FBQ_itemIsBusy(vl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue)) {
var EPTF_HTTP_HostInformation vl_local, vl_remote;
vl_local := v_EPTF_HTTP_Transport_localHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].localhostInfoIdx];
vl_remote := v_EPTF_HTTP_Transport_remoteHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].remotehostInfoIdx];
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].sessionId := pl_sessionId;
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state == OPENED or f_EPTF_HTTP_LocalTransport_openPortInGroup(pl_group, vl_port))
//if (v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx].openPort.apply(pl_group))
{
v_EPTF_HTTP_Transport_OutgoingMessage := { asp_Send := {
connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].connectionId,
proto := {tcp:= {}},
msg := pl_msg
} };
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, true, v_EPTF_HTTP_LocalTransport_selfName);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Send result is " &
log2str(v_resultNoWarning));
if ((not ispresent(v_resultNoWarning.errorCode)) or
(v_resultNoWarning.errorCode == ERROR_TEMPORARILY_UNAVAILABLE) or
(v_resultNoWarning.errorCode == ERROR_AVAILABLE) )
{
if (ispresent(v_resultNoWarning.errorCode) and (v_resultNoWarning.errorCode != ERROR_TEMPORARILY_UNAVAILABLE)) {
f_EPTF_HTTP_Transport_warning(%definitionId &
": f_EPTF_CommPort_IPL4_send error code: " &
log2str(v_resultNoWarning.errorCode));
}
// move to busy if sending on port
if (not f_EPTF_FBQ_itemIsBusy(vl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_sessId2PortId_HM,
pl_sessionId,
vl_port);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Message sent on " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_port) &
": " & log2str(pl_msg));
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Send message unsuccessful!" &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_port));
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].sessionId := -1;
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
pl_sessionId,
v_resultNoWarning});
}
}
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Instant connection opening unsuccessful for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_port));
}
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Sending on port which has already been removed!" &
int2str(pl_group) & " / " & int2str(vl_port));
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendMessage_default_NIC
//
// Purpose:
// Function to send message and open connection instantly
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_sessionId - *in* *integer* - unique session id of current send
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// The function selects a port within the port group which it has
// been applied to, then tries to send the message.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendMessage_default_NIC(
in integer pl_group,
in integer pl_sessionId,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_port :=
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx].selectPort.apply(pl_group);
if (vl_port == -1)
{
if (tsp_EPTF_HTTP_Transport_messageBufferEnable == false) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": No more free ports available");
}
else {
f_EPTF_MessageBufferManager_setMessageToBuffer(pl_msg, int2str (pl_sessionId), pl_group);
}
}
else {
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state != OPENED)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection is not opened, state: " &
log2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].state));
}
else
{
v_EPTF_HTTP_Transport_OutgoingMessage := { asp_Send := {
connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].connectionId,
proto := {tcp:= {}},
msg := pl_msg
} };
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, true, v_EPTF_HTTP_LocalTransport_selfName);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Send result is " &
log2str(v_resultNoWarning));
if (not ispresent(v_resultNoWarning.errorCode) or ((v_resultNoWarning.errorCode == ERROR_TEMPORARILY_UNAVAILABLE) or (v_resultNoWarning.errorCode == ERROR_AVAILABLE)))
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].sessionId := pl_sessionId
// move to busy if sending on port
if (not f_EPTF_FBQ_itemIsBusy(vl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_sessId2PortId_HM,
pl_sessionId,
vl_port);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Message sent on " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_port) &
": " & log2str(pl_msg));
}
else {
f_EPTF_HTTP_Transport_debug(%definitionId &
": Send message unsuccessful!" &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_port));
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
pl_sessionId,
v_resultNoWarning});
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendResponse_default_IC
//
// Purpose:
// Function to send a response and close connection instantly
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_portId - *in* *integer* - unique port id to send the request
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendResponse_default_IC(
in integer pl_group,
in integer pl_portId,
in integer pl_seqNum,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_port := -1;
if (not f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_portId2Idx_HM, pl_portId, vl_port))
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Could not find port identifier!" &
log2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase));
return;
}
if (f_EPTF_HTTP_Transport_sendResponse(pl_group, vl_port, pl_msg))
{
var integer vl_fGIdx := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx;
v_EPTF_HTTP_Transport_functionDB[vl_fGIdx].removeIncomingConn.apply(pl_group, vl_port);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendResponse_default_NIC
//
// Purpose:
// Function to send a response.
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_portId - *in* *integer* - unique port id to send the request
// - pl_seqNum - *in* *integer* - sequence number of the response
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendResponse_default_NIC(
in integer pl_group,
in integer pl_portId,
in integer pl_seqNum,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_port := -1;
if (not f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_portId2Idx_HM, pl_portId, vl_port))
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Could not find port identifier!" &
log2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase));
return;
}
if (-1 == pl_seqNum)
{
v_boolNoWarning := f_EPTF_HTTP_Transport_sendResponse(pl_group, vl_port, pl_msg);
return;
}
var integer vl_headIdx :=
f_EPTF_HTTP_RingBuffer_getHeadIdx(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums);
var integer vl_messageIdx := -1;
f_EPTF_HTTP_RingBuffer_setElementBusy(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums,
pl_seqNum
);
if (pl_seqNum == vl_headIdx)
{
v_boolNoWarning := f_EPTF_HTTP_Transport_sendResponse(pl_group, vl_port, pl_msg);
if (not v_boolNoWarning)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Error while sending buffered responses, clearing buffer.");
f_EPTF_HTTP_MsgBuffer_clear(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer);
return;
}
f_EPTF_HTTP_RingBuffer_freeHead(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums);
while(f_EPTF_HTTP_RingBuffer_isHeadBusy(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums))
{
//send buffered message
vl_headIdx :=
f_EPTF_HTTP_RingBuffer_getHeadIdx(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums);
if (f_EPTF_int2int_HashMap_Find(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNum2messageIdxHM,
vl_headIdx,
vl_messageIdx) and
f_EPTF_FBQ_itemIsBusy(
vl_messageIdx,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.messageQueue))
{
if (f_EPTF_HTTP_Transport_sendResponse(
pl_group,
vl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.httpMessages[vl_messageIdx]))
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.httpMessages[vl_messageIdx] := ''O;
f_EPTF_FBQ_moveFromBusyToFreeHead(
vl_messageIdx,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.messageQueue);
f_EPTF_int2int_HashMap_Erase(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNum2messageIdxHM,
vl_headIdx);
f_EPTF_HTTP_RingBuffer_freeHead(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNums);
continue;
}
f_EPTF_HTTP_MsgBuffer_clear(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer);
f_EPTF_HTTP_Transport_warning(%definitionId & ": Error while sending buffered responses, clearing buffer.");
return;
}else{
f_EPTF_HTTP_MsgBuffer_clear(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer);
f_EPTF_HTTP_Transport_warning(%definitionId & ": Inconsistency in message buffer!");
}
}
}else{
//store message
var integer vl_idx := -1;
if (f_EPTF_int2int_HashMap_Find(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNum2messageIdxHM,
pl_seqNum,
vl_idx))
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Re-using slot! Replacing old message with new.");
}else
{
vl_idx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.messageQueue);
f_EPTF_FBQ_moveFromFreeToBusyTail(
vl_idx,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.messageQueue);
f_EPTF_int2int_HashMap_Insert(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.seqNum2messageIdxHM,
pl_seqNum,
vl_idx)
}
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].messageBuffer.httpMessages[vl_idx] := pl_msg;
}
f_EPTF_HTTP_printBufferStatus(pl_group, vl_port);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_sendResponse
//
// Purpose:
// Sends the response.
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_sendResponse(
in integer pl_group,
in integer pl_port,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
var ProtoTuple vl_proto := {tcp:= {}};
if(v_EPTF_HTTP_Transport_portDB[pl_group].useSSL){
vl_proto := {ssl:= {}}
}
v_EPTF_HTTP_Transport_OutgoingMessage := { asp_Send := {
connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId,
proto := vl_proto,
msg := pl_msg
} };
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, true, v_EPTF_HTTP_LocalTransport_selfName);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Send result is " &
log2str(v_resultNoWarning));
if (ispresent(v_resultNoWarning.errorCode))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Send message unsuccessful!" &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port) & " " &
log2str(v_resultNoWarning));
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portId,
v_resultNoWarning});
}
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveMessage_default_IC
//
// Purpose:
// Function to receive message and close connection instantly
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_msg - *in* *octetstring* - encoded message to be sent
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// The function administrates port state and then calls the real
// message handler
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveMessage_default_IC(
in integer pl_group,
in integer pl_port,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_sessId2PortId_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId);
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state == IDLE)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Port already closed " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port));
return;
}
else
{
f_EPTF_HTTP_Transport_closePortInGroup(pl_group, pl_port);
//v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := IDLE;
//v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId := -1;
//f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2GroupId_HM, pl_conn);
//f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2PortId_HM, pl_conn);
// deleted port will be allocated again (if necessary) at last time (free tail)
//f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
// administrate as IDLE port
//if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
// f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
//}
}
var integer vl_temp := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId;
// delete session id only after handle receive message
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId := -1;
if (vf_EPTF_HTTP_LocalTransport_receive != null) {
vf_EPTF_HTTP_LocalTransport_receive.apply({
pl_group,
vl_temp,
-1,
pl_msg});
}
if (tsp_EPTF_HTTP_Transport_messageBufferEnable == true) {
var octetstring vl_message;
var charstring vl_sessionId;
if (f_EPTF_MessageBufferManager_getMessageFromBuffer(pl_group, vl_message, vl_sessionId)) {
if (lengthof (vl_message) > 0) {
f_EPTF_HTTP_LocalTransport_sendMessage_default_IC(pl_group, str2int(vl_sessionId), vl_message);
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveMessage_default_NIC
//
// Purpose:
// Function to handle message recpetion
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_msg - *in* *octetstring* - the received encoded message
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// The function closes the port connection on which the message has
// arrived and then calls the real message handler
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveMessage_default_NIC(
in integer pl_group,
in integer pl_port,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_sessId2PortId_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId);
// administrate as IDLE port
if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
var integer vl_temp := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId;
if (vf_EPTF_HTTP_LocalTransport_receive != null) {
vf_EPTF_HTTP_LocalTransport_receive.apply({
pl_group,
vl_temp,
-1,
pl_msg});
}
if (tsp_EPTF_HTTP_Transport_messageBufferEnable == true) {
var octetstring vl_message;
var charstring vl_sessionId;
if (f_EPTF_MessageBufferManager_getMessageFromBuffer(pl_group, vl_message, vl_sessionId)) {
if (lengthof (vl_message) > 0) {
f_EPTF_HTTP_LocalTransport_sendMessage_default_NIC(pl_group, str2int(vl_sessionId), vl_message);
}
}
}
// session id cannot be deleted if connection stayed open
//v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId := -1;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveMessageServer_default
//
// Purpose:
// Function to handle message recpetion
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_msg - *in* *octetstring* - the received encoded message
//
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveMessageServer_default(
in integer pl_group,
in integer pl_port,
in octetstring pl_msg)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer vl_seqNum := -1;
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].buffer)
{
vl_seqNum := f_EPTF_HTTP_RingBuffer_getNext(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer.seqNums);
if (-1 == vl_seqNum)
{
f_EPTF_HTTP_Transport_warning(log2str(%definitionId &
": Dropping message: ", pl_msg));
return;
}
f_EPTF_HTTP_printBufferStatus(pl_group, pl_port);
}
if (vf_EPTF_HTTP_LocalTransport_receive != null) {
vf_EPTF_HTTP_LocalTransport_receive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portId,
vl_seqNum,
pl_msg});
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveEvent_default
//
// Purpose:
// Function to handle event reception
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_type - *in* *integer* - event type
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveEvent_default(
in integer pl_group,
in integer pl_port,
in integer pl_type)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
select (pl_type)
{
case (c_EPTF_HTTP_inputIdx_connectionOpened)
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection opened received");
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := OPENED;
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
pl_type});
}
return;
}
case (c_EPTF_HTTP_inputIdx_connectionClosed)
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection closed received");
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state != IDLE)
{
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2GroupId_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId);
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2PortId_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := IDLE;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId := -1;
// deleted port will be allocated again (if necessary) at last time (free tail)
//f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
// administrate as IDLE port
if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
}
else { // receivemessage_default_IC can result in this state
//f_EPTF_HTTP_Transport_warning(%definitionId &
// ": Connection already closed");
}
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
pl_type});
}
return;
}
case (c_EPTF_HTTP_inputIdx_OKReceived) {
f_EPTF_HTTP_Transport_debug(%definitionId &
": OK message received");
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
pl_type});
}
return;
}
case (c_EPTF_HTTP_inputIdx_errorReceived) {
f_EPTF_HTTP_Transport_debug(%definitionId &
": Error message received");
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
v_EPTF_CommPort_IPL4_aspEvent.result});
}
return;
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveEventServer_default
//
// Purpose:
// Function to handle event reception in a server group.
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
// - pl_type - *in* *integer* - event type
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveEventServer_default(
in integer pl_group,
in integer pl_port,
in integer pl_type)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
select (pl_type)
{
case (c_EPTF_HTTP_inputIdx_connectionOpened)
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection opened received");
var integer vl_fGIdx := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx;
var integer vl_port := -1;
if (v_EPTF_HTTP_Transport_functionDB[vl_fGIdx].createIncomingConn.apply(pl_group,
v_EPTF_CommPort_IPL4_aspEvent.connOpened,
vl_port))
{
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].portId,
pl_type});
}
}
return;
}
case (c_EPTF_HTTP_inputIdx_connectionClosed)
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection closed received");
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portId,
pl_type});
}
var integer vl_fGIdx := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx;
var integer vl_connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := CLOSED;
f_EPTF_HTTP_Transport_socketClosed(vl_connId);
v_EPTF_HTTP_Transport_functionDB[vl_fGIdx].removeIncomingConn.apply(pl_group, pl_port);
return;
}
case (c_EPTF_HTTP_inputIdx_OKReceived) {
f_EPTF_HTTP_Transport_debug(%definitionId &
": OK message received");
if (LISTENING_PORT == v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portType)
{
if (vf_EPTF_HTTP_LocalTransport_listenSocketEvent != null) {
vf_EPTF_HTTP_LocalTransport_listenSocketEvent.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation,
pl_type});
}
}else
{
if (vf_EPTF_HTTP_LocalTransport_eventReceive != null) {
vf_EPTF_HTTP_LocalTransport_eventReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
pl_type});
}
}
return;
}
case (c_EPTF_HTTP_inputIdx_errorReceived) {
f_EPTF_HTTP_Transport_debug(%definitionId &
": Error message received");
if (LISTENING_PORT == v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portType)
{
if (vf_EPTF_HTTP_LocalTransport_listenSocketError != null) {
vf_EPTF_HTTP_LocalTransport_listenSocketError.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation,
v_EPTF_CommPort_IPL4_aspEvent.result});
}
}else
{
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
v_EPTF_CommPort_IPL4_aspEvent.result});
}
}
return;
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closePortOfUser_default
//
// Purpose:
// Function to close the port of an HTTP user free
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_sessionId - *in* *integer* - session id
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// An HTTP user is identified internally with a unique session id.
// If the HTTP user sends on a port of a port group, it can close the
// connection of its port group
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closePortOfUser_default(
in integer pl_group,
in integer pl_sessionId)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_port;
if (f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_sessId2PortId_HM, pl_sessionId, vl_port))
{
f_EPTF_HTTP_Transport_closePortInGroup(pl_group, vl_port);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].sessionId := -1;
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Port cannot be closed for session id " &
int2str(pl_sessionId) & " in group " & int2str(pl_group));
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_freePortOfUser_default
//
// Purpose:
// Function to make the port of an HTTP user free
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_sessionId - *in* *integer* - session id
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// An HTTP user is identified internally with a unique session id.
// If the HTTP user sends on a port of a port group, it can make the
// state of its port free. This case incoming messages on the port
// will be dropped and the port is free again for any HTTP user to use.
//
// If the port is reused by another HTTP user and the message of the
// last session arrives during this time, then the message will be
// forwaerded to the new HTTP user.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_freePortOfUser_default(
in integer pl_group,
in integer pl_sessionId)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_port;
if (f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_sessId2PortId_HM, pl_sessionId, vl_port))
{
// administrate as IDLE port
if (f_EPTF_FBQ_itemIsBusy(vl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue))
{
f_EPTF_FBQ_moveFromBusyToFreeTail(vl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
// if port made free again, then messages from last session are disabled
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_port].sessionId := -1;
}
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Port cannot be made free for session id " &
int2str(pl_sessionId) & " in group " & int2str(pl_group))
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_openConnection_defaultGroup
//
// Purpose:
// Function to open connections within a port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
//
// Return Value:
// *boolean* - result of connection opening
//
// Errors:
// -
//
// Detailed Comments:
// Connection for all the ports will be opened within the port group. If
// one fails, all will be closed.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_openConnection_defaultGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
var boolean vl_hasMoreElement;
var boolean vl_success := true;
var integer i; //, vl_ports := sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase);
vl_hasMoreElement := f_EPTF_FBQ_getBusyHeadIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
while (vl_hasMoreElement)
//for (i := 0; i < vl_ports; i := i + 1)
{
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].state == IDLE)
{
f_EPTF_Base_assert(%definitionId &
": Port is in idle state but connection id is presented at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, i),
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].connectionId == -1);
if (not f_EPTF_HTTP_LocalTransport_openPortInGroup(pl_group, i)) {
vl_success := false;
break; //i := vl_ports;
}
}
vl_hasMoreElement := f_EPTF_FBQ_getFwdBusyItemIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
}
if (not vl_success) {
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx].closeConnection.apply(pl_group);
}
return vl_success;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_openPortInGroup
//
// Purpose:
// Auxilary function to open a connection for a given port of a given
// port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
//
// Return Value:
// *boolean* - result of connection opening
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_openPortInGroup(
in integer pl_group,
in integer pl_port
)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var EPTF_HTTP_HostInformation vl_local, vl_remote;
var Result vl_result;
vl_local := v_EPTF_HTTP_Transport_localHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].localhostInfoIdx];
vl_remote := v_EPTF_HTTP_Transport_remoteHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].remotehostInfoIdx];
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Connect := {
remName := vl_remote.hostIPAddress,
remPort := vl_remote.hostPort,
locName := vl_local.hostIPAddress,
locPort := vl_local.hostPort,
proto := {tcp := {}}
}
}
vl_result:={omit,omit,omit,omit};
vl_result := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null,false,false,v_EPTF_HTTP_LocalTransport_selfName);
if (ispresent(vl_result.errorCode) and
IPL4_ERROR_TEMPORARILY_UNAVAILABLE != vl_result.errorCode)
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Connection opening unsuccessful" &
" for port (" & log2str(vl_result) & ") at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port));
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId,
vl_result});
}
return false;
}
else {
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId := vl_result.connId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := OPENED;
f_EPTF_HTTP_Transport_socketOpened(vl_result.connId, pl_group, pl_port);
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection opening successful for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port) &
" with connection id: " & int2str(vl_result.connId));
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_openConnection_defaultPort
//
// Purpose:
// Function to open connection for a given port
//
// Parameters:
// - pl_group - *in* *integer* - port index
//
// Return Value:
// *boolean* - result of connection opening
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_openConnection_defaultPort(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false; };
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state != IDLE)
{
f_EPTF_Base_assert("Non-IDLE port must be busy!",
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state == IDLE or
f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue) );
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection already open!");
return true; // because connection is open
}
else
{
if (f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue))
{
var Result vl_result;
log(v_EPTF_HTTP_Transport_portDB[pl_group]);
f_EPTF_Base_assert(%definitionId &
": Port is in idle state but connection id is presented at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0),
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].connectionId == -1);
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Connect := {
remName := v_EPTF_HTTP_Transport_portDB[pl_group].baseRemoteHostInformation.hostIPAddress,
remPort := v_EPTF_HTTP_Transport_portDB[pl_group].baseRemoteHostInformation.hostPort,
locName := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation.hostIPAddress,
locPort := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation.hostPort,
proto := {tcp := {}}
}
}
vl_result:={omit,omit,omit,omit};
vl_result := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null,false,false,v_EPTF_HTTP_LocalTransport_selfName);
if (ispresent(vl_result.errorCode) and
IPL4_ERROR_TEMPORARILY_UNAVAILABLE != vl_result.errorCode)
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Connection opening unsuccessful" &
" for port (" & log2str(vl_result) & ") at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0));
// socket error, calling callback
if(vf_EPTF_HTTP_LocalTransport_socketErrorReceive != null) {
vf_EPTF_HTTP_LocalTransport_socketErrorReceive.apply({
pl_group,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].sessionId,
vl_result});
}
return false;
}
else
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].connectionId := vl_result.connId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state := OPENED;
f_EPTF_HTTP_Transport_socketOpened(vl_result.connId, pl_group, 0);
f_EPTF_HTTP_Transport_debug(%definitionId &
": Connection opening successful for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0) &
" with connection id: " & int2str(vl_result.connId));
return true
}
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Port 0 already deleted from group: " & int2str(pl_group));
return false;
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_listen_default
//
// Purpose:
// Opens a listen port in a server port group.
//
// Parameters:
// - pl_group - *in* *integer* - server port group index
//
// Return Value:
// *boolean* - result
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_listen_default(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return -1; };
if (-1 != v_EPTF_HTTP_Transport_portDB[pl_group].listeningPortIdx)
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Already listening on " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, v_EPTF_HTTP_Transport_portDB[pl_group].listeningPortIdx));
return v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[v_EPTF_HTTP_Transport_portDB[pl_group].listeningPortIdx].portId;
}
var charstring vl_localHost := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation.hostIPAddress;
var integer vl_localPort := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation.hostPort;
var ProtoTuple vl_proto := {tcp := {}}
if(v_EPTF_HTTP_Transport_portDB[pl_group].useSSL) {
vl_proto := {ssl := {}};
f_EPTF_HTTP_Transport_debug(%definitionId &
": Using SSL.");
}
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Listen := {
locName := vl_localHost,
locPort := vl_localPort,
proto := vl_proto
}
}
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null,false,false,v_EPTF_HTTP_LocalTransport_selfName);
if (ispresent(v_resultNoWarning.errorCode))
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Listening unsuccessful for port (" & log2str(v_resultNoWarning) & ") at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0));
return -1;
}
var integer vl_fbqIdx := -1;
vl_fbqIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
var Result vl_result;
vl_result := f_EPTF_CommPort_IPL4_setUserData(v_resultNoWarning.connId, v_resultNoWarning.connId);
f_EPTF_HTTP_Transport_socketOpened(v_resultNoWarning.connId, pl_group, vl_fbqIdx);
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_fbqIdx, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue)
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx] := c_EPTF_HTTP_LocalTransport_initPortInfo;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].groupIndex := pl_group; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portIndex := vl_fbqIdx; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portType := LISTENING_PORT;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].state := OPENED;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portId := f_EPTF_HTTP_Transport_generatePortId(pl_group);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].connectionId := v_resultNoWarning.connId;
v_EPTF_HTTP_Transport_portDB[pl_group].listeningPortIdx := vl_fbqIdx;
v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts := v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts + 1;
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_portId2Idx_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portId, vl_fbqIdx);
f_EPTF_HTTP_Transport_debug(%definitionId &
": Listening successful on " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_fbqIdx) &
" with connection id: " & int2str(v_resultNoWarning.connId));
return v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portId;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_createIncomingConn_default
//
// Purpose:
// Creates an incoming connection in the port group.
//
// Parameters:
// - pl_group - *in* *integer* - port group index
// - pl_connOpened - *in* <ConnectionOpenedEvent> - connection opened event
// - pl_port - *inout* *integer* - the index of the created port
//
// Return Value:
// boolean -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_createIncomingConn_default(
in integer pl_group,
in ConnectionOpenedEvent pl_connOpened,
inout integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return false;};
var integer vl_fbqIdx := -1, vl_rhIdx := -1;
var EPTF_HTTP_HostInformation vl_rhostInformation := {"", -1};
vl_rhostInformation.hostIPAddress := pl_connOpened.remName;
vl_rhostInformation.hostPort := pl_connOpened.remPort;
vl_rhIdx := f_EPTF_HTTP_LocalTransport_addRemoteHostInformation(vl_rhostInformation);
vl_fbqIdx := f_EPTF_FBQ_getOrCreateFreeSlot(v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
f_EPTF_FBQ_moveFromFreeToBusyTail(vl_fbqIdx,
v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts := v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts + 1;
// set port data to port info database
if (sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase) <= vl_fbqIdx)
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx] := c_EPTF_HTTP_LocalTransport_initPortInfo;
}
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].groupIndex := pl_group; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portIndex := vl_fbqIdx; // FIXME check
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].connectionId := pl_connOpened.connId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portId := f_EPTF_HTTP_Transport_generatePortId(pl_group);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portType := INCOMING_PORT;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].state := OPENED;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].remotehostInfoIdx := vl_rhIdx;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].buffer := v_EPTF_HTTP_Transport_portDB[pl_group].buffer;
if (v_EPTF_HTTP_Transport_portDB[pl_group].buffer and omit == v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].messageBuffer)
{
f_EPTF_HTTP_MsgBuffer_init(
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].messageBuffer,
v_EPTF_HTTP_Transport_bufferSize,
vl_fbqIdx);
}
f_EPTF_HTTP_Transport_socketOpened(pl_connOpened.connId, pl_group, vl_fbqIdx);
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_portId2Idx_HM,
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[vl_fbqIdx].portId, vl_fbqIdx);
f_EPTF_HTTP_Transport_debug(%definitionId & ": New incoming connection added to " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, vl_fbqIdx));
pl_port := vl_fbqIdx;
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_removeIncomingConn_default
//
// Purpose:
// Removes an incoming connection from the server port group.
//
// Parameters:
// - pl_group - *in* *integer* - port group index
// - pl_port - *in* *integer* - the index of the port to remove
//
// Return Value:
// boolean -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_removeIncomingConn_default(
in integer pl_group,
in integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
f_EPTF_HTTP_LocalTransport_removeServerPort(pl_group, pl_port);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closePort_default
//
// Purpose:
// Closes a connection.
//
// Parameters:
// - pl_group - *in* *integer* - port group index
// - pl_portId - *in* *integer* - port identifier
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closePort_default(
in integer pl_group,
in integer pl_portId)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_port := -1;
if (not f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_portId2Idx_HM, pl_portId, vl_port))
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Could not find port identifier!" &
log2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase));
return;
}
f_EPTF_HTTP_LocalTransport_removeServerPort(pl_group, vl_port);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_removeServerPort
//
// Purpose:
// Removes a port from the server group.
//
// Parameters:
// - pl_group - *in* *integer* - port group index
// - pl_port - *in* *integer* - port index
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_removeServerPort(
in integer pl_group,
in integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue))
{
f_EPTF_HTTP_Transport_debug(%definitionId & ": Removing port from group: " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port));
if (CLOSED != v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state)
{
var integer vl_connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId;
f_EPTF_HTTP_Transport_debug(%definitionId & ": Closing connection with id " & int2str(vl_connId));
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Close := {
id := vl_connId,
proto := {tcp := {}}
}
}
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, false, v_EPTF_HTTP_LocalTransport_selfName);
f_EPTF_HTTP_Transport_socketClosed(vl_connId);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := CLOSED;
}
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_portId2Idx_HM, v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portId);
f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
if (omit == v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer)
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port] := c_EPTF_HTTP_LocalTransport_initPortInfo;
}else
{
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].groupIndex := c_EPTF_HTTP_LocalTransport_initPortInfo.groupIndex;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portIndex := c_EPTF_HTTP_LocalTransport_initPortInfo.portIndex;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId := c_EPTF_HTTP_LocalTransport_initPortInfo.connectionId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].sessionId := c_EPTF_HTTP_LocalTransport_initPortInfo.sessionId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portId := c_EPTF_HTTP_LocalTransport_initPortInfo.portId;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].localhostInfoIdx := c_EPTF_HTTP_LocalTransport_initPortInfo.localhostInfoIdx;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].remotehostInfoIdx :=
c_EPTF_HTTP_LocalTransport_initPortInfo.remotehostInfoIdx;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := c_EPTF_HTTP_LocalTransport_initPortInfo.state;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].portType := c_EPTF_HTTP_LocalTransport_initPortInfo.portType;
f_EPTF_HTTP_MsgBuffer_clear(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer);
}
v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts := v_EPTF_HTTP_Transport_portDB[pl_group].numberOfPorts - 1;
v_EPTF_HTTP_Transport_portDB[pl_group].listeningPortIdx := -1;
}
else
{
f_EPTF_HTTP_Transport_warning(log2str(%definitionId &
": Error removing incoming connection: port(",pl_port,") is not busy : " &
int2str(pl_group) & " - " &
v_EPTF_HTTP_Transport_portDB[pl_group].name & "; ",
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port]));
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closeConnection_defaultGroup
//
// Purpose:
// Function to close connections for a given port group
//
// Parameters:
// - pl_group - *in* *integer* - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// All open ports within the port group will be closed
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closeConnection_defaultGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var boolean vl_hasMoreElement;
var integer i;
//vl_ports := sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase);
vl_hasMoreElement := f_EPTF_FBQ_getBusyHeadIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
while (vl_hasMoreElement)
//for (i := 0; i < vl_ports; i := i + 1);
{
f_EPTF_HTTP_Transport_closePortInGroup(pl_group, i);
vl_hasMoreElement := f_EPTF_FBQ_getFwdBusyItemIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_closePortInGroup
//
// Purpose:
// Auxialry funtion to close a given port of a given port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_closePortInGroup(
in integer pl_group,
in integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state != IDLE)
{
var integer vl_connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId;
f_EPTF_Base_assert(%definitionId &
": Port is not in IDLE state but connection id is missing at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port),
vl_connId != -1);
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Close := {
id := vl_connId,
proto := {tcp := {}}
}
}
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, false, v_EPTF_HTTP_LocalTransport_selfName);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId := -1;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].state := IDLE;
f_EPTF_HTTP_Transport_socketClosed(vl_connId);
// administrate port as free
//if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue)) {
// f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port,
// v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
//}
// administrate as IDLE port
if (f_EPTF_FBQ_itemIsBusy(pl_port, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromBusyToFreeTail(pl_port,
v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
f_EPTF_HTTP_Transport_debug(%definitionId & ": Connection (" &
int2str(vl_connId) & ") closed for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port));
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection (" &
int2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].connectionId) &
") is already closed for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, pl_port));
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closeConnection_defaultPort
//
// Purpose:
// Function to close connection of a port
//
// Parameters:
// - pl_group - *in* *integer* - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closeConnection_defaultPort(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var integer vl_connId;
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state == IDLE)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": Connection already closed!");
return;
}
else
{
vl_connId := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].connectionId;
log(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0]);
f_EPTF_Base_assert(%definitionId &
": Port is not in IDLE state but connection id is missing at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0),
vl_connId != -1);
v_EPTF_HTTP_Transport_OutgoingMessage := {
asp_Close := {
id := vl_connId,
proto := {tcp := {}}
}
}
v_resultNoWarning := f_EPTF_CommPort_IPL4_send(
v_EPTF_HTTP_Transport_OutgoingMessage,
null, false, false, v_EPTF_HTTP_LocalTransport_selfName);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].connectionId := -1;
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state := IDLE;
f_EPTF_HTTP_Transport_socketClosed(vl_connId);
// administrate port as free
//if (f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue)) {
// f_EPTF_FBQ_moveFromBusyToFreeTail(0,
// v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
//}
// administrate as IDLE port
if (f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue)) {
f_EPTF_FBQ_moveFromBusyToFreeTail(0,
v_EPTF_HTTP_Transport_portDB[pl_group].portStateQueue);
}
}
f_EPTF_HTTP_Transport_debug(%definitionId & ": Connection (" &
int2str(vl_connId) & ") closed for port at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0));
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultGroup
//
// Purpose:
// Function to half close connections for a given port group
//
// Parameters:
// - pl_group - *in* *integer* - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// State of all opened ports will be set to half closed
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
var boolean vl_hasMoreElement;
var integer i; //, vl_ports;
//vl_ports := sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase);
vl_hasMoreElement := f_EPTF_FBQ_getBusyHeadIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
while (vl_hasMoreElement)
//for (i := 0; i < vl_ports; i := i + 1)
{
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].state != IDLE and
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].state != HALFCLOSED)
{
f_EPTF_Base_assert(%definitionId &
": Port is not in IDLE/HALFCLOSED state but connection id is missing at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, i),
-1 != v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].connectionId);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[i].state := HALFCLOSED;
f_EPTF_HTTP_Transport_debug(%definitionId & ": Port state is set to " &
"half closed at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, i));
}
vl_hasMoreElement := f_EPTF_FBQ_getFwdBusyItemIdx(i, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultPort
//
// Purpose:
// Auxialry funtion to close a given port
//
// Parameters:
// - pl_group - *in* *integer* - port index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultPort(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return; };
if (v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state != IDLE and
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state != HALFCLOSED and
f_EPTF_FBQ_itemIsBusy(0, v_EPTF_HTTP_Transport_portDB[pl_group].portQueue))
{
f_EPTF_Base_assert(%definitionId &
": Port is not in IDLE/HALFCLOSED state but connection id is missing at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0),
-1 != v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].connectionId);
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[0].state := HALFCLOSED;
f_EPTF_HTTP_Transport_debug(%definitionId & ": Port state is set to " &
"half closed at " &
f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(pl_group, 0));
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Connection already half closed!");
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_createGroupPortInfoString
//
// Purpose:
// Helper function to create port information string for logging
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_port - *in* *integer* - port index
//
// Return Value:
// *charstring* - the created information string
//
// Errors:
// -
//
// Detailed Comments:
// Information string will be 'group (<group index>) - <group name> at
// port index <port index>: Local: <local host information> / Remote:
// <remote host information>'
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_createGroupPortInfoString(
in integer pl_group,
in integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT return charstring
{
var EPTF_HTTP_HostInformation vl_local := {"", -1}, vl_remote := {"", -1};
if( sizeof(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase) > pl_port ) {
var integer vl_localIdx := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].localhostInfoIdx;
var integer vl_remoteIdx := v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].remotehostInfoIdx;
if (0 <= vl_localIdx)
{
vl_local := v_EPTF_HTTP_Transport_localHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].localhostInfoIdx];
}else{
vl_local := v_EPTF_HTTP_Transport_portDB[pl_group].baseLocalHostInformation
}
if (0 <= vl_remoteIdx)
{
vl_remote := v_EPTF_HTTP_Transport_remoteHostInformationList[
v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].remotehostInfoIdx];
}
} else {
f_EPTF_HTTP_Transport_debug(%definitionId & " Not fully initialized portDB: v_EPTF_HTTP_Transport_portDB:" &
log2str(v_EPTF_HTTP_Transport_portDB) & " pl_group: " & log2str(pl_group) & " pl_port: " & log2str(pl_port));
}
return "group (" & int2str(pl_group) & ") - " & v_EPTF_HTTP_Transport_portDB[pl_group].name &
" at port index " & int2str(pl_port) &
": Local: " & log2str(vl_local) & " / Remote: " & log2str(vl_remote);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_createUniqueGroupName
//
// Purpose:
// Creates a unique group name for port groups
//
// Parameters:
// - pl_basename - *in* *charstring* - base name for port names
//
// Return Value:
// - charstring - the created group name
//
// Errors:
// -
//
// Detailed Comments:
// The function appends a number to the provided pl_basename and increases
// the attached number till the created name will be unique
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_createUniqueGroupName(
in charstring pl_basename)
runs on EPTF_HTTP_LocalTransport_CT return charstring
{
var integer vl_dummy;
var charstring vl_groupName := pl_basename & "." & int2str(v_nameIdx);
while (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_groupName2Idx_HM,
vl_groupName, vl_dummy))
{
v_nameIdx := v_nameIdx + 1;
vl_groupName := pl_basename & "." & int2str(v_nameIdx);
}
f_EPTF_HTTP_Transport_debug(%definitionId &
": Unique group name created: " & vl_groupName);
return vl_groupName;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_registerGroupFunctions
//
// Purpose:
// Registers handler functions to a port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_portMode - *in* *boolean* - port group creation mode
// (port/group mode)
// - pl_funcs - *in* <EPTF_HTTP_Transport_UserFunctions> - record
// containing function references of handler functions
//
// Return Value:
// *charstring* - the created group name
//
// Errors:
// -
//
// Detailed Comments:
// The function should be applied to an already created port group with
// set instant connection close, instant connection open parameters.
//
// If the port group which the function is applied to has a set
// handler function reference index (defaultFIdx != -1), then the functions
// which are set in pl_funcs will be used to overdefine the default
// handler functions. The ones that are omit in pl_funcs will be left
// unchanged.
//
// If the port group which the function is applied to doesn't have a set
// handler function reference index (defaultFIdx != -1), then all the
// handler functions will be redefined. If a function reference is omit in
// pl_funcs, the handler function will be overdefined with default functions
// based on instant connection close, instant connection open parameters
// of the port group, otherwise the set function reference will be used to
// redefine the handler function.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_registerGroupFunctions(
in integer pl_group,
in boolean pl_portMode,
in EPTF_HTTP_Transport_UserFunctions pl_funcs)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return -1; };
var integer vl_index;
var charstring vl_key;
var EPTF_HTTP_Transport_Function vl_funcs := c_HTTP_Transport_initFunction;
f_EPTF_Base_assert(%definitionId &
": Group not yet initialized (" & int2str(pl_group) & ")",
pl_group < sizeof(v_EPTF_HTTP_Transport_portDB) and f_EPTF_FBQ_itemIsBusy(pl_group, v_EPTF_HTTP_Transport_groupQueue));
// checks if function group has been checked before
var boolean vl_override := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx == -1;
var boolean vl_iconn := v_EPTF_HTTP_Transport_portDB[pl_group].instantConnOpen;
var boolean vl_iclose := v_EPTF_HTTP_Transport_portDB[pl_group].instantConnClose;
// creates new candidate function group for the the port group
if (ispresent(pl_funcs.addPort) and pl_funcs.addPort != null) {
vl_funcs.addPort := pl_funcs.addPort;
} else {
if (vl_override) {
vl_funcs.addPort := refers(f_EPTF_HTTP_LocalTransport_addPortToGroup_default);
}
}
if (ispresent(pl_funcs.removePort) and pl_funcs.removePort != null) {
vl_funcs.removePort := pl_funcs.removePort;
} else {
if (vl_override) {
vl_funcs.removePort := refers(f_EPTF_HTTP_LocalTransport_removePortFromGroup_default);
}
}
if (ispresent(pl_funcs.selectPort) and pl_funcs.selectPort != null)
{
vl_funcs.selectPort := pl_funcs.selectPort;
} else {
if (vl_override) {
if (pl_portMode) {
vl_funcs.selectPort := refers(
f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultPort);
}
else {
vl_funcs.selectPort := refers(
f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultGroup);
}
}
}
/* MOVED TO COMPONENT VARIABLE vf_getGroupAndPort
if (ispresent(pl_funcs.getGroupAndPort) and pl_funcs.getGroupAndPort != null)
{
vl_funcs.getGroupAndPort := pl_funcs.getGroupAndPort;
}
else {
if (vl_override) {
if (pl_portMode) {
vl_funcs.getGroupAndPort := refers(
f_EPTF_HTTP_LocalTransport_getGroupAndPort_defaultGroup);
}
else {
vl_funcs.getGroupAndPort := refers(
f_EPTF_HTTP_LocalTransport_getGroupAndPort_defaultPort);
}
}
}
*/
if (ispresent(pl_funcs.sendMessage) and pl_funcs.sendMessage != null)
{
vl_funcs.sendMessage := pl_funcs.sendMessage;
}
else {
if (vl_override) {
if (vl_iconn) {
vl_funcs.sendMessage := refers(
f_EPTF_HTTP_LocalTransport_sendMessage_default_IC);
}
else {
vl_funcs.sendMessage := refers(
f_EPTF_HTTP_LocalTransport_sendMessage_default_NIC);
}
}
}
if (ispresent(pl_funcs.closePortOfUser) and pl_funcs.closePortOfUser != null)
{
vl_funcs.closePortOfUser := pl_funcs.closePortOfUser;
}
else {
if (vl_override) {
vl_funcs.closePortOfUser := refers(f_EPTF_HTTP_LocalTransport_closePortOfUser_default);
}
}
if (ispresent(pl_funcs.freePortOfUser) and pl_funcs.freePortOfUser != null)
{
vl_funcs.freePortOfUser := pl_funcs.freePortOfUser;
}
else {
if (vl_override) {
vl_funcs.freePortOfUser := refers(f_EPTF_HTTP_LocalTransport_freePortOfUser_default);
}
}
if (ispresent(pl_funcs.openPort) and pl_funcs.openPort != null)
{
vl_funcs.openPort := pl_funcs.openPort;
}
else {
if (vl_override) {
if (pl_portMode) {
vl_funcs.openPort := refers(
f_EPTF_HTTP_LocalTransport_openConnection_defaultPort);
}
else {
vl_funcs.openPort := refers(
f_EPTF_HTTP_LocalTransport_openConnection_defaultGroup);
}
}
}
if (ispresent(pl_funcs.closeConnection) and pl_funcs.closeConnection != null)
{
vl_funcs.closeConnection := pl_funcs.closeConnection;
}
else {
if (vl_override) {
if (pl_portMode) {
vl_funcs.closeConnection := refers(
f_EPTF_HTTP_LocalTransport_closeConnection_defaultPort);
}
else {
vl_funcs.closeConnection := refers(
f_EPTF_HTTP_LocalTransport_closeConnection_defaultGroup);
}
}
}
if (ispresent(pl_funcs.halfClosePort) and pl_funcs.halfClosePort != null)
{
vl_funcs.halfClosePort := pl_funcs.halfClosePort;
}
else {
if (vl_override) {
if (pl_portMode) {
vl_funcs.halfClosePort := refers(
f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultPort);
}
else {
vl_funcs.halfClosePort := refers(
f_EPTF_HTTP_LocalTransport_halfCloseConnection_defaultGroup);
}
}
}
if (ispresent(pl_funcs.receiveMessage) and pl_funcs.receiveMessage != null) {
vl_funcs.receiveMessage := pl_funcs.receiveMessage;
}
else {
if (vl_override) {
if (vl_iclose) {
vl_funcs.receiveMessage := refers(
f_EPTF_HTTP_LocalTransport_receiveMessage_default_IC);
}
else {
vl_funcs.receiveMessage := refers(
f_EPTF_HTTP_LocalTransport_receiveMessage_default_NIC);
}
}
}
if (ispresent(pl_funcs.receiveEvent) and pl_funcs.receiveEvent != null) {
vl_funcs.receiveEvent := pl_funcs.receiveEvent;
}
else {
if (vl_override) {
vl_funcs.receiveEvent := refers(f_EPTF_HTTP_LocalTransport_receiveEvent_default);
}
}
// creates a hash map key from the function group
vl_key := log2str(vl_funcs)
// if function group is already existing, then return id
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index))
{
return vl_index;
}
// if function group was not existing, then add new element
vl_index := sizeof(v_EPTF_HTTP_Transport_functionDB);
f_EPTF_HTTP_Transport_debug(%definitionId & ": New database index: " & int2str(vl_index) &
" for functions: " & vl_key);
v_EPTF_HTTP_Transport_functionDB[vl_index] := vl_funcs;
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Functions are registered to group (" &
int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name & ": " & vl_key &
" at position " & int2str(vl_index) & " in function database!");
return vl_index;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_registerServerGroupFunctions
//
// Purpose:
// Registers handler functions to a server port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
// - pl_funcs - *in* <EPTF_HTTP_Transport_ServerUserFunctions> - record
// containing function references of handler functions
//
// Return Value:
// *charstring* - the created group name
//
// Errors:
// -
//
// Detailed Comments:
// The function should be applied to an already created port group with
// set instant connection close, instant connection open parameters.
//
// If the port group which the function is applied to has a set
// handler function reference index (defaultFIdx != -1), then the functions
// which are set in pl_funcs will be used to overdefine the default
// handler functions. The ones that are omit in pl_funcs will be left
// unchanged.
//
// If the port group which the function is applied to doesn't have a set
// handler function reference index (defaultFIdx != -1), then all the
// handler functions will be redefined. If a function reference is omit in
// pl_funcs, the handler function will be overdefined with default functions
// based on instant connection close, instant connection open parameters
// of the port group, otherwise the set function reference will be used to
// redefine the handler function.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_registerServerGroupFunctions(
in integer pl_group,
in EPTF_HTTP_Transport_ServerUserFunctions pl_funcs)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_group)) { return -1; };
var integer vl_index;
var charstring vl_key;
var EPTF_HTTP_Transport_Function vl_funcs := c_HTTP_Transport_initFunction;
f_EPTF_Base_assert(%definitionId &
": Group not yet initialized (" & int2str(pl_group) & ")",
pl_group < sizeof(v_EPTF_HTTP_Transport_portDB) and f_EPTF_FBQ_itemIsBusy(pl_group, v_EPTF_HTTP_Transport_groupQueue));
// checks if function group has been checked before
var boolean vl_override := v_EPTF_HTTP_Transport_portDB[pl_group].defaultFIdx == -1;
var boolean vl_iclose := v_EPTF_HTTP_Transport_portDB[pl_group].instantConnClose;
if (ispresent(pl_funcs.removePort) and pl_funcs.removePort != null) {
vl_funcs.removePort := pl_funcs.removePort;
} else {
if (vl_override) {
vl_funcs.removePort := refers(f_EPTF_HTTP_LocalTransport_removePortFromGroupServer_default);
}
}
if (ispresent(pl_funcs.listen) and pl_funcs.listen != null){
vl_funcs.listen := pl_funcs.listen;
}else{
if (vl_override) {
vl_funcs.listen := refers(f_EPTF_HTTP_LocalTransport_listen_default);
}
}
if (ispresent(pl_funcs.createIncomingConn) and pl_funcs.createIncomingConn != null){
vl_funcs.createIncomingConn := pl_funcs.createIncomingConn;
}else{
if (vl_override) {
vl_funcs.createIncomingConn := refers(f_EPTF_HTTP_LocalTransport_createIncomingConn_default);
}
}
if (ispresent(pl_funcs.removeIncomingConn) and pl_funcs.removeIncomingConn != null){
vl_funcs.removeIncomingConn := pl_funcs.removeIncomingConn;
}else{
if (vl_override) {
vl_funcs.removeIncomingConn := refers(f_EPTF_HTTP_LocalTransport_removeIncomingConn_default);
}
}
if (ispresent(pl_funcs.receiveEvent) and pl_funcs.receiveEvent != null) {
vl_funcs.receiveEvent := pl_funcs.receiveEvent;
}
else {
if (vl_override) {
vl_funcs.receiveEvent := refers(f_EPTF_HTTP_LocalTransport_receiveEventServer_default);
}
}
if (ispresent(pl_funcs.receiveMessage) and pl_funcs.receiveMessage != null) {
vl_funcs.receiveMessage := pl_funcs.receiveMessage;
}
else {
if (vl_override) {
vl_funcs.receiveMessage := refers(
f_EPTF_HTTP_LocalTransport_receiveMessageServer_default);
}
}
if (ispresent(pl_funcs.sendResponse) and pl_funcs.sendResponse != null)
{
vl_funcs.sendResponse := pl_funcs.sendResponse;
}
else {
if (vl_override) {
if (vl_iclose) {
vl_funcs.sendResponse := refers(
f_EPTF_HTTP_LocalTransport_sendResponse_default_IC);
}
else {
vl_funcs.sendResponse := refers(
f_EPTF_HTTP_LocalTransport_sendResponse_default_NIC);
}
}
}
if (ispresent(pl_funcs.closePort) and pl_funcs.listen != null){
vl_funcs.closePort := pl_funcs.closePort;
}else{
if (vl_override) {
vl_funcs.closePort := refers(f_EPTF_HTTP_LocalTransport_closePort_default);
}
}
// creates a hash map key from the function group
vl_key := log2str(vl_funcs)
// if function group is already existing, then return id
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index))
{
return vl_index;
}
// if function group was not existing, then add new element
vl_index := sizeof(v_EPTF_HTTP_Transport_functionDB);
f_EPTF_HTTP_Transport_debug(%definitionId & ": New database index: " & int2str(vl_index) &
" for functions: " & vl_key);
v_EPTF_HTTP_Transport_functionDB[vl_index] := vl_funcs;
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_functions2Idx_HM,
vl_key, vl_index);
f_EPTF_HTTP_Transport_debug(%definitionId & ": Functions are registered to group (" &
int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name & ": " & vl_key &
" at position " & int2str(vl_index) & " in function database!");
return vl_index;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_checkGroup
//
// Purpose:
// Check the state of a port group
//
// Parameters:
// - pl_group - *in* *integer* - group index
//
// Return Value:
// *boolean* - true if group is okay, false otherwise
//
// Errors:
// -
//
// Detailed Comments:
// Check group index and group occupation state
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_checkGroup(
in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
if (pl_group == -1) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Group does not exist!");
return false;
}
if (sizeof(v_EPTF_HTTP_Transport_portDB) <= pl_group) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Invalid group index: " &
int2str(pl_group));
return false;
}
if (not f_EPTF_FBQ_itemIsBusy(pl_group, v_EPTF_HTTP_Transport_groupQueue)) {
f_EPTF_HTTP_Transport_warning(%definitionId & ": Group already deleted: " &
int2str(pl_group) & " - " & v_EPTF_HTTP_Transport_portDB[pl_group].name);
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_addLocalHostInformation
//
// Purpose:
// Function to add new Local Host Information to the LocalHostInformation database
//
// Parameters:
// pl_hostInformation - *in* - <EPTF_HTTP_HostInformation> - The local host information
//
// Return Value:
// *integer* - the index of the database record
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_addLocalHostInformation (
in EPTF_HTTP_HostInformation pl_hostInformation)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
var integer vl_EPTF_HTTP_index;
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_localHostHashMap,
pl_hostInformation.hostIPAddress&int2str(pl_hostInformation.hostPort),
vl_EPTF_HTTP_index))
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Local HostIPAddress already exists: "&int2str(vl_EPTF_HTTP_index));
}
else
{
vl_EPTF_HTTP_index := sizeof(v_EPTF_HTTP_Transport_localHostInformationList);
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_localHostHashMap,
pl_hostInformation.hostIPAddress&int2str(pl_hostInformation.hostPort),
vl_EPTF_HTTP_index);
v_EPTF_HTTP_Transport_localHostInformationList[vl_EPTF_HTTP_index] := pl_hostInformation;
f_EPTF_HTTP_Transport_debug(%definitionId &
": Local HostIPAddress does not exist, now added: "&int2str(vl_EPTF_HTTP_index));
}
return vl_EPTF_HTTP_index;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_addRemoteHostInformation
//
// Purpose:
// Function to add new Remote Host Information to the LocalHostInformation database
//
// Parameters:
// pl_hostInformation - *in* - <EPTF_HTTP_HostInformation> - The remote host information
//
// Return Value:
// *integer* - the index of the database record
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_addRemoteHostInformation (
in EPTF_HTTP_HostInformation pl_hostInformation)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
var integer vl_EPTF_HTTP_index;
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_Transport_remoteHostHashMap,
pl_hostInformation.hostIPAddress&int2str(pl_hostInformation.hostPort),
vl_EPTF_HTTP_index))
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Remote HostIPAddress already exists: "&int2str(vl_EPTF_HTTP_index));
}
else
{
vl_EPTF_HTTP_index := sizeof(v_EPTF_HTTP_Transport_remoteHostInformationList);
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_Transport_remoteHostHashMap,
pl_hostInformation.hostIPAddress&int2str(pl_hostInformation.hostPort),
vl_EPTF_HTTP_index);
v_EPTF_HTTP_Transport_remoteHostInformationList[vl_EPTF_HTTP_index] := pl_hostInformation;
f_EPTF_HTTP_Transport_debug(%definitionId &
": Remote HostIPAddress not exists, now added: "&int2str(vl_EPTF_HTTP_index));
}
return vl_EPTF_HTTP_index;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_addMessageLengthCalculationFunction
//
// Purpose:
// Function to add a new message length calculation function
//
// Parameters:
// pl_functionRef - *in* <f_IPL4_getMsgLen> - function reference of
// messagelength calculation function
//
// Return Value:
// *integer* - message length calcualtion function index
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_addMessageLengthCalculationFunction(
in f_IPL4_getMsgLen pl_functionRef)
runs on EPTF_HTTP_LocalTransport_CT return integer
{
var integer vl_size :=
sizeof(v_EPTF_HTTPLocalTransport_lengthCalculationFunctions);
v_EPTF_HTTPLocalTransport_lengthCalculationFunctions[vl_size] :=
pl_functionRef;
return vl_size;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_setMessageLengthCalculationFunctionToConnId
//
// Purpose:
// Function to set a message length calculation function to a connection
// id
//
// Parameters:
// pl_connId - *in* *integer* - connection id
// pl_functionIdx - *in* *integer* - message length calculation
// function database index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_setMessageLengthCalculationFunctionToConnId(
in integer pl_connId,
in integer pl_functionIdx)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_CommPort_IPL4_setMsgLen(pl_connId,
v_EPTF_HTTPLocalTransport_lengthCalculationFunctions[pl_functionIdx], {});
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_getMessageLength
//
// Purpose:
// Function to get the message length of a stream
//
// Parameters:
// stream - *in* *octetstring* - stream
// args - *inout* - arguments
//
// Return Value:
// *integer* - message length of stream
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_getMessageLength (
in octetstring stream,
inout ro_integer args)
return integer
{
return f_TCCMessageHandling_getMessageLength(stream)
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveMessage
//
// Purpose:
// Function to receive the incoming messages
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveMessage()
runs on EPTF_HTTP_LocalTransport_CT {
f_EPTF_HTTP_Transport_debug("### " & %definitionId &
"(): Message received on connection: " &
int2str(v_EPTF_CommPort_IPL4_aspRecvFrom.connId));
var integer vl_group, vl_port;
v_boolNoWarning := vf_getGroupAndPort.apply(v_EPTF_CommPort_IPL4_aspRecvFrom.connId, vl_group, vl_port);
v_EPTF_HTTP_Transport_lastReceivedGroup := vl_group;
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx].receiveMessage.apply(
vl_group, vl_port,
v_EPTF_CommPort_IPL4_aspRecvFrom.msg);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_receiveEvent
//
// Purpose:
// Function to receive the incoming events
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_receiveEvent()
runs on EPTF_HTTP_LocalTransport_CT {
var integer vl_group, vl_port, vl_conn;
if (ischosen(v_EPTF_CommPort_IPL4_aspEvent.connOpened))
{
vl_conn := v_EPTF_CommPort_IPL4_aspEvent.connOpened.connId;
var integer vl_userData := -1;
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "(): " &
"Event received on connection:" & int2str(vl_conn) & ": " &
log2str(v_EPTF_CommPort_IPL4_aspEvent));
v_resultNoWarning := f_EPTF_CommPort_IPL4_getUserData(vl_conn, vl_userData);
v_boolNoWarning := vf_getGroup.apply(vl_userData, vl_group);
v_EPTF_HTTP_Transport_lastReceivedGroup := vl_group;
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx].receiveEvent.apply(
vl_group, vl_port,
//vl_conn,
//v_EPTF_HTTP_Transport_portDB[vl_group].portDatabase[vl_port].sessionId, //vl_conn,
c_EPTF_HTTP_inputIdx_connectionOpened);
}
else
if (ischosen(v_EPTF_CommPort_IPL4_aspEvent.connClosed))
{
vl_conn := v_EPTF_CommPort_IPL4_aspEvent.connClosed.connId;
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()" &
"Event received on connection:" & int2str(vl_conn) & ": " &
log2str(v_EPTF_CommPort_IPL4_aspEvent));
v_boolNoWarning := vf_getGroupAndPort.apply(vl_conn, vl_group, vl_port);
v_EPTF_HTTP_Transport_lastReceivedGroup := vl_group;
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx].receiveEvent.apply(
vl_group, vl_port,
//vl_conn,
//v_EPTF_HTTP_Transport_portDB[vl_group].portDatabase[vl_port].sessionId, //vl_conn,
c_EPTF_HTTP_inputIdx_connectionClosed);
}
else
if (ischosen(v_EPTF_CommPort_IPL4_aspEvent.result))
{
vl_conn := v_EPTF_CommPort_IPL4_aspEvent.result.connId;
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "(): " &
"Event received on connection: " & int2str(vl_conn) & ": " &
log2str(v_EPTF_CommPort_IPL4_aspEvent));
v_boolNoWarning := vf_getGroupAndPort.apply(vl_conn, vl_group, vl_port);
v_EPTF_HTTP_Transport_lastReceivedGroup := vl_group;
if (v_EPTF_CommPort_IPL4_aspEvent.result.errorCode == omit)
{
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx].receiveEvent.apply(
vl_group, vl_port,
//vl_conn,
//v_EPTF_HTTP_Transport_portDB[vl_group].portDatabase[vl_port].sessionId, //vl_conn,
c_EPTF_HTTP_inputIdx_OKReceived);
}
else
{
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[vl_group].defaultFIdx].receiveEvent.apply(
vl_group, vl_port,
//vl_conn,
//v_EPTF_HTTP_Transport_portDB[vl_group].portDatabase[vl_port].sessionId, //vl_conn,
c_EPTF_HTTP_inputIdx_errorReceived);
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closePortOfUser
//
// Purpose:
// Function to close the port of an HTTP user
//
// Parameters:
// pl_connId - *in* *integer* - group id
// pl_sessionId - *in* *integer* - session id of HTTP user
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closePortOfUser(
in integer pl_groupId,
in integer pl_sessionId)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return; };
v_EPTF_HTTP_Transport_functionDB[
v_EPTF_HTTP_Transport_portDB[pl_groupId].defaultFIdx].closePortOfUser.apply(
pl_groupId,
pl_sessionId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_freePortOfUser
//
// Purpose:
// Function to free the port of an HTTP user
//
// Parameters:
// pl_groupId - *in* *integer* - group id
// pl_sessionId - *in* *integer* - session id of HTTP user
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_freePortOfUser(
in integer pl_groupId,
in integer pl_sessionId)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return; };
v_EPTF_HTTP_Transport_functionDB[
v_EPTF_HTTP_Transport_portDB[pl_groupId].defaultFIdx].freePortOfUser.apply(
pl_groupId,
pl_sessionId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_connectionOpen
//
// Purpose:
// Function to open the connection
//
// Parameters:
// pl_connId - *in* *integer* - group id
// pl_sessionId - *in* *integer* - session id of HTTP user
//
// Return Value:
// <Result> - the result of port open
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_connectionOpen(
in integer pl_connId,
in integer pl_sessionId)
runs on EPTF_HTTP_LocalTransport_CT return boolean
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_connId)) { return false; };
var integer vl_port :=
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_connId].defaultFIdx].selectPort.apply(pl_connId);
if (vl_port == -1)
{
f_EPTF_HTTP_Transport_warning(%definitionId & ": No more free ports available!");
}
else
{
v_EPTF_HTTP_Transport_portDB[pl_connId].portDatabase[vl_port].sessionId := pl_sessionId;
}
return v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_connId].defaultFIdx].openPort.apply(pl_connId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_connectionClose
//
// Purpose:
// Function to close the connection
//
// Parameters:
// pl_connId - *in* - <Result> - the connection ID
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_connectionClose(
in integer pl_connId)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_connId)) { return; };
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_connId].defaultFIdx].closeConnection.apply(pl_connId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_connectionClose
//
// Purpose:
// Function to close the connection
//
// Parameters:
// pl_connId - *in* - <Result> - the connection ID
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_connectionHalfClose(
in integer pl_connId)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_connId)) { return; };
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_connId].defaultFIdx].halfClosePort.apply(pl_connId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendMessage
//
// Purpose:
// Function to send the outgoing message
//
// Parameters:
// pl_connId - *in* *integer* - connection id
// pl_sessionId - *in* *integer* - session id
// pl_message - *in* *octetstring* - encoded message
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendMessage(
in integer pl_connId,
in integer pl_sessionId,
in octetstring pl_message)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_connId)) { return; };
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_connId].defaultFIdx].sendMessage.apply(
pl_connId,
pl_sessionId,
pl_message);
if (vf_EPTF_HTTP_messageSentHook != null) {
vf_EPTF_HTTP_messageSentHook.apply(pl_sessionId, pl_message);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_sendResponse
//
// Purpose:
// Function to send the response
//
// Parameters:
// pl_groupId - *in* *integer* - connection id
// pl_portId - *in* *integer* - unique port id
// pl_seqNum - *in* *integer* - sequnence number of the response
// pl_message - *in* *octetstring* - encoded message
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_sendResponse(
in integer pl_groupId,
in integer pl_portId,
in integer pl_seqNum,
in octetstring pl_message)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return; };
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_groupId].defaultFIdx].sendResponse.apply(
pl_groupId,
pl_portId,
pl_seqNum,
pl_message);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_listen
//
// Purpose:
// Function to create a listening socket in a server port group.
//
// Parameters:
// pl_groupId - *in* *integer* - the group ID
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_listen(
in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return -1; };
return v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_groupId].defaultFIdx].listen.apply(pl_groupId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_LocalTransport_closePort
//
// Purpose:
// Closes a socket in a server port.
//
// Parameters:
// pl_groupId - *in* *integer* - the group ID
// pl_portId - *in* *integer* - the port ID
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_LocalTransport_closePort(
in integer pl_groupId,
in integer pl_portId)
runs on EPTF_HTTP_LocalTransport_CT
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return; };
v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[pl_groupId].defaultFIdx].closePort.apply(pl_groupId, pl_portId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_generatePortId
//
// Purpose:
// Generates a port identifier unique in the port group.
//
// Parameters:
// pl_group - *in* *integer* - connection id
//
// Return Value:
// integer - identifier
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_generatePortId(in integer pl_group)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
var integer vl_maxNoPortIds:=100000;
var integer vl_dummyIdx:=-1;
var integer vl_nextPortId:=v_EPTF_HTTP_Transport_portDB[pl_group].currentPortId;
var boolean vl_foundFreePortId:=false;
//TR: HK96316
for(var integer i:=0;i< vl_maxNoPortIds and not vl_foundFreePortId;i:=i+1) {
vl_nextPortId:=(vl_nextPortId+1) mod vl_maxNoPortIds;
if( not f_EPTF_int2int_HashMap_Find(v_EPTF_HTTP_Transport_portId2Idx_HM,vl_nextPortId,vl_dummyIdx) ){
vl_foundFreePortId:=true;
}
}
if(not vl_foundFreePortId) {
f_EPTF_HTTP_Transport_warning(log2str(%definitionId &
" : Error in generating the next free portId. There is no free portId and it will fail" ));
}
v_EPTF_HTTP_Transport_portDB[pl_group].currentPortId:=vl_nextPortId;
return vl_nextPortId;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_socketOpened
//
// Purpose:
// Creates the database entries needed in case of opening a new socket.
//
// Parameters:
// - pl_connId - *in* *integer* - connection Id
// - pl_groupId - *in* *integer* - the index of the group
// - pl_port - *inout* *integer* - the index of the port
//
// Return Value:
// boolean -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_socketOpened(in integer pl_connId, in integer pl_groupId, in integer pl_portId)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_connId2GroupId_HM,
pl_connId, pl_groupId);
f_EPTF_int2int_HashMap_Insert(v_EPTF_HTTP_Transport_connId2PortId_HM,
pl_connId, pl_portId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_socketClosed
//
// Purpose:
// Removes the database entries needed in case of closing a socket.
//
// Parameters:
// - pl_connId - *in* *integer* - connection Id
//
// Return Value:
// boolean -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_socketClosed(in integer pl_connId)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2GroupId_HM, pl_connId);
f_EPTF_int2int_HashMap_Erase(v_EPTF_HTTP_Transport_connId2PortId_HM, pl_connId);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_setFunc_getGroupAndPort
//
// Purpose:
// Registers the group and port search function
//
// Parameters:
// pl_func - *in* <EPTF_HTTP_Transport_GetGroupAndPort_FT> - function reference
//
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_setFunc_getGroupAndPort(in EPTF_HTTP_Transport_GetGroupAndPort_FT pl_func)
runs on EPTF_HTTP_LocalTransport_CT
{
vf_getGroupAndPort := pl_func;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_setFunc_getGroup
//
// Purpose:
// Registers the group search function
//
// Parameters:
// pl_func - *in* <EPTF_HTTP_Transport_GetGroup_FT> - function reference
//
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_setFunc_getGroup(in EPTF_HTTP_Transport_GetGroup_FT pl_func)
runs on EPTF_HTTP_LocalTransport_CT
{
vf_getGroup := pl_func;
}
} // group LocalTransport
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_RemoteTransport
//
// Purpose:
// Functions of the EPTF HTTP Remote Transport
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_RemoteTransport {
///////////////////////////////////////////////////////////////////////////////
// Altstep: as_EPTF_HTTP_RemoteTransport_handler
//
// Purpose:
// Altstep to handle the incoming messages from the mapper component
//
///////////////////////////////////////////////////////////////////////////////
altstep as_EPTF_HTTP_RemoteTransport_handler()
runs on EPTF_HTTP_RemoteTransport_CT
{
[] v_EPTF_HTTP_RemoteTransport_commPort.receive(EPTF_HTTP_Transport_Receive:?) -> value v_EPTF_HTTP_RemoteTransport_receive
{
vf_EPTF_HTTP_RemoteTransport_handleReceive.apply({
v_EPTF_HTTP_RemoteTransport_receive.groupId,
v_EPTF_HTTP_RemoteTransport_receive.sessionId,
v_EPTF_HTTP_RemoteTransport_receive.seqNum,
v_EPTF_HTTP_RemoteTransport_receive.reveivedMessage});
repeat;
}
[] v_EPTF_HTTP_RemoteTransport_commPort.receive(EPTF_HTTP_Transport_Result:?) -> value v_EPTF_HTTP_RemoteTransport_result
{
vf_EPTF_HTTP_RemoteTransport_eventReceive.apply({
v_EPTF_HTTP_RemoteTransport_result.groupId,
v_EPTF_HTTP_RemoteTransport_result.sessionId,
v_EPTF_HTTP_RemoteTransport_result.resultType});
repeat;
}
[] v_EPTF_HTTP_RemoteTransport_commPort.receive(EPTF_HTTP_Transport_Error:?) -> value v_EPTF_HTTP_RemoteTransport_error
{
vf_EPTF_HTTP_RemoteTransport_socketErrorReceive.apply({
v_EPTF_HTTP_RemoteTransport_error.groupId,
v_EPTF_HTTP_RemoteTransport_error.sessionId,
v_EPTF_HTTP_RemoteTransport_error.result});
repeat;
}
[] v_EPTF_HTTP_RemoteTransport_commPort.receive(EPTF_HTTP_Transport_ListenEvent:?) -> value v_EPTF_HTTP_RemoteTransport_listenEvent
{
vf_EPTF_HTTP_RemoteTransport_listenSocketEvent.apply({
v_EPTF_HTTP_RemoteTransport_listenEvent.groupId,
v_EPTF_HTTP_RemoteTransport_listenEvent.hostInfo,
v_EPTF_HTTP_RemoteTransport_listenEvent.eventType});
repeat;
}
[] v_EPTF_HTTP_RemoteTransport_commPort.receive(EPTF_HTTP_Transport_ListenError:?) -> value v_EPTF_HTTP_RemoteTransport_listenError
{
vf_EPTF_HTTP_RemoteTransport_listenSocketError.apply({
v_EPTF_HTTP_RemoteTransport_listenError.groupId,
v_EPTF_HTTP_RemoteTransport_listenError.hostInfo,
v_EPTF_HTTP_RemoteTransport_listenError.transportError});
repeat;
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_init_CT
//
// Purpose:
// Function to init the RemoteTransport component
//
// Parameters:
// pl_selfName - *in* *charstring* - self name of the component
// pl_handleReceive - *in* - <EPTF_HTTP_messageProcess_FT> - receive
// function
// pl_eventReceiveFunction - *in* - <EPTF_HTTP_eventReceive_FT> -
// event receive function
//
// Return Value:
// *integer* - if the component initialize already the return value
// will be -1
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_init_CT(
in charstring pl_selfName := "EPTF_HTTP_RemoteTransport",
in EPTF_HTTP_messageProcess_FT pl_handleReceive,
in EPTF_HTTP_eventReceive_FT pl_eventReceiveFunction,
in EPTF_HTTP_socketErrorReceive_FT pl_socketErrorReceiveFunction,
in EPTF_HTTP_listenSocketEvent_FT pl_listenSocketEvent := null,
in EPTF_HTTP_listenSocketError_FT pl_listenSocketError := null)
runs on EPTF_HTTP_RemoteTransport_CT
return integer
{
if (v_EPTF_HTTP_RemoteTransport_initialized)
{
log(%definitionId & ": " & // intentionally simple log
"The HTTP RemoteTransport component already initialized!");
return -1;
}
v_EPTF_HTTP_RemoteTransport_selfName := pl_selfName
f_EPTF_Logging_init_CT(pl_selfName);
v_EPTF_HTTP_Transport_loggingMaskId :=
f_EPTF_Logging_registerComponentMasks(
tsp_EPTF_HTTP_Transport_loggingComponentMask,
c_EPTF_HTTP_Transport_loggingEventClasses,
EPTF_Logging_CLL);
if (tsp_EPTF_HTTP_Transport_loggingEnable)
{
f_EPTF_Logging_enableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_Debug);
}
else
{
f_EPTF_Logging_disableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_Debug);
}
if (tsp_EPTF_HTTP_Transport_bufferLogEnable)
{
f_EPTF_Logging_enableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_BufferDebug);
}else
{
f_EPTF_Logging_disableLocalMask(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_BufferDebug);
}
vf_EPTF_HTTP_RemoteTransport_handleReceive := pl_handleReceive;
vf_EPTF_HTTP_RemoteTransport_eventReceive := pl_eventReceiveFunction;
vf_EPTF_HTTP_RemoteTransport_socketErrorReceive := pl_socketErrorReceiveFunction;
vf_EPTF_HTTP_RemoteTransport_listenSocketEvent := pl_listenSocketEvent;
vf_EPTF_HTTP_RemoteTransport_listenSocketError := pl_listenSocketError;
f_EPTF_Base_init_CT(pl_selfName);
f_EPTF_Base_registerCleanup(refers(f_EPTF_HTTP_RemoteTransport_cleanup_CT));
f_EPTF_HashMap_init_CT(pl_selfName);
v_EPTF_HTTP_RemoteTransport_transportIdToConnId :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_RemoteTransport_HashMap_transportId2ConnId);
v_EPTF_HTTP_RemoteTransport_default := activate(as_EPTF_HTTP_RemoteTransport_handler());
//map(self:IPL4_PCO, system:IPL4_PCO);
v_EPTF_HTTP_RemoteTransport_initialized := true;
f_EPTF_HTTP_Transport_debug(%definitionId & ": The initialization of the " &
"HTTP RemoteTransport component is ready");
return 1;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTranport_cleanup_CT
//
// Purpose:
// Function to clean the RemoteTransport component
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_cleanup_CT ()
runs on EPTF_HTTP_RemoteTransport_CT
{
if (not v_EPTF_HTTP_RemoteTransport_initialized) {
return;
}
v_EPTF_HTTP_RemoteTransport_initialized := false;
deactivate(v_EPTF_HTTP_RemoteTransport_default);
v_EPTF_HTTP_RemoteTransport_default := null;
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_RemoteTransport_HashMap_transportId2ConnId);
v_EPTF_HTTP_RemoteTransport_transportIdToConnId := -1;
vf_EPTF_HTTP_RemoteTransport_handleReceive := null;
//f_EPTF_Logging_debug(true,"The cleanup of the RemoteTransport component is ready");
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_newPortGroup
//
// Purpose:
// Function to create port group on the mapper component remotely
//
// Parameters:
// pl_result - *out* - <Result> - the result of sending
//
// Return Value:
// *integer* - index of newly created port group, -1 if creation is
// unsuccessful
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_newPortGroup(
in EPTF_HTTP_Transport_GroupMode pl_group)
runs on EPTF_HTTP_RemoteTransport_CT return integer
{
var integer vl_groupId;
var EPTF_HTTP_Transport_NewPortGroup vl_createPortGroup := {
groupInfo := pl_group
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_createPortGroup);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_groupId {}
}
return vl_groupId;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_deletePortGroup
//
// Purpose:
// Function to delete port group on the mapper component remotely
//
// Parameters:
// pl_group - *in* - *integer* - port group index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_deletePortGroup(
in integer pl_group)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_DeletePortGroup vl_deletePortGroup := {
groupId := pl_group
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_deletePortGroup);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_newPort
//
// Purpose:
// Function to create a port on the mapper component remotely
//
// Parameters:
// pl_portInfo - *in* - <EPTF_HTTP_Transport_PortMode> - port data
//
// Return Value:
// *integer* - index of newly created port, -1 if creation is
// unsuccessful
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_newPort(
in EPTF_HTTP_Transport_PortMode pl_portInfo)
runs on EPTF_HTTP_RemoteTransport_CT return integer
{
var integer vl_groupId;
var EPTF_HTTP_Transport_NewPort vl_createPort := {
portInfo := pl_portInfo
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_createPort);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_groupId {}
}
return vl_groupId;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_newServerPort
//
// Purpose:
// Creates a server port on the mapper component remotely
//
// Parameters:
// pl_portInfo - *in* - <EPTF_HTTP_Transport_ServerPortMode> - server port data
//
// Return Value:
// *integer* - index of newly created port, -1 if creation is
// unsuccessful
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_newServerPort(
in EPTF_HTTP_Transport_ServerPortMode pl_portInfo)
runs on EPTF_HTTP_RemoteTransport_CT return integer
{
var integer vl_groupId;
var EPTF_HTTP_Transport_NewServerPort vl_createServerPort := {
portInfo := pl_portInfo
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_createServerPort);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_groupId {}
}
return vl_groupId;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_deletePort
//
// Purpose:
// Function to delete a port on the mapper component remotely
//
// Parameters:
// pl_group - *in* - *integer* - port group index
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_deletePort(
in integer pl_group)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_DeletePort vl_deletePort := {
portId := pl_group
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_deletePort);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_addPortToGroup
//
// Purpose:
// Function to add a new port to a port group on the mapper component
// remotely
//
// Parameters:
// pl_group - *in* - <EPTF_HTTP_Transport_GroupMode> - port group data
// pl_result - *out* - <Result> - the result of sending
//
// Return Value:
// *boolean* - success result of new port addition to port group
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_addPortToGroup(
in integer pl_group)
runs on EPTF_HTTP_RemoteTransport_CT return boolean
{
var integer vl_groupId;
var EPTF_HTTP_Transport_AddPort vl_addPort := {
groupId := pl_group
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_addPort);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_groupId {}
}
if (vl_groupId == -1) { return false; } else { return true; };
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_removePortFromGroup
//
// Purpose:
// Function to remove a port from a port group on the mapper remotely
//
// Parameters:
// pl_group - *in* - *integer* - port group data
//
// Return Value:
// *boolean* - result of port removal
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_removePortFromGroup(
in integer pl_group)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_RemovePort vl_removePort := {
groupId := pl_group
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_removePort);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_sendMessage
//
// Purpose:
// Function to send the messages to the mapper component
//
// Parameters:
// pl_connId - *in* - *integer* - connection id
// pl_sessionId - *in* - *integer* - session id
// pl_message - *in* *octetstring* - encoded message
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_sendMessage(
in integer pl_connId,
in integer pl_sessionId,
in octetstring pl_message)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_Send vl_send := {
groupId := pl_connId,
sessionId := pl_sessionId,
outgoingMessage := pl_message
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_send);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_sendMessage
//
// Purpose:
// Function to close the port of an HTTP user
//
// Parameters:
// pl_groupId - *in* - *integer* - group id
// pl_sessionId - *in* - *integer* - session id
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_closePortOfUser(
in integer pl_groupId,
in integer pl_sessionId)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_ClosePortOfUser vl_send := {
groupId := pl_groupId,
sessionId := pl_sessionId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_send);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_freePortOfUser
//
// Purpose:
// Function to free the port of an HTTP user
//
// Parameters:
// pl_groupId - *in* - *integer* - group id
// pl_sessionId - *in* - *integer* - session id
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// If port is freed then it can be reused by any HTTP user. Incoming
// messages from last session will be dropped.
//
// If message arrives on the port from the last session after reuse,
// then the message will be forwarded to the new entity
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_freePortOfUser(
in integer pl_groupId,
in integer pl_sessionId)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_FreePortOfUser vl_send := {
groupId := pl_groupId,
sessionId := pl_sessionId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_send);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_connectionOpen
//
// Purpose:
// Function to open the connection
//
// Parameters:
// pl_connId - *in* - *integer* - port group index
// pl_sessionId - *in* - *integer* - session id
//
// Return Value:
// *boolean* - result of connection opening
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_connectionOpen(
in integer pl_connId,
in integer pl_sessionId)
runs on EPTF_HTTP_RemoteTransport_CT return boolean
{
var integer vl_connId;
var EPTF_HTTP_Transport_Connect vl_connect := {
groupId := pl_connId,
sessionId := pl_sessionId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_connect);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_connId {}
}
if (vl_connId == -1) { return false; } else { return true; };
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_connectionClose
//
// Purpose:
// Function to close the connection
//
// Parameters:
// pl_connId - *in* - *integer* - the connection ID
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_connectionClose(
in integer pl_connId)
runs on EPTF_HTTP_RemoteTransport_CT {
var EPTF_HTTP_Transport_Close vl_close := {
groupId := pl_connId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_close);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_connectionHalfClose
//
// Purpose:
// Function to close the connection
//
// Parameters:
// pl_connId - *in* - *integer* - the connection ID
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_connectionHalfClose(
in integer pl_connId)
runs on EPTF_HTTP_RemoteTransport_CT {
var EPTF_HTTP_Transport_HalfClose vl_halfclose := {
groupId := pl_connId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_halfclose);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_listen
//
// Purpose:
// Function to open a listening socket
//
// Parameters:
// pl_group - *in* - *integer* - the server port identifier
//
// Return Value:
// boolean - listen result
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_listen(
in integer pl_groupId)
runs on EPTF_HTTP_RemoteTransport_CT
return integer{
var integer vl_result;
var EPTF_HTTP_Transport_Listen vl_listen := {
groupId := pl_groupId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_listen);
alt {
[] v_EPTF_HTTP_RemoteTransport_commPort.receive (integer:?) -> value vl_result {}
}
return vl_result;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_closePort
//
// Purpose:
// Closes a socket in the server port.
//
// Parameters:
// pl_group - *in* - *integer* - the server port identifier
// pl_portId - *in* - *integer* - the port identifier
//
// Return Value:
// boolean - listen result
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_closePort(
in integer pl_groupId,
in integer pl_portId)
runs on EPTF_HTTP_RemoteTransport_CT
{
var EPTF_HTTP_Transport_closePort vl_close :={
groupId := pl_groupId,
portId := pl_portId
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_close);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RemoteTransport_sendResponse
//
// Purpose:
// Function to send the responses to the mapper component
//
// Parameters:
// pl_group - *in* - *integer* - server group identifier
// pl_portId - *in* - *integer* - unique port identifier of the request
// pl_message - *in* *octetstring* - encoded message
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RemoteTransport_sendResponse(
in integer pl_groupId,
in integer pl_portId,
in integer pl_seqNum,
in octetstring pl_message
)
runs on EPTF_HTTP_RemoteTransport_CT{
var EPTF_HTTP_Transport_SendResponse vl_response :={
groupId := pl_groupId,
portId := pl_portId,
seqNum := pl_seqNum,
msg := pl_message
}
v_EPTF_HTTP_RemoteTransport_commPort.send(vl_response);
}
} // group remoteTransport
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_Mapper
//
// Purpose:
// The functions of the EPTF HTTP Mapper
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_Mapper {
///////////////////////////////////////////////////////////////////////////////
// Altstep: as_EPTF_HTTP_Mapper_Handler
//
// Purpose:
// Altstep to handle the incoming messages from the RemoteTransport component
//
///////////////////////////////////////////////////////////////////////////////
altstep as_EPTF_HTTP_Mapper_Handler()
runs on EPTF_HTTP_Mapper_CT
{
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_NewPortGroup:?) -> value v_EPTF_HTTP_Mapper_newPortGroup sender v_EPTF_HTTP_Mapper_componentRef
{
var integer vl_newGroupId :=
f_EPTF_HTTP_LocalTransport_newPortGroup(v_EPTF_HTTP_Mapper_newPortGroup.groupInfo);
if (vl_newGroupId == -1)
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Creation of port group failed for group: " &
log2str(v_EPTF_HTTP_Mapper_newPortGroup.groupInfo));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
}
else
{
f_EPTF_HTTP_Transport_debug(%definitionId &
"New group id acquired (" & int2str(vl_newGroupId) & " for group: " &
log2str(v_EPTF_HTTP_Mapper_newPortGroup.groupInfo));
v_EPTF_HTTP_Mapper_commPort.send(vl_newGroupId) to v_EPTF_HTTP_Mapper_componentRef;
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_DeletePortGroup:?) -> value v_EPTF_HTTP_Mapper_deletePortGroup sender v_EPTF_HTTP_Mapper_componentRef
{
f_EPTF_HTTP_LocalTransport_deletePortGroup(v_EPTF_HTTP_Mapper_deletePortGroup.groupId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_NewPort:?) -> value v_EPTF_HTTP_Mapper_newPort sender v_EPTF_HTTP_Mapper_componentRef
{
var integer vl_newGroupId :=
f_EPTF_HTTP_LocalTransport_newPort(v_EPTF_HTTP_Mapper_newPort.portInfo);
if (vl_newGroupId == -1)
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Creation of port failed for port: " &
log2str(v_EPTF_HTTP_Mapper_newPort.portInfo));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
}
else
{
f_EPTF_HTTP_Transport_debug(%definitionId &
"New port id acquired (" & int2str(vl_newGroupId) & " for port: " &
log2str(v_EPTF_HTTP_Mapper_newPort.portInfo));
v_EPTF_HTTP_Mapper_commPort.send(vl_newGroupId) to v_EPTF_HTTP_Mapper_componentRef;
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_NewServerPort:?) -> value v_EPTF_HTTP_Mapper_newServerPort sender v_EPTF_HTTP_Mapper_componentRef
{
var integer vl_newGroupId := -1
var boolean vl_new :=
f_EPTF_HTTP_LocalTransport_createServerPort(v_EPTF_HTTP_Mapper_newServerPort.portInfo, vl_newGroupId);
if (vl_newGroupId == -1)
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Creation of port failed for port: " &
log2str(v_EPTF_HTTP_Mapper_newServerPort.portInfo));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
}
else
{
if (vl_new)
{
v_EPTF_HTTP_Mapper_inRoutingDatabase[vl_newGroupId] := c_EPTF_HTTP_initRoutingDBE;
}
var integer vl_size := v_EPTF_HTTP_Mapper_inRoutingDatabase[vl_newGroupId].size;
v_EPTF_HTTP_Mapper_inRoutingDatabase[vl_newGroupId].size := vl_size + 1;
v_EPTF_HTTP_Mapper_inRoutingDatabase[vl_newGroupId].compIdList[vl_size] := f_EPTF_Base_upcast(v_EPTF_HTTP_Mapper_componentRef);
f_EPTF_HTTP_Transport_debug(log2str(%definitionId,
": Routing database: ", v_EPTF_HTTP_Mapper_inRoutingDatabase[vl_newGroupId]));
v_EPTF_HTTP_Mapper_commPort.send(vl_newGroupId) to v_EPTF_HTTP_Mapper_componentRef;
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_DeletePort:?) -> value v_EPTF_HTTP_Mapper_deletePort sender v_EPTF_HTTP_Mapper_componentRef
{
f_EPTF_HTTP_LocalTransport_deletePort(v_EPTF_HTTP_Mapper_deletePort.portId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_AddPort:?) -> value v_EPTF_HTTP_Mapper_addPort sender v_EPTF_HTTP_Mapper_componentRef
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(v_EPTF_HTTP_Mapper_addPort.groupId))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Wrong port group index: " & int2str(v_EPTF_HTTP_Mapper_addPort.groupId));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
repeat;
};
if (v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[v_EPTF_HTTP_Mapper_addPort.groupId].defaultFIdx].addPort.apply(
v_EPTF_HTTP_Mapper_addPort.groupId))
{
v_EPTF_HTTP_Mapper_commPort.send(1) to v_EPTF_HTTP_Mapper_componentRef;
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Port addition to group failed: " & int2str(v_EPTF_HTTP_Mapper_addPort.groupId));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_RemovePort:?) -> value v_EPTF_HTTP_Mapper_removePort sender v_EPTF_HTTP_Mapper_componentRef
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(v_EPTF_HTTP_Mapper_removePort.groupId))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Wrong port group index: " & int2str(v_EPTF_HTTP_Mapper_removePort.groupId));
repeat;
};
v_boolNoWarning := v_EPTF_HTTP_Transport_functionDB[v_EPTF_HTTP_Transport_portDB[v_EPTF_HTTP_Mapper_removePort.groupId].defaultFIdx
].removePort.apply(v_EPTF_HTTP_Mapper_removePort.groupId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_Connect:?) -> value v_EPTF_HTTP_Mapper_connect sender v_EPTF_HTTP_Mapper_componentRef
{
if (f_EPTF_HTTP_LocalTransport_connectionOpen(v_EPTF_HTTP_Mapper_connect.groupId, v_EPTF_HTTP_Mapper_connect.sessionId))
{
//v_EPTF_HTTP_Transport_lastReceivedGroup := v_EPTF_HTTP_Mapper_connect.groupId;
//v_EPTF_HTTP_Mapper_portId := f_EPTF_HTTP_LocalTransport_selectPortInGroup_defaultGroup(
// v_EPTF_HTTP_Mapper_groupId); // port on which we will send
//f_EPTF_Routing_processOutgoingMessage();
v_EPTF_HTTP_Mapper_commPort.send( v_EPTF_HTTP_Mapper_connect.groupId ) to v_EPTF_HTTP_Mapper_componentRef;
}
else
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Open connection unsuccessful for port group: " &
int2str(v_EPTF_HTTP_Mapper_connect.groupId));
v_EPTF_HTTP_Mapper_commPort.send(-1) to v_EPTF_HTTP_Mapper_componentRef;
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_Send:?) -> value v_EPTF_HTTP_Mapper_sendMessage sender v_EPTF_HTTP_Mapper_componentRef
{
v_EPTF_HTTP_Mapper_sessionId := v_EPTF_HTTP_Mapper_sendMessage.sessionId;
f_EPTF_Routing_processOutgoingMessage();
if (v_EPTF_HTTP_Mapper_sessionId != -1)
{
f_EPTF_HTTP_LocalTransport_sendMessage(
v_EPTF_HTTP_Mapper_sendMessage.groupId,
v_EPTF_HTTP_Mapper_sendMessage.sessionId,
v_EPTF_HTTP_Mapper_sendMessage.outgoingMessage);
}
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_SendResponse:?) -> value v_EPTF_HTTP_Mapper_sendResponse sender v_EPTF_HTTP_Mapper_componentRef
{
v_EPTF_HTTP_Mapper_portId := v_EPTF_HTTP_Mapper_sendResponse.portId;
f_EPTF_HTTP_LocalTransport_sendResponse(
v_EPTF_HTTP_Mapper_sendResponse.groupId,
v_EPTF_HTTP_Mapper_sendResponse.portId,
v_EPTF_HTTP_Mapper_sendResponse.seqNum,
v_EPTF_HTTP_Mapper_sendResponse.msg);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_ClosePortOfUser:?) -> value v_EPTF_HTTP_Mapper_closePortOfUser sender v_EPTF_HTTP_Mapper_componentRef
{
f_EPTF_HTTP_LocalTransport_closePortOfUser(
v_EPTF_HTTP_Mapper_closePortOfUser.groupId,
v_EPTF_HTTP_Mapper_closePortOfUser.sessionId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_FreePortOfUser:?) -> value v_EPTF_HTTP_Mapper_freePortOfUser sender v_EPTF_HTTP_Mapper_componentRef
{
f_EPTF_HTTP_LocalTransport_freePortOfUser(
v_EPTF_HTTP_Mapper_freePortOfUser.groupId,
v_EPTF_HTTP_Mapper_freePortOfUser.sessionId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_Close:?) -> value v_EPTF_HTTP_Mapper_close sender v_EPTF_HTTP_Mapper_componentRef
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(v_EPTF_HTTP_Mapper_close.groupId))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Wrong port group index: " & int2str(v_EPTF_HTTP_Mapper_close.groupId));
repeat;
};
//for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Transport_portDB[v_EPTF_HTTP_Transport_lastReceivedGroup].portDatabase); i := i + 1)
//{
// v_EPTF_HTTP_Mapper_portId := i;
// f_EPTF_Routing_processOutgoingMessage();
//}
f_EPTF_HTTP_LocalTransport_connectionClose(v_EPTF_HTTP_Mapper_close.groupId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_HalfClose:?) -> value v_EPTF_HTTP_Mapper_halfClose sender v_EPTF_HTTP_Mapper_componentRef
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(v_EPTF_HTTP_Mapper_halfClose.groupId)) {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Wrong port group index: " & int2str(v_EPTF_HTTP_Mapper_halfClose.groupId));
repeat;
};
//for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Transport_portDB[v_EPTF_HTTP_Transport_lastReceivedGroup].portDatabase); i := i + 1)
//{
// v_EPTF_HTTP_Mapper_portId := i;
// f_EPTF_Routing_processOutgoingMessage();
//}
f_EPTF_HTTP_LocalTransport_connectionHalfClose(
v_EPTF_HTTP_Mapper_halfClose.groupId);
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_Listen:?) -> value v_EPTF_HTTP_Mapper_listen sender v_EPTF_HTTP_Mapper_componentRef
{
var integer vl_id := f_EPTF_HTTP_LocalTransport_listen(v_EPTF_HTTP_Mapper_listen.groupId);
v_EPTF_HTTP_Mapper_commPort.send(vl_id) to v_EPTF_HTTP_Mapper_componentRef;
repeat;
}
[] v_EPTF_HTTP_Mapper_commPort.receive (EPTF_HTTP_Transport_closePort:?) -> value v_EPTF_HTTP_Mapper_closePort sender v_EPTF_HTTP_Mapper_componentRef
{
f_EPTF_HTTP_LocalTransport_closePort(v_EPTF_HTTP_Mapper_closePort.groupId, v_EPTF_HTTP_Mapper_closePort.portId);
repeat;
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_init_CT
//
// Purpose:
// Function to init the Mapper component
//
// Parameters:
// - pl_selfName - *in charstring* - the name of the component
// - pl_interfaceInformationList - <EPTF_CommPort_IPL4_InterfaceInformationList> - The defined interfaces
//
// Return Value:
// *integer* - if the component initialize already the return value will be -1
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_init_CT(
in charstring pl_selfName := "",
in EPTF_CommPort_IPL4_InterfaceInformationList pl_interfaceInformationList := {},
in integer pl_mode := 0) //0: client mode, 1:server mode
runs on EPTF_HTTP_Mapper_CT
return integer
{
if (v_EPTF_HTTP_Mapper_initialized) {
log(%definitionId & // intentionally simple log!
"The Mapper component is initialized already");
return -1;
}
v_EPTF_HTTP_Mapper_componentId := {};
f_EPTF_HashMap_init_CT(pl_selfName);
v_EPTF_HTTP_Mapper_hashMapIdx := f_EPTF_int2int_HashMap_New(
c_EPTF_HTTP_Mapper_HashMap_routing);
v_intNoWarning := f_EPTF_HTTP_LocalTransport_init_CT(pl_selfName,
refers(f_EPTF_HTTP_Mapper_receiveMsg),
refers(f_EPTF_HTTP_Mapper_receiveEvent),
refers(f_EPTF_HTTP_Mapper_receiveSocketError),
pl_interfaceInformationList,
refers(f_EPTF_HTTP_Mapper_listenSocketEvent),
refers(f_EPTF_HTTP_Mapper_listenSocketError));
if (0 == pl_mode)//client mode
{
f_EPTF_Routing_init_CT(
refers(f_EPTF_HTTP_Mapper_processOutgoingMessage),
refers(f_EPTF_HTTP_Mapper_processIncomingMessage));
}else if (1 == pl_mode)//server mode
{
f_EPTF_Routing_init_CT(
-,
refers(f_EPTF_HTTP_Mapper_processIncomingMessageServer));
}
v_EPTF_HTTP_MapperRoutingUri2LGenDB.uri2lgenIdxHash :=
f_EPTF_str2int_HashMap_New(c_EPTF_HTTP_Transport_hashMapName_uri2idxHash);
f_EPTF_Base_init_CT(pl_selfName);
f_EPTF_Base_registerCleanup(refers(f_EPTF_HTTP_Mapper_cleanup_CT));
v_EPTF_HTTP_Mapper_initialized := true;
v_EPTF_HTTP_Mapper_default := activate(as_EPTF_HTTP_Mapper_Handler());
f_EPTF_HTTP_Transport_debug(%definitionId &
": The initialization of the Mapper component is ready");
return 1;
}
function f_EPTF_HTTP_Mapper_CommPort_IPL4_setMsgLen(
in ConnectionId pl_connId,
in f_IPL4_getMsgLen pl_function,
in ro_integer pl_msgLenArgs)
runs on EPTF_HTTP_Mapper_CT
{
f_EPTF_CommPort_IPL4_setMsgLen(pl_connId, pl_function, pl_msgLenArgs);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_cleanup_CT
//
// Purpose:
// Function to clean the Mapper component
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_cleanup_CT()
runs on EPTF_HTTP_Mapper_CT
{
if (not v_EPTF_HTTP_Mapper_initialized) {
return;
}
v_EPTF_HTTP_Mapper_initialized := false;
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
v_EPTF_HTTP_Mapper_componentId := {};
v_EPTF_HTTP_Mapper_hashMapIdx := -1;
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_Mapper_HashMap_routing);
v_EPTF_HTTP_Mapper_default := null;
f_EPTF_HTTP_Transport_debug(%definitionId &
": The cleanup of the Mapper component is ready");
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_setRouting
//
// Purpose:
// Function to set routing information for Mapper database
//
// Parameters:
// pl_route - *in* <EPTF_HTTP_Mapper_RoutingList> - routing data
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_setRouting(
in EPTF_HTTP_Mapper_RoutingList pl_route)
runs on EPTF_HTTP_Mapper_CT
{
f_EPTF_HTTP_Transport_debug("### " & %definitionId & "()");
var integer i, vl_maxGroupIdx := -1;
for (i := 0; i < sizeof(pl_route); i := i + 1)
{
if (vl_maxGroupIdx < pl_route[i].groupId) {
vl_maxGroupIdx := pl_route[i].groupId;
};
}
for (i := 0; i < vl_maxGroupIdx; i := i + 1)
{
v_EPTF_HTTP_Mapper_routingSetDatabase[i] := false;
}
for (i := 0; i < sizeof(pl_route); i := i + 1)
{
v_EPTF_HTTP_Mapper_inRoutingDatabase[pl_route[i].groupId] := {
ptr := 0,
size := sizeof(pl_route[i].compIdList),
compIdList := pl_route[i].compIdList
}
v_EPTF_HTTP_Mapper_routingSetDatabase[i] := true;
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_setRoutingUri2LGen_GetUriCallback
//
// Purpose:
// Function to set the fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri.
// If fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri is set, then the Mapper will use its return value
// to look up the subscribed LGen for the returned URI
//
// Parameters:
// pl_callback - *in* <EPTF_HTTP_MapperRoutingUri2LGen_GetUri_FT> - user function to return the URI
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_setRoutingUri2LGen_GetUriCallback(in EPTF_HTTP_MapperRoutingUri2LGen_GetUri_FT pl_callback) runs on EPTF_HTTP_Mapper_CT {
fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri := pl_callback
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_getUri2LGenRoutingData
//
// Purpose:
// Looks up the subscribed LGen for <pl_uri>, and returns it in the <pl_lgenIdx>
//
// Parameters:
// pl_uri - *in* <charstring> - URI to look up
// pl_lgenIdx - *inout* <integer> - LGen index handling the URI
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
private function f_EPTF_HTTP_getUri2LGenRoutingData(in charstring pl_uri, inout integer pl_lgenIdx) runs on EPTF_HTTP_Mapper_CT return boolean {
if (f_EPTF_str2int_HashMap_Find(v_EPTF_HTTP_MapperRoutingUri2LGenDB.uri2lgenIdxHash, pl_uri, pl_lgenIdx)) {
return true;
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_addUri2LGenRoutingData
//
// Purpose:
// Adds (subscribes) LGen <pl_lgenIdx> for URI <pl_uri>, and stores it in the database
//
// Parameters:
// pl_uri - *in* <charstring> - URI to look up
// pl_lgenIdx - *in* <integer> - LGen index handling the URI
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_addUri2LGenRoutingData(in charstring pl_uri, in integer pl_lgenIdx) runs on EPTF_HTTP_Mapper_CT {
f_EPTF_str2int_HashMap_Insert(v_EPTF_HTTP_MapperRoutingUri2LGenDB.uri2lgenIdxHash, pl_uri, pl_lgenIdx);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_removeUri2LGenRoutingData
//
// Purpose:
// Removes (unsubscribes) URI <pl_uri> from the URI <-> LGen database
//
// Parameters:
// pl_uri - *in* <charstring> - URI to look up
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_removeUri2LGenRoutingData(in charstring pl_uri) runs on EPTF_HTTP_Mapper_CT {
f_EPTF_str2int_HashMap_Erase(v_EPTF_HTTP_MapperRoutingUri2LGenDB.uri2lgenIdxHash, pl_uri);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_processOutgoingMessage
//
// Purpose:
// Function to process the outgoing messages
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Functions stores in a hash map the integer casted component id value
// of the component from which the message has been received with the
// key of the connection id value within the message
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_processOutgoingMessage()
runs on EPTF_HTTP_Mapper_CT
{
var integer vl_dummy;
if (f_EPTF_int2int_HashMap_Find(
v_EPTF_HTTP_Mapper_hashMapIdx,
v_EPTF_HTTP_Mapper_sessionId,
vl_dummy))
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": A component reference for session id ("
& int2str(v_EPTF_HTTP_Mapper_sessionId) &
") is already stored! Message not sent!");
v_EPTF_HTTP_Mapper_sessionId := -1;
}
else
{
f_EPTF_int2int_HashMap_Insert(
v_EPTF_HTTP_Mapper_hashMapIdx,
v_EPTF_HTTP_Mapper_sessionId,
f_EPTF_Base_upcast(v_EPTF_HTTP_Mapper_componentRef));
f_EPTF_HTTP_Transport_debug(%definitionId &
" Source component index (" &
int2str(f_EPTF_Base_upcast(v_EPTF_HTTP_Mapper_componentRef)) &
") stored in hash map for session id (" &
int2str(v_EPTF_HTTP_Mapper_sessionId) & ")!");
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_processIncomingMessage
//
// Purpose:
// Function to process the incoming messages
//
// Parameters:
// -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Function retrieves the integer casted component id to which the
// received message should be sent and then places this component id
// into the component variable v_EPTF_HTTP_Mapper_componentId
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_processIncomingMessage()
runs on EPTF_HTTP_Mapper_CT
{
f_EPTF_HTTP_Transport_debug(log2str(%definitionId,
": Incoming message received for session id: ",
v_EPTF_HTTP_Mapper_sessionId));
/*
if (v_EPTF_HTTP_Transport_lastReceivedGroup >= sizeof(v_EPTF_HTTP_Mapper_routingSetDatabase) or
not v_EPTF_HTTP_Mapper_routingSetDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup])
{
f_EPTF_HTTP_Transport_warning(%definitionId &
": Group id (" & int2str(v_EPTF_HTTP_Transport_lastReceivedGroup) &
") not found in routing database!");
v_EPTF_HTTP_Mapper_componentId := -1;
}
else
{
var integer vl_ptr := v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].ptr;
var integer vl_size := v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].size;
//log(v_EPTF_HTTP_Mapper_inRoutingDatabase);
//log(vl_ptr);
//log(v_EPTF_HTTP_Mapper_groupId);
v_EPTF_HTTP_Mapper_componentId :=
v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].compIdList[vl_ptr];
f_EPTF_HTTP_Transport_debug(%definitionId &
" Destination component acquired (" &
int2str(v_EPTF_HTTP_Mapper_componentId) & ") for group id (" &
int2str(v_EPTF_HTTP_Transport_lastReceivedGroup) & ")!");
vl_ptr := vl_ptr + 1;
if (vl_ptr >= vl_size) { vl_ptr := 1; };
}
*/
var integer vl_compId := -1;
if (f_EPTF_int2int_HashMap_Find(
v_EPTF_HTTP_Mapper_hashMapIdx,
v_EPTF_HTTP_Mapper_sessionId,
vl_compId))
{
f_EPTF_HTTP_Transport_debug(log2str(%definitionId,
" Destination component acquired (",
v_EPTF_HTTP_Mapper_componentId, ") for session id (",
int2str(v_EPTF_HTTP_Transport_lastReceivedGroup),")!"));
f_EPTF_int2int_HashMap_Erase(
v_EPTF_HTTP_Mapper_hashMapIdx,
v_EPTF_HTTP_Mapper_sessionId);
v_EPTF_HTTP_Mapper_componentId := {vl_compId};
}
else {
f_EPTF_HTTP_Transport_warning(%definitionId &
": Session id (" & int2str(v_EPTF_HTTP_Mapper_sessionId) &
") not found in hash map! Possibly connection closed remotely on Free port!");
v_EPTF_HTTP_Mapper_componentId := {};
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_processIncomingMessageServer
//
// Purpose:
// Processes the incoming messages.
//
// Detailed Comments:
// The current LGen to send the request to is chosen round robin.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_processIncomingMessageServer()
runs on EPTF_HTTP_Mapper_CT
{
f_EPTF_HTTP_Transport_debug(%definitionId &
": Incoming message received for group id: " &
int2str(v_EPTF_HTTP_Transport_lastReceivedGroup))
if(fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri == null or (not isbound(v_EPTF_CommPort_IPL4_aspRecvFrom.msg))) {
var integer vl_current :=
v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].ptr;
v_EPTF_HTTP_Mapper_componentId := {v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].compIdList[vl_current]};
v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].ptr :=
(vl_current + 1) mod v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].size;
} else {
f_EPTF_HTTP_Transport_debug(%definitionId & ": Incoming message received, calling fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri..");
var charstring vl_uri := fcb_EPTF_HTTP_MapperRoutingUri2LGen_GetUri.apply();
var integer vl_comp;
if(f_EPTF_HTTP_getUri2LGenRoutingData(vl_uri, vl_comp)) {
//log("LGen #", vl_comp, " is subscribed to the URI: ", vl_uri, ".");
v_EPTF_HTTP_Mapper_componentId := { vl_comp };
} else {
//log("No LGen is subscribed to the URI: ", vl_uri, ". Message discarded!");
v_EPTF_HTTP_Mapper_componentId := {};
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_receiveMsg
//
// Purpose:
// Function to receive the incoming messages
//
// Parameters:
// pl_message - *in* <EPTF_HTTP_IncomingMessage> - incoming message from the transport layer
//
// Detailed Comments:
// Function performs routing of incoming messages. It determins to which
// load generator component the message should be sent based on
// the provided connection id and sends it to this component.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_receiveMsg(
in EPTF_HTTP_IncomingMessage pl_message)
runs on EPTF_HTTP_Mapper_CT
{
v_EPTF_HTTP_Mapper_sessionId := pl_message.sessionId;
f_EPTF_Routing_processIncomingMessage();
var EPTF_HTTP_Transport_Receive vl_receive := {
groupId := pl_message.groupId,
sessionId := pl_message.sessionId,
seqNum := pl_message.seqNum,
reveivedMessage := pl_message.httpMessage
}
for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Mapper_componentId); i := i + 1)
{
v_EPTF_HTTP_Mapper_commPort.send(vl_receive) to f_EPTF_Base_downcast(v_EPTF_HTTP_Mapper_componentId[i]);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_receiveEvent
//
// Purpose:
// Function to receive the incoming events
//
// Parameters:
// pl_event - *in* <EPTF_HTTP_Event> - incoming event from the transport layer
//
// Detailed Comments:
// Function performs routing of incoming messages. It determins to which
// load generator component the message should be sent based on
// the provided connection id and sends it to this component.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_receiveEvent(
in EPTF_HTTP_Event pl_event)
runs on EPTF_HTTP_Mapper_CT
{
v_EPTF_HTTP_Mapper_sessionId := pl_event.sessionId;
f_EPTF_Routing_processIncomingMessage();
var EPTF_HTTP_Transport_Result vl_result := {
groupId := pl_event.groupId,
sessionId := pl_event.sessionId, //pl_sessionId,
resultType := pl_event.eventType
}
for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Mapper_componentId); i := i + 1)
{
v_EPTF_HTTP_Mapper_commPort.send(vl_result) to f_EPTF_Base_downcast(v_EPTF_HTTP_Mapper_componentId[i]);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_receiveSocketError
//
// Purpose:
// Function to receive the incoming socket errors
//
// Parameters:
// pl_error - <EPTF_HTTP_Error> - the error message
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Function performs routing of incoming messages. It determins to which
// load generator component the message should be sent based on
// the provided connection id and sends it to this component.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_receiveSocketError(
in EPTF_HTTP_EventError pl_error)
runs on EPTF_HTTP_Mapper_CT
{
v_EPTF_HTTP_Mapper_sessionId := pl_error.sessionId;
f_EPTF_Routing_processIncomingMessage();
var EPTF_HTTP_Transport_Error vl_result := {
groupId := pl_error.groupId,
sessionId := pl_error.sessionId, //pl_sessionId,
result := pl_error.transportError
}
for (var integer i := 0; i < sizeof(v_EPTF_HTTP_Mapper_componentId); i := i + 1)
{
v_EPTF_HTTP_Mapper_commPort.send(vl_result) to f_EPTF_Base_downcast(v_EPTF_HTTP_Mapper_componentId[i]);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_listenSocketEvent
//
// Purpose:
// Function to receive the incoming listening socket events
//
// Parameters:
// pl_event - <EPTF_HTTP_listenSocketEvent> -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Events are routed to all of the LGens belonging to the server port.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_listenSocketEvent(
in EPTF_HTTP_listenSocketEvent pl_event)
runs on EPTF_HTTP_Mapper_CT
{
var EPTF_HTTP_Transport_ListenEvent vl_result := {
groupId := pl_event.groupId,
hostInfo := pl_event.hostInfo,
eventType := pl_event.eventType
}
for (var integer i := 0; i < v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].size; i := i + 1)
{
v_EPTF_HTTP_Mapper_commPort.send(vl_result) to
f_EPTF_Base_downcast(v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].compIdList[i]);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Mapper_listenSocketError
//
// Purpose:
// Function to receive the incoming listening socket events
//
// Parameters:
// pl_error - <EPTF_HTTP_listenSocketError> -
//
// Return Value:
// -
//
// Errors:
// -
//
// Detailed Comments:
// Events are routed to all of the LGens belonging to the server port.
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Mapper_listenSocketError(
in EPTF_HTTP_listenSocketError pl_error)
runs on EPTF_HTTP_Mapper_CT
{
var EPTF_HTTP_Transport_ListenError vl_result := {
groupId := pl_error.groupId,
hostInfo := pl_error.hostInfo,
transportError := pl_error.transportError
}
for (var integer i := 0; i < v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].size; i := i + 1)
{
v_EPTF_HTTP_Mapper_commPort.send(vl_result) to
f_EPTF_Base_downcast(v_EPTF_HTTP_Mapper_inRoutingDatabase[v_EPTF_HTTP_Transport_lastReceivedGroup].compIdList[i]);
}
}
} // end of Group: Mapper
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_Transport_Logging
//
// Purpose:
// The functions of the EPTF HTTP Transport Logging
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_Transport_Logging {
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_error
//
// Purpose:
// Function to log an error from EPTF HTTP Transport
//
// Parameters:
// - pl_message - *in* *charstring* - the message to log
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_error(
in @lazy charstring pl_message)
runs on EPTF_HTTP_Transport_Logging_CT
{
f_EPTF_Logging_errorV2(pl_message,
v_EPTF_HTTP_Transport_loggingMaskId,
{c_EPTF_HTTP_Transport_loggingClassIdx_Error});
f_EPTF_Base_stopAll();
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_warning
//
// Purpose:
// Function to log a warning from EPTF HTTP Transport
//
// Parameters:
// - pl_message - *in* *charstring* - the message to log
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_warning(
in @lazy charstring pl_message)
runs on EPTF_HTTP_Transport_Logging_CT
{
f_EPTF_Logging_warningV2(pl_message,
v_EPTF_HTTP_Transport_loggingMaskId,
{c_EPTF_HTTP_Transport_loggingClassIdx_Warning});
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_debug
//
// Purpose:
// Function to log a debug message from EPTF HTTP Transport
//
// Parameters:
// - pl_message - *in* *charstring* - the message to log
//
// Return Value:
// -
//
// Errors & assertions:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_debug(
in @lazy charstring pl_message)
runs on EPTF_HTTP_Transport_Logging_CT
{
f_EPTF_Logging_debugV2(pl_message,
v_EPTF_HTTP_Transport_loggingMaskId,
{c_EPTF_HTTP_Transport_loggingClassIdx_Debug});
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_bufferWarning
//
// Purpose:
// Function to log a buffer warning message from EPTF HTTP Transport
//
// Parameters:
// - pl_message - *in* *charstring* - the message to log
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_bufferWarning(
in @lazy charstring pl_message)
runs on EPTF_HTTP_Transport_Logging_CT
{
f_EPTF_Logging_warningV2(pl_message,
v_EPTF_HTTP_Transport_loggingMaskId,
{c_EPTF_HTTP_Transport_loggingClassIdx_BufferWarning});
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_bufferDebug
//
// Purpose:
// Function to log a buffer debug message from EPTF HTTP Transport
//
// Parameters:
// - pl_message - *in* *charstring* - the message to log
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_bufferDebug(
in @lazy charstring pl_message)
runs on EPTF_HTTP_Transport_Logging_CT
{
f_EPTF_Logging_debugV2(pl_message,
v_EPTF_HTTP_Transport_loggingMaskId,
{c_EPTF_HTTP_Transport_loggingClassIdx_BufferDebug});
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_debugEnabled
//
// Purpose:
// Function to check if debug is enabled for EPTF HTTP Transport
//
// Parameters:
// -
//
// Return Value:
// *boolean* - true if debug enalbed
//
// Errors & assertions:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_debugEnabled()
runs on EPTF_HTTP_Transport_Logging_CT
return boolean
{
return f_EPTF_Logging_isEnabled(
v_EPTF_HTTP_Transport_loggingMaskId,
c_EPTF_HTTP_Transport_loggingClassIdx_Debug);
}
} // group Logging
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_Transport_DB
//
// Purpose:
// Contains the database handling functions.
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_Transport_DB{
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_Transport_debugEnabled
//
// Purpose:
// Function to check if debug is enabled for EPTF HTTP Transport
//
// Parameters:
// -
//
// Return Value:
// *boolean* - true if debug enalbed
//
// Errors & assertions:
// -
//
// Detailed Comments:
// -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_Transport_Group_getName(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return charstring
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return ""; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].name;
}
function f_EPTF_HTTP_Transport_Group_getLocHostInfo(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return EPTF_HTTP_HostInformation
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return {"", -1}; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].baseLocalHostInformation;
}
function f_EPTF_HTTP_Transport_Group_getRemoteHostInfo(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return EPTF_HTTP_HostInformation
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return {"", -1}; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].baseRemoteHostInformation;
}
function f_EPTF_HTTP_Transport_Group_getNumberOfPorts(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return -1; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].numberOfPorts;
}
function f_EPTF_HTTP_Transport_Group_getLocalportStep(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return -1; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].localportStep;
}
function f_EPTF_HTTP_Transport_Group_getRemoteportStep(in integer pl_groupId)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return -1; };
return v_EPTF_HTTP_Transport_portDB[pl_groupId].remoteportStep;
}
function f_EPTF_HTTP_Transport_Group_getUseSSL(in integer pl_groupId, inout boolean pl_useSSL)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return false; };
pl_useSSL := v_EPTF_HTTP_Transport_portDB[pl_groupId].useSSL;
return true;
}
function f_EPTF_HTTP_Transport_Group_getInstantConnClose(in integer pl_groupId, inout boolean pl_instantConnClose)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return false; };
pl_instantConnClose := v_EPTF_HTTP_Transport_portDB[pl_groupId].instantConnClose;
return true;
}
function f_EPTF_HTTP_Transport_Group_getInstantConnOpen(in integer pl_groupId, inout boolean pl_instantConnOpen)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
if (not f_EPTF_HTTP_LocalTransport_checkGroup(pl_groupId)) { return false; };
pl_instantConnOpen := v_EPTF_HTTP_Transport_portDB[pl_groupId].instantConnOpen;
return true;
}
}//EPTF_HTTP_Transport_DB
///////////////////////////////////////////////////////////////////////////////
// Group: EPTF_HTTP_Buffer
//
// Purpose:
// Contains the buffer handling functions.
//
///////////////////////////////////////////////////////////////////////////////
group EPTF_HTTP_Buffer{
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_MsgBuffer_init
//
// Purpose:
// Initializes the message buffer.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_MessageBuffer> -
// pl_size - *in* *integer* - maximum size of the buffer
// pl_id - *in* *integer* - unique identifier of the buffer
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_MsgBuffer_init(inout EPTF_HTTP_MessageBuffer pl_buffer, in integer pl_size, in integer pl_id)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_RingBuffer_init(pl_buffer.seqNums, pl_size, pl_id);
pl_buffer.seqNum2messageIdxHM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_seqNum2messageIdx & int2str(pl_id));
f_EPTF_FBQ_initFreeBusyQueue(pl_buffer.messageQueue);
pl_buffer.httpMessages := {}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_init
//
// Purpose:
// Initializes the sequence numbers.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_SeqNumMgmt> -
// pl_size - *in* *integer* - maximum sequence number
// pl_id - *in* *integer* - unique identifier
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_init(inout EPTF_HTTP_RingBuffer pl_buffer, in integer pl_size, in integer pl_id)
runs on EPTF_HTTP_LocalTransport_CT
{
pl_buffer.nextSeqNum := 0;
pl_buffer.waitForSeqNum := 0;
pl_buffer.usedSlots := 0;
pl_buffer.maxSize := pl_size;
pl_buffer.isSlotBusyHM :=
f_EPTF_int2int_HashMap_New(c_EPTF_HTTP_LocalTransport_HashMap_isSlotBusy & int2str(pl_id));
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_clear
//
// Purpose:
// Clears the sequence numbers.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_RingBuffer> -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_clear(inout EPTF_HTTP_RingBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
{
pl_buffer.nextSeqNum := 0;
pl_buffer.waitForSeqNum := 0;
pl_buffer.usedSlots := 0;
f_EPTF_int2int_HashMap_Clear(pl_buffer.isSlotBusyHM);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_erase
//
// Purpose:
// Clears the sequence numbers.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_RingBuffer> -
// pl_id - *in* *integer* - unique identifier
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_erase(inout EPTF_HTTP_RingBuffer pl_buffer, in integer pl_id)
runs on EPTF_HTTP_LocalTransport_CT
{
pl_buffer.nextSeqNum := 0;
pl_buffer.waitForSeqNum := 0;
pl_buffer.usedSlots := 0;
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_isSlotBusy & int2str(pl_id));
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_MsgBuffer_clear
//
// Purpose:
// Clears the message buffer.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_Buffer> -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_MsgBuffer_clear(inout EPTF_HTTP_MessageBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_RingBuffer_clear(pl_buffer.seqNums);
f_EPTF_int2int_HashMap_Clear(pl_buffer.seqNum2messageIdxHM)
f_EPTF_FBQ_initFreeBusyQueue(pl_buffer.messageQueue);
pl_buffer.httpMessages := {}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_MsgBuffer_erase
//
// Purpose:
// Erases the message buffer.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_Buffer> -
// pl_id - *in* *integer* - unique identifier
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_MsgBuffer_erase(inout EPTF_HTTP_MessageBuffer pl_buffer, in integer pl_id)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_bufferDebug("### " & %definitionId & "()");
f_EPTF_HTTP_RingBuffer_erase(pl_buffer.seqNums, pl_id);
f_EPTF_int2int_HashMap_Delete(c_EPTF_HTTP_LocalTransport_HashMap_seqNum2messageIdx & int2str(pl_id))
pl_buffer.seqNum2messageIdxHM := -1;
f_EPTF_FBQ_initFreeBusyQueue(pl_buffer.messageQueue);
pl_buffer.httpMessages := {}
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_getNext
//
// Purpose:
// Gets the next sequence number.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_RingBuffer> -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_getNext(inout EPTF_HTTP_RingBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
if (pl_buffer.usedSlots == pl_buffer.maxSize)
{
f_EPTF_HTTP_Transport_bufferWarning(log2str(%definitionId &
": Buffer is full!"));
return -1;
}
var integer vl_next := pl_buffer.nextSeqNum;
pl_buffer.nextSeqNum := (vl_next + 1) mod pl_buffer.maxSize;
pl_buffer.usedSlots := pl_buffer.usedSlots + 1
return vl_next;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_setElementBusy
//
// Purpose:
// Sets the element status to busy.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_RingBuffer> -
// pl_elemIdx -*integer* *integer*- element index
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_setElementBusy(inout EPTF_HTTP_RingBuffer pl_buffer, in integer pl_elemIdx)
runs on EPTF_HTTP_LocalTransport_CT
{
if (pl_elemIdx >= pl_buffer.nextSeqNum and pl_elemIdx < pl_buffer.waitForSeqNum)
{
f_EPTF_HTTP_Transport_bufferWarning(log2str(%definitionId &
": Setting invalid index (",pl_elemIdx,"). ", "head: ", pl_buffer.waitForSeqNum, " tail: ", pl_buffer.nextSeqNum));
return;
}
f_EPTF_int2int_HashMap_Insert(pl_buffer.isSlotBusyHM, pl_elemIdx, 1);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_isHeadBusy
//
// Purpose:
// Retreive head slot status.
//
// Parameters:
// pl_buffer - *in* <EPTF_HTTP_RingBuffer> -
//
// Return Value:
// boolean - true if the head is busy
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_isHeadBusy(in EPTF_HTTP_RingBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
return boolean
{
var integer vl_tmp;
return f_EPTF_int2int_HashMap_Find(pl_buffer.isSlotBusyHM, pl_buffer.waitForSeqNum, vl_tmp);
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_freeHead
//
// Purpose:
// Sets the status of the head to free.
//
// Parameters:
// pl_buffer - *inout* <EPTF_HTTP_RingBuffer> -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_freeHead(inout EPTF_HTTP_RingBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_int2int_HashMap_Erase(pl_buffer.isSlotBusyHM, pl_buffer.waitForSeqNum);
pl_buffer.usedSlots := pl_buffer.usedSlots - 1;
pl_buffer.waitForSeqNum := (pl_buffer.waitForSeqNum + 1) mod pl_buffer.maxSize
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_RingBuffer_getHeadIdx
//
// Purpose:
// Gets the index of the head.
//
// Parameters:
// pl_buffer - *in* <EPTF_HTTP_RingBuffer> -
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_RingBuffer_getHeadIdx(in EPTF_HTTP_RingBuffer pl_buffer)
runs on EPTF_HTTP_LocalTransport_CT
return integer
{
return pl_buffer.waitForSeqNum;
}
///////////////////////////////////////////////////////////////////////////////
// Function: f_EPTF_HTTP_printBufferStatus
//
// Purpose:
// Prints message buffer status.
//
// Parameters:
// pl_group - *in* *integer* - group id
// pl_port - *in* *integer* - port id
//
///////////////////////////////////////////////////////////////////////////////
function f_EPTF_HTTP_printBufferStatus(in integer pl_group, in integer pl_port)
runs on EPTF_HTTP_LocalTransport_CT
{
f_EPTF_HTTP_Transport_bufferDebug(log2str(%definitionId, ": Buffer status (group: ",pl_group," port: ",pl_port,"):",
" next sequence number: "& int2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer.seqNums.nextSeqNum),
" waiting for: ", int2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer.seqNums.waitForSeqNum),
" used slots: ", int2str(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer.seqNums.usedSlots),
" size of message buffer: ",
f_EPTF_FBQ_getLengthOfFreeChain(v_EPTF_HTTP_Transport_portDB[pl_group].portDatabase[pl_port].messageBuffer.messageQueue)));
}
}//EPTF_HTTP_Buffer
}//end of module
with {
extension "version <RnXnn>"
}