creator/src/creator_connectionmethodelement.cpp
branchRCL_3
changeset 22 fad26422216a
parent 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/src/creator_connectionmethodelement.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,754 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+#include "creator_connectionmethodelement.h"
+#include "creator_traces.h"
+
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
+#include "creator_connectionmethod.h"
+#include <cmpluginpacketdatadef.h>
+#include <cmplugindialcommondefs.h>
+#include <cmplugincsddef.h>
+#include <cmpluginhscsddef.h>
+#include <cmpluginembdestinationdef.h>
+#include <cmpluginvpndef.h>
+#include <cmpluginlanbasedef.h>
+#else
+#include "creator_accesspoint.h"
+#endif
+
+
+using namespace creatorconnectionmethod;
+
+// connection name needs extra space for possible renaming
+const TInt KExtraSpace = 10;
+
+/*
+ * 
+ */
+CCreatorConnectionMethodElement* CCreatorConnectionMethodElement::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext )
+    {
+    CCreatorConnectionMethodElement* self = new (ELeave) CCreatorConnectionMethodElement(aEngine);
+    CleanupStack::PushL(self);
+    self->ConstructL(aName, aContext);
+    CleanupStack::Pop(self);
+    return self;
+    }
+/*
+ * 
+ */
+CCreatorConnectionMethodElement::CCreatorConnectionMethodElement(CCreatorEngine* aEngine) 
+: 
+CCreatorScriptElement(aEngine)
+    {
+    iIsCommandElement = ETrue;
+    }
+
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__)
+void CCreatorConnectionMethodElement::ExecuteCommandL()
+    {
+    const CCreatorScriptAttribute* amountAttr = FindAttributeByName(KAmount);
+    TInt cmAmount = 1;    
+    if( amountAttr )
+        {
+        cmAmount = ConvertStrToIntL(amountAttr->Value());
+        }
+    // Get 'fields' element 
+    CCreatorScriptElement* fieldsElement = FindSubElement(KFields);
+    if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+        {
+        // Get sub-elements
+        const RPointerArray<CCreatorScriptElement>& fields = fieldsElement->SubElements();        
+        // Create connection method entries, the amount of entries is defined by cmAmount:
+        for( TInt cI = 0; cI < cmAmount; ++cI )
+            {            
+            CConnectionSettingsParameters* param = new (ELeave) CConnectionSettingsParameters;
+            CleanupStack::PushL(param);
+            
+            for( TInt i = 0; i < fields.Count(); ++i )
+                {
+                CCreatorScriptElement* field = fields[i];
+                TPtrC elemName = field->Name();
+                TPtrC elemContent = field->Content();
+                const CCreatorScriptAttribute* randomAttr = fields[i]->FindAttributeByName(KRandomLength);
+                TBool useRandom = EFalse;
+                if( randomAttr || elemContent.Length() == 0 )
+                    {
+                    useRandom = ETrue;
+                    }
+                
+                if( elemName == Kconnectionname )
+                    {
+                    if( useRandom )
+                        {
+                        param->SetRandomCMNameL(*iEngine);
+                        }
+                    else
+                        {
+                        SetContentToTextParamL(param->iConnectionName, elemContent);
+                        // reserve extra space for possible renaming
+                        TInt newLen = param->iConnectionName->Length() + KExtraSpace;
+                        param->iConnectionName = param->iConnectionName->ReAllocL(newLen);
+                        }
+                    }
+                else if( elemName == Kstartpage )
+                    {
+                    if( useRandom )
+                        {
+                        param->SetRandomStartPageL(*iEngine);
+                        }
+                    else
+                        {
+                        SetContentToTextParamL(param->iStartPage, elemContent);
+                        }
+                    }
+                else if( elemName == Kwapwspoption )
+                    {
+                    if( useRandom )
+                        {
+                        param->SetRandomWapWspOptionL(*iEngine);
+                        }
+                    else
+                        {
+                        if( CompareIgnoreCase(elemContent, Kconnectionless) == 0 )
+                        	{
+                        	param->iWapWspOption = ECmWapWspOptionConnectionless;
+                        	}
+                        else if( CompareIgnoreCase(elemContent, Kconnectionoriented) == 0 )
+                        	{
+                        	param->iWapWspOption = ECmWapWspOptionConnectionOriented;
+                        	}
+                        }
+                    }
+                else if( elemName == Kprotocoltype )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomProtocolTypeL(*iEngine);
+                		}
+                	else
+                		{
+                		if( CompareIgnoreCase(elemContent, Kipv4) == 0 )
+                			{
+                			param->iProtocolType = RPacketContext::EPdpTypeIPv4;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Kipv6) == 0 )
+                			{
+                			param->iProtocolType = RPacketContext::EPdpTypeIPv6;
+                			}
+                		}
+                	}
+                else if( elemName == Kloginname )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomLoginNameL(*iEngine);                		
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iLoginName, elemContent);
+                		}
+                	}
+                else if( elemName == Ksecureauthentication )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomSecureAuthenticationL(*iEngine);
+                		}
+                	else
+                		{
+                		param->iSecureAuthentication = ConvertStrToBooleanL(elemContent);
+                		}
+                	}
+                else if( elemName == Kloginpass )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomLoginPassL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iLoginPass, elemContent);
+                		}
+                	}
+                else if( elemName == Kpromptpassword )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomPromptPasswordL(*iEngine);
+                		}
+                	else
+                		{
+                		param->iPromptPassword = ConvertStrToBooleanL(elemContent);
+                		}
+                	}
+                else if( elemName == Kgatewayaddress )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomGatewayAddressL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iGatewayAddress, elemContent);
+                		}
+                	}
+                else if( elemName == Ksubnetmask )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomSubnetMaskL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iSubnetMask, elemContent);
+                		}
+                	}
+                else if( elemName == Kdeviceipaddr )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomIPAddressL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iIPAddr, elemContent);
+                		}
+                	}
+                else if( elemName == Kip4nameserver1 )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomIP4NameServer1L(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iIP4NameServer1, elemContent);
+                		}
+                	}
+                else if( elemName == Kip4nameserver2 )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomIP4NameServer2L(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iIP4NameServer2, elemContent);
+                		}
+                	}
+                else if( elemName == Kdatacalltelnumber )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomTelephoneNumberL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iDefaultTelNumber, elemContent);
+                		}
+                	}
+                else if( elemName == Kdatacalltypeisdn )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomBearerTypeIsdnL(*iEngine);
+                		}
+                	else
+                		{
+                		if( CompareIgnoreCase(elemContent, Kanalogue) == 0 )
+                			param->iBearerCallTypeIsdn = CMManager::ECmCallTypeAnalogue;
+                		else if( CompareIgnoreCase( elemContent, Kisdnv110) == 0 )
+                			param->iBearerCallTypeIsdn = CMManager::ECmCallTypeISDNv110;
+                		else if( CompareIgnoreCase( elemContent, Kisdnv120) == 0 )
+                			param->iBearerCallTypeIsdn = CMManager::ECmCallTypeISDNv120;
+                		}
+                	}
+                else if( elemName == Kbearertype )
+                	{
+                	if( useRandom )
+                		{
+                		param->iBearerType = KRandomBearerType;
+                		}
+                	else
+                		{
+                		if( CompareIgnoreCase(elemContent, Kwlan) == 0 )
+                			{
+                			param->iBearerType = KUidWlanBearerType;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Kgprs) == 0 )
+                			{
+                			param->iBearerType = KUidPacketDataBearerType;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Kdatacall) == 0 )
+                			{
+                			param->iBearerType = KUidCSDBearerType;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Khsgsm) == 0 )
+                			{
+                			param->iBearerType = KUidHSCSDBearerType;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Kembedded) == 0 )
+                			{
+                			param->iBearerType = KUidEmbeddedDestination;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Kvpn) == 0 )
+                			{
+                			param->iBearerType = KPluginVPNBearerTypeUid;
+                			}
+                		else if( CompareIgnoreCase(elemContent, Klan) == 0 )
+                			{
+                			param->iBearerType = KUidLanBearerType;
+                			}
+                		}
+                	}
+                else if( elemName == Kdatacalllinespeed )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomBearerSpeedL(*iEngine);
+                		}
+                	else
+                		{
+                		if( CompareIgnoreCase(elemContent, Kautomatic) == 0 )
+                			{                			 
+                			param->iBearerSpeed = CMManager::ECmSpeedAutobaud;
+                			}
+                		else
+                			{
+                			TUint lineSpeed = ConvertStrToUintL(elemContent);
+                			if( lineSpeed == 9600 )
+                				param->iBearerSpeed = CMManager::ECmSpeed9600;
+                			else if( lineSpeed == 14400 )
+                				param->iBearerSpeed = CMManager::ECmSpeed14400;
+                			else if( lineSpeed == 19200 )
+                				param->iBearerSpeed = CMManager::ECmSpeed19200;
+                			else if( lineSpeed == 28800 )
+                				param->iBearerSpeed = CMManager::ECmSpeed28800;
+                			else if( lineSpeed == 38400 )
+                				param->iBearerSpeed = CMManager::ECmSpeed38400;
+                			else if( lineSpeed == 43200 )
+                				param->iBearerSpeed = CMManager::ECmSpeed43200;
+                			else if( lineSpeed == 56000 )
+                				param->iBearerSpeed = CMManager::ECmSpeed56000;
+                			}                			
+                		}
+                	}
+                else if( elemName == Kuseproxy )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomUseProxyL(*iEngine);
+                		}
+                	else
+                		{
+                		param->iUseProxy = ConvertStrToBooleanL(elemContent);
+                		}
+                	}
+                else if( elemName == Kproxyserveraddress )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomProxyAddressL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iProxyServerAddress, elemContent);                		
+                		}
+                	}
+                else if( elemName == Kproxyportnumber )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomProxyPortL(*iEngine);
+                		}
+                	else
+                		{
+                		param->iProxyPortNumber = ConvertStrToUintL(elemContent);                		
+                		}
+                	}
+                else if( elemName == Kip6nameserver1 )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomIPv6NameServer1L(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iIP6NameServer1, elemContent);               		                		
+                		}
+                	}
+                else if( elemName == Kip6nameserver2 )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomIPv6NameServer2L(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iIP6NameServer2, elemContent);               		                		
+                		}
+                	}
+                else if( elemName == Kdisabletextauth )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomDisableTextAuthL(*iEngine);
+                		}
+                	else
+                		{
+                		param->iDisableTextAuth = ConvertStrToBooleanL(elemContent);
+                		}
+                	}
+                else if( elemName == Kwlanname )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomWLANNameL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iWLANName, elemContent);               		                		
+                		}
+                	}
+                else if( elemName == Kwlanipaddr )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomWlanIpAddrL(*iEngine);
+                		}
+                	else
+                		{
+                		SetContentToTextParamL(param->iWlanIpAddr, elemContent);               		                		
+                		}
+                	}
+                else if( elemName == Kwlansecmode )
+                	{
+                	if( useRandom )
+                		{
+                		param->SetRandomWLANSecurityModeL(*iEngine);
+                		}
+                	else
+                		{
+                		if( CompareIgnoreCase(elemContent, Kopen) == 0)
+                			param->iWLanSecMode = CMManager::EWlanSecModeOpen;
+                		else if( CompareIgnoreCase(elemContent, Kwep) == 0 )
+                			param->iWLanSecMode = CMManager::EWlanSecModeWep;
+                		else if( CompareIgnoreCase(elemContent, Ke802_1x) == 0 )
+                			param->iWLanSecMode = CMManager::EWlanSecMode802_1x;
+                		else if( CompareIgnoreCase(elemContent, Kwpa) == 0 )
+                			param->iWLanSecMode = CMManager::EWlanSecModeWpa;
+                		else if( CompareIgnoreCase(elemContent, Kwpa2) == 0 )
+                			param->iWLanSecMode = CMManager::EWlanSecModeWpa2;                		               		                		
+                		}
+                	}
+                }
+            iEngine->AppendToCommandArrayL(ECmdCreateMiscEntryAccessPoints, param);
+            CleanupStack::Pop(); // param
+            }
+        }
+    else
+    	{
+    	// No fields defined so add random entries:
+    	iEngine->AppendToCommandArrayL(ECmdCreateMiscEntryAccessPoints, 0, cmAmount);
+    	}
+    }
+#else
+void CCreatorConnectionMethodElement::ExecuteCommandL()
+	{
+	const CCreatorScriptAttribute* amountAttr = FindAttributeByName(KAmount);
+	TInt cmAmount = 1;    
+	if( amountAttr )
+		{
+		cmAmount = ConvertStrToIntL(amountAttr->Value());
+		}
+	// Get 'fields' element 
+	CCreatorScriptElement* fieldsElement = FindSubElement(KFields);
+	if( fieldsElement )
+		{
+		// Get sub-elements
+		const RPointerArray<CCreatorScriptElement>& fields = fieldsElement->SubElements();        
+		// Create connection method entries, the amount of entries is defined by cmAmount:
+		for( TInt cI = 0; cI < cmAmount; ++cI )
+			{            
+			CAccessPointsParameters* param = new (ELeave) CAccessPointsParameters;
+			CleanupStack::PushL(param);
+
+			for( TInt i = 0; i < fields.Count(); ++i )
+				{
+				CCreatorScriptElement* field = fields[i];
+				TPtrC elemName = field->Name();
+				TPtrC elemContent = field->Content();
+				const CCreatorScriptAttribute* randomAttr = fields[i]->FindAttributeByName(KRandomLength);
+				TBool useRandom = EFalse;
+				if( randomAttr || elemContent.Length() == 0 )
+					{
+					useRandom = ETrue;
+					}
+
+				if( elemName == Kconnectionname )
+					{
+					if( useRandom )
+						{
+						param->SetRandomCMNameL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iConnectionName, elemContent);
+                        // reserve extra space for possible renaming
+                        TInt newLen = param->iConnectionName->Length() + KExtraSpace;
+                        param->iConnectionName = param->iConnectionName->ReAllocL(newLen);
+
+                        SetContentToTextParamL(param->iGprsAcessPointName, elemContent);
+						}
+					}
+				else if( elemName == Kstartpage )
+					{
+					if( useRandom )
+						{
+						param->SetRandomStartPageL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iWapStartPage, elemContent);
+						}
+					}
+				else if( elemName == Kwapwspoption )
+					{
+					if( useRandom )
+						{
+						param->SetRandomWapWspOptionL(*iEngine);
+						}
+					else
+						{
+						if( CompareIgnoreCase(elemContent, Kconnectionless) == 0 )
+							{
+							param->iWapWspOption = EWapWspOptionConnectionless;
+							}
+						else if( CompareIgnoreCase(elemContent, Kconnectionoriented) == 0 )
+							{
+							param->iWapWspOption = EWapWspOptionConnectionOriented;
+							}
+						}
+					}
+				else if( elemName == Kloginname )
+					{
+					if( useRandom )
+						{
+						param->SetRandomLoginNameL(*iEngine);                		
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspLoginName, elemContent);
+						}
+					}
+				else if( elemName == Ksecureauthentication )
+					{
+					if( useRandom )
+						{
+						param->SetRandomSecureAuthenticationL(*iEngine);
+						}
+					else
+						{
+						param->iSecureAuthentication = ConvertStrToBooleanL(elemContent);
+						}
+					}
+				else if( elemName == Kloginpass )
+					{
+					if( useRandom )
+						{
+						param->SetRandomLoginPassL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspLoginPass, elemContent);
+						}
+					}
+				else if( elemName == Kpromptpassword )
+					{
+					if( useRandom )
+						{
+						param->SetRandomPromptPasswordL(*iEngine);
+						}
+					else
+						{
+						param->iPromptPassword = ConvertStrToBooleanL(elemContent);
+						}
+					}
+				else if( elemName == Kgatewayaddress )
+					{
+					if( useRandom )
+						{
+						param->SetRandomGatewayAddressL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iWapGatewayAddress, elemContent);
+						}
+					}
+				else if( elemName == Kdeviceipaddr )
+					{
+					if( useRandom )
+						{
+						param->SetRandomIPAddressL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspIPAddr, elemContent);
+						}
+					}
+				else if( elemName == Kip4nameserver1 )
+					{
+					if( useRandom )
+						{
+						param->SetRandomIP4NameServer1L(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspIPNameServer1, elemContent);
+						}
+					}
+				else if( elemName == Kip4nameserver2 )
+					{
+					if( useRandom )
+						{
+						param->SetRandomIP4NameServer2L(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspIPNameServer2, elemContent);
+						}
+					}
+				else if( elemName == Kdatacalltelnumber )
+					{
+					if( useRandom )
+						{
+						param->SetRandomTelephoneNumberL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iIspDefaultTelNumber, elemContent);
+						}
+					}
+				else if( elemName == Kdatacalltypeisdn )
+					{
+					if( useRandom )
+						{
+						param->SetRandomBearerTypeIsdnL(*iEngine);
+						}
+					else
+						{
+						if( CompareIgnoreCase(elemContent, Kanalogue) == 0 )
+							param->iIspBearerCallTypeIsdn = ECallTypeAnalogue;
+						else if( CompareIgnoreCase( elemContent, Kisdnv110) == 0 )
+							param->iIspBearerCallTypeIsdn = ECallTypeISDNv110;
+						else if( CompareIgnoreCase( elemContent, Kisdnv120) == 0 )
+							param->iIspBearerCallTypeIsdn = ECallTypeISDNv120;
+						}
+					}
+				else if( elemName == Kbearertype )
+					{
+					if( useRandom )
+						{
+						param->iBearerType = EApBearerTypeGPRS;
+						}
+					else
+						{
+						if( CompareIgnoreCase(elemContent, Kwlan) == 0 )
+							{
+							param->iBearerType = EApBearerTypeWLAN;
+							}
+						else if( CompareIgnoreCase(elemContent, Kgprs) == 0 )
+							{
+							param->iBearerType = EApBearerTypeGPRS;
+							}
+						else if( CompareIgnoreCase(elemContent, Kdatacall) == 0 )
+							{
+							param->iBearerType = EApBearerTypeCSD;
+							}
+						else if( CompareIgnoreCase(elemContent, Khsgsm) == 0 )
+							{
+							param->iBearerType = EApBearerTypeHSCSD;
+							}
+						else if( CompareIgnoreCase(elemContent, Klan) == 0 )
+							{
+							param->iBearerType = EApBearerTypeLAN;
+							}
+						}
+					}
+				else if( elemName == Kdatacalllinespeed )
+					{
+					if( useRandom )
+						{
+						param->SetRandomBearerSpeedL(*iEngine);
+						}
+					else
+						{
+						if( CompareIgnoreCase(elemContent, Kautomatic) == 0 )
+							{                			 
+							param->iIspBearerSpeed = KSpeedAutobaud;
+							}
+						else
+							{
+							TUint lineSpeed = ConvertStrToUintL(elemContent);
+							if( lineSpeed == 9600 )
+								param->iIspBearerSpeed = KSpeed9600;
+							else if( lineSpeed == 14400 )
+								param->iIspBearerSpeed = KSpeed14400;
+							else if( lineSpeed == 19200 )
+								param->iIspBearerSpeed = KSpeed19200;
+							else if( lineSpeed == 28800 )
+								param->iIspBearerSpeed = KSpeed28800;
+							else if( lineSpeed == 38400 )
+								param->iIspBearerSpeed = KSpeed38400;
+							else if( lineSpeed == 43200 )
+								param->iIspBearerSpeed = KSpeed43200;
+							else if( lineSpeed == 56000 )
+								param->iIspBearerSpeed = KSpeed56000;
+							}                			
+						}
+					}
+				else if( elemName == Kproxyserveraddress )
+					{
+					if( useRandom )
+						{
+						param->SetRandomProxyAddressL(*iEngine);
+						}
+					else
+						{
+						SetContentToTextParamL(param->iProxyServerAddress, elemContent);                		
+						}
+					}
+				else if( elemName == Kproxyportnumber )
+					{
+					if( useRandom )
+						{
+						param->SetRandomProxyPortL(*iEngine);
+						}
+					else
+						{
+						param->iProxyPortNumber = ConvertStrToUintL(elemContent);                		
+						}
+					}
+				}
+			iEngine->AppendToCommandArrayL(ECmdCreateMiscEntryAccessPoints, param);
+			CleanupStack::Pop(); // param
+			}
+		}
+	}
+#endif