cmmanager/cmmgr/cmmpluginbase/src/ccmpluginbaseeng.cpp
branchRCL_3
changeset 24 05bc53fe583b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cmmgr/cmmpluginbase/src/ccmpluginbaseeng.cpp	Tue Aug 31 15:35:44 2010 +0300
@@ -0,0 +1,3121 @@
+/*
+* Copyright (c) 2009-2010 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:
+*        Implementation of plugin base class
+*
+*/
+
+
+#include <datamobilitycommsdattypes.h>
+#include <cmpluginbaseeng.h>
+#include <cmpsettingsconsts.h>
+#include <featmgr.h>
+#include <cmpluginembdestinationdef.h>
+
+#include "cmmserverdefs.h"
+#include "ccmpluginbaseengtextresolver.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ccmpluginbaseengTraces.h"
+#endif
+
+
+using namespace CMManager;
+using namespace CommsDat;
+
+const TInt KApMaxConnNameLength = 50;
+_LIT( KFormatPostfix, "%02d" );
+_LIT( KFormatLargePostfix, "%d" );
+_LIT( KFormatNameWithPostfix, "%S(%S)" );
+_LIT( KFormatNoPostfix, "%S" );
+const TInt KMaxPostfixLength = 5;
+
+_LIT( KDefWapGatewayIpAddress, "0.0.0.0" );
+
+_LIT( KLocationName, "Mobile" );
+
+_LIT( KDefaultIapName, "Connection Method" );
+
+
+EXPORT_C CCmClientPluginInstance* CCmClientPluginInstance::NewLC()
+    {
+    OstTraceFunctionEntry0( CCMCLIENTPLUGININSTANCE_NEWLC_ENTRY );
+
+    CCmClientPluginInstance* self = new( ELeave ) CCmClientPluginInstance();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    OstTraceFunctionExit0( CCMCLIENTPLUGININSTANCE_NEWLC_EXIT );
+    return self;
+    }
+
+EXPORT_C CCmClientPluginInstance* CCmClientPluginInstance::NewL()
+    {
+    OstTraceFunctionEntry0( CCMCLIENTPLUGININSTANCE_NEWL_ENTRY );
+
+    CCmClientPluginInstance* self = CCmClientPluginInstance::NewLC();
+    CleanupStack::Pop( self );
+
+    OstTraceFunctionExit0( CCMCLIENTPLUGININSTANCE_NEWL_EXIT );
+    return self;
+    }
+
+CCmClientPluginInstance::CCmClientPluginInstance()
+        :
+        iNamingMethod( ENamingUnique ),
+        iLocationEnabled( EFalse ),
+        iIapId( 0 )
+    {
+    }
+
+EXPORT_C CCmClientPluginInstance::~CCmClientPluginInstance()
+    {
+    OstTraceFunctionEntry0( CCMCLIENTPLUGININSTANCE_CCMCLIENTPLUGININSTANCE_ENTRY );
+
+    iGenRecordArray.ResetAndDestroy();
+    iBearerSpecRecordArray.ResetAndDestroy();
+
+    OstTraceFunctionExit0( CCMCLIENTPLUGININSTANCE_CCMCLIENTPLUGININSTANCE_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// Second phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CCmClientPluginInstance::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// TCmPluginInitParam::TCmPluginInitParam
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TCmPluginInitParam::TCmPluginInitParam( CommsDat::CMDBSession& aSession )
+        :
+        iSessionRef( aSession )
+    {
+    OstTraceFunctionEntry0( TCMPLUGININITPARAM_TCMPLUGININITPARAM_ENTRY );
+
+    iNotused1 = NULL;
+    iNotused2 = NULL;
+
+    OstTraceFunctionExit0( TCMPLUGININITPARAM_TCMPLUGININITPARAM_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CCmPluginBaseEng
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmPluginBaseEng::CCmPluginBaseEng( TCmPluginInitParam *aInitParam )
+        :
+        iSession( aInitParam->iSessionRef ),
+        iNamingMethod( ENamingUnique )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CCMPLUGINBASEENG_ENTRY );
+
+    iDtor_ID_Key.iUid = 0;
+    iBearerType = 0;
+
+    iIapRecord = NULL;
+    iProxyRecord = NULL;
+    iServiceRecord = NULL;
+    iNetworkRecord = NULL;
+    iLocationRecord = NULL;
+    iWapAPRecord = NULL;
+    iWapIPBearerRecord = NULL;
+    iMetaDataRecord = NULL;
+
+    iCmId = 0;
+    iMetadataTableId = 0;
+    iLocationEnabled = EFalse;
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_CCMPLUGINBASEENG_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::~CCmPluginBaseEng
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmPluginBaseEng::~CCmPluginBaseEng()
+    {
+    OstTraceFunctionEntry0( DUP1_CCMPLUGINBASEENG_CCMPLUGINBASEENG_ENTRY );
+
+    iCmId = 0;
+    delete iIapRecord; iIapRecord = NULL;
+    delete iProxyRecord; iProxyRecord = NULL;
+    delete iServiceRecord; iServiceRecord = NULL;
+    delete iNetworkRecord; iNetworkRecord = NULL;
+    delete iLocationRecord; iLocationRecord = NULL;
+    delete iWapAPRecord; iWapAPRecord = NULL;
+    delete iWapIPBearerRecord; iWapIPBearerRecord = NULL;
+    delete iMetaDataRecord; iMetaDataRecord = NULL;
+
+    iLocationEnabled = EFalse;
+
+    REComSession::DestroyedImplementation( iDtor_ID_Key );
+
+    OstTraceFunctionExit0( DUP1_CCMPLUGINBASEENG_CCMPLUGINBASEENG_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::ConstructL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::ConstructL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CONSTRUCTL_ENTRY );
+
+    TRAPD( err, iMetadataTableId = CCDIAPMetadataRecord::TableIdL( iSession ) );
+    if ( err )
+        {
+        if ( err == KErrNotFound )
+            {
+            iMetadataTableId = CCDIAPMetadataRecord::CreateTableL( iSession );
+            }
+        else
+            {
+            User::LeaveIfError( err );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_CONSTRUCTL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::UpdateL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATEL_ENTRY );
+
+    PrepareToUpdateRecordsL( aClientPluginInstance );
+
+    UpdateServiceRecordL( aClientPluginInstance );
+    UpdateLocationRecordL( aClientPluginInstance );
+    UpdateNetworkRecordL( aClientPluginInstance );
+    UpdateIAPRecordL( aClientPluginInstance );
+    UpdateWapRecordL( aClientPluginInstance );
+    UpdateProxyRecordL( aClientPluginInstance );
+    UpdateMetadataRecordL( aClientPluginInstance );
+    UpdateConnPrefSettingL();
+
+    UpdateBearerRecordsL(
+            aClientPluginInstance->iGenRecordArray,
+            aClientPluginInstance->iBearerSpecRecordArray );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// Delete this connection methond.
+// Record ids are checked to be sure that we delete only records
+// that were loaded before.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::DeleteL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_DELETEL_ENTRY );
+
+    PrepareToDeleteRecordsL();
+
+    if ( iIapRecord && iIapRecord->RecordId() )
+        {
+        iIapRecord->DeleteL( iSession );
+        }
+
+    if ( iProxyRecord && iProxyRecord->RecordId() )
+        {
+        iProxyRecord->DeleteL( iSession );
+        }
+
+    if ( iServiceRecord && iServiceRecord->RecordId() )
+        {
+        iServiceRecord->DeleteL( iSession );
+        }
+
+    if ( iNetworkRecord && iNetworkRecord->RecordId() )
+        {
+        iNetworkRecord->DeleteL( iSession );
+        }
+
+    if ( iLocationRecord && iLocationRecord->RecordId() )
+        {
+        iLocationRecord->DeleteL( iSession );
+        }
+
+    if ( iWapAPRecord && iWapAPRecord->RecordId() )
+        {
+        iWapAPRecord->DeleteL( iSession );
+        }
+
+    if ( iWapIPBearerRecord && iWapIPBearerRecord->RecordId() )
+        {
+        iWapIPBearerRecord->DeleteL( iSession );
+        }
+
+    if ( iMetaDataRecord && iMetaDataRecord->RecordId() )
+        {
+        iMetaDataRecord->DeleteL( iSession );
+        }
+
+    DeleteBearerRecordsL();
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_DELETEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::ReLoad
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::ReLoadL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_RELOAD_ENTRY );
+
+    delete iIapRecord; iIapRecord = NULL;
+    delete iProxyRecord; iProxyRecord = NULL;
+    delete iServiceRecord; iServiceRecord = NULL;
+    delete iNetworkRecord; iNetworkRecord = NULL;
+    delete iLocationRecord; iLocationRecord = NULL;
+    delete iWapAPRecord; iWapAPRecord = NULL;
+    delete iWapIPBearerRecord; iWapIPBearerRecord = NULL;
+    delete iMetaDataRecord; iMetaDataRecord = NULL;
+
+    iLocationEnabled = EFalse;
+
+    ResetBearerRecords();
+
+    LoadL( iCmId );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_RELOAD_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::LoadL( TUint32 aIapId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADL_ENTRY );
+
+    // Embedded destination must be handled separately first.
+    if ( aIapId > KCmDefaultDestinationAPTagId )
+        {
+        iCmId = aIapId;
+        return;
+        }
+
+    DoLoadL( aIapId );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CreateNewL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::CreateNewL( TUint32 aCmId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CREATENEWL_ENTRY );
+
+    if ( iCmId )
+        // we already have IAP id ->
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+
+    // Optional record, disabled by default.
+    iLocationEnabled = EFalse;
+
+    // Create mandatory records.
+    iIapRecord = static_cast<CCDIAPRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+    iNetworkRecord = static_cast<CCDNetworkRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+    iProxyRecord = static_cast<CCDProxiesRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+    NewWapRecordL();
+    iWapIPBearerRecord->iWAPGatewayAddress.SetL( KDefWapGatewayIpAddress );
+
+    iMetaDataRecord = NewMetadataRecordL( ETrue );
+
+    // Call plugin to create its own records.
+    CreateServiceRecordL();
+
+    // Update iaprecord servicetype name.
+    HBufC* servicetypeName( NULL );
+    ServiceRecordNameLC( servicetypeName );
+    iIapRecord->iServiceType.SetL( *servicetypeName );
+    CleanupStack::PopAndDestroy( servicetypeName );
+
+    // Update iaprecord bearertype name.
+    HBufC* bearerTypeName( NULL );
+    BearerRecordNameLC( bearerTypeName );
+    iIapRecord->iBearerType.SetL( *bearerTypeName );
+    CleanupStack::PopAndDestroy( bearerTypeName );
+
+    CreateBearerRecordsL();
+
+    EnableProxyL( EFalse );
+
+    _LIT( KDefaultConnNameTextId, "txt_occ_setlabel_connection_name_val_connection" );
+    HBufC* resolvedText( NULL );
+    resolvedText = CCmPluginBaseEngTextResolver::ResolveTextL( KDefaultConnNameTextId );
+    if ( resolvedText )
+        {
+        SetDefaultNameL( *resolvedText );
+        }
+    else
+        {
+        SetDefaultNameL( KDefaultIapName );
+        }
+
+    delete resolvedText;
+    resolvedText = NULL;
+
+    iIapRecord->iNetworkWeighting = 0; // it's always 0.
+
+    if ( aCmId != 0 )
+        {
+        iIapRecord->SetRecordId( aCmId );
+        iCmId = 0;
+        }
+    else
+        {
+        iIapRecord->SetRecordId( KCDNewRecordRequest );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_CREATENEWL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CreateCopyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCmPluginBaseEng* CCmPluginBaseEng::CreateCopyL(
+        CCmClientPluginInstance* /*aClientPluginInstance*/ )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CREATECOPYL_ENTRY );
+
+    TCmPluginInitParam params( iSession );
+    CCmPluginBaseEng* copyInst = CreateInstanceL( params );
+    CleanupStack::PushL( copyInst );
+
+    PrepareToCopyDataL( copyInst );
+    CopyDataL( copyInst );
+    CleanupStack::Pop( copyInst );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_CREATECOPYL_EXIT );
+    return copyInst;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::GetGenericTableIdsToBeObserved
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::GetGenericTableIdsToBeObservedL(
+        RArray<TUint32>& aTableIdArray ) const
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETGENERICTABLEIDSTOBEOBSERVED_ENTRY );
+
+    // Service and bearer records should be added by plugins.
+    aTableIdArray.AppendL( KCDTIdIAPRecord );
+    aTableIdArray.AppendL( KCDTIdWAPAccessPointRecord );
+    aTableIdArray.AppendL( KCDTIdWAPIPBearerRecord );
+    aTableIdArray.AppendL( KCDTIdProxiesRecord );
+    aTableIdArray.AppendL( iMetadataTableId );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETGENERICTABLEIDSTOBEOBSERVED_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CopyDataL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::CopyDataL( CCmPluginBaseEng* aCopyInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYDATAL_ENTRY );
+
+    aCopyInstance->iLocationEnabled = iLocationEnabled;
+    aCopyInstance->iNamingMethod = iNamingMethod;
+    CopyRecordsL( aCopyInstance );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYDATAL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CopyRecordsL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::CopyRecordsL( CCmPluginBaseEng* aCopyInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYRECORDSL_ENTRY );
+
+    CopyRecordDataL( KIapRecordIndex, aCopyInstance );
+
+    // Ensure that IAP's name is set by the rules (Naming Method).
+    SetNameL(
+            iIapRecord->iRecordName.GetL(),
+            aCopyInstance->iIapRecord,
+            aCopyInstance->iNamingMethod );
+
+    CopyRecordDataL( KServiceRecordIndex, aCopyInstance );
+    CopyRecordDataL( KNetworkRecordIndex, aCopyInstance );
+    CopyRecordDataL( KWAPAPRecordIndex, aCopyInstance );
+    CopyRecordDataL( KWAPBearerRecordIndex, aCopyInstance );
+    CopyRecordDataL( KMetaDataRecordIndex, aCopyInstance );
+    CopyRecordDataL( KProxyRecordIndex, aCopyInstance );
+
+    CopyBearerRecordsL( aCopyInstance );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYRECORDSL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CopyRecordDataL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::CopyRecordDataL(
+        TUint32 aRecordIdentifier,
+        CCmPluginBaseEng* aCopyInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYRECORDDATAL_ENTRY );
+
+    switch ( aRecordIdentifier )
+        {
+        case KIapRecordIndex:
+            {
+            aCopyInstance->iIapRecord = static_cast<CCDIAPRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+            CopyRecordFieldsL( *iIapRecord, *aCopyInstance->iIapRecord );
+            }
+            break;
+        case KServiceRecordIndex:
+            {
+            aCopyInstance->iServiceRecord = CopyServiceRecordL();
+            // The name of the service record copy is changed during update
+            // process, in PrepareToUpdateRecordsL()-method.
+            }
+            break;
+        case KNetworkRecordIndex:
+            {
+            aCopyInstance->iNetworkRecord = static_cast<CCDNetworkRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+            CopyRecordFieldsL( *iNetworkRecord, *aCopyInstance->iNetworkRecord );
+            }
+            break;
+        case KWAPAPRecordIndex:
+            {
+            aCopyInstance->iWapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+            CopyRecordFieldsL( *iWapAPRecord, *aCopyInstance->iWapAPRecord );
+            }
+            break;
+        case KWAPBearerRecordIndex:
+            {
+            aCopyInstance->iWapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+            CopyRecordFieldsL( *iWapIPBearerRecord, *aCopyInstance->iWapIPBearerRecord );
+            }
+            break;
+        case KMetaDataRecordIndex:
+            {
+            aCopyInstance->iMetaDataRecord = new( ELeave ) CCDIAPMetadataRecord( 
+                    iMetadataTableId );
+            CopyRecordFieldsL( *iMetaDataRecord, *aCopyInstance->iMetaDataRecord );
+            }
+            break;
+        case KProxyRecordIndex:
+            {
+            if ( iProxyRecord )
+                {
+                aCopyInstance->iProxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+                CopyRecordFieldsL( *iProxyRecord, *aCopyInstance->iProxyRecord );
+                }
+            }
+            break;
+        default:
+            {
+            User::Leave( KErrArgument );
+            }
+            break;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYRECORDDATAL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// Copies the values and attributes of all fields from aSource-record into
+// aDestination record. Does not copy the record element ID. Also, does not
+// touch any field in aDestination-record that is NULL in aSource-record.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::CopyRecordFieldsL(
+        CommsDat::CMDBRecordBase& aSource,
+        CommsDat::CMDBRecordBase& aDestination )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYRECORDFIELDSL_ENTRY );
+
+    const SRecordTypeInfo* recordInfo = aSource.GetRecordInfo();
+    if ( !recordInfo )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    CMDBElement* ptrSource( NULL );
+    CMDBElement* ptrDest( NULL );
+
+    while ( recordInfo && recordInfo->iTypeId != 0 )
+        {
+        ptrSource = aSource.GetFieldByIdL( recordInfo->iTypeId );
+        ptrDest = aDestination.GetFieldByIdL( recordInfo->iTypeId );
+
+        if ( !( ptrSource->IsNull() ) )
+            {
+            // Make sure we see only basic type info. Masks out any additional info
+            // on links (CommsDat internal stuff).
+            switch ( recordInfo->iValType & 0x000000ff )
+                {
+                case CommsDat::EInt:
+                case CommsDat::EBool:
+                    {
+                    static_cast<CMDBField<TInt>&>( *ptrDest ).SetL(
+                            static_cast<CMDBField<TInt>&>( *ptrSource ) );
+                    }
+                    break;
+                case CommsDat::EUint32:
+                case CommsDat::ELink:
+                    {
+                    static_cast<CMDBField<TUint32>&>( *ptrDest ).SetL(
+                            static_cast<CMDBField<TUint32>&>( *ptrSource ) );
+                    }
+                    break;
+                case CommsDat::EDesC8:
+                    {
+                    static_cast<CMDBField<TDesC8>&>( *ptrDest ).SetL(
+                            static_cast<CMDBField<TDesC8>&>( *ptrSource ) );
+                    }
+                    break;
+                case CommsDat::EText:
+                case CommsDat::EMedText:
+                case CommsDat::ELongText:
+                    {
+                    static_cast<CMDBField<TDesC>&>( *ptrDest ).SetL(
+                            static_cast<CMDBField<TDesC>&>( *ptrSource ) );
+                    }
+                    break;
+                default:
+                    {
+                    User::Leave( KErrCorrupt );
+                    }
+                    break;
+                }
+            ptrDest->ClearAttributes( ptrDest->Attributes() );
+            ptrDest->SetAttributes( ptrSource->Attributes() );
+            }
+        recordInfo++;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYRECORDFIELDSL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::DoLoadL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::DoLoadL( TUint32 aIapId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_DOLOADL_ENTRY );
+
+    PrepareToLoadRecordsL();
+
+    LoadIAPRecordL( aIapId );
+    LoadWapRecordL();
+    LoadMetadataRecordL();
+    LoadNetworkRecordL();
+
+    LoadServiceRecordL();
+    LoadProxyRecordL();
+
+    LoadBearerRecordsL();
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_DOLOADL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::PrepareToLoadRecordsL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::PrepareToLoadRecordsL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_PREPARETOLOADRECORDSL_ENTRY );
+
+    iLocationEnabled = EFalse;
+    PreparePluginToLoadRecordsL();
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_PREPARETOLOADRECORDSL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadIAPRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadIAPRecordL( TUint32 aIapId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADIAPRECORDL_ENTRY );
+
+    iCmId = aIapId;
+
+    // Load IAP record.
+    CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+
+    CleanupStack::PushL( iapRecord );
+
+    iapRecord->SetRecordId( iCmId );
+    iapRecord->LoadL( iSession );
+
+    CleanupStack::Pop( iapRecord );
+    iIapRecord = iapRecord;
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADIAPRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadProxySettingL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadProxyRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADPROXYSETTINGL_ENTRY );
+
+    // Load Proxy record.
+    CMDBRecordSet<CCDProxiesRecord>* proxieRS =
+            new( ELeave ) CMDBRecordSet<CCDProxiesRecord>( KCDTIdProxiesRecord );
+    CleanupStack::PushL(proxieRS);
+
+    // Now try to find the linked proxy record.
+    // Create new record.
+    CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+    CleanupStack::PushL( proxyRecord );
+
+    // Prime record.
+    TPtrC serviceType( iIapRecord->iServiceType );
+    proxyRecord->iServiceType.SetL( serviceType );
+    proxieRS->iRecords.AppendL( proxyRecord ); // Ownership transfered.
+
+    CleanupStack::Pop( proxyRecord );
+    proxyRecord = NULL;
+
+    if ( proxieRS->FindL(iSession) )
+        {
+        TInt i( 0 );
+        while ( i < proxieRS->iRecords.Count() )
+            // Now that we have a list of services with the proper service type
+            // search for our proxy record and remove it from the array,
+            // then destroy the array.
+            {
+            CCDProxiesRecord* proxyRecord = (*proxieRS)[i];
+
+            // Compare the record id of these 2 services.
+            if ( TUint32( proxyRecord->iService ) == TUint32( iIapRecord->iService ) )
+                {
+                iProxyRecord = proxyRecord;
+                // Take ownership of this record.
+                proxieRS->iRecords.Remove( i );
+                break;
+                }
+            ++i;
+            }
+        }
+
+    proxieRS->iRecords.ResetAndDestroy();
+
+    if ( !iProxyRecord )
+        {
+        // This creates a proxy record, where usage is disabled.
+        EnableProxyL( EFalse );
+        }
+
+    CleanupStack::PopAndDestroy( proxieRS );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADPROXYSETTINGL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadNetworkSettingL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadNetworkRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADNETWORKSETTINGL_ENTRY );
+
+    CCDNetworkRecord* networkRecord = static_cast<CCDNetworkRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+    CleanupStack::PushL( networkRecord );
+
+    networkRecord->SetRecordId( iIapRecord->iNetwork );
+    TRAPD( err, networkRecord->LoadL( iSession ) );
+    if ( err == KErrNotFound )
+        {
+        CleanupStack::PopAndDestroy( networkRecord );
+
+        networkRecord = static_cast<CCDNetworkRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+        }
+    else
+        // KErrNotFound -> doesn't matter. We will do it UpdateL()
+        {
+        User::LeaveIfError( err );
+
+        CleanupStack::Pop( networkRecord );
+        }
+
+    iNetworkRecord = networkRecord;
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADNETWORKSETTINGL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadLocationSettingL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadLocationRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADLOCATIONSETTINGL_ENTRY );
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADLOCATIONSETTINGL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::PrepareToUpdateRecordsL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::PrepareToUpdateRecordsL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_PREPARETOUPDATERECORDSL_ENTRY );
+
+    //TODO, Add null checks for mandatory generic record pointers.
+    //
+
+    // Set the record attributes to bearer specific records.
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    for ( TInt i = 0; i < aClientPluginInstance->iBearerSpecRecordArray.Count(); i++ )
+        {
+        CCDRecordBase* record = static_cast<CCDRecordBase*>(
+                aClientPluginInstance->iBearerSpecRecordArray[i] );
+
+        CopyAttributes( iapRecord, record );
+        }
+
+    PreparePluginToUpdateRecordsL(
+            aClientPluginInstance->iGenRecordArray,
+            aClientPluginInstance->iBearerSpecRecordArray );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_PREPARETOUPDATERECORDSL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateIAPRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateIAPRecordL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATEIAPRECORDL_ENTRY );
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    if ( iCmId == 0 )
+        {
+        // Otherwise predefined iapid.
+        if ( !iIapRecord->RecordId() )
+            {
+            iIapRecord->SetRecordId( KCDNewRecordRequest );
+            }
+
+        TUint32 id( 0 );
+        id = ServiceRecordId();
+        iIapRecord->iService = id;
+
+        HBufC* name( NULL );
+        ServiceRecordNameLC( name );
+        iIapRecord->iServiceType.SetL( *name );
+        CleanupStack::PopAndDestroy( name );
+
+        BearerRecordIdL( id );
+        iIapRecord->iBearer = id;
+        BearerRecordNameLC( name );
+        iIapRecord->iBearerType.SetL( *name );
+        CleanupStack::PopAndDestroy( name );
+
+        iIapRecord->iNetwork = iNetworkRecord->RecordId();
+
+        iIapRecord->iLocation = GetLocationIdL();
+
+        CopyAttributes( iapRecord, iIapRecord );
+        CheckIfNameModifiedL( iapRecord, iIapRecord );
+
+        iIapRecord->StoreL( iSession );
+        // Have to be "reloaded" to get possible default values 
+        // from template records.
+        iIapRecord->LoadL( iSession );
+
+        iCmId = iIapRecord->RecordId();
+        aClientPluginInstance->iIapId = iCmId;
+
+        CCDIAPRecord* tempIapRecord = static_cast<CCDIAPRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CleanupStack::PushL( tempIapRecord );
+        CopyRecordFieldsL( *iIapRecord, *tempIapRecord );
+        tempIapRecord->SetElementId( iIapRecord->ElementId() );
+
+        aClientPluginInstance->iGenRecordArray.Remove( KIapRecordIndex );
+        delete iapRecord;
+        iapRecord = NULL;
+
+        aClientPluginInstance->iGenRecordArray.InsertL(
+                static_cast<CommsDat::CCDRecordBase*>( tempIapRecord ),
+                KIapRecordIndex );
+
+        CleanupStack::Pop( tempIapRecord );
+        }
+    else
+        {
+        delete iIapRecord;
+        iIapRecord = NULL;
+        iIapRecord = static_cast<CCDIAPRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CopyRecordFieldsL( *iapRecord, *iIapRecord );
+
+        iIapRecord->SetElementId( iapRecord->ElementId() );
+        iIapRecord->ModifyL( iSession );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATEIAPRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateProxyRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateProxyRecordL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATEPROXYRECORDL_ENTRY );
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+            aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+
+    if ( !iapRecord || !proxyRecord )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    CopyAttributes( iapRecord, proxyRecord );
+    CheckIfNameModifiedL( iapRecord, proxyRecord );
+
+    delete iProxyRecord;
+    iProxyRecord = NULL;
+    iProxyRecord = static_cast<CCDProxiesRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+    CopyRecordFieldsL( *proxyRecord, *iProxyRecord );
+    iProxyRecord->SetElementId( proxyRecord->ElementId() );
+
+    if ( !iProxyRecord->RecordId() )
+        {
+        // New proxy setting -> create new record.
+        iProxyRecord->iService = iServiceRecord->RecordId();
+        iProxyRecord->iServiceType.SetL( iIapRecord->iServiceType );
+
+        // By default protocol is set to "http".
+        if ( TPtrC( proxyRecord->iProtocolName ).Length() == 0 )
+            {
+            iProxyRecord->iProtocolName.SetL( KDefProxyProtocolName );
+            }
+
+        iProxyRecord->SetRecordId( KCDNewRecordRequest );
+        iProxyRecord->StoreL( iSession );
+        // Have to be "reloaded" to get possible default values from template records.
+        iProxyRecord->LoadL( iSession );
+
+        proxyRecord->SetElementId( iProxyRecord->ElementId() );
+        }
+    else
+        // Already existing record -> update only.
+        {
+        iProxyRecord->ModifyL( iSession );
+        }
+    CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATEPROXYRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateMetadataRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateMetadataRecordL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATEMETADATARECORDL_ENTRY );
+
+    CCDIAPRecord* clientIapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    CCDIAPMetadataRecord* clientMetadataRecord = static_cast<CCDIAPMetadataRecord*>(
+            aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+
+    // Adjust client side metadata record attributes and name if needed.
+    CopyAttributes( clientIapRecord, clientMetadataRecord );
+    CheckIfNameModifiedL( clientIapRecord, clientMetadataRecord );
+
+    // Make a copy of client's metadata record and save to database.
+    delete iMetaDataRecord;
+    iMetaDataRecord = NULL;
+    iMetaDataRecord = new( ELeave ) CCDIAPMetadataRecord( iMetadataTableId );
+
+    CopyRecordFieldsL( *clientMetadataRecord, *iMetaDataRecord );
+
+    iMetaDataRecord->SetElementId( clientMetadataRecord->ElementId() );
+
+    if ( !iMetaDataRecord->RecordId() )
+        {
+        iMetaDataRecord->iIAP = IAPRecordElementId();
+        iMetaDataRecord->SetRecordId( KCDNewRecordRequest );
+        iMetaDataRecord->StoreL( iSession );
+        // Have to be "reloaded" to get possible default values from template records.
+        iMetaDataRecord->LoadL( iSession );
+
+        clientMetadataRecord->SetElementId( iMetaDataRecord->ElementId() );
+        }
+    else
+        {
+        iMetaDataRecord->ModifyL( iSession );
+        }
+    CopyRecordFieldsL( *iMetaDataRecord, *clientMetadataRecord );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATEMETADATARECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateServiceRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateServiceRecordL(
+    CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATESERVICERECORDL_ENTRY );
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    CCDRecordBase* serviceRecord = static_cast<CCDRecordBase*>(
+            aClientPluginInstance->iGenRecordArray[KServiceRecordIndex] );
+
+    CopyAttributes( iapRecord, serviceRecord );
+
+    UpdateServiceRecordL(
+            aClientPluginInstance->iGenRecordArray,
+            aClientPluginInstance->iBearerSpecRecordArray );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATESERVICERECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateNetworkRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateNetworkRecordL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATENETWORKRECORDL_ENTRY );
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    CCDNetworkRecord* networkRecord = static_cast<CCDNetworkRecord*>(
+            aClientPluginInstance->iGenRecordArray[KNetworkRecordIndex] );
+
+    CopyAttributes( iapRecord, networkRecord );
+
+    delete iNetworkRecord;
+    iNetworkRecord = NULL;
+
+    CheckIfNameModifiedL( iapRecord, networkRecord );
+
+    iNetworkRecord = static_cast<CCDNetworkRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+    CopyRecordFieldsL( *networkRecord, *iNetworkRecord );
+
+    iNetworkRecord->SetElementId( networkRecord->ElementId() );
+
+    if ( !iNetworkRecord->RecordId() )
+        {
+        iNetworkRecord->SetRecordId( KCDNewRecordRequest );
+        iNetworkRecord->StoreL( iSession );
+        // Have to be "reloaded" to get possible default values from template records.
+        iNetworkRecord->LoadL( iSession );
+
+        networkRecord->SetElementId( iNetworkRecord->ElementId() );
+        }
+    else
+        {
+        iNetworkRecord->ModifyL( iSession );
+        }
+    CopyRecordFieldsL( *iNetworkRecord, *networkRecord );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATENETWORKRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateLocationRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateLocationRecordL(
+        CCmClientPluginInstance* /*aClientPluginInstance*/ )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATELOCATIONRECORDL_ENTRY );
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATELOCATIONRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateConnPrefSettingL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateConnPrefSettingL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATECONNPREFSETTINGL_ENTRY );
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATECONNPREFSETTINGL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::EnableProxyL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::EnableProxyL( TBool aEnable )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ENABLEPROXYL_ENTRY );
+
+    if ( !iServiceRecord )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    if ( !iProxyRecord )
+        {
+        iProxyRecord = static_cast<CCDProxiesRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+        }
+
+    iProxyRecord->iUseProxyServer = aEnable;
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_ENABLEPROXYL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::EnableLocationL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::EnableLocationL( TBool aEnable )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ENABLELOCATIONL_ENTRY );
+
+    // Not supported anymore
+    iLocationEnabled = aEnable;
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_ENABLELOCATIONL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadWapRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadWapRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADWAPRECORDL_ENTRY );
+
+    iWapIPBearerRecord = FindWAPRecordL();
+    if ( iWapIPBearerRecord )
+        {
+        CCDWAPAccessPointRecord *wapApRecord = static_cast<CCDWAPAccessPointRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+
+        CleanupStack::PushL( wapApRecord );
+
+        wapApRecord->SetRecordId( iWapIPBearerRecord->iWAPAccessPointId );
+        TRAPD( err, wapApRecord->LoadL( iSession ) );
+        if ( err == KErrNotFound )
+            {
+            CleanupStack::PopAndDestroy( wapApRecord );
+
+            wapApRecord = static_cast<CCDWAPAccessPointRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+            }
+        else
+            {
+            User::LeaveIfError( err );
+
+            CleanupStack::Pop( wapApRecord );
+            }
+
+        iWapAPRecord = wapApRecord;
+        }
+    else
+        // No WAP record found -> create a new one
+        {
+        NewWapRecordL();
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADWAPRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::LoadMetadataRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::LoadMetadataRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADSEAMLESSNESSRECORDL_ENTRY );
+
+    iMetaDataRecord = FindMetadataRecordL();
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADSEAMLESSNESSRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::UpdateWapRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::UpdateWapRecordL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_UPDATEWAPRECORDL_ENTRY );
+
+    delete iWapAPRecord;
+    iWapAPRecord = NULL;
+
+    delete iWapIPBearerRecord;
+    iWapIPBearerRecord = NULL;
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    CCDWAPAccessPointRecord* wapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+            aClientPluginInstance->iGenRecordArray[KWAPAPRecordIndex] );
+
+    CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+            aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+    CopyAttributes( iapRecord, wapAPRecord );
+    CopyAttributes( iapRecord, wapIPBearerRecord );
+
+    CheckIfNameModifiedL( iapRecord, wapAPRecord );
+    CheckIfNameModifiedL( iapRecord, wapIPBearerRecord );
+
+    // WAP AP record
+    iWapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+    CopyRecordFieldsL( *wapAPRecord, *iWapAPRecord );
+    iWapAPRecord->SetElementId( wapAPRecord->ElementId() );
+
+    // WAP IP Bearer record
+    iWapIPBearerRecord =static_cast<CCDWAPIPBearerRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+    CopyRecordFieldsL( *wapIPBearerRecord, *iWapIPBearerRecord );
+    iWapIPBearerRecord->SetElementId( wapIPBearerRecord->ElementId() );
+
+    if ( !iWapAPRecord->RecordId() )
+        {
+        iWapAPRecord->SetRecordId( KCDNewRecordRequest );
+        iWapAPRecord->StoreL(iSession );
+        // Have to be "reloaded" to get possible default values from template records.
+        iWapAPRecord->LoadL(iSession );
+
+        wapAPRecord->SetElementId( iWapAPRecord->ElementId() );
+        }
+    else
+        {
+        iWapAPRecord->ModifyL( iSession );
+        }
+    CopyRecordFieldsL( *iWapAPRecord, *wapAPRecord );
+
+    if ( !iWapIPBearerRecord->RecordId() )
+        {
+        iWapIPBearerRecord->iWAPAccessPointId = iWapAPRecord->RecordId();
+        iWapIPBearerRecord->iWAPIAP = iapRecord->RecordId();
+
+        iWapIPBearerRecord->SetRecordId( KCDNewRecordRequest );
+        iWapIPBearerRecord->StoreL( iSession );
+        // Have to be "reloaded" to get possible default values from template records.
+        iWapIPBearerRecord->LoadL( iSession );
+
+        wapIPBearerRecord->SetElementId( iWapIPBearerRecord->ElementId() );
+        }
+    else
+        {
+        iWapIPBearerRecord->ModifyL( iSession );
+        }
+    CopyRecordFieldsL( *iWapIPBearerRecord, *wapIPBearerRecord );
+
+    OstTraceFunctionExit0( DUP1_CCMPLUGINBASEENG_UPDATEWAPRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::NewWapRecordL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::NewWapRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_NEWWAPRECORDL_ENTRY );
+
+    if ( !iWapIPBearerRecord )
+        {
+        iWapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+        iWapIPBearerRecord->iWAPProxyPort = 0;
+        iWapIPBearerRecord->iWAPWSPOption = ECmWapWspOptionConnectionOriented;
+        iWapIPBearerRecord->iWAPSecurity = EFalse;
+        }
+
+    if ( !iWapAPRecord )
+        {
+        iWapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+        // SMS bearer is not supported by this version.
+        iWapAPRecord->iWAPCurrentBearer.SetL( TPtrC( KCDTypeNameWAPIPBearer ) );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_NEWWAPRECORDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::NewMetadataRecordL
+// ---------------------------------------------------------------------------
+//
+CCDIAPMetadataRecord* CCmPluginBaseEng::NewMetadataRecordL( TBool aSetDef )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_NEWSEAMLESSNESSRECORDL_ENTRY );
+
+    CCDIAPMetadataRecord* record = new( ELeave ) CCDIAPMetadataRecord( iMetadataTableId );
+
+    if ( aSetDef )
+        {
+        TRAPD( err, record->iSeamlessness = GetBearerInfoIntL( ECmSeamlessnessLevel ) );
+        if ( err )
+            {
+            record->iSeamlessness = ESeamlessnessConfirmFirst;
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_NEWSEAMLESSNESSRECORDL_EXIT );
+    return record;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::SetAttribute
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::SetAttribute(
+        CCDRecordBase* aRecord,
+        TUint32 aAttribute,
+        TBool aSet )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETATTRIBUTE_ENTRY );
+
+    if ( aSet )
+        {
+        aRecord->SetAttributes( aAttribute );
+        }
+    else
+        {
+        aRecord->ClearAttributes( aAttribute );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETATTRIBUTE_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CopyAttributes
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::CopyAttributes(
+        CCDRecordBase* aSrcRecord,
+        CCDRecordBase* aDstRecord )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYATTRIBUTES_ENTRY );
+
+    if ( !aSrcRecord || !aDstRecord )
+        {
+        OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYATTRIBUTES_EXIT );
+        return;
+        }
+
+    // Clear the target record attributes first.
+    aDstRecord->ClearAttributes( aDstRecord->Attributes() );
+    aDstRecord->SetAttributes( aSrcRecord->Attributes() );
+
+    OstTraceFunctionExit0( DUP1_CCMPLUGINBASEENG_COPYATTRIBUTES_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::FindWAPRecordL
+// ---------------------------------------------------------------------------
+//
+CCDWAPIPBearerRecord* CCmPluginBaseEng::FindWAPRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_FINDWAPRECORDL_ENTRY );
+
+    CMDBRecordSet<CCDWAPIPBearerRecord>* wapRS =
+            new( ELeave ) CMDBRecordSet<CCDWAPIPBearerRecord>( KCDTIdWAPIPBearerRecord );
+    CleanupStack::PushL( wapRS );
+
+    CCDWAPIPBearerRecord* wapBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+
+    CleanupStack::PushL( wapBearerRecord );
+
+    wapBearerRecord->iWAPIAP = iCmId;
+    wapRS->iRecords.AppendL( wapBearerRecord );
+
+    CleanupStack::Pop( wapBearerRecord );
+    wapBearerRecord = NULL;
+
+    if ( wapRS->FindL( iSession ) )
+        {
+        wapBearerRecord = static_cast<CCDWAPIPBearerRecord*>( wapRS->iRecords[0] );
+
+        // Take over the ownership of this record.
+        wapRS->iRecords.Remove( 0 );
+        }
+
+    CleanupStack::PopAndDestroy( wapRS );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_FINDWAPRECORDL_EXIT );
+    return wapBearerRecord;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::FindSeamlessnessRecordL
+// ---------------------------------------------------------------------------
+//
+CCDIAPMetadataRecord* CCmPluginBaseEng::FindMetadataRecordL()
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_FINDSEAMLESSNESSRECORDL_ENTRY );
+
+    CMDBRecordSet<CCDIAPMetadataRecord>* metadataRecordSet =
+            new( ELeave ) CMDBRecordSet<CCDIAPMetadataRecord>( iMetadataTableId );
+    CleanupStack::PushL( metadataRecordSet );
+
+    CCDIAPMetadataRecord* metadataRecord =
+            new( ELeave ) CCDIAPMetadataRecord( iMetadataTableId );
+    CleanupStack::PushL( metadataRecord );
+
+    metadataRecord->iIAP = IAPRecordElementId();
+    metadataRecordSet->iRecords.AppendL( metadataRecord );
+
+    CleanupStack::Pop( metadataRecord );
+    metadataRecord = NULL;
+
+    if ( metadataRecordSet->FindL( iSession ) )
+        {
+        CMDBRecordBase* record = metadataRecordSet->iRecords[0];
+
+        metadataRecord = NewMetadataRecordL( EFalse );
+        metadataRecord->SetRecordId( record->RecordId() );
+
+        // This can leave only in case of OOM.
+        metadataRecord->LoadL( iSession );
+        }
+    else
+        {
+        metadataRecord = NewMetadataRecordL( ETrue );
+        }
+
+    CleanupStack::PopAndDestroy( metadataRecordSet );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_FINDSEAMLESSNESSRECORDL_EXIT );
+    return metadataRecord;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::DoMakeValidNameL
+// ---------------------------------------------------------------------------
+//
+HBufC* CCmPluginBaseEng::DoMakeValidNameL(
+        const TDesC& aName,
+        const TUint32& aIapId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_DOMAKEVALIDNAMEL_ENTRY );
+
+    const TInt decimalBase = 10;
+    TBool changed( EFalse );
+    HBufC* temp = HBufC::NewLC( KApMaxConnNameLength );
+    HBufC* temp2 = HBufC::NewLC( KApMaxConnNameLength );
+
+    HBufC* corrname = EnsureMaxLengthLC( aName, changed );
+    *temp = *corrname;
+    TInt postfix( 0 );
+    TInt pf( 0 );
+    TInt i( 0 );
+    TBool valid ( EFalse );
+
+    TPtrC prefix = GetPrefix( *corrname );
+
+    postfix = GetPostfix( *temp, prefix );
+    postfix = -1;
+    do
+        {
+        valid = IsValidNameL( *temp, aIapId );
+        if ( !valid )
+            {
+            changed = ETrue;
+            postfix++;
+            // Check the length of postfix, check text length accordingly.
+            pf = postfix;
+            for ( i = 1; i < decimalBase; i++ )
+                {
+                pf /= decimalBase;
+                if ( !pf )
+                    break;
+                }
+            TPtr sgdptr( temp->Des() );
+            TPtr sgdptr2( temp2->Des() );
+            if ( postfix )
+                {
+                if ( postfix < decimalBase )
+                    {
+                    sgdptr2 = prefix.Left( KApMaxConnNameLength - i - 3 );
+                    }
+                else
+                    {
+                    sgdptr2 = prefix.Left( KApMaxConnNameLength - i - 2 );
+                    }
+                }
+            else
+                {
+                sgdptr2 = prefix.Left( KApMaxConnNameLength );
+                }
+            if ( postfix )
+                {
+                TBuf<KMaxPostfixLength> postfixString;
+                if ( postfix >= decimalBase )
+                    {
+                    postfixString.Format( KFormatLargePostfix, postfix );
+//     TODO:               AknTextUtils::LanguageSpecificNumberConversion( postfixString );
+                    }
+                else
+                    {
+                    postfixString.Format( KFormatPostfix, postfix );
+//     TODO:               AknTextUtils::LanguageSpecificNumberConversion( postfixString );
+                    }
+                sgdptr.Format( KFormatNameWithPostfix, &sgdptr2, &postfixString );
+                }
+            else
+                {
+                sgdptr.Format( KFormatNoPostfix, &sgdptr2 );
+                }
+            }
+        } while ( !valid );
+
+    CleanupStack::PopAndDestroy( corrname );
+    CleanupStack::PopAndDestroy( temp2 );
+
+    if ( changed )
+        {
+        CleanupStack::Pop( temp );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( temp );
+        temp = NULL;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_DOMAKEVALIDNAMEL_EXIT );
+    return temp;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::EnsureMaxLengthLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CCmPluginBaseEng::EnsureMaxLengthLC(
+        const TDesC& aName,
+        TBool& aChanged )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ENSUREMAXLENGTHLC_ENTRY );
+
+    TInt length = aName.Length();
+
+    aChanged = EFalse;
+
+    if ( !length )
+        {
+        // Name is required.
+        User::Leave( KErrArgument );
+        }
+
+    HBufC* corrname;
+    if ( KApMaxConnNameLength < length )
+        {
+        // Name too long, truncate.
+        corrname = aName.Left( KApMaxConnNameLength ).AllocLC();
+        aChanged = ETrue;
+        }
+    else
+        {
+        corrname = aName.AllocLC();
+        corrname->Des().Trim();
+        if ( corrname->Length() == 0 )
+            {
+            User::Leave( KErrArgument );
+            }
+        // Comes here only if name is valid.
+        if ( corrname->Length() != aName.Length() )
+            {
+            aChanged = ETrue;
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_ENSUREMAXLENGTHLC_EXIT );
+    return corrname;
+    }
+
+// ---------------------------------------------------------------------------
+// Given aName in the format <prefix> or <prefix><brace><integer><brace>,
+// return a pointer to the leading part.
+// That is, if there is trailing <space><integer>,
+// then that is excluded; if there is no trailing part, then the original
+// decriptor is returned.
+// Examples:
+//   - "Foo" returns "Foo";
+//   - "Foo 12" returns "Foo 12";
+//   - "Foo(12)" returns "Foo";
+//   - "Foo 12 (34)" returns "Foo 12 ";
+//   - "Foo bar" returns "Foo bar";
+//   - "Foo " returns "Foo ".
+// ---------------------------------------------------------------------------
+TPtrC CCmPluginBaseEng::GetPrefix( const TDesC& aName )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETPREFIX_ENTRY );
+
+    TPtrC prefix = aName;
+    TInt lastBrace = aName.LocateReverse('(');
+    if ( lastBrace != KErrNotFound )
+        {
+        // aName looks like "<prefix><brace><something>".
+        // See if <something> is an integer number.
+        TPtrC num = aName.Right( aName.Length() - lastBrace - 1 );
+        TInt val;
+        TLex lex( num );
+        if ( lex.Val( val ) == KErrNone )
+            {
+            // Yes, the trailer is an integer.
+            prefix.Set( aName.Left( lastBrace ) );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETPREFIX_EXIT );
+    return prefix;
+    }
+
+
+// ---------------------------------------------------------------------------
+// If aName is constructed from aPrefix with a postfix, get the numeric
+// value of the postfix, e.g:
+//   - GetPostfix( "Foo (3)", "Foo" ) == 3
+//   - GetPostfix( "Foo 23 (45)", "Foo 23" ) == 45
+// If aName is the same as aPrefix, return 0, e.g.:
+//   - GetPostfix( "Foo", "Foo" ) == 0
+// If aName is not constructed from aPrefix, return -1, e.g.:
+//   - GetPostfix( "Foobar", "Foo" ) == -1
+//   - GetPostfix( "Fo 23 45", "Foo" ) == -1
+// ---------------------------------------------------------------------------
+TInt CCmPluginBaseEng::GetPostfix( const TDesC& aName, const TDesC& aPrefix )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETPOSTFIX_ENTRY );
+
+    TInt postfix( KErrNotFound );
+    TInt nameLength = aName.Length();
+    TInt prefixLength = aPrefix.Length();
+    if ( nameLength >= prefixLength && aName.FindF( aPrefix ) == 0 )
+        {
+        // aName is longer or equal length, and
+        // aPrefix can be found in the beginning of aName.
+        if ( nameLength == prefixLength )
+            {
+            // They have the same length; they equal.
+            postfix = 0;
+            }
+        else
+            {
+            if ( prefixLength > 0 )
+                {
+                if ( aName[ prefixLength ] == '(' )
+                    {
+                    // (Now we know that aName is longer than aPrefix.)
+                    // aName looks like "aPrefix<brace><something>".
+                    // See if <something> is an integer number.
+                    TPtrC num = aName.Right( nameLength - prefixLength - 1 );
+                        TBuf< KApMaxConnNameLength > pf;
+                    pf = num;
+// TODO                    AknTextUtils::ConvertDigitsTo( pf, EDigitTypeWestern );
+                    TInt val;
+                    TLex lex( pf );
+                    if ( lex.Val( val ) == KErrNone )
+                        {
+                        // Yes, the trailer is an integer.
+                        if ( val > 0 )
+                            {
+                            postfix = val;
+                            }
+                        else
+                            {
+                            // signal that it is invalid...
+                            postfix = -1;
+                            }
+                        }
+                    }
+                }
+            else
+                {
+                postfix = -1;
+                }
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETPOSTFIX_EXIT );
+    return postfix;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::IsValidNameL
+// ---------------------------------------------------------------------------
+//
+TBool CCmPluginBaseEng::IsValidNameL(
+        const TDesC& aNameText,
+        const TUint32& aIapId )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ISVALIDNAMEL_ENTRY );
+
+    TBool retVal( ETrue );
+
+    CMDBRecordSet<CCDIAPRecord>* iapRS =
+            new( ELeave ) CMDBRecordSet<CCDIAPRecord>(KCDTIdIAPRecord);
+    CleanupStack::PushL(iapRS);
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+    CleanupStack::PushL( iapRecord );
+
+    // Prime record.
+    iapRecord->iRecordName.SetL( aNameText );
+    iapRS->iRecords.AppendL( iapRecord );
+    CleanupStack::Pop( iapRecord );
+    iapRecord = NULL;
+
+    if ( iapRS->FindL( iSession ) )
+        {
+        if ( iCmId )
+            {
+            // This is not a new CM.
+            for ( TInt i = 0; i < iapRS->iRecords.Count(); ++i )
+                {
+                if ( iapRS->iRecords[i]->RecordId() != aIapId )
+                    {
+                    // Duplication because it's not our name.
+                    retVal = EFalse;
+                    break;
+                    }
+                }
+            }
+        else
+            {
+            // New CM -> any occurence is a duplication.
+            retVal = EFalse;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( iapRS );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_ISVALIDNAMEL_EXIT );
+    return retVal;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::EscapeTextLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CCmPluginBaseEng::EscapeTextLC( const TDesC& aLiteral )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ESCAPETEXTLC_ENTRY );
+
+    TInt l( aLiteral.Length() );
+    //> 2*, to ensure correct esc. even if ALL chars are quotes...
+    HBufC* retbuf = HBufC::NewLC( 2*l );
+    TPtr ret = retbuf->Des();
+    TUint quote( '\'' );  // TChar gives warnings in THUMB & ARMI
+    TInt i( 0 );
+
+    for ( i = 0; i < l; i++ )
+        {
+        ret.Append( aLiteral[i] );
+        if ( aLiteral[i] == quote )
+            {
+            // Duplicate quote.
+            ret.Append( quote );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_ESCAPETEXTLC_EXIT );
+    return retbuf;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::SetDefaultNameL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::SetDefaultNameL( const TDesC& aName )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETDEFAULTNAMEL_ENTRY );
+
+    if ( iNamingMethod == ENamingNothing )
+        {
+        iIapRecord->iRecordName.SetL( aName );
+        }
+    else if ( iNamingMethod == ENamingUnique )
+        {
+        HBufC* newName = DoMakeValidNameL( aName, iCmId );
+
+        if ( newName )
+            // Name converted to unique.
+            {
+            CleanupStack::PushL( newName );
+            iIapRecord->iRecordName.SetL( *newName );
+            CleanupStack::PopAndDestroy( newName );
+            }
+        else
+            {
+            iIapRecord->iRecordName.SetL( aName );
+            }
+        }
+    else if ( iNamingMethod == ENamingNotAccept )
+        {
+        if ( IsValidNameL( aName, iCmId ) )
+            {
+            iIapRecord->iRecordName.SetL( aName );
+            }
+        else
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+    else
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETDEFAULTNAMEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::SetNameL
+// ---------------------------------------------------------------------------
+//
+void CCmPluginBaseEng::SetNameL(
+        const TDesC& aName,
+        CommsDat::CCDRecordBase* aIapRecord,
+        const CMManager::TNamingMethod aNamingMethod )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETNAMEL_ENTRY );
+
+    if ( aNamingMethod == ENamingNothing )
+        {
+        aIapRecord->iRecordName.SetL( aName );
+        }
+    else if ( aNamingMethod == ENamingUnique )
+        {
+        TUint32 iapid = aIapRecord->RecordId();
+        HBufC* newName = DoMakeValidNameL( aName, iapid );
+
+        if ( newName )
+            // Name converted to unique.
+            {
+            CleanupStack::PushL( newName );
+            aIapRecord->iRecordName.SetL( *newName );
+            CleanupStack::PopAndDestroy( newName );
+            }
+        else
+            {
+            aIapRecord->iRecordName.SetL( aName );
+            }
+        }
+    else if ( aNamingMethod == ENamingNotAccept )
+        {
+        if ( IsValidNameL( aName, aIapRecord->RecordId() ) )
+            {
+            aIapRecord->iRecordName.SetL( aName );
+            }
+        else
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+    else
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETNAMEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CheckIfNameModifiedL
+// ---------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::CheckIfNameModifiedL(
+        CCDRecordBase* aSrcRecord,
+        CCDRecordBase* aDestRecord ) const
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CHECKIFNAMEMODIFIEDL_ENTRY );
+
+    if ( !aSrcRecord || !aDestRecord )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    if ( !TPtrC( aSrcRecord->iRecordName ).CompareF( TPtrC( aDestRecord->iRecordName ) ) )
+        {
+        // Names match.
+        OstTraceFunctionExit0( CCMPLUGINBASEENG_CHECKIFNAMEMODIFIEDL_EXIT );
+        return;
+        }
+
+    aDestRecord->iRecordName.SetL( TPtrC( aSrcRecord->iRecordName ) );
+
+    OstTraceFunctionExit0( DUP1_CCMPLUGINBASEENG_CHECKIFNAMEMODIFIEDL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::IAPRecordElementId
+// ---------------------------------------------------------------------------
+TMDBElementId CCmPluginBaseEng::IAPRecordElementId() const
+    {
+    return ( KCDMaskShowField & iIapRecord->ElementId() );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::IsProtected
+// ---------------------------------------------------------------------------
+TBool CCmPluginBaseEng::IsProtected() const
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_ISPROTECTED_ENTRY );
+
+    return ( iIapRecord->Attributes() & ECDProtectedWrite );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::GetLocationIdL
+// ---------------------------------------------------------------------------
+TUint32 CCmPluginBaseEng::GetLocationIdL() const
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETLOCATIONIDL_ENTRY );
+
+    TUint32 locId( 0 );
+    CMDBRecordSet<CCDLocationRecord>* locRS =
+            new( ELeave ) CMDBRecordSet<CCDLocationRecord>( KCDTIdLocationRecord );
+    CleanupStack::PushL( locRS );
+
+    CCDLocationRecord* locRecord = static_cast<CCDLocationRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdLocationRecord ) );
+    CleanupStack::PushL( locRecord );
+
+    locRecord->iRecordName.SetL( KLocationName );
+    locRS->iRecords.AppendL( locRecord );
+    CleanupStack::Pop( locRecord );
+
+    if ( locRS->FindL(iSession) )
+        {
+        locRecord = static_cast<CCDLocationRecord*>( locRS->iRecords[0] );
+        locId = locRecord->RecordId();
+        }
+    else
+        {
+        User::Leave( KErrNotFound ); //TODO, what to do if not found. Can we create it? need study.
+        }
+
+    CleanupStack::PopAndDestroy( locRS );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETLOCATIONIDL_EXIT );
+    return locId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::SetProxyServerNameL
+// ---------------------------------------------------------------------------
+ void CCmPluginBaseEng::SetProxyServerNameL(
+         const TDesC& aProxyServer,
+         CCDRecordBase* aProxyRecord )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETPROXYSERVERNAMEL_ENTRY );
+
+    CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>( aProxyRecord );
+
+    proxyRecord->iServerName.SetL( aProxyServer );
+    if ( !aProxyServer.Length() )
+        {
+        proxyRecord->iUseProxyServer = EFalse;
+        }
+    else
+        {
+        proxyRecord->iUseProxyServer = ETrue;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETPROXYSERVERNAMEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::CheckDNSServerAddressL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCmPluginBaseEng::CheckDNSServerAddressL(
+        TBool aIPv6,
+        CMDBField<TDesC>& aDNS1,
+        CMDBField<TDesC>& aDNS2,
+        CMDBField<TBool>& aDNSFromServer )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_CHECKDNSSERVERADDRESSL_ENTRY );
+
+    if ( !aDNSFromServer )
+        {
+        if ( aIPv6 )
+            {
+            if ( ClassifyIPv6Address( aDNS1 ) == EIPv6Unspecified )
+                {
+                if ( ClassifyIPv6Address( aDNS2 ) != EIPv6Unspecified )
+                    {
+                    aDNS1.SetL( aDNS2 );
+                    aDNS2.SetL( KDynamicIpv6Address );
+                    }
+                else
+                    {
+                    // Both are unspecified.
+                    aDNSFromServer = ETrue;
+                    }
+                }
+            }
+        else // IPv4
+            {
+            if ( IsUnspecifiedIPv4Address( aDNS1 ) )
+                {
+                if ( !IsUnspecifiedIPv4Address( aDNS2 ) )
+                    {
+                    aDNS1.SetL( aDNS2 );
+                    aDNS2.SetL( KUnspecifiedIPv4 );
+                    }
+                else
+                    {
+                    // Both are unspecified.
+                    aDNSFromServer = ETrue;
+                    }
+                }
+            }
+        }
+
+    OstTraceFunctionExit0( DUP1_CCMPLUGINBASEENG_CHECKDNSSERVERADDRESSL_EXIT );
+    }
+
+//-----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetGenericCmRecordsL
+// -----------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::GetPluginDataL(
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETPLUGINDATAL_ENTRY );
+
+    if ( !aClientPluginInstance )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    aClientPluginInstance->iGenRecordArray.ResetAndDestroy();
+    aClientPluginInstance->iBearerSpecRecordArray.ResetAndDestroy();
+
+    aClientPluginInstance->iNamingMethod = iNamingMethod;
+    aClientPluginInstance->iLocationEnabled = iLocationEnabled;
+
+    if ( iIapRecord )
+        {
+        CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CleanupStack::PushL( iapRecord );
+        CopyRecordFieldsL( *iIapRecord, *iapRecord );
+        iapRecord->SetElementId( iIapRecord->ElementId() );
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( iapRecord ) );
+        CleanupStack::Pop( iapRecord );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    if ( iServiceRecord )
+        {
+        CCDRecordBase* serviceRecord = CopyServiceRecordL();
+        serviceRecord->SetElementId( iServiceRecord->ElementId() );
+        CleanupStack::PushL( serviceRecord );
+        aClientPluginInstance->iGenRecordArray.AppendL( serviceRecord );
+        CleanupStack::Pop( serviceRecord );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    if ( iNetworkRecord )
+        {
+        CCDNetworkRecord* networkRecord = static_cast<CCDNetworkRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+        CleanupStack::PushL( networkRecord );
+        CopyRecordFieldsL( *iNetworkRecord, *networkRecord );
+        networkRecord->SetElementId( iNetworkRecord->ElementId() );
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( networkRecord ) );
+        CleanupStack::Pop( networkRecord );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    if ( iWapAPRecord )
+        {
+        CCDWAPAccessPointRecord* wapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdWAPAccessPointRecord ) );
+        CleanupStack::PushL( wapAPRecord );
+        CopyRecordFieldsL( *iWapAPRecord, *wapAPRecord );
+        wapAPRecord->SetElementId( iWapAPRecord->ElementId() );
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( wapAPRecord ) );
+        CleanupStack::Pop( wapAPRecord );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    if ( iWapIPBearerRecord )
+        {
+        CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+        CleanupStack::PushL( wapIPBearerRecord );
+        CopyRecordFieldsL( *iWapIPBearerRecord, *wapIPBearerRecord );
+        wapIPBearerRecord->SetElementId( iWapIPBearerRecord->ElementId() );
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( wapIPBearerRecord ) );
+        CleanupStack::Pop( wapIPBearerRecord );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    if ( iMetaDataRecord )
+        {
+        CCDIAPMetadataRecord* metadataRecord =
+                new( ELeave ) CCDIAPMetadataRecord( iMetadataTableId );
+        CleanupStack::PushL( metadataRecord );
+        CopyRecordFieldsL( *iMetaDataRecord, *metadataRecord );
+        metadataRecord->SetElementId( iMetaDataRecord->ElementId() );
+        // Record name is set/changed during update.
+
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( metadataRecord ) );
+        CleanupStack::Pop( metadataRecord );
+        }
+    else
+        {
+        aClientPluginInstance->iGenRecordArray.AppendL( NULL );
+        }
+
+    // Location record does not need to be loaded
+    aClientPluginInstance->iGenRecordArray.AppendL( NULL );
+
+    if ( iProxyRecord )
+        {
+        CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+        CleanupStack::PushL( proxyRecord );
+        CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+        proxyRecord->SetElementId( iProxyRecord->ElementId() );
+        aClientPluginInstance->iGenRecordArray.AppendL(
+                static_cast<CommsDat::CCDRecordBase*>( proxyRecord ) );
+        CleanupStack::Pop( proxyRecord );
+        }
+    else
+        {
+        aClientPluginInstance->iGenRecordArray.AppendL( NULL );
+        }
+
+    GetBearerSpecificRecordsL( aClientPluginInstance->iBearerSpecRecordArray );
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETPLUGINDATAL_EXIT );
+    }
+
+//-----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetIntAttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C TUint32 CCmPluginBaseEng::GetIntAttributeL(
+        TUint32 aAttribute,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETINTATTRIBUTEL_ENTRY );
+
+    TUint32 retVal( 0 );
+
+    switch ( aAttribute )
+        {
+        case ECmIapId: // If the CM has an ECmIapId then the ECmIapId is the ECmId.
+        case ECmId:
+            {
+            if ( iBearerType == KUidEmbeddedDestination )
+                {
+                retVal = GetBearerIntAttributeL(
+                        aAttribute,
+                        aClientPluginInstance->iGenRecordArray,
+                        aClientPluginInstance->iBearerSpecRecordArray );
+                }
+            else
+                {
+                retVal = static_cast<CCDIAPRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KIapRecordIndex] )->RecordId();
+                }
+            }
+            break;
+        case ECmWapId:
+            {
+            retVal = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )
+                    ->iWAPAccessPointId;
+            }
+            break;
+        case ECmIapServiceId:
+            {
+            retVal = static_cast<CCDIAPRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] )->iService;
+            }
+            break;
+        case ECmBearerType:
+            {
+            retVal = iBearerType;
+            }
+            break;
+        case ECmDefaultPriority:
+            {
+            retVal = KDataMobilitySelectionPolicyPriorityWildCard;
+            }
+            break;
+        case ECmDefaultUiPriority:
+            {
+            retVal = KDataMobilitySelectionPolicyPriorityWildCard;
+            }
+            break;
+        case ECmNamingMethod:
+            {
+            retVal = iNamingMethod;
+            }
+            break;
+        case ECmSeamlessnessLevel:
+            {
+            if ( iMetaDataRecord )
+                {
+                retVal = static_cast<CCDIAPMetadataRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] )
+                        ->iSeamlessness;
+                }
+            else
+                {
+                User::Leave( KErrNotFound );
+                }
+            }
+            break;
+        case ECmElementID:
+            {
+            if ( !iIapRecord )
+                {
+                User::Leave( KErrNotReady );
+                }
+
+            retVal = ( KCDMaskShowField & ( static_cast<CCDIAPRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] )->ElementId() ) );
+            }
+            break;
+
+        case ECmLoadResult:
+            {
+            // This attribute has been deprecated since Symbian^4.
+            User::Leave( KErrNotSupported ); //TODO, update attribute definition comments.
+            }
+            break;
+
+        case ECmNetworkId:
+            {
+            retVal = static_cast<CCDIAPRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] )->iNetwork;
+            }
+            break;
+        case ECmProxyPortNumber:
+            {
+            if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                {
+                User::Leave( KErrNotFound );
+                }
+
+            retVal = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->iPortNumber;
+            }
+            break;
+        case ECmWapIPWSPOption:
+            {
+            retVal = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )->iWAPWSPOption;
+            }
+            break;
+        case ECmWapIPProxyPort:
+            {
+            retVal = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )->iWAPProxyPort;
+            }
+            break;
+        default:
+            {
+            retVal = GetBearerIntAttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+            break;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETINTATTRIBUTEL_EXIT );
+    return retVal;
+    }
+
+//-----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetBoolAttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CCmPluginBaseEng::GetBoolAttributeL(
+        TUint32 aAttribute,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETBOOLATTRIBUTEL_ENTRY );
+
+    TBool retVal( EFalse );
+
+    switch ( aAttribute )
+        {
+        case ECmProtected:
+            {
+            if ( iBearerType == KUidEmbeddedDestination )
+                {
+                retVal = GetBearerBoolAttributeL(
+                        aAttribute,
+                        aClientPluginInstance->iGenRecordArray,
+                        aClientPluginInstance->iBearerSpecRecordArray );
+                }
+            else
+                {
+                CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+                retVal = iapRecord->Attributes() & ECDProtectedWrite;
+                }
+            }
+            break;
+        case ECmHidden:
+            {
+            if ( iBearerType == KUidEmbeddedDestination )
+                {
+                retVal = GetBearerBoolAttributeL(
+                        aAttribute,
+                        aClientPluginInstance->iGenRecordArray,
+                        aClientPluginInstance->iBearerSpecRecordArray );
+                }
+            else
+                {
+                CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+                retVal = iapRecord->Attributes() & ECDHidden;
+                }
+            }
+            break;
+        case ECmProxyUsageEnabled:
+            {
+            if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                {
+                retVal = EFalse;
+                }
+            else
+                {
+                retVal = static_cast<CCDProxiesRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                        ->iUseProxyServer;
+                }
+            }
+            break;
+        case ECmDestination:
+            {
+            TRAPD( err, retVal = GetBearerBoolAttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray ) );
+            if ( err )
+                {
+                retVal = EFalse;
+                }
+            }
+            break;
+        case ECmChargeCardUsageEnabled:
+            {
+            retVal = EFalse;
+            }
+            break;
+        case ECmLocationUsageEnabled:
+            {
+            retVal = iLocationEnabled;
+            }
+            break;
+        case ECmCoverage:
+            // By default the plugin has no network coverage.
+            {
+            TRAPD( err, retVal = GetBearerBoolAttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray ) );
+            if ( err )
+                {
+                if ( err == KErrNotFound )
+                    {
+                    retVal = EFalse;
+                    }
+                else
+                    {
+                    User::Leave( err );
+                    }
+                }
+            }
+            break;
+        case ECmMetaHighlight:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            retVal = metadataRecord->iMetadata & EMetaHighlight;
+            }
+            break;
+        case ECmMetaHiddenAgent:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            retVal = metadataRecord->iMetadata & EMetaHiddenAgent;
+            }
+            break;
+        case ECmMetaHotSpot:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            retVal = metadataRecord->iMetadata & EMetaHotSpot;
+            }
+            break;
+        case ECmVirtual:
+            {
+            // This is bearer specific attribute.
+            TRAPD( err, retVal = GetBearerInfoBoolL( aAttribute ) );
+            if ( err )
+                {
+                retVal = EFalse;
+                }
+            }
+            break;
+        case ECmWapIPSecurity:
+            {
+            retVal = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )->iWAPSecurity;
+            }
+            break;
+        default:
+            {
+            retVal = GetBearerBoolAttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETBOOLATTRIBUTEL_EXIT );
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetStringAttributeL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC* CCmPluginBaseEng::GetStringAttributeL(
+        TUint32 aAttribute,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETSTRINGATTRIBUTEL_ENTRY );
+
+    if ( !aClientPluginInstance )
+        {
+        User::Leave( KErrCorrupt );
+        }
+
+    HBufC* retVal = NULL;
+
+    switch ( aAttribute )
+        {
+        case ECmBearerIcon:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+
+            if ( !metadataRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( metadataRecord->iIconFileName ).AllocL();
+            }
+            break;
+        case ECmStartPage:
+            {
+            CCDWAPAccessPointRecord* wapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPAPRecordIndex] );
+
+            if ( !wapAPRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( wapAPRecord->iWAPStartPage ).AllocL();
+            }
+            break;
+        case ECmName:
+            {
+            CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+            if ( !iapRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( iapRecord->iRecordName ).AllocL();
+            }
+            break;
+        case ECmProxyServerName:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+
+            if ( !proxyRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( proxyRecord->iServerName ).AllocL();
+            }
+            break;
+        case ECmProxyProtocolName:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+
+            if ( !proxyRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( proxyRecord->iExceptions ).AllocL();
+            }
+            break;
+        case ECmProxyExceptions:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+
+            if ( !proxyRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( proxyRecord->iProtocolName ).AllocL();
+            }
+            break;
+        case ECmWapIPGatewayAddress:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( wapIPBearerRecord->iWAPGatewayAddress ).AllocL();
+            }
+            break;
+        case ECmWapIPProxyLoginName:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( wapIPBearerRecord->iWAPProxyLoginName ).AllocL();
+            }
+            break;
+        case ECmWapIPProxyLoginPass:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( wapIPBearerRecord->iWAPProxyLoginPass ).AllocL();
+            }
+            break;
+        default:
+            {
+            retVal = GetBearerStringAttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+            break;
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETSTRINGATTRIBUTEL_EXIT );
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetString8AttributeL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CCmPluginBaseEng::GetString8AttributeL(
+        TUint32 aAttribute,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_GETSTRING8ATTRIBUTEL_ENTRY );
+
+    HBufC8* retVal = NULL;
+
+    switch ( aAttribute )
+        {
+        default:
+            {
+            retVal = GetBearerString8AttributeL(
+                    aAttribute,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_GETSTRING8ATTRIBUTEL_EXIT );
+    return retVal;
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::GetIntAttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::SetIntAttributeL(
+        TUint32 aAttribute,
+        TUint32 aValue,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETINTATTRIBUTEL_ENTRY );
+
+    switch ( aAttribute )
+        {
+        case ECmNamingMethod:
+            {
+            aClientPluginInstance->iNamingMethod = ( TNamingMethod )aValue;
+            }
+            break;
+
+        case ECmCommsDBBearerType:
+        case ECmElementID:
+        case ECmIapId:
+        case ECmId:
+            {
+            User::Leave( KErrNotSupported );
+            }
+            break;
+
+        case ECmSeamlessnessLevel:
+            {
+            if ( aValue == ESeamlessnessConfirmFirst || aValue == ESeamlessnessShowprogress )
+                {
+                static_cast<CCDIAPMetadataRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] )->
+                        iSeamlessness.SetL( aValue );
+                }
+            else
+                {
+                User::Leave( KErrNotSupported );
+                }
+            }
+            break;
+
+        case ECmNetworkId:
+            {
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        case ECmProxyPortNumber:
+            {
+            if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                {
+                CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+                CleanupStack::PushL( proxyRecord );
+                CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+                proxyRecord->SetElementId( iProxyRecord->ElementId() );
+                aClientPluginInstance->iGenRecordArray.InsertL(
+                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ),
+                        KProxyRecordIndex );
+                CleanupStack::Pop( proxyRecord );
+                }
+
+            static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->
+                    iPortNumber = aValue;
+            }
+            break;
+        case ECmWapIPWSPOption:
+            {
+            if ( aValue > KMaxTUint8 )
+                {
+                User::Leave( KErrArgument );
+                }
+            else
+                {
+                static_cast<CCDWAPIPBearerRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )->
+                        iWAPWSPOption.SetL( aValue );
+                }
+            }
+            break;
+        case ECmWapIPProxyPort:
+            {
+            static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )->
+                    iWAPProxyPort.SetL( aValue );
+            }
+            break;
+        default:
+            {
+            SetBearerIntAttributeL(
+                    aAttribute,
+                    aValue,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETINTATTRIBUTEL_EXIT );
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::SetBoolAttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::SetBoolAttributeL(
+        TUint32 aAttribute,
+        TBool aValue,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETBOOLATTRIBUTEL_ENTRY );
+
+    CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+            aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+    switch ( aAttribute )
+        {
+        case ECmProtected:
+            {
+            /**
+             * ECDProtectedWrite attribute is set in
+             * - iap record
+             * - network record
+             * - iapmetadata record
+             * - wap records
+             * - proxy record
+             * And depending the bearer
+             * - service record
+             * - bearer record
+             * - other bearer specific records
+             */
+            SetAttribute( iapRecord, ECDProtectedWrite, aValue );
+            }
+            break;
+        case ECmHidden:
+            {
+            /**
+             * ECDHidden attribute is set in
+             * - iap record
+             * - network record
+             * - iapmetadata record
+             * - wap records
+             * - proxy record
+             * And depending the bearer
+             * - service record
+             * - bearer record
+             * - other bearer specific records
+             */
+            SetAttribute( iapRecord, ECDHidden, aValue );
+            }
+            break;
+        case ECmProxyUsageEnabled:
+            {
+            if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                {
+                CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+                CleanupStack::PushL( proxyRecord );
+                CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+                proxyRecord->SetElementId( iProxyRecord->ElementId() );
+                aClientPluginInstance->iGenRecordArray.InsertL(
+                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ),
+                        KProxyRecordIndex );
+                CleanupStack::Pop( proxyRecord );
+                }
+
+            static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->iUseProxyServer =
+                            aValue;
+            }
+            break;
+        case ECmChargeCardUsageEnabled:
+            {
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        case ECmLocationUsageEnabled:
+            {
+            EnableLocationL( aValue );
+            }
+            break;
+        case ECmMetaHighlight:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            if ( aValue )
+                {
+                metadataRecord->iMetadata = EMetaHighlight | metadataRecord->iMetadata;
+                }
+            else
+                {
+                metadataRecord->iMetadata = ~EMetaHighlight & metadataRecord->iMetadata;
+                }
+            }
+            break;
+        case ECmMetaHiddenAgent:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            if ( aValue )
+                {
+                metadataRecord->iMetadata = EMetaHiddenAgent | metadataRecord->iMetadata;
+                }
+            else
+                {
+                metadataRecord->iMetadata = ~EMetaHiddenAgent & metadataRecord->iMetadata;
+                }
+            }
+            break;
+        case ECmMetaHotSpot:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            if ( aValue )
+                {
+                metadataRecord->iMetadata = EMetaHotSpot | metadataRecord->iMetadata;
+                }
+            else
+                {
+                metadataRecord->iMetadata = ~EMetaHotSpot & metadataRecord->iMetadata;
+                }
+            }
+            break;
+        case ECmWapIPSecurity:
+            {
+            static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )
+                    ->iWAPSecurity.SetL( aValue );
+            }
+            break;
+        default:
+            {
+            SetBearerBoolAttributeL(
+                    aAttribute,
+                    aValue,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETBOOLATTRIBUTEL_EXIT );
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::SetStringAttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::SetStringAttributeL(
+        TUint32 aAttribute,
+        const TDesC16& aValue,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETSTRINGATTRIBUTEL_ENTRY );
+
+    switch ( aAttribute )
+        {
+        case ECmBearerIcon:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+
+            if ( !metadataRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            metadataRecord->iIconFileName.SetL( aValue );
+            }
+            break;
+        case ECmStartPage:
+            {
+            CCDWAPAccessPointRecord* wapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPAPRecordIndex] );
+
+            if ( !wapAPRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            wapAPRecord->iWAPStartPage.SetL( aValue );
+            }
+            break;
+        case ECmName:
+            {
+            CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
+
+            if ( !iapRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            SetNameL( aValue, iapRecord, aClientPluginInstance->iNamingMethod );
+            }
+            break;
+        case ECmProxyServerName:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+            if ( !proxyRecord )
+                {
+                proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+
+                // Map proxy record to this iap.
+                proxyRecord->iService = static_cast<CCDProxiesRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->RecordId();
+
+                aClientPluginInstance->iGenRecordArray.Insert( proxyRecord, KProxyRecordIndex );
+                }
+
+            SetProxyServerNameL( aValue, proxyRecord );
+            }
+            break;
+        case ECmProxyProtocolName:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+            if ( !proxyRecord )
+                {
+                proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+
+                // Map proxy record to this iap.
+                proxyRecord->iService = static_cast<CCDProxiesRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->RecordId();
+
+                aClientPluginInstance->iGenRecordArray.Insert( proxyRecord, KProxyRecordIndex );
+                }
+
+            proxyRecord->iProtocolName.SetL( aValue );
+            }
+            break;
+        case ECmProxyExceptions:
+            {
+            CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] );
+            if ( !proxyRecord )
+                {
+                proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+
+                // Map proxy record to this iap.
+                proxyRecord->iService = static_cast<CCDProxiesRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->RecordId();
+
+                aClientPluginInstance->iGenRecordArray.Insert( proxyRecord, KProxyRecordIndex );
+                }
+
+            proxyRecord->iExceptions.SetL( aValue );
+            }
+            break;
+        case ECmWapIPGatewayAddress:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            wapIPBearerRecord->iWAPGatewayAddress.SetL( aValue );
+            }
+            break;
+        case ECmWapIPProxyLoginName:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            wapIPBearerRecord->iWAPProxyLoginName.SetL( aValue );
+            }
+            break;
+        case ECmWapIPProxyLoginPass:
+            {
+            CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] );
+
+            if ( !wapIPBearerRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            wapIPBearerRecord->iWAPProxyLoginPass.SetL( aValue );
+            }
+            break;
+        default:
+            {
+            SetBearerStringAttributeL(
+                    aAttribute,
+                    aValue,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETSTRINGATTRIBUTEL_EXIT );
+    }
+
+// -----------------------------------------------------------------------------
+// CCmPluginBaseEng::SetString8AttributeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CCmPluginBaseEng::SetString8AttributeL(
+        TUint32 aAttribute,
+        const TDesC8& aValue,
+        CCmClientPluginInstance* aClientPluginInstance )
+    {
+    OstTraceFunctionEntry0( CCMPLUGINBASEENG_SETSTRING8ATTRIBUTEL_ENTRY );
+
+    switch ( aAttribute )
+        {
+        default:
+            {
+            SetBearerString8AttributeL(
+                    aAttribute,
+                    aValue,
+                    aClientPluginInstance->iGenRecordArray,
+                    aClientPluginInstance->iBearerSpecRecordArray );
+            }
+        }
+
+    OstTraceFunctionExit0( CCMPLUGINBASEENG_SETSTRING8ATTRIBUTEL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::IsUnspecifiedIPv4Address
+// ---------------------------------------------------------------------------
+//
+TBool CCmPluginBaseEng::IsUnspecifiedIPv4Address( const TDesC& aIpv4Address )
+    {
+    OstTraceFunctionEntry0( _ISUNSPECIFIEDIPV4ADDRESS_ENTRY );
+
+    if ( aIpv4Address.Length() == 0 || !aIpv4Address.CompareF( KUnspecifiedIPv4 ) )
+        {
+        OstTraceFunctionExit0( _ISUNSPECIFIEDIPV4ADDRESS_EXIT );
+        return ETrue;
+        }
+
+    OstTraceFunctionExit0( DUP1__ISUNSPECIFIEDIPV4ADDRESS_EXIT );
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CCmPluginBaseEng::ClassifyIPv6Address
+// ---------------------------------------------------------------------------
+//
+TIPv6Types CCmPluginBaseEng::ClassifyIPv6Address( const TDesC& aIpv6Address )
+    {
+    OstTraceFunctionEntry0( _CLASSIFYIPV6ADDRESS_ENTRY );
+
+    if ( aIpv6Address.Length() == 0 || !aIpv6Address.CompareF( KDynamicIpv6Address ) )
+        {
+        OstTraceFunctionExit0( _CLASSIFYIPV6ADDRESS_EXIT );
+
+        return EIPv6Unspecified;
+        }
+    else if ( !aIpv6Address.CompareF( KKnownIp6NameServer1 ) ||
+            !aIpv6Address.CompareF( KKnownIp6NameServer2 ) )
+        {
+        OstTraceFunctionExit0( DUP1__CLASSIFYIPV6ADDRESS_EXIT );
+
+        return EIPv6WellKnown;
+        }
+
+    OstTraceFunctionExit0( DUP2__CLASSIFYIPV6ADDRESS_EXIT );
+    return EIPv6UserDefined;
+    }
+
+// End of file