<#--
   ******************************************************
   *
   *                       NOTICE
   *
   *  THIS SOFTWARE IS THE PROPERTY OF AND CONTAINS
   *  CONFIDENTIAL INFORMATION OF INFOR, AND SHALL NOT BE
   *  COPIED, USED, NOR DISCLOSED WITHOUT EXPRESS WRITTEN
   *  AUTHORIZATION.  ALTHOUGH PUBLICATION IS NOT
   *  INTENDED, IN THE EVENT OF PUBLICATION, THE
   *  FOLLOWING NOTICE IS APPLICABLE:
   *
   *  Copyright © 2009 Infor. All rights reserved.
   *  The word and design marks set forth herein are
   *  trademarks and/or registered trademarks of Infor
   *  and/or related affiliates and subsidiaries.
   *  All rights reserved. All other trademarks listed
   *  herein are the property of their respective owners.
   *  www.infor.com.
   *
   ******************************************************
  -->
<#import "common.source.ftl" as source/> 
<#import "common.names.ftl" as names/>
<#import "common.defs.ftl" as common/>
<@common.initListAllPublicAttributes/>
<@source.startsource/>
<@source.idents iIsPublic=false/>
<#import "protected.st.common.ftl" as protected/>
<#import "public.sb.common.ftl" as public/>
<@protected.initListProtectedAttributes/>
<@protected.initListProtectedAssociatedAttributes/>
<@protected.initListInternalIdentifiers/>
<@protected.initListProtectedComponents/>
<@protected.initHasMethodAlternativeImplementation/>
<@common.initListComponentImplementations/>
<#include "common.check.ftl" parse=true />
<@protected.declareDefines iUndef=false/>

|******************************* Initialize ***********************************
<#include "protected.st.initialize.ftl" parse=true />

|****************************** Set & Get generic *********************************

<#if common.referenceMethodPresent()>
function extern 
void <@names.ST_DLLCode/>.set.refKey(string i.value(40))
{
	DllUsage
	EndDllUsage

	if isspace(i.value) then
		bl.refKey = uuid.format$(uuid.generate$())
	else
		bl.refKey = i.value
	endif
	bl.refKey.set = true
}

function extern 
long <@names.ST_DLLCode/>.get.refKey(ref string o.value)
{
	DllUsage
	EndDllUsage

	o.value = ""
	if bl.refKey.set = true then
		o.value = bl.refKey
	endif
	return(0)
}

function extern 
boolean <@names.ST_DLLCode/>.is.set.refKey()
{
	DllUsage
	EndDllUsage

	return(bl.refKey.set)
}
</#if><#--if common.referenceMethodPresent()-->

function extern 
boolean <@names.ST_DLLCode/>.supports.referential.integrity()
{
	DllUsage
	EndDllUsage
<#if common.referenceMethodPresent()>
	return(true)
<#else><#--if common.referenceMethodPresent()-->
	return(false)
</#if><#--if common.referenceMethodPresent()-->
}

function 
void set.permission.for.readonly.attributes(boolean i.value)
{
	bl.permission.for.setting.readonly.attributes = i.value
}

|****************************** Set & Get *********************************

<#list protected.listProtectedComponents() as c>
	<#list c.componentImplementation.attributeImplementation as attributeImplementation>
		<#assign fieldname = c.componentName + "." + common.getAttributeName(attributeImplementation)>
		<#assign domain = common.getDatatypeName(common.getDatatype(attributeImplementation))>
function extern 
	<#assign array=false>
	<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists>
		<#assign dimensions=common.getDimensionsForDataType(common.getMandatoryDatatype(attributeImplementation))/>
		<#assign array=true>
		<#if dimensions?number == 0>
long <@names.ST_DLLCode/>.set.${fieldname}(ref domain ${domain} i.value(), ref boolean i.valueIsSet(), long i.size)
		<#else>
long <@names.ST_DLLCode/>.set.${fieldname}(ref domain ${domain} i.value(), ref boolean i.valueIsSet())
		</#if>
	<#else>
long <@names.ST_DLLCode/>.set.${fieldname}(const domain ${domain} i.value)
	</#if><#--if common.getMandatoryDatatype(attributeImplementation).dimensions?exists-->
{
	DllUsage
	EndDllUsage

	<#if attributeImplementation.isReadOnly>
	if not bl.permission.for.setting.readonly.attributes then
		dal.set.error.message("tlbctst0002", "${fieldname}")
		|* Setting the readonly attribute '%1$s' is not allowed.
		return (DALHOOKERROR)
	endif
	</#if>

	<#if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content>
	boolean cancel
	</#if><#--if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content-->

	if not bl.${c.componentName}.initialize then
		<@names.ST_DLLCode/>.${c.componentName}.initialize()
	endif
	<#assign arrayPart=""> 
	<#if array>
		<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
			<#assign arrayPart="(1, i.element)"> 
		<#else>
			<#assign arrayPart="(i.element)"> 
		</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
	</#if><#--if array-->
	<#if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content>
	RETIFNOK(Hook.BeforeSet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
		bl.${c.componentName}.${hookarg.name},
		bl.${c.componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
		bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
		<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists && dimensions?number == 0>
		i.size,
		</#if>
		cancel))
	if not cancel then
	</#if><#--if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content-->
	<#if array>
		long	i
		<#if dimensions?number == 0>
		if i.size = 0 then
			if bl.${fieldname}.size > 0 then
				free.mem(bl.${fieldname})
				free.mem(bl.${fieldname}.set)
				free.mem(bl.${fieldname}.get)
			endif
			bl.${fieldname}.size = 0
		else
			if bl.${fieldname}.size <> i.size then
				alloc.mem(bl.${fieldname}, i.size)
				alloc.mem(bl.${fieldname}.set, i.size)
				alloc.mem(bl.${fieldname}.get, i.size)
				for i = bl.${fieldname}.size + 1 to i.size
			<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
					bl.${fieldname}(1,i) = ""
			<#else>
					bl.${fieldname}(i) = ${protected.getBaanDataInitializers(attributeImplementation)}
			</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
					bl.${fieldname}.set(i) = false
				endfor
			endif
			bl.${fieldname}.size = i.size
			for i = 1 to i.size
				if i.valueIsSet(i) then
			<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
					bl.${fieldname}(1,i) = i.value(1,i)
			<#else>
					bl.${fieldname}(i) = i.value(i)
			</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
					bl.${fieldname}.set(i) = true
				endif
			endfor
		endif
		<#else>
		for i = 1 to ${dimensions?number}
			if i.valueIsSet(i) then
		<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
				bl.${fieldname}(1,i) = i.value(1,i)
		<#else>
				bl.${fieldname}(i) = i.value(i)
		</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
				bl.${fieldname}.set(i) = true
			endif
		endfor
		</#if>
	<#else>
		bl.${fieldname} = i.value
		bl.${fieldname}.set = true
	</#if><#--if array-->
	<#--#TODO This is incorrect: only set if attribute implementation is mapped to the table!-->
	<#if attributeImplementation.type=="column" && attributeImplementation.componentImplementationTable?exists>
		<#if !attributeImplementation.componentImplementationTable.idref.isReferentialIntegrityTable>
		bl.${attributeImplementation.componentImplementationTable.idref.table.idref.name}.set = true
		<#-- Are we sure that column must be set if attr. impl. maps to column?
		     maybe the get is done from column, but set for column is done through another path? -->
		</#if>
	</#if>
	<#if attributeImplementation.onSetHookExpression?exists && attributeImplementation.onSetHookExpression?has_content>
		RETIFNOK(Hook.OnSet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
			<#assign componentName=common.getComponentNameFromAttributeImplementation(hookarg.attributeImplementation)>
			bl.${componentName}.${hookarg.name},
			bl.${componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
			bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
			bl.${fieldname},
		<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists && dimensions?number == 0>
			bl.${fieldname}.set,
			i.size))
		<#else>
			bl.${fieldname}.set))
		</#if>
	</#if><#--if attributeImplementation.onSetHookExpression?exists && attributeImplementation.onSetHookExpression?has_content-->
	<#if attributeImplementation.afterSetHookExpression?exists && attributeImplementation.afterSetHookExpression?has_content>
		RETIFNOK(Hook.AfterSet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
			<#assign componentName=common.getComponentNameFromAttributeImplementation(hookarg.attributeImplementation)>
			bl.${componentName}.${hookarg.name},
			bl.${componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
			bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
			bl.${fieldname},
		<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists && dimensions?number == 0>
			bl.${fieldname}.set,
			i.size))
		<#else>
			bl.${fieldname}.set))
		</#if>
	</#if><#--if attributeImplementation.afterSetHookExpression?exists && attributeImplementation.afterSetHookExpression?has_content-->
	<#if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content>
	endif
	</#if><#--if attributeImplementation.beforeSetHookExpression?exists && attributeImplementation.beforeSetHookExpression?has_content-->
	return(0)
}

function extern 
	<#assign array=false>
	<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists>
		<#assign dimensions=common.getDimensionsForDataType(common.getMandatoryDatatype(attributeImplementation))/>
		<#assign array=true>
		<#if dimensions?number == 0>
long <@names.ST_DLLCode/>.get.${fieldname}(ref domain ${domain} o.value(), ref boolean o.valueIsSet(), ref long o.size)
		<#else>
long <@names.ST_DLLCode/>.get.${fieldname}(ref domain ${domain} o.value(), ref boolean o.valueIsSet())
		</#if>
	<#else>
long <@names.ST_DLLCode/>.get.${fieldname}(
					ref domain ${domain} o.value)
	</#if><#--if common.getMandatoryDatatype(attributeImplementation).dimensions?exists-->
{
	DllUsage
	EndDllUsage

	<#if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content>
	boolean cancel
	</#if><#--if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content-->
	<#if attributeImplementation.type=="association" || (attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content)>
	long	duml

	duml = 0
	</#if><#--if attributeImplementation.type=="association" || (attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content)-->
	<#if array && dimensions?number == 0>
	o.size = bl.${fieldname}.size
	if o.size > 0 then
		alloc.mem(o.value, bl.${fieldname}.size)
		alloc.mem(o.valueIsSet, bl.${fieldname}.size)
		alloc.mem(bl.${fieldname}.get, bl.${fieldname}.size)
	endif
	</#if>

	<#if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content>
		<#list attributeImplementation.attributeImplementationRelationship?sort_by("position") as air>
	<#assign componentName=common.getComponentNameFromAttributeImplementation(air.attributeImplementation.idref)>
	<#assign attributeName=common.getAttributeName(air.attributeImplementation.idref)>
			<#if !common.getMandatoryDatatype(air.attributeImplementation.idref).dimensions?exists>
	duml = <@names.ST_DLLCode/>.get.${componentName}.${attributeName}(
		bl.${componentName}.${attributeName})
		bl.${componentName}.${attributeName}.set = 
			<@names.ST_DLLCode/>.is.set.${componentName}.${attributeName}()
			<#else>
	duml = <@names.ST_DLLCode/>.get.${componentName}.${attributeName}(
		bl.${componentName}.${attributeName},
				<#if common.getMandatoryDatatype(air.attributeImplementation.idref).dimensions == "0">
		bl.${componentName}.${attributeName}.set,
		bl.${componentName}.${attributeName}.size)
				<#else>
		bl.${componentName}.${attributeName}.set)
				</#if>
			</#if>
		</#list><#--list attributeImplementation.attributeImplementationRelationship?sort_by("position") as air-->
	</#if><#--if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content-->
	<#if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content>
	RETIFNOK(Hook.BeforeGet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
			<#assign componentName=common.getComponentNameFromAttributeImplementation(hookarg.attributeImplementation)>
			bl.${componentName}.${hookarg.name},
			bl.${componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
			bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
			cancel))
	if not cancel then
	</#if><#--if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content-->
	<#if !attributeImplementation.interactionPoint?exists>
		<#assign defaultVal=protected.getDefaultFromAttributeImplementation(attributeImplementation)>
		<#if defaultVal.dimensions==1 && defaultVal.present><#-- no defaults for arrays-->
	if not bl.${fieldname}.set then
		bl.${fieldname} = ${defaultVal.value}
		bl.${fieldname}.set = true
	endif
		</#if>
	</#if>
	<#if array>
		<#if attributeImplementation.type=="association">
	RETIFNOK(private.Read.${fieldname}())
			<#-- Use Read from other BDE to get info -->
		</#if><#--#if attributeImplementation.type=="association"-->
	long	i
		<#if dimensions?number == 0>
	if bl.${fieldname}.size > o.size then
		alloc.mem(o.value, bl.${fieldname}.size)
		alloc.mem(o.valueIsSet, bl.${fieldname}.size)
		alloc.mem(bl.${fieldname}.get, bl.${fieldname}.size)
		o.size = bl.${fieldname}.size 
	endif
	for i = 1 to bl.${fieldname}.size
		<#else>
	for i = 1 to ${dimensions?number}
		</#if>
		if bl.${fieldname}.set(i) then
			o.valueIsSet(i) = true
		<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
			o.value(1,i) = bl.${fieldname}(1,i)
		<#else>
			o.value(i) = bl.${fieldname}(i)
		</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
		else
			o.valueIsSet(i) = false
		endif
	endfor
	<#else>
		<#if attributeImplementation.type=="association">
	RETIFNOK(private.Read.${fieldname}())
			<#-- Use Read from other BDE to get info -->
		</#if><#--#if attributeImplementation.type=="association"-->
	o.value = bl.${fieldname}
	</#if><#--array-->
	<#if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content>

		<#if array && dimensions?number == 0>
	|* Clear existing dynamic array
	if bl.${fieldname}.size > 0 then
			<#if common.isAnyType(attributeImplementation)>
		for i = 1 to bl.${fieldname}.size
			if o.value(i) <> 0 then
				duml = xmlDelete(o.value(i))
			endif
		endfor
			</#if>
		free.mem(o.value)
		free.mem(o.valueIsSet)
		free.mem(bl.${fieldname})
		free.mem(bl.${fieldname}.set)
		bl.${fieldname}.size = 0
		o.size = 0
	endif
		</#if>
	RETIFNOK(Hook.OnGet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
			<#assign componentName=common.getComponentNameFromAttributeImplementation(hookarg.attributeImplementation)>
		bl.${componentName}.${hookarg.name},
		bl.${componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
		bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
		<#if array>
		bl.${fieldname},
			<#if dimensions?number == 0>
		bl.${fieldname}.set,
		bl.${fieldname}.size))
	if bl.${fieldname}.size > o.size then
		alloc.mem(o.value, bl.${fieldname}.size)
		alloc.mem(o.valueIsSet, bl.${fieldname}.size)
		alloc.mem(bl.${fieldname}.get, bl.${fieldname}.size)
		o.size = bl.${fieldname}.size 
	endif
	for i = 1 to bl.${fieldname}.size
			<#else>
		bl.${fieldname}.set))
	for i = 1 to ${dimensions?number}
			</#if>
		if bl.${fieldname}.set(i) then
			o.valueIsSet(i) = true
				<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
			o.value(1,i) = bl.${fieldname}(1,i)
				<#else>
			o.value(i) = bl.${fieldname}(i)
				</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
		else
			o.valueIsSet(i) = false
		endif
	endfor
		<#else>
		o.value,
		bl.${fieldname}.set))
		</#if><#--array-->
		<#if common.isAnyType(attributeImplementation)>
			<#assign alias=public.getAttributeAlias(c.componentImplementation.component.idref, attributeImplementation.attribute.idref)>
			<#if array>

				<#if dimensions?number == 0>
	for i = 1 to bl.${fieldname}.size
				<#else>
	for i = 1 to ${dimensions?number}
				</#if>
		if o.valueIsSet(i) = true and
					<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
		   xmlName$(o.value(1,i)) <> "${alias}" then
					<#else>
		   xmlName$(o.value(i)) <> "${alias}" then
					</#if>
			dal.set.error.message("tlbctst0050", "${common.getAttributeName(attributeImplementation)}", str$(i))
			|* Top-level node for anyType attribute %1$s array element %2$s is not valid.
			return (DALHOOKERROR)
		endif
	endfor
			<#else>
	
	if bl.${fieldname}.set and xmlName$(o.value) <> "${alias}" then
		dal.set.error.message("tlbctst0049", "${common.getAttributeName(attributeImplementation)}")
		|* Top-level node for anyType attribute %1$s is not valid.
		return (DALHOOKERROR)
	endif
			</#if>
		</#if>
	</#if><#--if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content-->
	<#if attributeImplementation.afterGetHookExpression?exists && attributeImplementation.afterGetHookExpression?has_content>

	RETIFNOK(Hook.AfterGet.${fieldname}(
		<#list protected.getAttributeHookArguments(attributeImplementation) as hookarg>
			<#assign componentName=common.getComponentNameFromAttributeImplementation(hookarg.attributeImplementation)>
		bl.${componentName}.${hookarg.name},
		bl.${componentName}.${hookarg.name}.set,
			<#if hookarg.hasDynamicDimensions>
		bl.${c.componentName}.${hookarg.name}.size,
			</#if>
		</#list><#--list getAttributeHookArguments(attributeImplementation) as hookarg-->
			<#if array>
		bl.${fieldname},
		bl.${fieldname}.set))
				<#if dimensions?number == 0>
		for i = 1 to bl.${fieldname}.size
				<#else>
		for i = 1 to ${dimensions?number}
				</#if>
			if bl.${fieldname}.set(i) then
				o.valueIsSet(i) = true
					<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING">
				o.value(1,i) = bl.${fieldname}(1,i)
					<#else>
				o.value(i) = bl.${fieldname}(i)
					</#if><#--common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.STRING"-->
			else
				o.valueIsSet(i) = false
			endif
		endfor
			<#else>
			o.value,
			bl.${fieldname}.set))
			</#if><#--array-->
	</#if><#--if attributeImplementation.afterGetHookExpression?exists && attributeImplementation.afterGetHookExpression?has_content-->
	<#if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content>
		<#if !attributeImplementation.isMandatory>
			<#assign emptyValue=protected.getBaanDataInitializers(attributeImplementation)>
	else<#--cancel=true -->
			<#if array>
				<#if dimensions?number == 0>
		for i = 1 to bl.${fieldname}.size
				<#else>
		for i = 1 to ${dimensions?number}
				</#if>
			bl.${fieldname}.set(i) = false
				<#if emptyValue=="\"\"">
			bl.${fieldname}(1,i) = ""
			o.value(1,i) = ""
				<#else>
			bl.${fieldname}(i) = ${emptyValue}
			o.value(i) = ${emptyValue}
				</#if><#--if emptyValue=="\"\""-->
		endfor
			<#else>
		bl.${fieldname}.set = false
		bl.${fieldname} = ${emptyValue}
		o.value = ${emptyValue}
			</#if><#--array-->
		</#if>
	endif
	</#if><#--if attributeImplementation.beforeGetHookExpression?exists && attributeImplementation.beforeGetHookExpression?has_content-->
	<#if array>

		<#if dimensions?number == 0>
	for i = 1 to bl.${fieldname}.size
		<#else>
	for i = 1 to ${dimensions?number}
		</#if>
		bl.${fieldname}.get(i) = true
	endfor
	<#else>

	bl.${fieldname}.get = true
	</#if><#--array-->

	return(0)
}

function extern 
	<#assign array=false>
	<#if common.getMandatoryDatatype(attributeImplementation).dimensions?exists>
		<#assign array=true>
boolean <@names.ST_DLLCode/>.is.set.${fieldname}(long i.element)
	<#else>
boolean <@names.ST_DLLCode/>.is.set.${fieldname}()
	</#if><#--if common.getMandatoryDatatype(attributeImplementation).dimensions?exists-->
{
	DllUsage
	EndDllUsage
	<#if array=true>
	return(bl.${fieldname}.set(i.element))
	<#else>
	return(bl.${fieldname}.set)
	</#if><#--array=true-->
}

<#-- Check is there is a hook needed..... -->

		<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.TEXT">
			<#if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content>
function extern long <@names.ST_DLLCode/>.read.text.${c.componentName}.${common.getAttributeName(attributeImplementation)}()
{
				<#list attributeImplementation.attributeImplementationRelationship?sort_by("position") as air>
					<#assign componentName=common.getComponentNameFromAttributeImplementation(air.attributeImplementation.idref)>
					<#assign attributeName=common.getAttributeName(air.attributeImplementation.idref)>
					<#if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(air.attributeImplementation.idref))=="DB.TEXT">
	RETIFNOK(<@names.ST_DLLCode/>.read.text.${componentName}.${attributeName}())
					</#if><#--if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(air.attributeImplementation.idref))=="DB.TEXT"-->
				</#list><#--list attributeImplementation.attributeImplementationRelationship?sort_by("position") as air-->
	return(0)
}

			</#if><#--if attributeImplementation.onGetHookExpression?exists && attributeImplementation.onGetHookExpression?has_content-->
		</#if><#--if common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(attributeImplementation))=="DB.TEXT"-->
	</#list><#--list c.componentImplementation.attributeImplementation as attributeImplementation-->
</#list><#--list protected.listProtectedComponents() as c-->

<#assign definePrinted=false>
<#list protected.listProtectedComponents() as c>
	<#if public.hasCustomerDataLocation(c.componentImplementation.component.idref)>
		<#if !definePrinted>
#define DALERROR_IF(cond, mesg)
^	if cond then
^		dal.set.error.message("@" & mesg)
^		return(DALHOOKERROR)
^	endif

			<#assign definePrinted=true>
		</#if>
function extern boolean <@names.ST_DLLCode/>.must.add.${c.componentName}.custom.output()
{
	DllUsage
	EndDllUsage

	return(bl.${c.componentName}.custom.output)
}

function extern void <@names.ST_DLLCode/>.do.not.add.${c.componentName}.custom.output()
{
	DllUsage
	EndDllUsage

	bl.${c.componentName}.custom.output = false
}

function extern 
long <@names.ST_DLLCode/>.get.${c.componentName}._index1(
		ref		long		o.xml)
{
	DllUsage
	EndDllUsage

	long	table.node
	long	column.node
	long	retl
	long	i

	i = 0
	retl = 0
	table.node = 0
	column.node = 0
	o.xml = xmlNewNode("IndexValues")
	DALERROR_IF(o.xml = 0, "Cannot create XML node")

		<#list c.componentImplementation.componentImplementationTable as componentImplementationTable>
			<#assign table=componentImplementationTable.table.idref/>
			<#if table.type=="table">
				<#assign tableHasIdentifiers=false>
				<#list componentImplementationTable.table.idref.column as col>
					<#if col.isPrimaryKey>
						<#assign a = protected.getAttributeImplementationLinkedToTableColumnByCit(c, componentImplementationTable, col.name)>
						<#if a?has_content>
							<#assign tableHasIdentifiers=true>
<#-- xml structure is documented in  tlbct.dll1000.add.custom.output() -->
							<#if a.attributeImplementation.datatype?exists && a.attributeImplementation.datatype.idref.dimensions?exists &&
								a.attributeImplementation.datatype.idref.dimensions != "1">
								<#if a.attributeImplementation.datatype.idref.dimensions == "0">
	for i = 1 to bl.${a.componentName}.${a.attributeName}.size
								<#else>
	for i = 1 to ${a.attributeImplementation.datatype.idref.dimensions}
								</#if>
		if bl.${a.componentName}.${a.attributeName}.set(i) then
			table.node = xmlNewNode("Table", XML_ELEMENT, o.xml)
			DALERROR_IF(table.node = 0, "Cannot create XML node")
			retl = xmlSetAttribute(table.node, "name", "${table.name}")
			DALERROR_IF(retl = 0, "Cannot set XML attribute")
			column.node = xmlNewDataElement("Column",
				bl.${a.componentName}.${a.attributeName}(i), table.node)
			DALERROR_IF(column.node = 0, "Cannot create XML node")
			retl = xmlSetAttribute(column.node, "name", "${col.name}")
			DALERROR_IF(retl = 0, "Cannot set XML attribute")
			retl = xmlSetAttribute(column.node, "dataType", "${common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(a.attributeImplementation))}")
			DALERROR_IF(retl = 0, "Cannot set XML attribute")
		else
			dal.set.error.message("@Protected attribute ${a.componentName}.${a.attributeName} is mandatory.")
			return(DALHOOKERROR)
		endif
	endfor
							<#else>
	if bl.${a.componentName}.${a.attributeName}.set then
		table.node = xmlNewNode("Table", XML_ELEMENT, o.xml)
		DALERROR_IF(table.node = 0, "Cannot create XML node")
		retl = xmlSetAttribute(table.node, "name", "${table.name}")
		DALERROR_IF(retl = 0, "Cannot set XML attribute")
		column.node = xmlNewDataElement("Column",
			bl.${a.componentName}.${a.attributeName}, table.node)
		DALERROR_IF(column.node = 0, "Cannot create XML node")
		retl = xmlSetAttribute(column.node, "name", "${col.name}")
		DALERROR_IF(retl = 0, "Cannot set XML attribute")
		retl = xmlSetAttribute(column.node, "dataType", "${common.get_BaanDatatype_from_XMLSchemaDatatype(common.getMandatoryDatatype(a.attributeImplementation))}")
		DALERROR_IF(retl = 0, "Cannot set XML attribute")
	else
		dal.set.error.message("@Protected attribute ${a.componentName}.${a.attributeName} is mandatory.")
		return(DALHOOKERROR)
	endif
							</#if>

						</#if><#--if a?has_content-->
					</#if><#--if col.isPrimaryKey-->
				</#list><#--list componentImplementationTable.table.idref.column as col-->
				<#if !tableHasIdentifiers && componentImplementationTable.isRootTable>
	dal.set.error.message("@Table ${table.name} does not have any identifiers")
	return(DALHOOKERROR)

				</#if>
			</#if><#--if table.type=="table"-->
		</#list><#--list c.componentImplementation.componentImplementationTable as componentImplementationTable-->
	return(0)
}

	</#if><#--if public.hasCustomerDataLocation(c.componentImplementation.component.idref))-->
</#list><#--list protected.listProtectedComponents() as c-->

|****************************** Helper functions for control data **********

function boolean getControlAttribute(
	const	string	i.name,
	ref	string	o.value)
{
	return(getControlAttributeFromRequest(
		bl.RequestArgument, i.name, o.value))
}

function boolean setControlAttribute(
	const	string	i.name,
	const	string	i.value)
{
	return(setControlAttributeInResponse(
		bl.ResponseArgument, i.name, i.value))
}

function boolean getControlAttributeFromRequest(
		long	i.request,
	const	string	i.name,
	ref	string	o.value)
{
	xmlnode ControlAreaNode
	long	retl

	ControlAreaNode = xmlFindFirst("ControlArea", i.request)
	retl = xmlGetDataElement(ControlAreaNode, i.name, o.value)
	if retl = 0 then
		return (false)
	endif
	return (true)
}

function boolean setControlAttributeInResponse(
		long	io.response,
	const	string	i.name,
	const	string	i.value)
{
	xmlnode ControlAreaNode
	long	retl

	ControlAreaNode = xmlFindFirst("ControlArea", io.response)
	if ControlAreaNode = 0 then
		ControlAreaNode = xmlNewNode("ControlArea")
		retl = xmlInsertInChilds(io.response, ControlAreaNode)
		if retl = 0 then
			return (false)
		endif
	endif
	retl = xmlRewriteDataElement(ControlAreaNode, i.name, i.value)
	if retl = 0 then
		return (false)
	endif
	return (true)
}

function boolean getAttributeValueFromRequest(
		long	i.request,
	const	string	i.path,
	ref	string	o.value)
{
	string	path(1000)
	long	matching.node

	path = i.path
	if isspace(i.path) or not tlbct.dll1000.replace.data(path, ".", ">.<") then
		o.value = ""
		return(false)
	endif
	matching.node = xmlFindFirstMatch(sprintf$("<>.<DataArea>.<%s>", path),
					i.request)
	if matching.node = 0 or xmlGetType(xmlGetFirstChild(matching.node)) <> XML_DATA then
		o.value = ""
		return(false)
	endif
	o.value = xmlData$(matching.node)
	return(true)
}

function long getRequest()
{
	return(bl.RequestArgument)
}

#define attributeIsSelected(componentName, attributeImplementationName)
^	bl.##componentName##.##attributeImplementationName##.selected

function do.not.use.this.function()
{
| The purpose of this function is to avoid compile warnings on unused
| functions.
	
	boolean	dumb
	long	duml
	string	dums(1)
	
	if false then
		do.not.use.this.function()
		dumb = getControlAttribute(dums, dums)
		dumb = setControlAttribute(dums, dums)
		dumb = getControlAttributeFromRequest(duml, dums, dums)
		dumb = setControlAttributeInResponse(duml, dums, dums)
		dumb = getAttributeValueFromRequest(duml, dums, dums)
		duml = getRequest()
		duml = handle.result(duml)
<#list protected.listProtectedComponents() as c>
	<#list c.componentImplementation.methodImplementation as methodImplementation>
		<#assign methodName = common.getNameFromMethodImplementation(methodImplementation)/>
		<#if methodImplementation.processingOrder != "batch"&&
		     protected.hasMethodAlternativeImplementation(methodName)=="" &&
			(common.isQueryMethod(methodName) || common.isPublishMethod(methodName) || common.isEventMethod(methodName))>
		duml = <@names.ST_DLLCode/>.${c.componentName}.${methodName}.set.derived()
		</#if>
	</#list>
		log.identifiers.DAL.message.${c.componentName}()
</#list>
<#if common.queryMethodPresent()>
	<#list protected.listProtectedComponents() as c>
		<#assign first=true>
		<#list c.componentImplementation.componentImplementationTable as cit>
		<#if first>
		dums = childComponentJoin.${c.componentName}("")
			<#assign first=false>
		</#if>
		dums = nonRootJoin.${c.componentName}.${cit.table.idref.name}_${cit.position}()
		</#list>
	</#list>
</#if>
		dums = calculate.checksum(dums)
<#list protected.listProtectedComponents() as c>
	<#if !protected.isFunctionServerComponent(c.componentImplementation) &&
		common.methodPresent("Change", c.componentImplementation)>
		dums = ${c.componentName}.CalculateChecksum()
		dums = ${c.componentName}.CalculateChecksumRB()
	</#if>
</#list>
	endif
}

<#-- AFS -->
<#include "protected.st.afs.ftl" parse=true />

|****************************** Methods ********************************

<#include "protected.st.methods.ftl" parse=true />

<#-- Query List/Show -->
<#include "protected.st.query.ftl" parse=true />

<#if common.eventMethodPresent() || common.batchMethodPresent() >

<#-- ****************************** Event Methods******************************** -->

<#include "protected.st.events.ftl" parse=true />     

</#if><#-- common.eventMethodPresent() || common.batchMethodPresent() -->

<@protected.declareDefines iUndef=true/>

|****************************** Hooks **********************************

<#-- Hooks must be done AFTER undefining all used defines (except helper functions to be used in hooks)!-->
<#include "protected.st.hooks.ftl" parse=true />

<@source.endsource/>
