cmmanager/cmmgr/cmmpluginbase/src/ccmpluginbaseeng.cpp
changeset 46 95d45f234cf3
parent 27 489cf6208544
child 53 4af712113915
--- a/cmmanager/cmmgr/cmmpluginbase/src/ccmpluginbaseeng.cpp	Thu May 27 13:17:01 2010 +0300
+++ b/cmmanager/cmmgr/cmmpluginbase/src/ccmpluginbaseeng.cpp	Wed Jun 23 18:39:24 2010 +0300
@@ -21,7 +21,9 @@
 #include <cmpluginbaseeng.h>
 #include <cmpsettingsconsts.h>
 #include <featmgr.h>
-
+#include <cmpluginembdestinationdef.h>
+
+#include "cmmserverdefs.h"
 #include "ccmpluginbaseengtextresolver.h"
 
 #include "OstTraceDefinitions.h"
@@ -33,7 +35,7 @@
 using namespace CMManager;
 using namespace CommsDat;
 
-const TInt KApMaxConnNameLength = 30;
+const TInt KApMaxConnNameLength = 50;
 _LIT( KFormatPostfix, "%02d" );
 _LIT( KFormatLargePostfix, "%d" );
 _LIT( KFormatNameWithPostfix, "%S(%S)" );
@@ -136,7 +138,7 @@
     iWapIPBearerRecord = NULL;
     iMetaDataRecord = NULL;
 
-    iIapId = 0;
+    iCmId = 0;
     iMetadataTableId = 0;
     iLocationEnabled = EFalse;
 
@@ -151,7 +153,7 @@
     {
     OstTraceFunctionEntry0( DUP1_CCMPLUGINBASEENG_CCMPLUGINBASEENG_ENTRY );
 
-    iIapId = 0;
+    iCmId = 0;
     delete iIapRecord; iIapRecord = NULL;
     delete iProxyRecord; iProxyRecord = NULL;
     delete iServiceRecord; iServiceRecord = NULL;
@@ -297,7 +299,7 @@
 
     ResetBearerRecords();
 
-    LoadL( iIapId );
+    LoadL( iCmId );
 
     OstTraceFunctionExit0( CCMPLUGINBASEENG_RELOAD_EXIT );
     }
@@ -310,6 +312,13 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADL_ENTRY );
 
+    // Embedded destination must be handled separately first.
+    if ( aIapId > KCmDefaultDestinationAPTagId )
+        {
+        iCmId = aIapId;
+        return;
+        }
+
     DoLoadL( aIapId );
 
     OstTraceFunctionExit0( CCMPLUGINBASEENG_LOADL_EXIT );
@@ -323,7 +332,7 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_CREATENEWL_ENTRY );
 
-    if ( iIapId )
+    if ( iCmId )
         // we already have IAP id ->
         {
         User::Leave( KErrAlreadyExists );
@@ -366,7 +375,7 @@
     _LIT( KDefaultConnNameTextId, "txt_occ_setlabel_connection_name_val_connection" );
     HBufC* resolvedText( NULL );
     resolvedText = CCmPluginBaseEngTextResolver::ResolveTextL( KDefaultConnNameTextId );
-    if ( resolvedText != NULL )
+    if ( resolvedText )
         {
         SetDefaultNameL( *resolvedText );
         }
@@ -383,7 +392,7 @@
     if ( aCmId != 0 )
         {
         iIapRecord->SetRecordId( aCmId );
-        iIapId = 0;
+        iCmId = 0;
         }
     else
         {
@@ -486,8 +495,12 @@
         {
         case KIapRecordIndex:
             {
-            aCopyInstance->iIapRecord = static_cast<CCDIAPRecord*>(
-                    CCDRecordBase::CreateCopyRecordL( *iIapRecord ) );
+            CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+            CleanupStack::PushL( iapRecord );
+            CopyRecordFieldsL( *iIapRecord, *iapRecord );
+            CleanupStack::Pop( iapRecord );
+            aCopyInstance->iIapRecord = iapRecord;
             }
             break;
         case KServiceRecordIndex:
@@ -499,20 +512,24 @@
             break;
         case KNetworkRecordIndex:
             {
-            aCopyInstance->iNetworkRecord = static_cast<CCDNetworkRecord*>(
-                    CCDRecordBase::CreateCopyRecordL( *iNetworkRecord ) );
+            CCDNetworkRecord* networkRecord = static_cast<CCDNetworkRecord*>(
+                    CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+            CleanupStack::PushL( networkRecord );
+            CopyRecordFieldsL( *iNetworkRecord, *networkRecord );
+            CleanupStack::Pop( networkRecord );
+            aCopyInstance->iNetworkRecord = networkRecord;
             }
             break;
         case KWAPAPRecordIndex:
             {
             aCopyInstance->iWapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
-                    CCDRecordBase::CreateCopyRecordL( *iWapAPRecord ) );
+                    CCDRecordBase::CreateCopyRecordL( *iWapAPRecord ) );//TODO, convert to generic copy
             }
             break;
         case KWAPBearerRecordIndex:
             {
             aCopyInstance->iWapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
-                    CCDRecordBase::CreateCopyRecordL( *iWapIPBearerRecord ) );
+                    CCDRecordBase::CreateCopyRecordL( *iWapIPBearerRecord ) );//TODO, convert to generic copy
             }
             break;
         case KMetaDataRecordIndex:
@@ -529,8 +546,12 @@
             {
             if ( iProxyRecord )
                 {
-                aCopyInstance->iProxyRecord = static_cast<CCDProxiesRecord*>(
-                        CCDRecordBase::CreateCopyRecordL( *iProxyRecord ) );
+                CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+                CleanupStack::PushL( proxyRecord );
+                CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+                CleanupStack::Pop( proxyRecord );
+                aCopyInstance->iProxyRecord = proxyRecord;
                 }
             }
             break;
@@ -545,17 +566,19 @@
     }
 
 // ---------------------------------------------------------------------------
-// CCmPluginBaseEng:: CopyRecordFieldsL
+// 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.
 // ---------------------------------------------------------------------------
 //
-void CCmPluginBaseEng::CopyRecordFieldsL(
+EXPORT_C void CCmPluginBaseEng::CopyRecordFieldsL(
         CommsDat::CMDBRecordBase& aSource,
         CommsDat::CMDBRecordBase& aDestination )
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYRECORDFIELDSL_ENTRY );
 
     const SRecordTypeInfo* recordInfo = aSource.GetRecordInfo();
-    if ( recordInfo == NULL )
+    if ( !recordInfo )
         {
         User::Leave( KErrCorrupt );
         }
@@ -563,7 +586,7 @@
     CMDBElement* ptrSource( NULL );
     CMDBElement* ptrDest( NULL );
 
-    while ( recordInfo != NULL && recordInfo->iTypeId != 0 )
+    while ( recordInfo && recordInfo->iTypeId != 0 )
         {
         ptrSource = aSource.GetFieldByIdL( recordInfo->iTypeId );
         ptrDest = aDestination.GetFieldByIdL( recordInfo->iTypeId );
@@ -675,15 +698,15 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADIAPRECORDL_ENTRY );
 
-    iIapId = aIapId;
-
-    // Load IAP record
-    CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord *>(
+    iCmId = aIapId;
+
+    // Load IAP record.
+    CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord*>(
             CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
 
     CleanupStack::PushL( iapRecord );
 
-    iapRecord->SetRecordId( iIapId );
+    iapRecord->SetRecordId( iCmId );
     iapRecord->LoadL( iSession );
 
     CleanupStack::Pop( iapRecord );
@@ -700,19 +723,18 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_LOADPROXYSETTINGL_ENTRY );
 
-    // Load Proxy record
+    // 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
+    // Now try to find the linked proxy record.
+    // Create new record.
     CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
             CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
-
     CleanupStack::PushL( proxyRecord );
 
-    // Prime record
+    // Prime record.
     TPtrC serviceType( iIapRecord->iServiceType );
     proxyRecord->iServiceType.SetL( serviceType );
     proxieRS->iRecords.AppendL( proxyRecord ); // Ownership transfered.
@@ -730,11 +752,11 @@
             {
             CCDProxiesRecord* proxyRecord = (*proxieRS)[i];
 
-            // Compare the record id of these 2 services
+            // Compare the record id of these 2 services.
             if ( TUint32( proxyRecord->iService ) == TUint32( iIapRecord->iService ) )
                 {
                 iProxyRecord = proxyRecord;
-                // Take ownership of this record
+                // Take ownership of this record.
                 proxieRS->iRecords.Remove( i );
                 break;
                 }
@@ -842,7 +864,7 @@
     CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
             aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
 
-    if ( iIapId == 0 )
+    if ( iCmId == 0 )
         {
         // Otherwise predefined iapid.
         if ( !iIapRecord->RecordId() )
@@ -874,31 +896,32 @@
 
         iIapRecord->StoreL( iSession );
 
-        iIapId = iIapRecord->RecordId();
-        aClientPluginInstance->iIapId = iIapId;
+        iCmId = iIapRecord->RecordId();
+        aClientPluginInstance->iIapId = iCmId;
 
         CCDIAPRecord* tempIapRecord = static_cast<CCDIAPRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iIapRecord ) );
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
         CleanupStack::PushL( tempIapRecord );
+        CopyRecordFieldsL( *iIapRecord, *tempIapRecord );
         tempIapRecord->SetElementId( iIapRecord->ElementId() );
 
         aClientPluginInstance->iGenRecordArray.Remove( KIapRecordIndex );
-        CleanupStack::PushL( iapRecord );
+        delete iapRecord;
+        iapRecord = NULL;
 
         aClientPluginInstance->iGenRecordArray.InsertL(
                 static_cast<CommsDat::CCDRecordBase*>( tempIapRecord ),
                 KIapRecordIndex );
 
-        CleanupStack::PopAndDestroy( iapRecord );
         CleanupStack::Pop( tempIapRecord );
         }
     else
         {
         delete iIapRecord;
         iIapRecord = NULL;
-
         iIapRecord = static_cast<CCDIAPRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iapRecord ) );
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CopyRecordFieldsL( *iapRecord, *iIapRecord );
 
         iIapRecord->SetElementId( iapRecord->ElementId() );
         iIapRecord->ModifyL( iSession );
@@ -930,45 +953,34 @@
     CopyAttributes( iapRecord, proxyRecord );
     CheckIfNameModifiedL( iapRecord, proxyRecord );
 
-    if ( proxyRecord->iUseProxyServer )
+    delete iProxyRecord;
+    iProxyRecord = NULL;
+    iProxyRecord = static_cast<CCDProxiesRecord*>(
+            CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+    CopyRecordFieldsL( *proxyRecord, *iProxyRecord );
+    iProxyRecord->SetElementId( proxyRecord->ElementId() );
+
+    if ( !iProxyRecord->RecordId() )
         {
-        delete iProxyRecord;
-        iProxyRecord = NULL;
-
-        iProxyRecord = static_cast<CCDProxiesRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *proxyRecord ) );
-        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 )
             {
-            // 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 );
-            proxyRecord->SetElementId( iProxyRecord->ElementId() );
-            proxyRecord->iService = iServiceRecord->RecordId();
-            proxyRecord->iServiceType.SetL( iIapRecord->iServiceType );
+            iProxyRecord->iProtocolName.SetL( KDefProxyProtocolName );
             }
-        else
-            // Already existing record -> update only.
-            {
-            iProxyRecord->ModifyL( iSession );
-            }
+
+        iProxyRecord->SetRecordId( KCDNewRecordRequest );
+        iProxyRecord->StoreL( iSession );
+        CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
+        proxyRecord->SetElementId( iProxyRecord->ElementId() );
         }
     else
+        // Already existing record -> update only.
         {
-        if ( iProxyRecord->RecordId() )
-            {
-            iProxyRecord->DeleteL( iSession );
-            }
+        iProxyRecord->ModifyL( iSession );
         }
 
     OstTraceFunctionExit0( CCMPLUGINBASEENG_UPDATEPROXYRECORDL_EXIT );
@@ -1062,7 +1074,8 @@
     CheckIfNameModifiedL( iapRecord, networkRecord );
 
     iNetworkRecord = static_cast<CCDNetworkRecord*>(
-            CCDRecordBase::CreateCopyRecordL( *networkRecord ) );
+            CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+    CopyRecordFieldsL( *networkRecord, *iNetworkRecord );
 
     iNetworkRecord->SetElementId( networkRecord->ElementId() );
 
@@ -1116,7 +1129,7 @@
 
     if ( !iProxyRecord )
         {
-        iProxyRecord = static_cast<CCDProxiesRecord *>(
+        iProxyRecord = static_cast<CCDProxiesRecord*>(
                 CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
         }
 
@@ -1226,11 +1239,11 @@
     CheckIfNameModifiedL( iapRecord, wapIPBearerRecord );
 
     iWapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
-            CCDRecordBase::CreateCopyRecordL( *wapAPRecord ) );
+            CCDRecordBase::CreateCopyRecordL( *wapAPRecord ) );//TODO, convert to generic copy
     iWapAPRecord->SetElementId( wapAPRecord->ElementId() );
 
     iWapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
-            CCDRecordBase::CreateCopyRecordL( *wapIPBearerRecord ) );
+            CCDRecordBase::CreateCopyRecordL( *wapIPBearerRecord ) );//TODO, convert to generic copy
     iWapIPBearerRecord->SetElementId( wapIPBearerRecord->ElementId() );
 
     if ( !iWapAPRecord->RecordId() )
@@ -1348,7 +1361,7 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_COPYATTRIBUTES_ENTRY );
 
-    if ( aSrcRecord == NULL || aDstRecord == NULL )
+    if ( !aSrcRecord || !aDstRecord )
         {
         OstTraceFunctionExit0( CCMPLUGINBASEENG_COPYATTRIBUTES_EXIT );
         return;
@@ -1378,7 +1391,7 @@
 
     CleanupStack::PushL( wapBearerRecord );
 
-    wapBearerRecord->iWAPIAP = iIapId;
+    wapBearerRecord->iWAPIAP = iCmId;
     wapRS->iRecords.AppendL( wapBearerRecord );
 
     CleanupStack::Pop( wapBearerRecord );
@@ -1451,6 +1464,7 @@
     {
     OstTraceFunctionEntry0( CCMPLUGINBASEENG_DOMAKEVALIDNAMEL_ENTRY );
 
+    const TInt decimalBase = 10;
     TBool changed( EFalse );
     HBufC* temp = HBufC::NewLC( KApMaxConnNameLength );
     HBufC* temp2 = HBufC::NewLC( KApMaxConnNameLength );
@@ -1475,9 +1489,9 @@
             postfix++;
             // Check the length of postfix, check text length accordingly.
             pf = postfix;
-            for ( i = 1; i < 10; i++ )
+            for ( i = 1; i < decimalBase; i++ )
                 {
-                pf /= 10;
+                pf /= decimalBase;
                 if ( !pf )
                     break;
                 }
@@ -1485,7 +1499,7 @@
             TPtr sgdptr2( temp2->Des() );
             if ( postfix )
                 {
-                if ( postfix < 10 )
+                if ( postfix < decimalBase )
                     {
                     sgdptr2 = prefix.Left( KApMaxConnNameLength - i - 3 );
                     }
@@ -1501,7 +1515,7 @@
             if ( postfix )
                 {
                 TBuf<KMaxPostfixLength> postfixString;
-                if ( postfix > 9 )
+                if ( postfix >= decimalBase )
                     {
                     postfixString.Format( KFormatLargePostfix, postfix );
 //     TODO:               AknTextUtils::LanguageSpecificNumberConversion( postfixString );
@@ -1718,7 +1732,7 @@
 
     if ( iapRS->FindL( iSession ) )
         {
-        if ( iIapId )
+        if ( iCmId )
             {
             // This is not a new CM.
             for ( TInt i = 0; i < iapRS->iRecords.Count(); ++i )
@@ -1787,7 +1801,7 @@
         }
     else if ( iNamingMethod == ENamingUnique )
         {
-        HBufC* newName = DoMakeValidNameL( aName, iIapId );
+        HBufC* newName = DoMakeValidNameL( aName, iCmId );
 
         if ( newName )
             // Name converted to unique.
@@ -1803,7 +1817,7 @@
         }
     else if ( iNamingMethod == ENamingNotAccept )
         {
-        if ( IsValidNameL( aName, iIapId ) )
+        if ( IsValidNameL( aName, iCmId ) )
             {
             iIapRecord->iRecordName.SetL( aName );
             }
@@ -1965,7 +1979,6 @@
     proxyRecord->iServerName.SetL( aProxyServer );
     if ( !aProxyServer.Length() )
         {
-        proxyRecord->iPortNumber = 0;
         proxyRecord->iUseProxyServer = EFalse;
         }
     else
@@ -2049,9 +2062,10 @@
     if ( iIapRecord )
         {
         CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iIapRecord ) );
+                CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
+        CleanupStack::PushL( iapRecord );
+        CopyRecordFieldsL( *iIapRecord, *iapRecord );
         iapRecord->SetElementId( iIapRecord->ElementId() );
-        CleanupStack::PushL( iapRecord );
         aClientPluginInstance->iGenRecordArray.AppendL(
                 static_cast<CommsDat::CCDRecordBase*>( iapRecord ) );
         CleanupStack::Pop( iapRecord );
@@ -2077,9 +2091,10 @@
     if ( iNetworkRecord )
         {
         CCDNetworkRecord* networkRecord = static_cast<CCDNetworkRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iNetworkRecord ) );
+                CCDRecordBase::RecordFactoryL( KCDTIdNetworkRecord ) );
+        CleanupStack::PushL( networkRecord );
+        CopyRecordFieldsL( *iNetworkRecord, *networkRecord );
         networkRecord->SetElementId( iNetworkRecord->ElementId() );
-        CleanupStack::PushL( networkRecord );
         aClientPluginInstance->iGenRecordArray.AppendL(
                 static_cast<CommsDat::CCDRecordBase*>( networkRecord ) );
         CleanupStack::Pop( networkRecord );
@@ -2092,7 +2107,7 @@
     if ( iWapAPRecord )
         {
         CCDWAPAccessPointRecord* wapAPRecord = static_cast<CCDWAPAccessPointRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iWapAPRecord ) );
+                CCDRecordBase::CreateCopyRecordL( *iWapAPRecord ) );//TODO, convert to generic copy
         wapAPRecord->SetElementId( iWapAPRecord->ElementId() );
         CleanupStack::PushL( wapAPRecord );
         aClientPluginInstance->iGenRecordArray.AppendL(
@@ -2107,7 +2122,7 @@
     if ( iWapIPBearerRecord )
         {
         CCDWAPIPBearerRecord* wapIPBearerRecord = static_cast<CCDWAPIPBearerRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iWapIPBearerRecord ) );
+                CCDRecordBase::CreateCopyRecordL( *iWapIPBearerRecord ) );//TODO, convert to generic copy
         wapIPBearerRecord->SetElementId( iWapIPBearerRecord->ElementId() );
         CleanupStack::PushL( wapIPBearerRecord );
         aClientPluginInstance->iGenRecordArray.AppendL(
@@ -2143,9 +2158,10 @@
     if ( iProxyRecord )
         {
         CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
-                CCDRecordBase::CreateCopyRecordL( *iProxyRecord ) );
+                CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
+        CleanupStack::PushL( proxyRecord );
+        CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
         proxyRecord->SetElementId( iProxyRecord->ElementId() );
-        CleanupStack::PushL( proxyRecord );
         aClientPluginInstance->iGenRecordArray.AppendL(
                 static_cast<CommsDat::CCDRecordBase*>( proxyRecord ) );
         CleanupStack::Pop( proxyRecord );
@@ -2176,14 +2192,25 @@
         case ECmIapId: // If the CM has an ECmIapId then the ECmIapId is the ECmId.
         case ECmId:
             {
-            retVal = static_cast<CCDIAPRecord*>(
-                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] )->RecordId();
+            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;
+                    aClientPluginInstance->iGenRecordArray[KWAPBearerRecordIndex] )
+                    ->iWAPAccessPointId;
             }
             break;
         case ECmIapServiceId:
@@ -2217,7 +2244,8 @@
             if ( iMetaDataRecord )
                 {
                 retVal = static_cast<CCDIAPMetadataRecord*>(
-                        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] )->iSeamlessness;
+                        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] )
+                        ->iSeamlessness;
                 }
             else
                 {
@@ -2239,7 +2267,8 @@
 
         case ECmLoadResult:
             {
-            retVal = KErrNone;
+            // This attribute has been deprecated since Symbian^4.
+            User::Leave( KErrNotSupported ); //TODO, update attribute definition comments.
             }
             break;
 
@@ -2301,14 +2330,34 @@
         {
         case ECmProtected:
             {
-            retVal = IsProtected();
+            if ( iBearerType == KUidEmbeddedDestination )
+                {
+                retVal = GetBearerBoolAttributeL(
+                        aAttribute,
+                        aClientPluginInstance->iGenRecordArray,
+                        aClientPluginInstance->iBearerSpecRecordArray );
+                }
+            else
+                {
+                retVal = IsProtected();
+                }
             }
             break;
         case ECmHidden:
             {
-            CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(
-                    aClientPluginInstance->iGenRecordArray[KIapRecordIndex] );
-            retVal = iapRecord->Attributes() & ECDHidden;
+            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:
@@ -2317,9 +2366,12 @@
                 {
                 retVal = EFalse;
                 }
-
-            retVal = static_cast<CCDProxiesRecord*>(
-                    aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )->iUseProxyServer;
+            else
+                {
+                retVal = static_cast<CCDProxiesRecord*>(
+                        aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
+                        ->iUseProxyServer;
+                }
             }
             break;
         case ECmDestination:
@@ -2330,14 +2382,7 @@
                     aClientPluginInstance->iBearerSpecRecordArray ) );
             if ( err )
                 {
-                if ( err == KErrNotFound )
-                    {
-                    retVal = EFalse;
-                    }
-                else
-                    {
-                    User::Leave( err );
-                    }
+                retVal = EFalse;
                 }
             }
             break;
@@ -2385,9 +2430,21 @@
             retVal = metadataRecord->iMetadata & EMetaHiddenAgent;
             }
             break;
+        case ECmMetaHotSpot:
+            {
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+            retVal = metadataRecord->iMetadata & EMetaHotSpot;
+            }
+            break;
         case ECmVirtual:
             {
-            retVal = EFalse;
+            // This is bearer specific attribute.
+            TRAPD( err, retVal = GetBearerInfoBoolL( aAttribute ) );
+            if ( err )
+                {
+                retVal = EFalse;
+                }
             }
             break;
         case ECmWapIPSecurity:
@@ -2430,17 +2487,15 @@
         {
         case ECmBearerIcon:
             {
-            //TODO, read icon name from metadata record after commsdat changes implemented.
-            //CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
-            //        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
-
-            //if ( !metadataRecord )
-            //    {
-            //    User::Leave( KErrCorrupt );
-            //    }
-
-            //retVal = TPtrC( metadataRecord->iIconFileName ).AllocL();
-            retVal = KNullDesC().AllocL();//TODO, check this freed
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+
+            if ( !metadataRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+
+            retVal = TPtrC( metadataRecord->iIconFileName ).AllocL();
             }
             break;
         case ECmStartPage:
@@ -2640,11 +2695,13 @@
             if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
                 {
                 CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
-                        CCDRecordBase::CreateCopyRecordL( *iProxyRecord ) );
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
                 CleanupStack::PushL( proxyRecord );
+                CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
                 proxyRecord->SetElementId( iProxyRecord->ElementId() );
-                aClientPluginInstance->iGenRecordArray.AppendL(
-                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ) );
+                aClientPluginInstance->iGenRecordArray.InsertL(
+                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ),
+                        KProxyRecordIndex );
                 CleanupStack::Pop( proxyRecord );
                 }
 
@@ -2741,11 +2798,13 @@
             if ( !aClientPluginInstance->iGenRecordArray[KProxyRecordIndex] )
                 {
                 CCDProxiesRecord* proxyRecord = static_cast<CCDProxiesRecord*>(
-                        CCDRecordBase::CreateCopyRecordL( *iProxyRecord ) );
+                        CCDRecordBase::RecordFactoryL( KCDTIdProxiesRecord ) );
                 CleanupStack::PushL( proxyRecord );
+                CopyRecordFieldsL( *iProxyRecord, *proxyRecord );
                 proxyRecord->SetElementId( iProxyRecord->ElementId() );
-                aClientPluginInstance->iGenRecordArray.AppendL(
-                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ) );
+                aClientPluginInstance->iGenRecordArray.InsertL(
+                        static_cast<CommsDat::CCDRecordBase*>( proxyRecord ),
+                        KProxyRecordIndex );
                 CleanupStack::Pop( proxyRecord );
                 }
 
@@ -2792,6 +2851,20 @@
                 }
             }
             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*>(
@@ -2826,15 +2899,14 @@
         {
         case ECmBearerIcon:
             {
-            //TODO, write icon name to metadata record after commsdat changes implemented.
-            //CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
-            //        aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
-
-            //if ( !metadataRecord )
-            //    {
-            //    User::Leave( KErrCorrupt );
-            //    }
-            //metadataRecord->iIconFileName.SetL( aValue );
+            CCDIAPMetadataRecord* metadataRecord = static_cast<CCDIAPMetadataRecord*>(
+                    aClientPluginInstance->iGenRecordArray[KMetaDataRecordIndex] );
+
+            if ( !metadataRecord )
+                {
+                User::Leave( KErrCorrupt );
+                }
+            metadataRecord->iIconFileName.SetL( aValue );
             }
             break;
         case ECmStartPage: