wlan_bearer/wlandbif_cd/src/wdbifwlansettings.cpp
changeset 0 c40eb8fe8501
child 15 191c8407e577
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlan_bearer/wlandbif_cd/src/wdbifwlansettings.cpp	Tue Feb 02 02:03:13 2010 +0200
@@ -0,0 +1,1320 @@
+/*
+* Copyright (c) 2002-2004 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:  Handles the custom WLANServiceTable  in CommsDat
+*
+*/
+
+/*
+* %version: 12 %
+*/
+
+//  INCLUDE FILES
+
+#include <e32svr.h>
+#include <commdb.h>
+#include <commsdattypeinfov1_1.h>
+#include "wdbifwlansettings.h"
+#include "wdbifwlandefs.h"
+#include "gendebug.h"
+
+// LOCAL CONSTANTS
+
+_LIT( KGenericTable, "WLANServiceTable");
+
+const int KMaxEapDataBufLength = 128;
+const int KOldStyleMaxEapTypeValue = 100;
+
+// ---------------------------------------------------------
+// Class CWlanSettings
+// ---------------------------------------------------------
+
+// MEMBER FUNCTIONS
+
+// -----------------------------------------------------------------------------
+// CWLanSettings::CWLanSettings()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CWLanSettings::CWLanSettings() : iCurrentRecord( KErrNotFound),
+                                           iWLANRecord( 0),
+                                           iDBSession( 0)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::CWlanSettings()")));    
+    }
+
+// Destructor
+//
+EXPORT_C CWLanSettings::~CWLanSettings() 
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::~CWlanSettings()")));    
+    delete iDBSession;
+    delete iWLANRecord;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::Connect()
+// Connects to the CommsDat storage server
+// Wraps around leavable function DoConnectL
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::Connect()
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::Connect")));
+
+    TRAPD(err,DoConnectL());
+    return err;
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::Disconnect()
+// Disconnects from the CommsDat storage server
+// ---------------------------------------------------------
+//
+EXPORT_C void CWLanSettings::Disconnect()
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::Disconnect")));
+    
+    delete iDBSession;
+    iDBSession = NULL;
+    
+    delete iWLANRecord;
+    iWLANRecord = NULL;
+    
+    iCurrentRecord = KErrNotFound;
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::GetDataL( SWLANSettings& aSettings)
+// Reads data from a WLANServiceTable record which has previously
+// been fetched (= current record) from the CommsDat.
+// returns settings in aSettings
+// ---------------------------------------------------------
+//
+void CWLanSettings::GetDataL( SWLANSettings& aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetDataL start")));
+    
+    ClearWepKeys( aSettings);
+    
+    aSettings.Id = iWLANRecord->RecordId();
+
+    aSettings.Name = *((CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdRecordName));
+
+    aSettings.ServiceID = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanServiceId));
+    
+    aSettings.ConnectionMode = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanConnMode));
+    
+    aSettings.SSID = *((CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanSSID));
+    
+    // new
+    aSettings.UsedSSID = *((CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanUsedSSID));
+    
+    aSettings.ScanSSID = *((CMDBField<TBool>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanScanSSID));
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetDataL ScanSSID = %d"),aSettings.ScanSSID));
+    
+    aSettings.ChannelID = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanChannelID));
+    // end new
+
+    aSettings.AuthenticationMode = EWepAuthModeOpen; // defaults to open (in case of wep, the value will be read from db later)
+    aSettings.EnableWpaPsk = EFalse;
+    aSettings.WPAKeyLength = 0;
+
+    aSettings.SecurityMode = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanSecMode));
+    
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetDataL, SecurityMode = %d"),aSettings.SecurityMode));
+
+    if( aSettings.SecurityMode == Wep)
+        {    
+        // authentication mode can be != open only when WEP in use
+        aSettings.AuthenticationMode = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanAuthMode));
+
+        aSettings.WepIndex = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanWepIndex));
+        ReadWepKeysL(aSettings);
+        TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetDataL, Wep keys succesfully read")));
+        }
+    else if( aSettings.SecurityMode > Wep)
+        {
+        aSettings.WPAKeyLength = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanWpaKeyLength));
+        aSettings.EnableWpaPsk = *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanEnableWpaPsk));
+        aSettings.PresharedKeyFormat = EWlanPresharedKeyFormatAscii;
+        aSettings.WPAPreSharedKey.Zero();
+        CMDBField<TDesC8>* wpaKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWpaPreSharedKey));
+         
+        aSettings.WPAPreSharedKey.Append( *wpaKey);
+        
+        // In WPA-PSK case the preshared key can be either 8 - 63 characters in ASCII
+        // or 64 characters in hex.
+        //
+        // In WAPI case the preshared key format is stored in WEP key #1 format field.
+        if( aSettings.EnableWpaPsk )
+            {
+            if( aSettings.SecurityMode == Wapi )
+                {
+                TRAP_IGNORE(
+                    aSettings.PresharedKeyFormat = *(CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL( KCDTIdWlanFormatKey1 ) ); 
+                }
+            else if( aSettings.WPAKeyLength == KWLMMaxWpaPskLength )
+                {
+                aSettings.PresharedKeyFormat = EWlanPresharedKeyFormatHex;
+                }
+            }            
+        }
+    
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetDataL end")));
+    }
+    
+
+
+void CWLanSettings::ClearWepKeys( SWLANSettings &aSettings)
+    {
+    // it is enough to set the keylengths to zero, the key is not attempted to read if length == 0
+    aSettings.WepKey1.KeyLength = 0;    
+    aSettings.WepKey2.KeyLength = 0;
+    aSettings.WepKey3.KeyLength = 0;
+    aSettings.WepKey4.KeyLength = 0;
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::WriteDataL( SWLANSettings& aSettings)
+// Writes data from aSettings to a WLANServiceTable record which has 
+// previously been fetched (or newly created) from the CommsDat.
+// ---------------------------------------------------------
+//
+void CWLanSettings::WriteDataL(SWLANSettings& aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteDataL start")));
+
+    CMDBField<TDesC>* textField = (CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdRecordName);
+    textField->SetMaxLengthL(aSettings.Name.Length());
+    textField->SetL( aSettings.Name);
+    
+    *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanServiceId)) = aSettings.ServiceID;
+    
+    *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanConnMode)) = aSettings.ConnectionMode;
+
+    textField = (CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanSSID);
+    textField->SetMaxLengthL( aSettings.SSID.Length());
+    textField->SetL( aSettings.SSID);
+        
+    *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanAuthMode)) = aSettings.AuthenticationMode;
+       
+    *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanSecMode)) = aSettings.SecurityMode;
+
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteDataL, SecurityMode = %d"),aSettings.SecurityMode));
+
+    if( aSettings.SecurityMode == Wep)
+        {
+        *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanWepIndex)) = aSettings.WepIndex;
+        
+        //
+        // never write wep keys
+        //
+        //WriteWepKeysL( aSettings);
+        }
+    else if( aSettings.SecurityMode > Wep)
+        {
+        //
+        // never write wpa psk key
+        //
+        /*
+        TBuf8<KWlanWpaPskLength> buf;
+        
+        TInt len = aSettings.WPAPreSharedKey.Length();
+        
+        for( TInt i=0; i<len; i++)
+            {
+            buf.Append( aSettings.WPAPreSharedKey[i]);
+            }
+        
+        CMDBField<TDesC8>* binField = (CMDBField<TDesC8>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanWpaPreSharedKey);
+        binField->SetMaxLengthL( len);
+        binField->SetL( buf);
+        */
+        *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanWpaKeyLength)) = aSettings.WPAKeyLength;
+        *((CMDBField<TUint32>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanEnableWpaPsk)) = aSettings.EnableWpaPsk;
+        }
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteDataL end")));
+    }
+
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::GetWlanSettings(TUint32 aId,SWLANSettings &aSettings)
+// Gets a WLANServiceTable record from CommsDat with record ID aId
+// writes record data to aSettings; the record ID of the fetched record is set as the 
+// current record
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetWlanSettings(TUint32 aId,SWLANSettings &aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetWlanSettings %d"),aId));
+    
+    TRAPD( err, CreateWLANServiceRecordL( aId, EWlanRecordId));
+    
+    if( !err)
+        {
+        TRAP( err, GetDataL( aSettings));
+        if( !err)
+            {
+            iCurrentRecord = aId;    
+            }
+        }
+        
+    return err;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::GetWlanSettingsForService(TUint32 aId,SWLANSettings &aSettings)
+// Gets a WLANServiceTable record from CommsDat with service ID aId
+// writes record data to aSettings; the record ID of the fetched record is set as the 
+// current record
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetWlanSettingsForService(TUint32 aId,SWLANSettings &aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetWlanSettingsForService %d"),aId));
+    
+    TRAPD( err, CreateWLANServiceRecordL( aId, EWlanServiceId));
+    
+    if( !err)
+        {
+        TRAP( err, GetDataL( aSettings));
+        if( !err)
+            {
+            iCurrentRecord = aSettings.Id;        
+            }
+        }
+        
+    return err;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::GetWlanSettingsForIap( const TUint32 aId, SWLANSettings &aSettings )
+// Gets a WLANServiceTable record from CommsDat with IAP ID aId
+// writes record data to aSettings; the record ID of the fetched record is set as the 
+// current record
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetWlanSettingsForIap(TUint32 aId,SWLANSettings &aSettings)
+    {
+    TraceDump( WARNING_LEVEL, ( _L("CWlanSettings::GetWlanSettingsForIap %d"), aId ) );
+
+    TRAPD( err, CreateWLANServiceRecordL( aId, EWlanIapId ) );
+    if ( !err )
+        {
+        TRAP( err, GetDataL( aSettings ) );
+        if ( !err )
+            {
+            iCurrentRecord = aSettings.Id;
+            }
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::GetFirstSettings( SWLANSettings &aSettings )
+// 
+// Not implemented (never used)
+//
+// returns KErrNotSupported 
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetFirstSettings(SWLANSettings& /*aSettings*/) // implemented if needed
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetFirstSettings")));
+
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::GetNextSettings( SWLANSettings &aSettings)
+// 
+// Not implemented (never used)
+//
+// returns KErrNotSupported 
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetNextSettings(SWLANSettings& /*aSettings*/) // implemented if needed
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetNextSettings")));
+
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::AddWlanTable( )
+// 
+// Not implemented (WLAN table is created by UI)
+//
+// leaves with KErrNotSupported 
+// ---------------------------------------------------------
+//
+EXPORT_C void CWLanSettings::AddWlanTableL()
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::AddWlanTableL")));
+    
+    User::Leave( KErrNotSupported);    
+    }
+
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::WriteWlanSettings( SWLANSettings &aSettings)
+// Writes settings from aSettings to a WLANServiceTable record in CommsDat
+// If aSettings.Id == 0, creates a new record, given new record ID 
+// is returned in aSettings.Id; otherwise modifies an existing record
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::WriteWlanSettings( SWLANSettings& aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWlanSettings start")));
+
+    TInt id = ( aSettings.Id == 0 ? KCDNewRecordRequest : aSettings.Id);
+                                            
+    TRAPD( err, CreateWLANServiceRecordL( id, EWlanRecordId));
+    
+    if( !err)
+        {
+        if( aSettings.Id == 0) // create new
+            {  // store first (placeholder for a new generic wlan record)
+            TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWlanSettings() creating new record")));
+            TRAP( err, iWLANRecord->StoreL( *iDBSession)); 
+            if( err)
+                {
+                return err;
+                }
+            aSettings.Id = iWLANRecord->RecordId(); // return new id to caller    
+            TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWlanSettings() new record id %d"),aSettings.Id));
+            }
+            
+        TRAP( err, WriteDataL( aSettings)); // write from SWLANSettings to iWLANRecord
+        if( err)
+            {
+            TRAP_IGNORE( iWLANRecord->DeleteL( *iDBSession)); // get rid of the placeholder
+            TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWlanSettings(), error writing to record; nothing stored")));
+            return err;
+            }
+                // modify the placeholder or an existing record
+        TRAP( err, iWLANRecord->ModifyL( *iDBSession));
+        }
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWlanSettings end")));
+    return err;
+    }
+
+
+// ---------------------------------------------------------
+// void CWLanSettings::ReadWepKeysL( SWLANSettings &aSettings)
+// Reads WEP keys from current WLANServiceTable record; the
+// record from which data is read must be fetched from CommsDat
+// before calling ReadWepKeysL()
+// ---------------------------------------------------------
+//
+
+
+void CWLanSettings::ReadWepKeysL( SWLANSettings &aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::ReadWepKeysL start")));
+
+    // 1    
+    CMDBField<TDesC8>* wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey1));
+    UnPackWepKey( wepKey->GetL(), aSettings.WepKey1, 0);
+
+    // 2
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey2));
+    UnPackWepKey( wepKey->GetL(), aSettings.WepKey2, 1);
+
+    // 3
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey3));
+    UnPackWepKey( wepKey->GetL(), aSettings.WepKey3, 2);
+
+    // 4
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey4));
+    UnPackWepKey( wepKey->GetL(), aSettings.WepKey4, 3);
+    
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::ReadWepKeysL end")));
+    }
+
+
+// ---------------------------------------------------------
+// void CWLanSettings::WriteWepKeysL( SWLANSettings &aSettings)
+// Writes WEP keys from aSettings to current WLANServiceTable record
+// The record which the data is written to must be fetched from CommsDat
+// before calling WriteWepKeysL()
+// ---------------------------------------------------------
+//
+void CWLanSettings::WriteWepKeysL( SWLANSettings &aSettings)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWepKeys start")));
+
+    // 1
+    CMDBField<TDesC8>* wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey1));
+
+    ASSERT( aSettings.WepKey1.KeyLength <= KWLMMaxWEPKeyLength);
+    PackWepKeyL( aSettings.WepKey1, wepKey);
+    
+    // 2
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey2));
+
+    ASSERT( aSettings.WepKey2.KeyLength <= KWLMMaxWEPKeyLength);
+    PackWepKeyL( aSettings.WepKey2, wepKey);
+    
+    // 3
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey3));
+
+    ASSERT( aSettings.WepKey3.KeyLength <= KWLMMaxWEPKeyLength);
+    PackWepKeyL( aSettings.WepKey3, wepKey);
+
+    // 4
+    wepKey = static_cast<CMDBField<TDesC8>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanWepKey4));
+
+    ASSERT( aSettings.WepKey4.KeyLength <= KWLMMaxWEPKeyLength);
+    PackWepKeyL( aSettings.WepKey4, wepKey);
+    
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::WriteWepKeys end")));
+    }
+
+
+// ---------------------------------------------------------
+// void CWLanSettings::PackWepKeyL( const TWep& aInputKey, CMDBField<TDesC>& aPackedKey)
+// Copies wepkey string from wepkey structs TUint8 buffer to a WLANServiceTable
+// record's WEP key field descriptor
+// ---------------------------------------------------------
+//
+void CWLanSettings::PackWepKeyL( const TWep& aInputKey, CMDBField<TDesC8>* aPackedKey)
+    {
+    TraceDump(ERROR_LEVEL,(_L("CWlanSettings::PackWepKeyL %d"),aInputKey.KeyIndex));
+
+    if( aInputKey.KeyLength > KWLMMaxWEPKeyLength)
+        {
+        User::Leave( KErrArgument);
+        }
+    
+    TBuf8<KWLMMaxWEPKeyLength> wepBuf;
+    
+    for (TUint i = 0 ; i<aInputKey.KeyLength; i++)
+        {
+        wepBuf.Append(aInputKey.KeyMaterial[i]);
+        }
+    
+    aPackedKey->SetL( wepBuf);
+    }
+
+
+void CWLanSettings::AsciiToHexValue( TUint8& aValue)
+    {
+    // 0-9 = [48(0x30) - 57(0x39)], A-F = [65(0x41) - 70(0x46)], a-f = [97(0x61)-102(0x66)]
+    
+    if( aValue >= '0' && aValue <= '9') // 0..9
+        {
+        aValue -= '0';
+        }
+    else if( aValue >= 'A' && aValue <= 'F')  // A..F
+        {
+        aValue -= ('A' - 10);
+        }
+    else if( aValue >= 'a' && aValue <= 'f') // a..f
+        {
+        aValue -= ('a' - 10);    
+        }
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::UnPackWepKeyL( const TDesC& aInputKey, TWep& aUnpackedKey, TInt aKeyIndex )
+// Copies 8 bit wepkey string to TWep structs TUint8 buffer from a WLANServiceTable
+// record's WEP key field descriptor
+// ---------------------------------------------------------
+//
+void CWLanSettings::UnPackWepKey( TDesC8& aInputKey, TWep& aUnpackedKey, TInt aKeyIndex )
+    {
+    TraceDump(ERROR_LEVEL,(_L("CWlanSettings::UnPackWepKey %d"),aKeyIndex));
+    
+    TUint length = aInputKey.Length() / 2; // in aInputKey, 0xXY numbers are represented as ascii(X)ascii(Y)
+                                           // -> actual length is half of the length of aInputKey
+    
+    if( length == 0 || length > KWLMMaxWEPKeyLength)
+        {
+        aUnpackedKey.KeyLength = 0;
+        return;
+        }
+    
+    for( TUint i=0, j=0; i<length ; i++)
+        {
+        TUint8 hexMSB = aInputKey[j++];
+        TUint8 hexLSB = aInputKey[j++];
+    
+        AsciiToHexValue( hexMSB);
+        AsciiToHexValue( hexLSB);
+        
+        TUint8 keyMaterial = hexMSB * 0x10 + hexLSB;
+        
+        aUnpackedKey.KeyMaterial[i] = keyMaterial;
+        }
+    aUnpackedKey.KeyLength = length;
+    aUnpackedKey.KeyIndex = aKeyIndex;
+    }
+
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::DeleteWlanSettings( TUint32 aId)
+// Deletes a WLANServiceTable record with record ID aId
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::DeleteWlanSettings( TUint32 aId)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::DeleteWlanSettings")));
+    
+    TRAPD( err, CreateWLANServiceRecordL( aId, EWlanRecordId));
+    
+    if( !err)
+        {
+        TRAP( err, iWLANRecord->DeleteL( *iDBSession));
+        }
+    return err;    
+    }
+
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::DeleteWlanSettingsForService( TUint32 aId)
+// Deletes a WLANServiceTable record with service ID aId
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::DeleteWlanSettingsForService( TUint32 aId)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::DeleteWlanSettingsForService")));
+    
+    TRAPD( err, CreateWLANServiceRecordL( aId, EWlanServiceId));
+    
+    if( !err)
+        {
+        TRAP( err, iWLANRecord->DeleteL( *iDBSession));
+        }
+
+    return err;    
+    }
+
+
+// ---------------------------------------------------------
+// void CWLanSettings::SetEapDataL( const TEapArray &aEaps)
+// Sets EAP data to current WLANServiceTable record
+// Format "+123,- 34", + means enabled, - disabled, then id, 
+// id is always 3 characters for easy parsing
+//
+// GetWlanSettings() or GetWlanSettingsForService() must be called prior to
+// calling SetEapDataL() so that current record is set
+// ---------------------------------------------------------
+//
+EXPORT_C void CWLanSettings::SetEapDataL( const TEapArray &aEaps)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::SetEapDataL start")));
+
+    // the behaviour has been that first user calls GetWlanSettingsForService()
+    // and then writes EAP data..
+ 
+    if( iCurrentRecord == KErrNotFound)
+        {
+        User::Leave( KErrNotReady);
+        }
+
+    TInt num( aEaps.Count());
+    
+    if( num == 0)
+        {
+        return;
+        }
+   
+    HBufC16* DbText = HBufC16::NewLC( 5*num); // 5 chars per eap entry + ','
+    TPtr16 ptr( DbText->Des());
+    TBuf16<3+1> UidTmp;   // 4 chars per eap entry
+
+    ptr = _L("");
+    for( TInt i=0 ; i<num; i++)
+        {
+        UidTmp.Copy( aEaps[i]->UID);
+        if( i > 0)
+            {
+            ptr.Append(',');
+            }
+        ptr.AppendFormat( _L("%c%3s"), aEaps[i]->Enabled ? '+' : '-', UidTmp.PtrZ());
+        }
+    
+    DoSetEapDataL( ptr);
+    
+    CleanupStack::PopAndDestroy(DbText);
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::SetEapDataL end")));
+    }
+
+
+EXPORT_C void CWLanSettings::SetEapDataL( RExpandedEapTypeArray &aEapsEnabled, RExpandedEapTypeArray &aEapsDisabled )
+    {
+    TraceDump( WARNING_LEVEL, ( _L("CWlanSettings::SetEapDataL start") ) );
+
+    // the behaviour has been that first user calls GetWlanSettingsForService()
+    // and then writes EAP data..
+ 
+    if ( iCurrentRecord == KErrNotFound )
+        {
+        User::Leave( KErrNotReady );
+        }
+    
+    HBufC8* const DbDataEnabled = HBufC8::NewLC( aEapsEnabled.Count() * KExpandedEapTypeSize ); // 8 bytes per eap entry
+    TPtr8 enabledPtr( DbDataEnabled->Des() );
+    for ( TInt i = 0 ; i < aEapsEnabled.Count(); i++ )
+        {
+		enabledPtr.Append( aEapsEnabled[i]->EapExpandedType );
+        }
+        
+    HBufC8* const DbDataDisabled = HBufC8::NewLC( aEapsDisabled.Count() * KExpandedEapTypeSize ); // 8 bytes per eap entry
+    TPtr8 disabledPtr( DbDataDisabled->Des() );
+    for ( TInt i = 0 ; i < aEapsDisabled.Count(); i++ )
+        {
+		disabledPtr.Append( aEapsDisabled[i]->EapExpandedType );
+        }
+
+    DoSetEapDataL( enabledPtr, disabledPtr );
+    
+    CleanupStack::PopAndDestroy( DbDataDisabled );
+    CleanupStack::PopAndDestroy( DbDataEnabled );
+    
+    TraceDump( WARNING_LEVEL, ( _L("CWlanSettings::SetEapDataL end") ) );
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::DoSetEapDataL( TDesC& aData)
+// Sets EAP data to current WLANServiceTable record
+// ---------------------------------------------------------
+//
+void CWLanSettings::DoSetEapDataL( TDesC& aData)
+    {
+    
+    ASSERT( iCurrentRecord > 0);
+    
+    CMDBField<TDesC>* eapList = (CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanEaps);
+    eapList->SetMaxLengthL( aData.Length());
+    eapList->SetL( aData);
+    iWLANRecord->ModifyL( *iDBSession);
+
+    }
+
+// ---------------------------------------------------------
+// void CWLanSettings::DoSetEapDataL( TDesC8& aEnabledData, TDesC8& aDisabledData )
+// Sets EAP data to current WLANServiceTable record
+// ---------------------------------------------------------
+//
+void CWLanSettings::DoSetEapDataL( TDesC8& aEnabledData, TDesC8& aDisabledData )
+    {
+    ASSERT( iCurrentRecord > 0 );
+    
+    CMDBField<TDesC8>* const eapEnabledList = (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtEnabled );
+    eapEnabledList->SetMaxLengthL( aEnabledData.Length() );
+    eapEnabledList->SetL( aEnabledData );
+    
+    CMDBField<TDesC8>* const eapDisabledList = (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtDisabled );
+    eapDisabledList->SetMaxLengthL( aDisabledData.Length() );
+    eapDisabledList->SetL( aDisabledData );
+    
+    iWLANRecord->ModifyL( *iDBSession );
+
+    }
+
+// ---------------------------------------------------------
+// HBufC* CWLanSettings::DoGetEapDataLC()
+// Gets eap data from current WLANServiceTable record
+// returns buffer which contains the data
+// ---------------------------------------------------------
+//
+HBufC* CWLanSettings::DoGetEapDataLC()
+    {
+    
+    ASSERT( iCurrentRecord > 0);
+    
+    HBufC* temp = HBufC::NewLC( KMaxEapDataBufLength);
+    
+    TPtr ptr( temp->Des());
+        
+    ptr = *((CMDBField<TDesC>*)iWLANRecord->GetFieldByIdL(KCDTIdWlanEaps));
+    
+    return temp;
+    }
+
+// ---------------------------------------------------------
+// HBufC* CWLanSettings::DoGetEapDataLC( HBufC8*& enabledEapsData, HBufC8*& disabledEapsData )
+// Gets eap data from current WLANServiceTable record
+// returns buffer which contains the data
+// ---------------------------------------------------------
+//
+void CWLanSettings::DoGetEapDataLC( HBufC8*& enabledEapsData, HBufC8*& disabledEapsData )
+	{
+    ASSERT( iCurrentRecord > 0 );
+    
+    enabledEapsData = HBufC8::NewLC( KMaxEapDataBufLength );
+    disabledEapsData = HBufC8::NewLC( KMaxEapDataBufLength );
+
+    TPtr8 ptr( enabledEapsData->Des() );
+    TPtr8 ptr2( disabledEapsData->Des() );
+    ptr = *( (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtEnabled) );
+   // ptr2 = disabledEapsData->Des();
+    ptr2 = *( (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtDisabled) );
+	}
+
+// ---------------------------------------------------------
+// void CWLanSettings::GetEapDataL( TEapArray &aEaps)
+// Gets EAP data from current WLANServiceTable record
+// see format in SetEapDataL()
+//
+// GetWlanSettings() or GetWlanSettingsForService() must be called prior to
+// calling GetEapDataL() so that current record is set
+// ---------------------------------------------------------
+//
+EXPORT_C void CWLanSettings::GetEapDataL( TEapArray &aEaps)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetEapDataL start")));
+ 
+    if( iCurrentRecord == KErrNotFound)
+        {
+        User::Leave( KErrNotReady);
+        }
+    
+    HBufC* eapData = 0;
+
+    eapData = DoGetEapDataLC();
+   
+    aEaps.Reset();
+    
+    TUint Length = eapData->Length();
+   
+    if( Length == 0)
+        {
+        CleanupStack::PopAndDestroy( eapData);
+        return;
+        }
+        
+    TPtr16 ptr( eapData->Des());
+    TEap* eapTmp;
+    TUint x = 0;
+    
+    while( x < Length)
+        {
+        eapTmp = new (ELeave) TEap; 
+        if( (ptr[x++]) == '+')
+            {
+            eapTmp->Enabled = ETrue;
+            }
+            
+        else 
+            {
+            eapTmp->Enabled=EFalse;
+            }
+           
+        eapTmp->UID.Zero();
+        eapTmp->UID.Append( ptr[x++]);
+        eapTmp->UID.Append( ptr[x++]);
+        eapTmp->UID.Append( ptr[x++]);
+        eapTmp->UID.Trim();
+        x++; // skip ',' if there is one
+        aEaps.Append( eapTmp); 
+        }
+    CleanupStack::PopAndDestroy( eapData);
+    }
+// ---------------------------------------------------------
+// void CWLanSettings::GetEapDataL( RExpandedEapTypeArray &aEapsEnabled, RExpandedEapTypeArray &aEapsDisabled )
+// Gets EAP data from current WLANServiceTable record
+// see format in SetEapDataL()
+//
+// GetWlanSettings() or GetWlanSettingsForService() must be called prior to
+// calling GetEapDataL() so that current record is set
+// ---------------------------------------------------------
+//
+EXPORT_C void CWLanSettings::GetEapDataL( RExpandedEapTypeArray &aEapsEnabled, RExpandedEapTypeArray &aEapsDisabled )
+    {
+    TraceDump( WARNING_LEVEL, ( _L("CWlanSettings::GetEapDataL start") ) );
+ 
+    if ( iCurrentRecord == KErrNotFound )
+        {
+        User::Leave( KErrNotReady );
+        }
+   
+    aEapsEnabled.Reset();
+    aEapsDisabled.Reset();
+   
+    HBufC* const eapData = DoGetEapDataLC();
+
+    const TUint Length = eapData->Length();
+   
+    if ( Length == 0 )
+        {
+    	TraceDump(WARNING_LEVEL,(_L("CWlanSettings::start getting data")));
+
+        // No old-style EAP data
+		CleanupStack::PopAndDestroy( eapData );
+		        
+        // Get EAP data as in new format
+		HBufC8* enabledEapsData;
+		HBufC8* disabledEapsData;
+		DoGetEapDataLC( enabledEapsData, disabledEapsData );
+    	TraceDump(WARNING_LEVEL,(_L("CWlanSettings::data taken")));
+		
+	    // Array pointer
+	    TPtr8 ptr( enabledEapsData->Des() );
+    
+		TInt i = 0;
+		for ( i = 0; i<(enabledEapsData->Length() / KExpandedEapTypeSize); i++ )
+			{
+	        SEapExpandedType* const expandedEap = new (ELeave) SEapExpandedType();
+	        CleanupStack::PushL(expandedEap);
+	        expandedEap->EapExpandedType = ptr.Mid( i * KExpandedEapTypeSize, KExpandedEapTypeSize );
+	        aEapsEnabled.AppendL( expandedEap );
+			CleanupStack::Pop( expandedEap );
+    		TraceDump(WARNING_LEVEL,(_L("CWlanSettings::inloop1")));
+ 			}
+        TraceDump(WARNING_LEVEL,(_L("CWlanSettings::first loop ok")));
+			
+		ptr = disabledEapsData->Des();
+		for ( i = 0; i<(disabledEapsData->Length() / KExpandedEapTypeSize); i++ )
+			{
+	        SEapExpandedType* const expandedEap = new (ELeave) SEapExpandedType();
+	        CleanupStack::PushL(expandedEap);
+	        expandedEap->EapExpandedType = ptr.Mid( i * KExpandedEapTypeSize, KExpandedEapTypeSize );
+	        aEapsDisabled.AppendL( expandedEap );
+			CleanupStack::Pop( expandedEap );
+    		TraceDump(WARNING_LEVEL,(_L("CWlanSettings::inloop2")));
+			}
+        TraceDump(WARNING_LEVEL,(_L("CWlanSettings::second loop ok")));
+			    
+		CleanupStack::PopAndDestroy( disabledEapsData );
+		CleanupStack::PopAndDestroy( enabledEapsData );
+		
+	    TraceDump( WARNING_LEVEL,( _L("CWlanSettings::GetEapDataL end") ) );
+		return;
+        }
+    
+    else
+    	{
+    	// Convert to new format. This part should be removed after old-atyle EAP list support is not needed anymore
+    	
+    	TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetEapDataL - old style data")));
+
+	    TUint16 x = 0;
+	    TUint16 newEapValue;
+	    TBool enableEapType;
+
+	    // Array pointer
+	    const TPtrC16 ptr( eapData->Des() );
+	    
+	    while ( (x+3) < Length )
+	        {
+	        TBool addToList = ETrue;
+	        if ( ptr[x] == '+' )
+	            {
+	            // Append into enabled list
+	            enableEapType = ETrue;
+	            }
+	        else if ( ptr[x] == '-' )
+	            {
+	            // Append into disabled list
+	        	enableEapType = EFalse;
+	            }
+	        else 
+	            {
+	            // Unknown value
+	            TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetEapDataL - unknown value")));
+	            enableEapType = EFalse;
+	            addToList = EFalse;
+	            }
+
+            ++x;
+            TChar tens( ptr[x+1] );
+            TChar ones( ptr[x+2] );
+
+            newEapValue = KOldStyleMaxEapTypeValue;
+	        
+            if( tens.IsDigit() && ones.IsDigit() )
+                {
+                newEapValue = tens.GetNumericValue() * 10 + ones.GetNumericValue();	
+                }
+
+            if( addToList && ptr[x] == '0' && newEapValue < KOldStyleMaxEapTypeValue )
+                {
+                SEapExpandedType* const expandedEap = new (ELeave) SEapExpandedType();
+                CleanupStack::PushL( expandedEap );
+	        
+                expandedEap->EapExpandedType.Zero();
+
+                expandedEap->EapExpandedType.Append( 0xFE );
+
+                if ( newEapValue == 99 )
+                    {
+                    // Plain MSCHAPv2
+                    expandedEap->EapExpandedType.Append( 0xFF );
+                    expandedEap->EapExpandedType.Append( 0xFF );
+                    expandedEap->EapExpandedType.Append( 0xFF );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x1A );
+                    }
+                else
+                    {
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( 0x00 );
+                    expandedEap->EapExpandedType.Append( newEapValue );
+                    }
+	        
+                if ( enableEapType )
+                    {
+                    aEapsEnabled.AppendL( expandedEap );
+                    }
+                else
+                    {
+                    aEapsDisabled.AppendL( expandedEap );
+                    }
+	        
+                CleanupStack::Pop( expandedEap );
+                }
+                
+            x += 4;
+            }	        
+	    
+	    // Store new-style EAP list
+	    HBufC8* const DbDataEnabled = HBufC8::NewLC( aEapsEnabled.Count() * KExpandedEapTypeSize ); // 8 bytes per eap entry
+	    TPtr8 enabledPtr( DbDataEnabled->Des() );
+	    for ( TInt i = 0 ; i < aEapsEnabled.Count(); i++ )
+	        {
+			enabledPtr.Append( aEapsEnabled[i]->EapExpandedType );
+	        }
+	        
+	    HBufC8* const DbDataDisabled = HBufC8::NewLC( aEapsDisabled.Count() * KExpandedEapTypeSize ); // 8 bytes per eap entry
+	    TPtr8 disabledPtr( DbDataDisabled->Des() );
+	    for ( TInt i = 0 ; i < aEapsDisabled.Count(); i++ )
+	        {
+			disabledPtr.Append( aEapsDisabled[i]->EapExpandedType );
+	        }
+	    
+	    CMDBField<TDesC8>* const eapEnabledList = (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtEnabled );
+	    eapEnabledList->SetMaxLengthL( enabledPtr.Length() );
+	    eapEnabledList->SetL( enabledPtr );
+	    
+	    CMDBField<TDesC8>* const eapDisabledList = (CMDBField<TDesC8>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEapsExtDisabled );
+	    eapDisabledList->SetMaxLengthL( disabledPtr.Length() );
+	    eapDisabledList->SetL( disabledPtr );
+	    
+	    // Empty old-style EAP list
+	    CMDBField<TDesC>* const eapList = (CMDBField<TDesC>*) iWLANRecord->GetFieldByIdL( KCDTIdWlanEaps );
+	    eapList->SetMaxLengthL( 0 );
+	    
+	    iWLANRecord->ModifyL( *iDBSession );
+	    
+		CleanupStack::PopAndDestroy( DbDataDisabled );
+		CleanupStack::PopAndDestroy( DbDataEnabled );
+	    
+		CleanupStack::PopAndDestroy( eapData );
+    	}
+	
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetEapDataL end")));
+    }
+
+
+// ---------------------------------------------------------
+// TInt CWLanSettings::IsEasyWlan( TUint aServiceId, TBool &aEasyWlan)
+// Checks if wlan settings with given ServiceId is easywlan iap
+// returns KErrNone on success
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::IsEasyWlan( TUint aServiceId, TBool &aEasyWlan)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::IsEasyWlan %d"),aServiceId));
+    
+    aEasyWlan = EFalse;
+
+    TRAPD( err, CreateWLANServiceRecordL( aServiceId, EWlanServiceId));
+
+    if( !err)
+        {
+            CMDBField<TDesC>* ssid = NULL;
+            TRAP(err, ssid = static_cast<CMDBField<TDesC>*>(iWLANRecord->GetFieldByIdL(KCDTIdWlanSSID)));
+            if (err)
+                {
+            	return err;
+                }
+            
+            TPtrC pSsid;
+            TRAP(err, pSsid.Set(ssid->GetL()));
+            if (err)
+                {
+            	return err;
+                }
+            
+            if( pSsid.Length() == 0)
+                {
+                aEasyWlan = ETrue;
+                }
+                
+                
+        }
+    return err;
+    }
+
+// ----------------------------------------------------------
+// void CWLanSettings::GetIAPWlanServicesL( RArray<SWlanIAPId>& aServices)
+// Find all WLANServiceTable records which correspond to wlan IAPs 
+// returns ID's to both WLANServiceTable records and IAP records in aServices
+// ----------------------------------------------------------
+//
+
+EXPORT_C void CWLanSettings::GetIAPWlanServicesL( RArray<SWlanIAPId>& aServices)
+    {
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetIAPWlanServicesL start")));
+    
+    CMDBRecordSet<CCDIAPRecord>* iapRecSet = new (ELeave) CMDBRecordSet<CCDIAPRecord>(KCDTIdIAPRecord);
+    CleanupStack::PushL( iapRecSet);
+    
+    CCDIAPRecord* iapPrimer = static_cast<CCDIAPRecord*>
+                ( CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord));
+    CleanupStack::PushL( iapPrimer);
+
+    // prime record set for service type "LANService"
+    TPtrC servType( KCDTypeNameLANService);
+    iapPrimer->iServiceType.SetL( servType);
+    iapRecSet->iRecords.AppendL( iapPrimer);
+    
+    CleanupStack::Pop( ); // iapPrimer
+    iapPrimer = 0;
+    
+    TBool found( EFalse);
+
+    // get all iap records with service type "LANService"    
+    found = iapRecSet->FindL( *iDBSession);
+    
+    // find all such WLANServiceTable records that have a ServiceID that match some lanId
+    if( found)
+        {
+        TraceDump(WARNING_LEVEL, (_L("\tfound %d IAPs with LANService type"),iapRecSet->iRecords.Count()));
+        for( TInt i=0; i<iapRecSet->iRecords.Count(); i++)
+            {
+            TRAPD( error, CreateWLANServiceRecordL( (*iapRecSet)[i]->iService, EWlanServiceId));
+            
+            if( error == KErrNone)
+                {    // found a WLANServiceTable record with ServiceID that matches a LANService record id
+                SWlanIAPId id;
+                id.iWLANRecordId = iWLANRecord->RecordId();  // WLANServiceTable record ID (not the value of ServiceID of the found record)
+                id.iIAPId = (*iapRecSet)[i]->RecordId();    // IAP record id
+                User::LeaveIfError( aServices.Append( id)); 
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( ); // iapRecSet
+    TraceDump(WARNING_LEVEL,(_L("CWlanSettings::GetIAPWlanServicesL end")));
+    }
+
+// -----------------------------------------------------------------------------
+// CWLanSettings::GetSecondarySsidsForService
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWLanSettings::GetSecondarySsidsForService(
+	TUint32 aId,
+	RArray<TWlanSecondarySsid>& aSsids )
+	{
+	TraceDump( INFO_LEVEL, ( _L( "CWlanSettings::GetSecondarySsidsForService()" ) ) );
+
+	aSsids.Reset();
+
+    /**
+    * This is done using the old commdb interface because Symbian
+    * doesn't have a class definition for WLAN Secondary SSID table.
+    */
+    CCommsDatabase* db = NULL;
+    TRAPD( ret, db = CCommsDatabase::NewL() );
+    if ( ret != KErrNone )
+        {
+        TraceDump( ERROR_LEVEL,
+            ( _L( "CWlanSettings::GetSecondarySsidsForService() - unable to create CCommsDatabase" ) ) );
+
+        return ret;
+        }
+    
+    TraceDump(INFO_LEVEL,
+        ( _L( "CWlanSettings::GetSecondarySsidsForService() - searching for WLAN ID %u" ), aId ) );
+
+    CCommsDbTableView* table = NULL;
+    TRAP( ret, table = db->OpenViewMatchingUintLC(
+        TPtrC( WLAN_SECONDARY_SSID ),
+        TPtrC( WLAN_SEC_SSID_SERVICE_ID ),
+        aId ); CleanupStack::Pop( table ) );
+    if ( ret != KErrNone )
+        {
+        TraceDump( ERROR_LEVEL,
+            ( _L( "CWlanSettings::GetSecondarySsidsForService() - unable to create CCommsDbTableView" ) ) );
+        delete db;
+        
+        return ret;
+        }
+
+    ret = table->GotoFirstRecord();
+    while ( ret == KErrNone )
+        {
+        TWlanSecondarySsid entry;
+        TRAPD( err, table->ReadUintL( TPtrC( WLAN_SEC_SSID_ID ), entry.id ) );
+
+        if ( err == KErrNone )
+            {
+            TraceDump( INFO_LEVEL,
+                ( _L( "CWlanSettings::GetSecondarySsidsForService() - reading ID %u" ), entry.id ) );
+            
+            TRAP( err, table->ReadTextL( TPtrC( WLAN_SEC_SSID_SCANNED_SSID ), entry.ssid ) );
+            }
+
+        if ( err == KErrNone )
+            {
+            TRAP( err, table->ReadTextL( TPtrC( WLAN_SEC_SSID_USED_SSID ), entry.usedSsid ) );
+            }
+
+        if ( err == KErrNone )
+            {
+            TraceDump( ERROR_LEVEL,
+                ( _L( "CWlanSettings::GetSecondarySsidsForService() - appending entry" ) ) );
+            aSsids.Append( entry );
+            }
+        else
+            {
+            TraceDump( ERROR_LEVEL,
+                ( _L( "CWlanSettings::GetSecondarySsidsForService() - unable to read, discarding" ) ) );            
+            }
+        ret = table->GotoNextRecord();    
+        }
+
+    delete table;
+    delete db;
+	
+	return KErrNone;
+	}
+    
+// ---------------------------------------------------------
+// void CWLanSettings::CreateWLANServiceRecordL( TUint32 aId, TWlanRecIdType aType)
+// Fetches a WLANServiceTable record from CommsDat or creates a new record if
+// aId == KCDNewRecordRequest
+// if aType == EWlanRecordId, fetches record using record ID as criteria (can be LoadL'd)
+// if aType == EWlanServiceId, fetches record using service ID as criteria (must be FindL'd)
+// on success, iWLANRecord points to the fetched or created record
+// on failure, iWLANRecord remains NULL
+// ---------------------------------------------------------
+//
+void CWLanSettings::CreateWLANServiceRecordL( TUint32 aId, TWlanRecIdType aType)
+    {
+    if( iWLANRecord)
+        {
+        delete iWLANRecord;
+        iWLANRecord = NULL;
+        }
+
+    if ( aType == EWlanIapId )
+        {
+        /**
+         * Load the IAP record and get the service ID that should point
+         * to the WLAN service table.
+         */        
+        CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord *>
+            ( CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CleanupStack::PushL( iapRecord );
+
+        TraceDump( INFO_LEVEL,
+            ( _L( "CWlanSettings::CreateWLANServiceRecordL() - searching for IAP ID %u"  ), aId ) );
+
+        iapRecord->SetRecordId( aId );
+        TRAPD( ret, iapRecord->LoadL( *iDBSession ) );
+        if ( ret !=  KErrNone )
+            {
+            TraceDump( ERROR_LEVEL,
+                ( _L( "CWlanSettings::CreateWLANServiceRecordL() - LoadL leaved with %d"  ), ret ) );
+
+            User::Leave( ret );
+            }
+
+        if ( TPtrC( iapRecord->iServiceType ) != TPtrC( KCDTypeNameLANService ) ||
+             TPtrC( iapRecord->iBearerType ) != TPtrC( KCDTypeNameLANBearer ) )
+            {
+            TraceDump( ERROR_LEVEL,
+                ( _L( "CWlanSettings::CreateWLANServiceRecordL() - IAP doesn't point to LANService table" ) ) );
+
+            User::Leave( KErrNotFound );
+            }
+        aId = iapRecord->iService;
+
+        TraceDump( INFO_LEVEL,
+            ( _L( "CWlanSettings::CreateWLANServiceRecordL() - WLAN ServiceID is %u"  ), aId ) );
+
+        CleanupStack::PopAndDestroy( iapRecord );
+        }
+
+    CMDBGenericRecord* const genRec = static_cast<CMDBGenericRecord*> ( CCDRecordBase::RecordFactoryL( 0 ) );
+    CleanupStack::PushL( genRec );
+
+    genRec->InitializeL( KGenericTable(),NULL);
+    
+    if( aType == EWlanRecordId)
+        {
+        genRec->SetRecordId( aId);
+        genRec->LoadL( *iDBSession);
+        }
+    else // EWlanServiceId
+        {
+        genRec->LoadL( *iDBSession);
+        
+        CMDBField<TUint32>* sidField = static_cast<CMDBField<TUint32>*>
+                                        (genRec->GetFieldByIdL( KCDTIdWlanServiceId));
+            // prime with service id                
+        *sidField = aId;
+        
+        TBool found = genRec->FindL( *iDBSession);
+        
+        if( !found)
+            {
+            User::Leave( KErrNotFound);
+            }
+
+        }
+
+    CleanupStack::Pop(); //genRec
+    iWLANRecord = genRec;
+    }
+
+//
+// L-methods called and trapped by the public non-leaving methods
+//
+
+// ---------------------------------------------------------
+// void CWLanSettings::DoConnectL()
+// Connects to the CommsDat storage server
+// ---------------------------------------------------------
+//
+void CWLanSettings::DoConnectL()
+    {
+    TraceDump(ERROR_LEVEL,(_L("CWlanSettings::DoConnectL")));    
+    
+    if( !iDBSession)
+        {
+        iDBSession = CMDBSession::NewL( KCDCurrentVersion);
+        }
+    
+    }
+