omadm/omadmextensions/adapters/nsmldinternet/src/NSmlWlanSettings.cpp
changeset 1 4490afcb47b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadm/omadmextensions/adapters/nsmldinternet/src/NSmlWlanSettings.cpp	Thu Jan 07 12:39:15 2010 +0200
@@ -0,0 +1,1732 @@
+/*
+* Copyright (c) 2002-2006 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:   Wlan Adapter DB handler
+*
+*/
+
+
+
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <commsdat_partner.h>
+#endif
+#include <WlanCdbCols.h>
+#include "NSmlWlanSettings.h"
+#include "NSmlWLanAdapter.h"
+#include "nsmldebug.h"
+#include <comms-infras/commdb/protection/protectdb.h>
+#include <SettingEnforcementInfo.h> // vsettingenforcementinfo
+#include <featmgr.h>
+
+#ifndef __WINS__
+// This lowers the unnecessary compiler warning (armv5) to remark.
+// "Warning:  #174-D: expression has no effect..." is caused by 
+// DBG_ARGS8 macro in no-debug builds.
+#pragma diag_remark 174
+#endif
+
+const TUint KEAPListBufferSize = 128;
+const TUint KLengthOfOldStyleEAPListEntry = 5; // "+xxx,"
+
+const TInt KBeginTransRetryDelay = 1000000; // Delay for comms db begintransaction retry (microseconds)
+const  TInt KBeginTransRetryCount = 7;      // Maximum number of retries
+//-----------------------------------------------------------------------------
+// CWlanAdapter::CWlanSettings( CCommsDatabase& aDatabase )
+//-----------------------------------------------------------------------------
+CWlanSettings::CWlanSettings( CCommsDatabase& aDatabase ) : iDatabase( aDatabase ), iExpandedEAPTypeFieldsUsed( ETrue )
+	{
+	_DBG_FILE("CWlanSettings::CWlanSettings(): begin");
+
+	iTableView = 0;
+	iEapType = NULL;
+	iSecondaryView = NULL;
+
+
+	_DBG_FILE("CWlanSettings::CWlanSettings(): end");
+	}
+
+//-----------------------------------------------------------------------------
+// CWlanAdapter::~CWlanSettings( )
+//-----------------------------------------------------------------------------
+CWlanSettings::~CWlanSettings( )
+	{
+
+	delete iEapType;
+	delete iSecondaryView;
+	delete iTableView;
+	}
+
+//-----------------------------------------------------------------------------
+// CWlanSettings* CWlanSettings::NewL( CCommsDatabase& aDatabase )
+//-----------------------------------------------------------------------------
+CWlanSettings* CWlanSettings::NewL( CCommsDatabase& aDatabase )
+	{
+	_DBG_FILE("CWlanSettings::NewL(): begin");
+
+	CWlanSettings* self = new(ELeave) CWlanSettings( aDatabase );
+
+	CleanupStack::PushL( self );
+	self->ConstructL( );
+	CleanupStack::Pop( self );
+
+	_DBG_FILE("CWlanSettings::NewL(): end");
+	return self;
+	}
+
+//-----------------------------------------------------------------------------
+// void CWlanSettings::ConstructL( )
+//-----------------------------------------------------------------------------
+void CWlanSettings::ConstructL( )
+{
+	_DBG_FILE("CWlanSettings::ConstructL(): begin");
+	_DBG_FILE("CWlanSettings::ConstructL(): end");
+}
+
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::GetWlanSettings( TUint32 aLuid, TWlanSettings& aWlanSettings )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::GetWlanSettings( TUint32 aLuid, TWlanSettings& aWlanSettings )
+	{
+	_DBG_FILE("CWlanSettings::GetWlanSettings(): begin");
+
+	TRAPD( err, ConnectToDatabaseL() );
+	if( err == KErrNone )
+		{
+		err = GoToRecord( aLuid );
+
+		if( err == KErrNone )
+			{
+			TRAP( err, GetDataFromRecordL( &aWlanSettings ) );			
+			}
+		}
+
+	_DBG_FILE("CWlanSettings::GetWlanSettings(): end");
+	return err;
+	}
+	
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::GetEapSettings( TInt aId, TWlanSettings& aWlanSettings )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::GetEAPSettings( const TInt aId, const TInt aEapType, const TInt aTunnelingType, EAPSettings& aEapSettings )
+	{
+	_DBG_FILE("CWlanSettings::GetEapSettings(): begin");
+	DBG_ARGS(_S16("aId=%d, eEapType=%d"), aId, aEapType);
+
+	TRAPD( err, GetEAPInterfaceL(aId, aTunnelingType, aEapType) );
+	DBG_ARGS(_S16("GetEAPInterfaceL leaved with %d"), err);
+	if( err == KErrNone )
+		{
+		TRAP(err, iEapType->GetConfigurationL(aEapSettings));
+    	DBG_ARGS(_S16("iEapType->GetConfigurationL leaved with %d"), err);
+		}
+		
+	_DBG_FILE("CWlanSettings::GetEAPSettings(): end");
+	return err;
+	}
+
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::DeleteWlanSettings( TUint32 aLuid )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::DeleteWlanSettings( TUint32 aLuid )
+	{
+	_DBG_FILE("CWlanSettings::DeleteWlanSettings(): begin");
+	TBool wlanEnforce = EFalse;
+	TInt tableLockError= KErrNone;
+	
+    if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+        {
+        TInt enError = KErrNone;
+        TRAP(enError, wlanEnforce=CheckEnforcementL());
+        DBG_ARGS(_S16("CWlanSettings::DeleteWLANSettings, check enforcement failed. error: <%D>"), enError );
+        if(wlanEnforce)
+            {
+            _DBG_FILE("CWlanSettings::WriteWlanSettings(): wlan enforce is ON ");
+            TRAPD(lockError,tableLockError = PerformLockWLANTablesL(EFalse));
+            if(lockError == KErrNone && tableLockError == KErrNone)
+                {
+                _DBG_FILE("CWlanSettings::WriteWlanSettings(): Table unlcoked successfully ");
+                iWLANRelock = ETrue;	
+                }
+            }
+        }
+ 	
+	TRAPD( err, ConnectToDatabaseL() );
+	if( err == KErrNone )
+		{
+		err = GoToRecord( aLuid );
+		if( err == KErrNone )
+			{
+			
+			if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+			    {
+			    if(wlanEnforce)
+			        {
+			        ((CCommsDbProtectTableView*)iTableView)->UnprotectRecord();
+			        }
+			    }
+
+			
+			TInt err = iTableView->UpdateRecord( );
+	        if( err == KErrLocked )
+	             {
+	             _DBG_FILE("DeleteWlanSettings: UpdateRecord was locked.");
+	             TInt retry = KBeginTransRetryCount;            
+	             while ( retry > 0 && err == KErrLocked )
+	                 {
+	                 User::After(KBeginTransRetryDelay);
+	                 _DBG_FILE("DeleteWlanSettings: Slept 1 second. Try again");
+	                 err = iTableView->UpdateRecord();	                 
+	                 retry--;
+	                 }      	                           
+                 if( err != KErrNone )
+                     {
+                     _DBG_FILE("DeleteWlanSettings: UpdateRecord was unsuccessful");
+                     }			
+                 else
+                     {
+                     _DBG_FILE("DeleteWlanSettings: UpdateRecord was successful");
+                     }
+	             }			
+			
+			if( err == KErrNone )
+				{
+				TRAP( err, iTableView->WriteUintL( TPtrC(WLAN_SERVICE_ID), 0 ) );
+				if( err != KErrNone )
+					{
+					if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+					    {
+					    TInt tableLockError= KErrNone;
+					    if(iWLANRelock)
+					        {
+					        TInt lockError = KErrNone;
+					        TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+					        ((CCommsDbProtectTableView*)iTableView)->ProtectRecord();
+					        DBG_ARGS(_S16("CWlanSettings::DeleteWLANSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+					        iWLANRelock =EFalse;		             
+					        }
+					    if ( tableLockError != KErrNone ) // to remove warnings
+					        {
+					        tableLockError = KErrNone;
+					        }
+					    }
+					return err;
+					}
+				}
+			err = iTableView->PutRecordChanges( );
+			if( err == KErrLocked )
+                {
+                _DBG_FILE("DeleteWlanSettings: PutRecordChanges was locked.");
+                TInt retry = KBeginTransRetryCount;            
+                while ( retry > 0 && err == KErrLocked )
+                    {
+                    User::After(KBeginTransRetryDelay);
+                    _DBG_FILE("DeleteWlanSettings: Slept 1 second. Try again");
+                    err = iTableView->PutRecordChanges();
+                    retry--;
+                    }                                     
+                if( err != KErrNone )
+                    {
+                    _DBG_FILE("DeleteWlanSettings: PutRecordChanges was unsuccessful");
+                    }
+                else
+                    {
+                    _DBG_FILE("DeleteWlanSettings: PutRecordChanges was successful");
+                    }
+                }
+			
+			if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+			    {
+				TInt tableLockError= KErrNone;
+				if(iWLANRelock)
+					{
+					TInt lockError = KErrNone;
+					TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+					DBG_ARGS(_S16("CWlanSettings::DeleteWLANSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+					((CCommsDbProtectTableView*)iTableView)->ProtectRecord();
+					iWLANRelock =EFalse;
+					}
+				if ( tableLockError != KErrNone ) // to remove warnings
+				    {
+				    tableLockError = KErrNone;
+				    }
+			    }   
+
+			
+			if ( err == KErrNone )
+				{
+				// Ignore err on purpose
+				TRAP( err, DeleteSecondarySSIDsL( aLuid ) );				
+    	                    
+	            TRAP( err, DeleteWlanEapSettingsL( aLuid ) );
+				}            
+			}
+		}
+
+
+	_DBG_FILE("CWlanSettings::DeleteWlanSettings(): end");
+	if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+	    {
+	    if(iWLANRelock)
+		    {
+		    TInt lockError = KErrNone;
+		    TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+	        DBG_ARGS(_S16("CWlanSettings::DeleteWLANSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+	        ((CCommsDbProtectTableView*)iTableView)->ProtectRecord();
+	        iWLANRelock =EFalse;		   
+		    }
+	    }
+	
+	if (wlanEnforce) 
+		wlanEnforce = EFalse; // to get rid of warnings
+	return err;
+	}
+
+
+
+
+TInt CWlanSettings::DeleteOneSecondarySSIDL( TUint32 aWLANId , TUint32 asecId)
+{
+  
+  	   TInt retval = KErrNone;
+        SetSecondaryViewToRecordL(aWLANId);
+    	retval = iSecondaryView->GotoFirstRecord();
+          
+       while (retval == KErrNone)
+        {
+        TSecondarySSID ssid;
+        TRAP(retval, iSecondaryView->ReadUintL( TPtrC(WLAN_SEC_SSID_ID ),  ssid.Id ));
+        if(ssid.Id == asecId)
+            {
+            //retval = iSecondaryView->UpdateRecord();
+            //if( retval==KErrNone )
+              //  {
+            if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+                {
+    			TBool wlanEnforce = EFalse;
+    			TInt enError = KErrNone;
+    			TRAP(enError, wlanEnforce=CheckEnforcementL());
+    			DBG_ARGS(_S16("CWlanSettings::DeleteWLANSettings, check enforcement failed. error: <%D>"), enError );
+    			if(wlanEnforce)
+    				{
+    				((CCommsDbProtectTableView*)iSecondaryView)->UnprotectRecord();
+    				}
+                }
+
+            retval = iSecondaryView->DeleteRecord();
+            if( retval == KErrLocked )
+                {
+                _DBG_FILE("DeleteOneSecondarySSIDL: DeleteRecord was locked.");
+                TInt retry = KBeginTransRetryCount;            
+                while ( retry > 0 && retval == KErrLocked )
+                    {
+                    User::After(KBeginTransRetryDelay);
+                    _DBG_FILE("DeleteOneSecondarySSIDL: Slept 1 second. Try again");
+                    retval = iSecondaryView->DeleteRecord();
+                    retry--;
+                    }                                    
+                if( retval != KErrNone )
+                    {
+                    _DBG_FILE("DeleteOneSecondarySSIDL: DeleteRecord was unsuccessful");
+                    }
+                else
+                    {
+                    _DBG_FILE("DeleteOneSecondarySSIDL: DeleteRecord was successful");
+                    }
+                }
+                DBG_ARGS(_S16("CWlanSettings::DeleteOneSecondarySSIDL, Secondaryssid delete error: <%D> "), retval );
+
+                //    iTableView->PutRecordChanges( );
+                //}
+
+        	break;
+       	}
+        
+        retval = iSecondaryView->GotoNextRecord();
+        }
+        
+	return retval;
+}
+
+TInt CWlanSettings::DeleteSecondarySSIDsL( TUint32 aWLANId )
+    {
+    TInt retVal(KErrNone);
+	if (iSecondaryView == NULL)
+	    {
+	    SetSecondaryViewToRecordL(aWLANId);
+	    }
+	else 
+	    {
+	    retVal = iSecondaryView->GotoFirstRecord();
+	    TUint32 secId = 0;
+	    if (retVal == KErrNone)
+	        {
+	        iSecondaryView->ReadUintL( TPtrC(WLAN_SEC_SSID_SERVICE_ID), secId );
+	        }
+	    if (secId != aWLANId)
+	        {
+	        SetSecondaryViewToRecordL(aWLANId);
+	        }
+	    }
+	    
+    TInt err = iSecondaryView->GotoFirstRecord();
+    while (err == KErrNone)
+        {
+        if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+            {
+			TBool wlanEnforce = EFalse;
+			TInt enError = KErrNone;
+			TRAP(enError, wlanEnforce=CheckEnforcementL());
+			DBG_ARGS(_S16("CWlanSettings::DeleteSecondarySSIDsL, check enforcement failed. error: <%D>"), enError );
+			if(wlanEnforce)
+				{
+				((CCommsDbProtectTableView*)iSecondaryView)->UnprotectRecord();
+				}
+            }
+		retVal = iSecondaryView->DeleteRecord();
+        if( retVal == KErrLocked )
+             {
+             _DBG_FILE("DeleteSecondarySSIDsL: DeleteRecord was locked.");
+             TInt retry = KBeginTransRetryCount;            
+             while ( retry > 0 && retVal == KErrLocked )
+                 {
+                 User::After(KBeginTransRetryDelay);
+                 _DBG_FILE("DeleteSecondarySSIDsL: Slept 1 second. Try again");
+                 retVal = iSecondaryView->DeleteRecord();
+                 retry--;
+                 }                                   
+             if( retVal != KErrNone )
+                 {
+                 _DBG_FILE("DeleteSecondarySSIDsL: DeleteRecord was unsuccessful");
+                 }
+             else
+                 {
+                 _DBG_FILE("DeleteSecondarySSIDsL: DeleteRecord was successful");     
+                 }
+             }
+		DBG_ARGS(_S16("CWlanSettings::DeleteSecondarySSIDsL, Secondaryssid delete error: <%D> "), retVal );
+
+		err = iSecondaryView->GotoNextRecord();
+        }
+    
+    return retVal;
+    }
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::DeleteEapSettings( TInt aWlanId, TInt aEapType )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::DeleteEAPSettings( TInt aWlanId, TInt aEapType  )
+	{
+	_DBG_FILE("CWlanSettings::DeleteEAPSettings(): begin");
+
+	TRAPD( err, GetEAPInterfaceL(aWlanId, EAPSettings::EEapNone, aEapType) );
+	if( err == KErrNone )
+		{
+		TRAP( err, iEapType->DeleteConfigurationL());
+		if( err != KErrNone )
+		    {
+		    DBG_ARGS(_S16("CWlanSettings::DeleteEAPSettings, delete failed, error: <%D> "), err );
+			return err;
+		    }
+		}
+
+	_DBG_FILE("CWlanSettings::DeleteEAPSettings(): end");
+	return err;
+	}
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::DeleteWlanEapSettings( TInt aWlanId )
+// Deletes all EAPs from a Wlan
+//-----------------------------------------------------------------------------
+void CWlanSettings::DeleteWlanEapSettingsL( TInt aWlanId )
+	{
+	_DBG_FILE("CWlanSettings::DeleteWlanEapSettings(): begin");    
+    TInt retVal( KErrNone );
+    TInt err( KErrNone );
+
+    // List EAP implementations and call deletion for those that are not encapsulated
+	
+	RImplInfoPtrArray ecomInfoArray;
+	REComSession::ListImplementationsL( KEapTypeInterfaceUid, ecomInfoArray );	
+	TUint eapId;
+	for (TInt i = 0; i < ecomInfoArray.Count(); i++)
+		{
+		if ( !CEapType::IsDisallowedOutsidePEAP( *ecomInfoArray[i] ) )
+			{
+			// Not encapsulated method. Settings can be deleted.
+			if ( ecomInfoArray[i]->DataType().Length() == KExpandedEAPIdLength)
+				{				
+				// The EAP ID is in expanded type format
+				eapId = ecomInfoArray[i]->DataType()[7];				
+				}
+			else
+				{
+				// The EAP ID is in old 8-bit format (as string)
+				TLex8 lex( ecomInfoArray[i]->DataType() );
+        		lex.Val( eapId );        		        		
+				}
+			err = DeleteEAPSettings( aWlanId, eapId );				
+			if ( err != KErrNone )
+				{
+				retVal = err;
+				}
+			}
+		}
+	ecomInfoArray.ResetAndDestroy();
+	User::LeaveIfError (retVal);
+		
+	_DBG_FILE("CWlanSettings::DeleteWlanEapSettings(): end");	
+	}
+
+
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::WriteWlanSettings( TWlanSettings& aWlanSettings )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::WriteWlanSettings( TWlanSettings& aWlanSettings )
+	{
+	_DBG_FILE("CWlanSettings::WriteWlanSettings(): begin");
+
+	TInt err = 0;
+	TInt enError= KErrNone;
+	iServiceID = aWlanSettings.ServiceID; 
+	TBool wlanEnforce = EFalse;
+
+	if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+	    {
+	    TRAP(enError, wlanEnforce=CheckEnforcementL());
+	    DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings, check enforcement . error: <%D>"), enError );
+	    if(wlanEnforce)
+	        {
+	        TRAPD(lockError,enError = PerformLockWLANTablesL(EFalse));
+	        if(lockError == KErrNone && enError == KErrNone)
+	            {
+	            iWLANRelock = ETrue;	
+	            }
+	        }
+	    }
+	
+	if( RecordExists( aWlanSettings.ServiceID ) <= 0 )
+		{
+		err = iTableView->InsertRecord( aWlanSettings.Id );			           
+        if( err == KErrLocked )
+            {
+            _DBG_FILE("WriteWlanSettings InsertRecord: CommsDat was locked.");
+            TInt retry = KBeginTransRetryCount;            
+            while ( retry > 0 && err == KErrLocked )
+                {
+                User::After(KBeginTransRetryDelay);
+                _DBG_FILE("WriteWlanSettings: Slept 1 second. Try again");
+                err = iTableView->InsertRecord( aWlanSettings.Id ); 
+                retry--;
+                }      
+            }        
+		
+		if( err != KErrNone )
+			{
+			DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings(): - InsertRecord failed. error: <%D>"), err );
+		
+			if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+			    {
+			    TInt tableLockError= KErrNone;
+			    if(iWLANRelock)
+			        {
+			        TInt lockError = KErrNone;
+			        TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+			        DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+			        iWLANRelock =EFalse;
+			        }
+			    if ( tableLockError != KErrNone ) // to remove warnings
+			        {
+			        tableLockError = KErrNone;
+			        }
+			    }
+			return err;
+			}
+		TRAP( err, InitialiseRecordL() );
+		if( err != KErrNone )
+			{
+			DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings(): - InitialiseRecord failed. error: <%D>"), err );
+		
+			if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+			    {
+			    TInt tableLockError= KErrNone;
+			    if(iWLANRelock)
+			        {
+			        TInt lockError = KErrNone;
+			        TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+			        DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+			        iWLANRelock =EFalse;
+			        }
+			    if ( tableLockError != KErrNone ) // to remove warnings
+			        {
+			        tableLockError = KErrNone;
+			        }
+			    }
+			return err;
+			}
+		}
+	else
+		{
+		err = GoToRecord( aWlanSettings.ServiceID );
+		if( err == KErrNone )
+			{
+			
+			if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+			    {
+				if ( wlanEnforce )
+					{
+					_DBG_FILE("CWlanSettings::WriteWlanSettings(): unprotect wlan");
+					((CCommsDbProtectTableView*)iTableView)->UnprotectRecord(); 
+					}
+			    }
+
+			
+			err = iTableView->UpdateRecord( );
+            if( err == KErrLocked )
+                {
+                _DBG_FILE("WriteWlanSettings: UpdateRecord was locked.");
+                TInt retry = KBeginTransRetryCount;            
+                while ( retry > 0 && err == KErrLocked )
+                    {
+                    User::After(KBeginTransRetryDelay);
+                    _DBG_FILE("WriteWlanSettings: Slept 1 second. Try again");
+                    err = iTableView->UpdateRecord();                    
+                    retry--;
+                    }               
+                if( err != KErrNone )
+                    {
+                    _DBG_FILE("WriteWlanSettings: UpdateRecord was unsuccessful");
+                    }
+                else
+                    {
+                    _DBG_FILE("WriteWlanSettings: UpdateRecord was successful");
+                    }
+                }           
+			
+			if( err != KErrNone )
+				{
+				DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings(): - UpdateRecord failed. error: <%D>"), err );
+			
+				if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+				    {
+				    TInt tableLockError= KErrNone;
+				    if(iWLANRelock)
+				        {
+				        TInt lockError = KErrNone;
+				        TRAP(lockError,tableLockError = PerformLockWLANTablesL(ETrue));
+				        DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,tableLockError );
+				        ((CCommsDbProtectTableView*)iTableView)->ProtectRecord(); 
+				        iWLANRelock =EFalse;
+				        }
+				    if ( tableLockError != KErrNone ) // to remove warnings
+				        {
+				        tableLockError = KErrNone;
+				        }
+				    }
+				return err;
+				}
+			}
+		}
+
+	TRAP( err, WriteDataToRecordL( &aWlanSettings ) );
+
+	if( err == KErrNone )
+		{
+		_DBG_FILE("CWlanSettings::WriteWlanSettings(): PutRecordChanges");
+		err = iTableView->PutRecordChanges();
+		if( err == KErrLocked )
+            {
+            _DBG_FILE("WriteWlanSettings: PutRecordChanges was locked.");
+            TInt retry = KBeginTransRetryCount;            
+            while ( retry > 0 && err == KErrLocked )
+                {
+                User::After(KBeginTransRetryDelay);
+                _DBG_FILE("WriteWlanSettings: Slept 1 second. Try again");
+                err = iTableView->PutRecordChanges();
+                retry--;
+                }      
+            }                
+        if( err != KErrNone )
+            {
+            _DBG_FILE("WriteWlanSettings: PutRecordChanges was unsuccessful");
+            }				
+        else
+            {
+            _DBG_FILE("WriteWlanSettings: PutRecordChanges was successful");        
+            }
+		}
+	if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+	    {
+	    if(iWLANRelock)
+	        {
+	        TInt lockError = KErrNone;
+	        TRAP(lockError,enError = PerformLockWLANTablesL(ETrue));
+	        DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings, WLAN table Lock error. error: <%D>, <%D> "), lockError,enError );
+	       iWLANRelock =EFalse;
+		   }
+	    }
+	DBG_ARGS(_S16("CWlanSettings::WriteWlanSettings(): end. err: <%D>"), err );
+	return err;
+	}
+
+
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::WriteWlanSettings( TWlanSettings& aWlanSettings )
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::WriteSecondarySSIDL( TUint32 aWlanID, TSecondarySSID& aSettings, TBool aNew )
+    {
+    
+    _DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): begin");
+
+    TUint32 id = 0;
+    delete iSecondaryView;
+    iSecondaryView = NULL;
+    
+    TInt retval = KErrNone;
+    TInt reLock = EFalse;
+    TBool apEnforce=EFalse;
+    
+    if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+        {
+    	TRAPD(eError,apEnforce=CheckEnforcementL())
+    	DBG_ARGS8(_S8("CNSmlInternetAdapter::WriteSecondarySSIDL(): EError %d , APEnforcement is %d"),eError,apEnforce);
+		if(eError==KErrNone && apEnforce)
+			{
+			_DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): set db protect");
+			TInt enError=KErrNone;
+			TInt lockError = KErrNone;
+			TRAP(lockError,enError = PerformLockWLANTablesL(EFalse));
+			reLock = ETrue;
+			if ( enError != KErrNone ) // to remove warnings
+			    {
+			    enError = KErrNone;
+			    }
+			}
+        }
+
+    
+    if (aNew)
+        {
+        _DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): new table inserted");
+        iSecondaryView = iDatabase.OpenTableLC( TPtrC( WLAN_SECONDARY_SSID ) ); 
+        CleanupStack::Pop(iSecondaryView); // iSecondaryView
+        retval = iSecondaryView->InsertRecord(id);
+        
+        if( retval == KErrLocked )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: InsertRecord was locked.");
+             TInt retry = KBeginTransRetryCount;            
+             while ( retry > 0 && retval == KErrLocked )
+                 {
+                 User::After(KBeginTransRetryDelay);
+                 _DBG_FILE("WriteSecondarySSIDL: Slept 1 second. Try again");
+                 retval = iSecondaryView->InsertRecord(id);
+                 retry--;
+                 }      
+             }                
+         if( retval != KErrNone )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: InsertRecord was unsuccessful");
+             }
+         else 
+             {
+             _DBG_FILE("WriteSecondarySSIDL: InsertRecord was successful");
+             }
+        
+        DBG_ARGS8(_S8("CNSmlInternetAdapter::WriteSecondarySSIDL(): Add record, error %d"), retval);
+        if ( retval == KErrNone )
+        	{
+        	_DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): table insertion went ok");      
+        	iSecondaryView->WriteUintL(TPtrC(WLAN_SEC_SSID_SERVICE_ID), aWlanID );
+        	iSecondaryView->WriteUintL(TPtrC(WLAN_SEC_SSID_ID), id );
+        	}
+        }
+    else
+        {
+        _DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): table exists, find it");
+        iSecondaryView = iDatabase.OpenViewMatchingUintLC(TPtrC(WLAN_SECONDARY_SSID),
+                                                        TPtrC(WLAN_SEC_SSID_ID),
+                                                        aSettings.Id);
+        CleanupStack::Pop(iSecondaryView); // iSecondaryView
+        TInt err = iSecondaryView->GotoFirstRecord();
+        if (err != KErrNone)
+            {
+            _DBG_FILE("CWlanSettings::WriteSecondarySSIDL(): go to first record failed");
+            // most likely KErrNotFound, something wrong with the URI parsing probably
+            return err;
+            }
+        if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+            {
+    		if ( apEnforce )
+    			{
+    			((CCommsDbProtectTableView*)iSecondaryView)->UnprotectRecord();
+    			}
+            }
+        retval = iSecondaryView->UpdateRecord();
+        if( retval == KErrLocked )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: UpdateRecord was locked.");
+             TInt retry = KBeginTransRetryCount;            
+             while ( retry > 0 && retval == KErrLocked )
+                 {
+                 User::After(KBeginTransRetryDelay);
+                 _DBG_FILE("WriteSecondarySSIDL: Slept 1 second. Try again");
+                 retval = iSecondaryView->UpdateRecord();
+                 retry--;
+                 }      
+             }                
+         if( retval != KErrNone )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: UpdateRecord was unsuccessful");
+             }
+         else
+             {
+             _DBG_FILE("WriteSecondarySSIDL: UpdateRecord was successful");
+             }
+        }
+    if ( retval == KErrNone )
+    	{
+    	DBG_ARGS8(_S8("CWlanSettings::writesecondaryssids - WLAN_SEC_SSID_SCANNED_SSID uri: <%S> ad  WLAN_SEC_SSID_USED_SSID : <%S>"), &aSettings.ScannedId, &aSettings.UsedId );
+    	iSecondaryView->WriteTextL(TPtrC(WLAN_SEC_SSID_SCANNED_SSID), aSettings.ScannedId);
+    	iSecondaryView->WriteTextL(TPtrC(WLAN_SEC_SSID_USED_SSID), aSettings.UsedId);
+    
+    	retval = iSecondaryView->PutRecordChanges();
+        if( retval == KErrLocked )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: PutRecordChanges was locked.");
+             TInt retry = KBeginTransRetryCount;            
+             while ( retry > 0 && retval == KErrLocked )
+                 {
+                 User::After(KBeginTransRetryDelay);
+                 _DBG_FILE("WriteSecondarySSIDL: Slept 1 second. Try again");
+                 retval = iSecondaryView->PutRecordChanges();
+                 retry--;
+                 }      
+             }                
+         if( retval != KErrNone )
+             {
+             _DBG_FILE("WriteSecondarySSIDL: PutRecordChanges was unsuccessful");
+             }
+         else
+             {
+             _DBG_FILE("WriteSecondarySSIDL: PutRecordChanges was successful");
+             }
+    	}
+    
+    if(FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement))
+        {
+    	if ( reLock )
+    		{
+			TInt enError=KErrNone;
+			TInt lockError = KErrNone;
+			TRAP(lockError,enError = PerformLockWLANTablesL(ETrue));
+			if ( iSecondaryView != NULL )
+				{
+				((CCommsDbProtectTableView*)iSecondaryView)->ProtectRecord();
+				}
+			if ( enError != KErrNone ) // to remove warnings
+			    {
+			    enError = KErrNone;
+			    }
+    		}
+        }
+
+    	
+    // This makes sure that there will be no calling to GotoFirstRecord() 
+    // before secondaryview is reinitialized, (causes a panic if that would happen)
+    delete iSecondaryView;
+    iSecondaryView = NULL;
+    
+    if ( reLock&&apEnforce )
+    	{
+    	reLock = EFalse; // to get rid of warnings
+    	apEnforce = EFalse;
+    	}
+    
+    return retval;
+    
+    }
+	
+TInt CWlanSettings::WriteEAPSettings( EAPSettings& aEapSettings) 
+    {
+    TRAPD(err, iEapType->SetConfigurationL(aEapSettings));
+    return err;
+    }
+
+
+//-----------------------------------------------------------------------------
+// void CWlanSettings::ConnectToDatabaseL( )
+//-----------------------------------------------------------------------------
+void CWlanSettings::ConnectToDatabaseL( )
+	{
+	_DBG_FILE("CWlanSettings::ConnectToDatabaseL(): begin");
+
+	if( !iTableView )
+		{
+		iTableView = iDatabase.OpenTableLC( TPtrC( WLAN_SERVICE ) ); 
+
+		if( iTableView == NULL )
+			{
+			_DBG_FILE("CWlanSettings::ConnectToDatabaseL(): could not open table");
+			User::Leave( KErrCouldNotConnect );
+			}
+
+		CleanupStack::Pop( iTableView ); //iTableView
+		}
+	
+	_DBG_FILE("CWlanSettings::ConnectToDatabaseL(): end");
+	}
+
+
+void CWlanSettings::GetEAPInterfaceL(const TInt aId, const TInt aTunnelingType, const TInt aType)
+    {
+    if ( aId < 0 )
+    	{
+    	// Illegal input
+    	User::Leave( KErrArgument );
+    	}
+    	
+ 	if ( iEapType )
+	    {
+	    delete iEapType;
+	    iEapType = NULL;
+	    }
+
+    TInt err = KErrNone;
+    TUint8 expandedEapId[] = {0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+    TBuf8<KExpandedEAPIdLength> cue;
+    
+	// First try loading EAP type using the expanded id and if that fails 
+	// try the 8-bit id. If that succeeds then set the flag so that subsequent
+	// EAP method loads are always done using the 8-bit id.
+	if ( iExpandedEAPTypeFieldsUsed )
+		{
+		_DBG_FILE("CWlanSettings::GetEAPInterfaceL(): iExpandedEAPTypeFieldsUsed == True.");
+		// Set-up 64-bit expanded EAP id
+		if ( ( aType == KMschapv2TypeId[7] ) || ( aType == KTtlspapTypeId[7] ) )
+			{
+			// This is plain MSCHAPv2. Set vendor ID correctly
+			expandedEapId[1] = KMschapv2TypeId[1];
+			expandedEapId[2] = KMschapv2TypeId[2];
+			expandedEapId[3] = KMschapv2TypeId[3];
+			}
+		
+		expandedEapId[KExpandedEAPIdLength - 1] = static_cast<TUint8> ( aType );	
+						
+		cue.Copy( expandedEapId, KExpandedEAPIdLength );
+		
+		// Try loading EAP ECOM module
+		TRAP( err, iEapType = CEapType::NewL( cue, ELan, aId ));
+		if ( err != KErrNone )
+			{
+			_DBG_FILE("CWlanSettings::GetEAPInterfaceL(): Expanded EAP type loading failed. Trying old style.");
+			// It failed. Try old style
+			cue.Format( _L8("%d"), aType );
+			iEapType = CEapType::NewL( cue, ELan, aId );
+			_DBG_FILE("CWlanSettings::GetEAPInterfaceL(): Old style loading successful.");
+			// Succeeded (because didn't leave). Set the flag so that subsequent trys
+			// are directly using the old format.
+			iExpandedEAPTypeFieldsUsed = EFalse;					
+			}			
+    	}
+    else
+    	{
+    	// Use the old 8-bit format
+    	_DBG_FILE("CWlanSettings::GetEAPInterfaceL(): iExpandedEAPTypeFieldsUsed == False.");
+    	cue.Format( _L8("%d"), aType );
+		iEapType = CEapType::NewL( cue, ELan, aId );
+		_DBG_FILE("CWlanSettings::GetEAPInterfaceL(): Old style loading successful.");
+    	}   
+    	
+    // Set tunneling type
+	if (aTunnelingType != EAPSettings::EEapNone)
+		{
+		iEapType->SetTunnelingType(aTunnelingType);
+		}
+}
+
+
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::GoToRecord( TUint32 aId )
+// Moves iTableView to point record whose id-number equals to aId
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::GoToRecord( TUint32 aId )
+{
+	_DBG_FILE("CWlanSettings::GoToRecord(): begin");
+	DBG_ARGS(_S16("CWlanSettings::GoToRecord(): begin Search record id: <%D>"), aId );
+	
+	TInt err = iTableView->GotoFirstRecord( );
+	if( err != KErrNone )
+		{
+		DBG_ARGS(_S16("CWlanSettings::GoToRecord(): end, GotoFirstRecord. err: <%D>"), err );
+    return err;
+		}
+
+	TUint32 id = 0;
+	TRAP( err, iTableView->ReadUintL( TPtrC(WLAN_SERVICE_ID), id ) );
+	if( err != KErrNone )
+		{
+		DBG_ARGS(_S16("CWlanSettings::GoToRecord(): end, ReadUintL. err: <%D>"), err );
+	  return err;
+		}
+
+	while( aId != id )
+		{
+		err = iTableView->GotoNextRecord( );
+		if( err != KErrNone )
+			{
+			DBG_ARGS(_S16("CWlanSettings::GoToRecord(): end, GotoNextRecord. err: <%D>"), err );
+  	  	    return err;
+			}
+
+		TRAP( err, iTableView->ReadUintL( TPtrC(WLAN_SERVICE_ID), id ) );
+
+		if( err == KErrNone )
+			{
+			DBG_ARGS(_S16("CWlanSettings::GoToRecord(): Found service id: <%D>"), id );
+			}
+		else
+			{
+	  	DBG_ARGS(_S16("CWlanSettings::GoToRecord(): end, ReadUintL next. err: <%D>"), err );
+			return err;
+			}
+		}
+
+    TRAP(err, SetSecondaryViewToRecordL(aId));
+
+
+	DBG_ARGS(_S16("CWlanSettings::GoToRecord(): end. Final record id: <%D>"), id );
+
+	return err;
+	}
+
+
+
+void CWlanSettings::SetSecondaryViewToRecordL( TUint32 aId )
+    {
+    // optional secondarySSID
+    if (iSecondaryView)
+        {
+        delete iSecondaryView;
+        iSecondaryView = NULL;
+        }
+        
+    // first open a view to secondary ssid table, with all the rows with service id
+    // matching the wlan service id (count can be zero)        
+    iSecondaryView = iDatabase.OpenViewMatchingUintLC( TPtrC(WLAN_SECONDARY_SSID),
+                                                        TPtrC(WLAN_SEC_SSID_SERVICE_ID),
+                                                        aId);
+	if( iSecondaryView == NULL )
+		{
+		// this should not happen in a normal situation
+		User::Leave( KErrCouldNotConnect );
+		}
+	CleanupStack::Pop( iSecondaryView );
+    }
+
+
+//-----------------------------------------------------------------------------
+// void CWlanSettings::GetDataFromRecordL( TWlanSettings* aWlanSettings )
+// Read settings from database to aWlanSettings structure
+//-----------------------------------------------------------------------------
+void CWlanSettings::GetDataFromRecordL( TWlanSettings* aWlanSettings )
+	{
+	_DBG_FILE("CWlanSettings::GetDataFromRecordL(): begin");
+	
+    TInt leavecode = 0;
+
+    aWlanSettings->ServiceID = 0;
+    aWlanSettings->ConnectionMode = 0;
+    aWlanSettings->SSID = _L("");
+    aWlanSettings->UsedSSID = _L("");
+    aWlanSettings->ScanSSID = 0;
+    aWlanSettings->WepKey1 = _L8("");
+    aWlanSettings->WepKey2 = _L8("");
+    aWlanSettings->WepKey3 = _L8("");
+    aWlanSettings->WepKey4 = _L8("");
+    aWlanSettings->WepIndex = 0;
+    aWlanSettings->SecurityMode = EAllowUnsecure;
+    aWlanSettings->WPAPreSharedKey = _L8("");
+    aWlanSettings->UseWPAPSK = 0;
+    aWlanSettings->EapList = _L("");
+    aWlanSettings->AuthMode = 0;                
+            
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( WLAN_SERVICE_ID ), aWlanSettings->ServiceID ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_SERVICE_ID read error: <%D>"), leavecode );
+        }       
+       
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( WLAN_CONNECTION_MODE ), aWlanSettings->ConnectionMode ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_CONNECTION_MODE read error: <%D>"), leavecode );
+        }       
+
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( NU_WLAN_AUTHENTICATION_MODE ), aWlanSettings->AuthMode ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_AUTHENTICATION_MODE read error: <%D>"), leavecode );
+        }       
+ 
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( WLAN_WEP_INDEX ), aWlanSettings->WepIndex ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_WEP_INDEX read error: <%D>"), leavecode );
+        }       
+
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( WLAN_SECURITY_MODE ), aWlanSettings->SecurityMode ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_SECURITY_MODE read error: <%D>"), leavecode );
+        }       
+
+    TRAP( leavecode, iTableView->ReadUintL( TPtrC( WLAN_ENABLE_WPA_PSK ), aWlanSettings->UseWPAPSK ) );
+    if ( leavecode != KErrNone ) 
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_ENABLE_WPA_PSK read error: <%D>"), leavecode );
+        }       
+
+    TBuf8<KCommsDbSvrMaxFieldLength> columnValue8;
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(NU_WLAN_WEP_KEY1 ),  columnValue8 ));
+    if ( ( leavecode == KErrNone ) && ( columnValue8.Length() > 0 ) )
+        {
+    	aWlanSettings->WepKey1 = columnValue8;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_WEP_KEY1 read error: <%D>"), leavecode );
+        }
+
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(NU_WLAN_WEP_KEY2 ),  columnValue8 ));
+    if ( ( leavecode == KErrNone ) && ( columnValue8.Length() > 0 ) )
+        {
+    	aWlanSettings->WepKey2 = columnValue8;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_WEP_KEY2 read error: <%D>"), leavecode );
+        }
+
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(NU_WLAN_WEP_KEY3 ),  columnValue8 ));
+    if ( ( leavecode == KErrNone ) && ( columnValue8.Length() > 0 ) )
+        {
+    	aWlanSettings->WepKey3 = columnValue8;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_WEP_KEY3 read error: <%D>"), leavecode );
+        }
+
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(NU_WLAN_WEP_KEY4 ),  columnValue8 ));
+    if ( ( leavecode == KErrNone ) && ( columnValue8.Length() > 0 ) )
+        {
+    	aWlanSettings->WepKey4 = columnValue8;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_WEP_KEY4 read error: <%D>"), leavecode );
+        }
+
+	TBuf8<KMaxPSKLength> precolumnValue8;
+    TBuf<KCommsDbSvrMaxFieldLength> columnValue;
+    
+    _DBG_FILE("CWlanSettings::GetDataFromRecordL(): Before getting WLAN_WPA_PRE_SHARED_KEY ");
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(WLAN_WPA_PRE_SHARED_KEY ),  precolumnValue8 ));
+    DBG_ARGS(_S16("CWlanSettings::ReadTextL( TPtrC(WLAN_WPA_PRE_SHARED_KEY ),length of key: <%D>"), precolumnValue8.Length() );
+    if ( ( leavecode == KErrNone ) && ( precolumnValue8.Length() > 0 ) )
+        {
+    	aWlanSettings->WPAPreSharedKey = precolumnValue8;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_WPA_PRE_SHARED_KEY read error: <%D>"), leavecode );
+        }
+
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(NU_WLAN_SSID ),  columnValue ));
+    if ( ( leavecode == KErrNone ) && ( columnValue.Length() > 0 ) )
+        {
+    	aWlanSettings->SSID = columnValue;
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): NU_WLAN_SSID read error: <%D>"), leavecode );
+        }
+
+    TRAP(leavecode, iTableView->ReadTextL( TPtrC(WLAN_USED_SSID ),  columnValue ));
+    if ( ( leavecode == KErrNone ) && ( columnValue.Length() > 0 ) )
+        {
+    	aWlanSettings->UsedSSID = columnValue;
+        _DBG_FILE("CWlanSettings::GetDataFromRecordL(): WLAN_USED_SSID reading ok");
+        }
+    else
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_USED_SSID read error: <%D>"), leavecode );
+        }
+	
+    iTableView->ReadTextL( TPtrC(WLAN_USED_SSID), aWlanSettings->UsedSSID );
+    _DBG_FILE("CWlanSettings::GetDataFromRecordL(): WLAN_USED_SSID");
+
+    TRAP(leavecode, iTableView->ReadUintL( TPtrC(WLAN_SCAN_SSID ), aWlanSettings->ScanSSID ));
+    if ( leavecode != KErrNone )
+        {
+        DBG_ARGS(_S16("CWlanSettings::GetDataFromRecordL(): WLAN_SCAN_SSID read error: <%D>"), leavecode );
+        }
+
+	TInt retval = iSecondaryView->GotoFirstRecord();
+	if (retval == KErrNone)
+	    {
+	    aWlanSettings->SecondarySSIDsExisting = ETrue;
+	    }
+	else
+	    {
+	    aWlanSettings->SecondarySSIDsExisting = EFalse;
+	    }
+
+	// Try to read the old EAPList field
+	HBufC* eapList = iTableView->ReadLongTextLC( TPtrC( WLAN_EAPS ) );
+	if ( eapList->Length() > 0 )
+		{
+		// The old field was valid and there was content
+		aWlanSettings->EapList = *eapList;		
+		}
+	else
+		{
+		// Old list was invalid or empty. Try the new fields:
+	    // enabled EAP types
+	    TBuf8<KEAPListBufferSize> enabledTypes;
+	    TBuf8<KEAPListBufferSize> disabledTypes;
+	    iTableView->ReadTextL( TPtrC( WLAN_ENABLED_EAPS ), enabledTypes);
+	    iTableView->ReadTextL( TPtrC( WLAN_DISABLED_EAPS ), disabledTypes);         	                               
+		
+	    // Calculate the number of EAP types altogether
+	    TUint numEapTypes = enabledTypes.Length() / KExpandedEAPIdLength;
+	    numEapTypes += disabledTypes.Length() / KExpandedEAPIdLength;
+	    
+	    if (numEapTypes > 0)
+		    {
+		    // One EAP type reserves maximum of 5 bytes: "+xxx,"
+		    HBufC* outputBuf = HBufC::NewLC( numEapTypes * KLengthOfOldStyleEAPListEntry );
+		    		    
+		    TPtr output = outputBuf->Des();	    
+			_LIT( KFormat, "%03d" );		                  	                               
+			for ( TInt i = (KExpandedEAPIdLength - 1) ; i < enabledTypes.Length() ; i += KExpandedEAPIdLength)
+				{
+				
+				output.Append(TChar( '+' ));
+				output.AppendFormat( KFormat, enabledTypes[i] );
+				output.Append(TChar( ',' ));
+				}
+				
+			for ( TInt i = (KExpandedEAPIdLength - 1) ; i < disabledTypes.Length() ; i += KExpandedEAPIdLength)
+				{				
+				output.Append(TChar( '-' ));
+				output.AppendFormat( KFormat, disabledTypes[i] );
+				output.Append(TChar( ',' ));
+				}
+			// Strip the final ','
+			output.Delete( output.Length() - 1, 1 );
+			
+			aWlanSettings->EapList = *outputBuf;
+			CleanupStack::PopAndDestroy( outputBuf );
+		    }
+		}
+    
+	CleanupStack::PopAndDestroy( eapList );
+
+    _DBG_FILE("CWlanSettings::GetDataFromRecordL(): WLAN_EAPS");
+    
+
+	_DBG_FILE("CWlanSettings::GetDataFromRecordL(): end");
+	}
+	
+	
+	
+//-----------------------------------------------------------------------------
+// void CWlanSettings::GetSecondarySSIDListL(TUint32 aId, RArray<TSecondarySSID>& aSecondarySSIDs)
+// Fills the array with secondarySSIDs, which are associated with given WLANID
+//-----------------------------------------------------------------------------
+void CWlanSettings::GetSecondarySSIDListL(TUint32 aWlanId, RArray<TSecondarySSID>& aSecondarySSIDs)
+    {
+    if (iSecondaryView == NULL)
+        {
+        // views haven't been initialized, in case of incorrect usage
+        User::Leave(KErrNotReady);
+        }
+        
+    // set the view pointer into the first record
+    TInt retval = iSecondaryView->GotoFirstRecord();
+    if (retval != KErrNone)
+        {
+        return;
+        }
+    
+    // check that given id matches the current rowset. If not, then reinitialize
+    TUint32 id;
+    TInt err(KErrNone);
+    TRAP(err, iSecondaryView->ReadUintL( TPtrC(WLAN_SEC_SSID_SERVICE_ID ),  id ));
+    if (id != aWlanId)
+        {
+        SetSecondaryViewToRecordL(aWlanId);
+    	retval = iSecondaryView->GotoFirstRecord();
+        }
+        
+    TBuf<KMaxTextLength> columnValue;
+
+    while (retval == KErrNone)
+        {
+        TSecondarySSID ssid;
+        TRAP(retval, iSecondaryView->ReadUintL( TPtrC(WLAN_SEC_SSID_ID ),  ssid.Id ));
+        TRAP(retval, iSecondaryView->ReadTextL( TPtrC(WLAN_SEC_SSID_SCANNED_SSID ),  ssid.ScannedId ));
+        TRAP(retval, iSecondaryView->ReadTextL( TPtrC(WLAN_SEC_SSID_USED_SSID ),  ssid.UsedId ));
+        aSecondarySSIDs.Append(ssid);
+        retval = iSecondaryView->GotoNextRecord();
+        }
+    }
+
+
+
+
+//-----------------------------------------------------------------------------
+// void CWlanSettings::WriteDataToRecordL( TWlanSettings* aWlanSettings )
+// Writes settings to database from aWlanSettings structure
+//-----------------------------------------------------------------------------
+void CWlanSettings::WriteDataToRecordL( TWlanSettings* aWlanSettings )
+	{
+	_DBG_FILE("CWlanSettings::WriteDataToRecordL(): begin");
+
+	iTableView->WriteUintL( TPtrC(WLAN_SERVICE_ID), aWlanSettings->ServiceID );
+	iTableView->WriteUintL( TPtrC(WLAN_CONNECTION_MODE), aWlanSettings->ConnectionMode );
+	iTableView->WriteUintL( TPtrC(WLAN_WEP_INDEX), aWlanSettings->WepIndex );
+	iTableView->WriteUintL( TPtrC(WLAN_SECURITY_MODE), aWlanSettings->SecurityMode );
+	iTableView->WriteUintL( TPtrC(WLAN_ENABLE_WPA_PSK), aWlanSettings->UseWPAPSK );
+	iTableView->WriteUintL( TPtrC(NU_WLAN_AUTHENTICATION_MODE), aWlanSettings->AuthMode );
+	iTableView->WriteTextL( TPtrC(NU_WLAN_SSID), aWlanSettings->SSID );
+	iTableView->WriteTextL( TPtrC(WLAN_USED_SSID), aWlanSettings->UsedSSID );
+	iTableView->WriteUintL( TPtrC(WLAN_SCAN_SSID), aWlanSettings->ScanSSID );
+	
+	iTableView->WriteTextL( TPtrC(NU_WLAN_WEP_KEY1), aWlanSettings->WepKey1 );
+	iTableView->WriteTextL( TPtrC(NU_WLAN_WEP_KEY2), aWlanSettings->WepKey2 );
+	iTableView->WriteTextL( TPtrC(NU_WLAN_WEP_KEY3), aWlanSettings->WepKey3 );
+	iTableView->WriteTextL( TPtrC(NU_WLAN_WEP_KEY4), aWlanSettings->WepKey4 );
+	iTableView->WriteUintL( TPtrC(WLAN_WEP_KEY1_FORMAT ), 1 ); // 0 = Eascii, 1 = EHexadecimal
+	iTableView->WriteUintL( TPtrC(WLAN_WEP_KEY2_FORMAT ), 1 );
+	iTableView->WriteUintL( TPtrC(WLAN_WEP_KEY3_FORMAT ), 1 );
+	iTableView->WriteUintL( TPtrC(WLAN_WEP_KEY4_FORMAT ), 1 ); 
+	
+	iTableView->WriteTextL( TPtrC(WLAN_WPA_PRE_SHARED_KEY), aWlanSettings->WPAPreSharedKey );
+	iTableView->WriteUintL( TPtrC(WLAN_WPA_KEY_LENGTH), aWlanSettings->WPAPreSharedKey.Length() );
+
+	// Expanded EAP types in use. Write the eap list to the new columns.
+
+    // generate appropriate entries in the new enabled and disabled list,
+    // overwriting those values 
+    
+    // count the + and - signs to determine the size of enabled and 
+    // disabled descriptors
+    TLex lex( aWlanSettings->EapList );
+    
+    TInt numPlus = 0;
+    TInt numMinus = 0;
+    TChar ch;
+    while ( !lex.Eos() )
+        {
+        ch = lex.Get();
+        if ( ch == '+' ) ++numPlus;
+        else if ( ch == '-' ) ++numMinus;
+        }
+        
+    // each entry consumes 8 bytes in binary format
+    HBufC8* enabledEAPPlugin = HBufC8::NewL( 8 * numPlus );
+    CleanupStack::PushL( enabledEAPPlugin );
+    
+    HBufC8* disabledEAPPlugin = HBufC8::NewL( 8 * numMinus );
+    CleanupStack::PushL( disabledEAPPlugin );
+        
+    lex.Assign( aWlanSettings->EapList );
+    
+    while ( !lex.Eos() )
+        {
+        // beginning of implementation UID
+        TInt16 implUid = 0;
+        
+        if ( lex.Val( implUid ) != KErrNone || !implUid )
+            {
+            // if the old string is corrupted, null out both lists
+            enabledEAPPlugin->Des().Zero();
+            disabledEAPPlugin->Des().Zero();
+            break;
+            }
+
+        // append it to the appropriate list ('+' enabled, '-' disabled)
+        _LIT8( KPadding, "\xFE\0\0\0\0\0\0" );
+        _LIT8( KMsChapV2Padding, "\xFE\xFF\xFF\xFF\0\0\0");
+        const TInt KPlainMsChapV2ImplUid = 99;
+        const TInt KTtlspapImplUid = 98;
+        
+        // Check whether eap is inluded or not +/-
+        if ( implUid > 0 )
+            {
+            // check whether plain mschap or ttlspap in question
+            if ( Abs( implUid ) == KPlainMsChapV2ImplUid || Abs( implUid ) == KTtlspapImplUid )
+            	{
+            	enabledEAPPlugin->Des().Append( KMsChapV2Padding );
+            	}
+            else
+            	{
+            	enabledEAPPlugin->Des().Append( KPadding );
+            	}
+            enabledEAPPlugin->Des().Append( Abs( implUid ) );
+            }
+        else if (implUid < 0 )
+            {
+            // check whether plain mschap or ttlspap in question
+            if ( Abs( implUid ) == KPlainMsChapV2ImplUid || Abs( implUid ) == KTtlspapImplUid )
+            	{
+            	disabledEAPPlugin->Des().Append( KMsChapV2Padding );
+            	}
+            else
+            	{
+            	disabledEAPPlugin->Des().Append( KPadding );
+            	}
+            disabledEAPPlugin->Des().Append( Abs( implUid ) );
+            }
+        
+        // swallow the delimiter (',')
+        lex.Get();
+        }
+                	
+	
+	
+	iTableView->WriteTextL( TPtrC( WLAN_ENABLED_EAPS ), 
+                                  enabledEAPPlugin? 
+                                        (const TDesC8&)*enabledEAPPlugin: 
+                                        (const TDesC8&)KNullDesC8 );
+
+    iTableView->WriteTextL( TPtrC( WLAN_DISABLED_EAPS ), 
+                                  disabledEAPPlugin? 
+                                        (const TDesC8&)*disabledEAPPlugin: 
+                                        (const TDesC8&)KNullDesC8 );
+    CleanupStack::PopAndDestroy( disabledEAPPlugin );
+    CleanupStack::PopAndDestroy( enabledEAPPlugin );
+    
+	_DBG_FILE("CWlanSettings::WriteDataToRecordL(): end");
+	}
+
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::RecordExists( TUint32 aLuid )
+// Returns ETrue if record exists in database
+//-----------------------------------------------------------------------------
+TInt CWlanSettings::RecordExists( TUint32 aLuid )
+	{
+	_DBG_FILE("CWlanSettings::RecordExists(): begin");
+	
+	TInt err = KErrNone;
+	TRAP( err, ConnectToDatabaseL() );
+	
+	// If the connection went ok, then we can go to the record
+	if( err == KErrNone )
+	    {	    
+	    err = GoToRecord( aLuid );
+	    }
+	
+	if( err == KErrNone )
+		{
+  	    DBG_ARGS(_S16("CWlanSettings::RecordExists(): end. GoToRecord OK err: <%D>"), err );
+		return ETrue;
+		}
+	else
+		{
+  	    DBG_ARGS(_S16("CWlanSettings::RecordExists(): end. GoToRecord error err: <%D>"), err );
+		return err;
+		}
+	}
+
+//-----------------------------------------------------------------------------
+// void CWlanSettings::InitialiseRecordL( )
+// Inserts mandatory values for commsdb
+//-----------------------------------------------------------------------------
+void CWlanSettings::InitialiseRecordL( )
+	{
+	_DBG_FILE("CWlanSettings::InitialiseRecordL(): begin");
+	
+	iTableView->WriteUintL( TPtrC(WLAN_WPA_KEY_LENGTH), 0 );
+	iTableView->WriteUintL( TPtrC(NU_WLAN_AUTHENTICATION_MODE), 0 );
+
+  _DBG_FILE("CWlanSettings::InitialiseRecordL(): end");
+	}
+
+		
+TInt CWlanSettings::InstalledEAPsL(CBufBase& aEAPList)
+    {
+    _DBG_FILE("CWlanSettings::InstalledEAPsL(): begin");
+
+    RImplInfoPtrArray ecomInfoArray;
+    REComSession::ListImplementationsL(KEapTypeInterfaceUid, ecomInfoArray);
+        
+    TUint eapId( 0 ); 
+                
+    // First sort the EAPIds
+    for (TInt i = 0; i < ecomInfoArray.Count(); i++)
+        {        
+		if ( ecomInfoArray[i]->DataType().Length() == KExpandedEAPIdLength)
+			{
+			// The EAP ID is in expanded type format
+			// Only handle the vendor type of 0
+			if ( (ecomInfoArray[i]->DataType()[1] != 0
+				 || ecomInfoArray[i]->DataType()[2] != 0
+				 || ecomInfoArray[i]->DataType()[3] != 0  )
+				 && ( ( ecomInfoArray[i]->DataType()[7] != KMschapv2TypeId[7] ) &&
+					  ( ecomInfoArray[i]->DataType()[7] != KTtlspapTypeId[7] ) ) )
+				 {
+				 	// This is some other vendor type than IETF
+				 	continue;	
+				 }
+			eapId = ecomInfoArray[i]->DataType()[7];
+			_DBG_FILE("CWlanSettings::InstalledEAPsL(): Expanded EAP id found.");			
+			}
+		else
+			{
+			// The EAP ID is in old 8-bit format (as string)
+			TLex8 lex( ecomInfoArray[i]->DataType() );
+        	if ( lex.Val( eapId ) != KErrNone )
+        		{
+        		// Unsupported format. Ignore this.
+        		_DBG_FILE("CWlanSettings::InstalledEAPsL(): Unsupported EAP id found.");
+        		continue;
+				}			       			
+				_DBG_FILE("CWlanSettings::InstalledEAPsL(): Old style EAP id found.");
+			}
+			        
+        if ( !CEapType::IsDisallowedOutsidePEAP( *ecomInfoArray[i] ) )
+        	{
+		        aEAPList.InsertL(aEAPList.Size(), KNSmlWLanEapId);  // EAPId
+        		TBuf8<3> cue;    // Max EAPId == 255
+        		cue.AppendNumFixedWidth( eapId, EDecimal, 3 );
+        		aEAPList.InsertL(aEAPList.Size(), cue);
+				aEAPList.InsertL(aEAPList.Size(), KSlash);				
+        	}
+
+		// Check if the method is allowed inside PEAP
+		if ( !CEapType::IsDisallowedInsidePEAP( *ecomInfoArray[i] ) )
+			{			
+	        aEAPList.InsertL(aEAPList.Size(), KNSmlWLanEapId);  // EAPId
+	        TBuf8<3> cue;    // Max EAPId == 255
+	        cue.AppendNumFixedWidth( eapId, EDecimal, 3 );
+	        aEAPList.InsertL(aEAPList.Size(), cue);		
+	        aEAPList.InsertL(aEAPList.Size(), KDash);
+	        cue.Zero();
+	        cue.AppendNumFixedWidth( KEapPeapTypeId[7], EDecimal, 3 );
+	        aEAPList.InsertL(aEAPList.Size(), cue);			       
+	        aEAPList.InsertL(aEAPList.Size(), KSlash);
+	        
+#ifdef FF_WLAN_EXTENSIONS
+			// same additions for EAP-FAST
+	       	aEAPList.InsertL(aEAPList.Size(), KNSmlWLanEapId);  // EAPId
+	       	cue.Zero();    // Max EAPId == 255
+	        cue.AppendNumFixedWidth( eapId, EDecimal, 3 );
+	       	aEAPList.InsertL(aEAPList.Size(), cue);		
+	        aEAPList.InsertL(aEAPList.Size(), KDash);
+	        cue.Zero();
+	        cue.AppendNumFixedWidth( KEapFastTypeId[7], EDecimal, 3 );
+	        aEAPList.InsertL(aEAPList.Size(), cue);			       
+	        aEAPList.InsertL(aEAPList.Size(), KSlash);	
+#endif		        
+			}
+		// Check if the method is allowed inside TTLS
+		if ( !CEapType::IsDisallowedInsideTTLS( *ecomInfoArray[i] ) )
+			{
+	        aEAPList.InsertL(aEAPList.Size(), KNSmlWLanEapId);  // EAPId
+	        TBuf8<3> cue;    // Max EAPId == 255
+	        cue.AppendNumFixedWidth( eapId, EDecimal, 3 );
+	        aEAPList.InsertL(aEAPList.Size(), cue);		
+	        aEAPList.InsertL(aEAPList.Size(), KDash);
+	        cue.Zero();
+	        cue.AppendNumFixedWidth( KEapTtlsTypeId[7], EDecimal, 3 );
+	        aEAPList.InsertL(aEAPList.Size(), cue);			       	
+	        aEAPList.InsertL(aEAPList.Size(), KSlash);		                		        		
+			}
+        }
+    // ECOM array is no longer needed.
+    ecomInfoArray.ResetAndDestroy();
+
+    // Cut the last slash
+	aEAPList.ResizeL( aEAPList.Size() -1);
+     
+    _DBG_FILE("CWlanSettings::InstalledEAPsL(): end");
+    return KErrNone;
+    }
+
+		
+
+//-----------------------------------------------------------------------------
+// TBool CWlanSettings::CheckEnforcementL( )
+// Checks if wlan enforcement is On or Off
+//-----------------------------------------------------------------------------
+    TBool CWlanSettings::CheckEnforcementL()
+    {
+    	CSettingEnforcementInfo* info = CSettingEnforcementInfo::NewL();
+		CleanupStack::PushL(info);
+		TBool enforceWLANActive ( EFalse );
+		User::LeaveIfError(info->EnforcementActive(EWLANEnforcement, enforceWLANActive));
+		CleanupStack::PopAndDestroy(info);
+		return ( enforceWLANActive) ;
+    }
+
+//-----------------------------------------------------------------------------
+// TBool CWlanSettings::CheckAPEnforcementL( )
+// Checks if AP enforcement is On or Off
+//-----------------------------------------------------------------------------
+    
+TBool CWlanSettings::CheckAPEnforcementL()
+    {
+    	CSettingEnforcementInfo* info = CSettingEnforcementInfo::NewL();
+		CleanupStack::PushL(info);
+		TBool enforceAPActive ( EFalse );
+		User::LeaveIfError(info->EnforcementActive(EAPEnforcement, enforceAPActive));
+		CleanupStack::PopAndDestroy(info);
+		return ( enforceAPActive) ;
+    }
+//-----------------------------------------------------------------------------
+// TInt CWlanSettings::PerformLockWLANTablesL( )
+// Locks or unlocks the wlan tables depending on the 
+// aProtect value
+//-----------------------------------------------------------------------------
+  TInt CWlanSettings::PerformLockWLANTablesL(TBool aProtect)
+    {
+       
+   	_DBG_FILE("CWlanSettings::PerformLockWLANTablesL(): BEGIN ");
+    CCommsDatabaseProtect* dbprotect = CCommsDatabaseProtect::NewL();
+    CleanupStack::PushL(dbprotect);
+    RArray<TPtrC> wlanTableList;
+    CleanupClosePushL( wlanTableList );
+    TBuf<KCommsDbSvrMaxFieldLength> serviceType;
+   	TBool apEnforce = EFalse;
+   	TInt err = KErrNone;
+	
+   	TRAP_IGNORE( apEnforce=CheckAPEnforcementL() );
+   	if(apEnforce)
+    	{
+    	_DBG_FILE("CWlanSettings::PerformLockWLANTablesL(): AP enforcement is TRUE");
+   		wlanTableList.AppendL( TPtrC( WAP_ACCESS_POINT ) );
+		wlanTableList.AppendL( TPtrC( WAP_IP_BEARER ) );
+		wlanTableList.AppendL( TPtrC( IAP ) );
+		//condition when only ap is enforced and not wlan then its not 
+		//necessary to add wlanservice table
+		RDbRowSet::TAccess checkAccessType;
+		checkAccessType =  dbprotect->GetTableAccessL(TPtrC(WLAN_DEVICE_SETTINGS));
+    	switch(checkAccessType)
+			{
+			case RDbRowSet::EReadOnly :
+				{
+				wlanTableList.AppendL( TPtrC(WLAN_SERVICE) );
+				wlanTableList.AppendL(TPtrC(WLAN_SECONDARY_SSID) );
+				}
+			default :	
+				{
+				break;
+				}
+			}
+		
+    	}
+    else
+    	{
+    	_DBG_FILE("CWlanSettings::PerformLockWLANTablesL() Only wlan enforcement is ON");
+    	wlanTableList.AppendL( TPtrC(WLAN_SERVICE) );	
+    	wlanTableList.AppendL(TPtrC(WLAN_SECONDARY_SSID) );
+    	}
+    	
+   	iDatabase.CommitTransaction();
+	                                                               	   
+   	for ( TInt i( 0 ); i < wlanTableList.Count(); i++ )	
+   	    {
+   	    if(!aProtect)
+   	        {
+		   	err = dbprotect->UnProtectTable( wlanTableList[ i ] );
+		   	DBG_ARGS(_S16("CWlanSettings::PerformLockWLANTablesL(): Unprotect error  %D"), err);	
+		   	//Check if current AP is locked , if yes , unprotect 
+			// lock = EFalse;
+			}
+   	    else 
+			{
+			err = dbprotect->ProtectTable( wlanTableList[ i ] );
+			//Check if current ServiceID is not locked , if yes , protect
+			// lock = ETrue;
+			}
+   	    } //for loop
+	
+   	CleanupStack::PopAndDestroy(&wlanTableList);
+   	CleanupStack::PopAndDestroy( dbprotect );		
+   	CCommsDatabase* commsDataBase = CCommsDatabase::NewL();
+   	CleanupStack::PushL( commsDataBase );
+			
+	// Open the IAP from IAP Table and protect 
+					
+	TUint32 apIAPID = 0;   					
+	CCommsDbTableView* iapViews = commsDataBase->OpenViewMatchingUintLC(TPtrC(IAP),
+	                                                                    TPtrC(IAP_SERVICE),
+                                                                        iServiceID);
+    err = iapViews->GotoFirstRecord();
+	// Service ID can be same for GPRS or WLAN, hence check service type and get the iAPID
+    while (err == KErrNone )
+        {
+        iapViews->ReadTextL(TPtrC(IAP_SERVICE_TYPE), serviceType);
+		if(serviceType == TPtrC(LAN_SERVICE))    
+		    {		           	
+		    iapViews->ReadUintL(TPtrC(COMMDB_ID), apIAPID);
+		    DBG_ARGS(_S16("CWlanSettings::PerformLockWLANTablesL():  IAPId   %D"), apIAPID);	
+		    break;
+		    }      
+		err = iapViews->GotoNextRecord();
+        }
+                                                          
+        //iapViews->ReadUintL(TPtrC(COMMDB_ID), apIAPID);
+        DBG_ARGS(_S16("CWlanSettings::PerformLockWLANTablesL(): end. IAP ID being locked %d "), apIAPID );
+        if(err == KErrNone)		
+            {	
+            CCommsDbTableView* iapUpdate = commsDataBase->OpenViewMatchingUintLC(TPtrC(IAP),TPtrC(COMMDB_ID),apIAPID);
+            TInt iapExists = iapUpdate->GotoFirstRecord();
+	
+            if(!aProtect)                                                                       	
+                {	
+                ((CCommsDbProtectTableView*)iapViews)->UnprotectRecord(); 	
+                if (iapExists)		
+                    {	
+                    ((CCommsDbProtectTableView*)iapUpdate)->UnprotectRecord();
+                    }
+                }	
+            else
+        		{
+        		((CCommsDbProtectTableView*)iapViews)->ProtectRecord();
+        		if (iapExists)
+        			{
+        			((CCommsDbProtectTableView*)iapUpdate)->ProtectRecord();
+        			}
+        		}
+        	CleanupStack::PopAndDestroy(); // iapUpdate
+            }
+    
+        CleanupStack::PopAndDestroy( iapViews );
+        CleanupStack::PopAndDestroy( commsDataBase );
+            
+        iDatabase.BeginTransaction();
+		return err;
+    }
+  
+