cmmanager/cmmgr/cmmserver/src/cmmdestinationinstance.cpp
branchRCL_3
changeset 58 83ca720e2b9a
parent 57 05bc53fe583b
child 62 bb1f80fb7db2
--- a/cmmanager/cmmgr/cmmserver/src/cmmdestinationinstance.cpp	Tue Aug 31 15:35:44 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1842 +0,0 @@
-/*
-* 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:
-* Session side object representing a destination.
-*
-*/
-
-
-#include <cmpluginbaseeng.h>
-#include <datamobilitycommsdattypes.h>
-#include <cmpluginembdestinationdef.h>
-
-#include "cmmdestinationinstance.h"
-#include "cmmsession.h"
-#include "cmmcache.h"
-#include "cmmconnmethodinstance.h"
-#include "cmmconnmethoditem.h"
-#include "cmmanagertextresolver.h"
-
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "cmmdestinationinstanceTraces.h"
-#endif
-
-
-// ---------------------------------------------------------------------------
-// Two phased construction.
-// ---------------------------------------------------------------------------
-//
-CCmmDestinationInstance* CCmmDestinationInstance::NewL(
-        CCmmSession* aCmmSession,
-        CCmmCache* aCache )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_NEWL_ENTRY );
-
-    CCmmDestinationInstance* self = CCmmDestinationInstance::NewLC( aCmmSession, aCache );
-    CleanupStack::Pop( self );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_NEWL_EXIT );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Two phased construction.
-// ---------------------------------------------------------------------------
-//
-CCmmDestinationInstance* CCmmDestinationInstance::NewLC(
-        CCmmSession* aCmmSession,
-        CCmmCache* aCache )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_NEWLC_ENTRY );
-
-    CCmmDestinationInstance* self = new( ELeave ) CCmmDestinationInstance( aCmmSession, aCache );
-    CleanupClosePushL( *self );
-    self->ConstructL();
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_NEWLC_EXIT );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor.
-// ---------------------------------------------------------------------------
-//
-CCmmDestinationInstance::~CCmmDestinationInstance()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CCMMDESTINATIONINSTANCE_ENTRY );
-
-    // Tell cache this handle is beeing closed. Cache will update it's own
-    // bookkeeping accordingly.
-    if ( iCache )
-        {
-        iCache->CloseDestination( *this );
-        }
-    delete iNetworkRecord;
-    delete iDestApRecord;
-    delete iMetadataRecord;
-
-    iConnMethodItemArray.Close();
-    iConnMethodsToBeDeleted.Close();
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CCMMDESTINATIONINSTANCE_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Constructor.
-// ---------------------------------------------------------------------------
-//
-CCmmDestinationInstance::CCmmDestinationInstance(
-        CCmmSession* aCmmSession,
-        CCmmCache* aCache )
-        :
-        iCmmSession( aCmmSession ),
-        iCache( aCache )
-    {
-    OstTraceFunctionEntry0( DUP1_CCMMDESTINATIONINSTANCE_CCMMDESTINATIONINSTANCE_ENTRY );
-
-    iNetworkRecord = NULL;
-    iDestApRecord = NULL;
-    iMetadataRecord = NULL;
-
-    iNetworkRecordStatus = ECmmRecordStatusBlank;
-    iDestApRecordStatus = ECmmRecordStatusBlank;
-    iMetadataRecordStatus = ECmmRecordStatusBlank;
-
-    iStatus = ECmmDestinationStatusChanged;
-    iId = 0;
-    iHandle = 0;
-
-    iProtectionChanged = EFalse;
-    iLastProtectionLevel = CMManager::EProtLevel0;
-    iCurrentProtectionLevel = CMManager::EProtLevel0;
-
-    OstTraceFunctionExit0( DUP1_CCMMDESTINATIONINSTANCE_CCMMDESTINATIONINSTANCE_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Second phase constructor.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::ConstructL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CONSTRUCTL_ENTRY );
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CONSTRUCTL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set the destination ID.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetId( const TUint32 aId )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETID_ENTRY );
-
-    iId = aId;
-
-    // If this is the real ID (not the temporary ID of a new unsaved destination),
-    // write it also into network record.
-    if ( aId > KCmmDestIdIntervalMin && aId < KCmmDestIdIntervalMax )
-        {
-        iNetworkRecord->SetRecordId( aId - KCmDefaultDestinationAPTagId );
-        iDestApRecord->iRecordTag = aId;
-        iDestApRecord->iCustomSelectionPolicy = ( aId - KCmDefaultDestinationAPTagId );
-        iMetadataRecord->iSNAP = aId;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETID_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get the destination ID.
-// ---------------------------------------------------------------------------
-//
-TUint32 CCmmDestinationInstance::GetId() const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETID_ENTRY );
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETID_EXIT );
-    return iId;
-    }
-
-// ---------------------------------------------------------------------------
-// Set the current status of this destination.
-// ECmmDestinationStatusValid: Contents in sync with database.
-// ECmmDestinationStatusChanged: Contents differ from database contents.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetStatus( const TCmmDestinationStatus& aStatus )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETSTATUS_ENTRY );
-
-    switch ( aStatus )
-        {
-        // Fallthrough intended
-        case ECmmDestinationStatusValid:
-        case ECmmDestinationStatusChanged:
-            iStatus = aStatus;
-            break;
-        default:
-            ASSERT(0); // Error, invalid status.
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETSTATUS_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Gets the current status of this destination instance.
-// ---------------------------------------------------------------------------
-//
-TCmmDestinationStatus CCmmDestinationInstance::GetStatus() const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETSTATUS_ENTRY );
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETSTATUS_EXIT );
-    return iStatus;
-    }
-
-// ---------------------------------------------------------------------------
-// Get handle ID.
-// ---------------------------------------------------------------------------
-//
-TInt CCmmDestinationInstance::GetHandle() const
-    {
-    return iHandle;
-    }
-
-// ---------------------------------------------------------------------------
-// Set handle ID.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetHandle( const TInt aHandle )
-    {
-    iHandle = aHandle;
-    }
-
-// ---------------------------------------------------------------------------
-// Set the record status for all records.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetStatusForAllRecords( const TCmmRecordStatus& aStatus )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETSTATUSFORALLRECORDS_ENTRY );
-
-    iDestApRecordStatus = aStatus;
-    iNetworkRecordStatus = aStatus;
-    iMetadataRecordStatus = aStatus;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETSTATUSFORALLRECORDS_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get the destination element ID.
-// ---------------------------------------------------------------------------
-//
-TUint32 CCmmDestinationInstance::GetElementIdL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETELEMENTIDL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestNetworkRecord );
-
-    if ( !iNetworkRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETELEMENTIDL_EXIT );
-    return iNetworkRecord->ElementId() & KCDMaskShowField;
-    }
-
-// ---------------------------------------------------------------------------
-// Get the destination access point record's record tag (destination ID).
-// ---------------------------------------------------------------------------
-//
-TUint32 CCmmDestinationInstance::GetRecordTagFromApRecordL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETRECORDTAGFROMAPRECORDL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestApRecord );
-
-    if ( !iDestApRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETRECORDTAGFROMAPRECORDL_EXIT );
-    return iDestApRecord->iRecordTag;
-    }
-
-// ---------------------------------------------------------------------------
-// Sets a record pointer to the one given as parameter, Ownership is
-// transfered. Also deletes the previous pointer and sets the record status
-// to 'ECmmRecordStatusLoaded'.
-// ---------------------------------------------------------------------------
-//
-TInt CCmmDestinationInstance::SetRecordPointer(
-        const TCmmDbRecords& aDestRecord,
-        CommsDat::CCDRecordBase* aRecordPointer )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETRECORDPOINTER_ENTRY );
-
-    TInt ret( KErrNone );
-    switch ( aDestRecord )
-        {
-        case ECmmDestNetworkRecord:
-            {
-            delete iNetworkRecord;
-            iNetworkRecord = static_cast<CommsDat::CCDNetworkRecord*>( aRecordPointer );
-            iNetworkRecordStatus = ECmmRecordStatusLoaded;
-            }
-            break;
-        case ECmmDestApRecord:
-            {
-            delete iDestApRecord;
-            iDestApRecord = static_cast<CommsDat::CCDAccessPointRecord*>( aRecordPointer );
-            iDestApRecordStatus = ECmmRecordStatusLoaded;
-            }
-            break;
-        case ECmmDestMetadataRecord:
-            {
-            delete iMetadataRecord;
-            iMetadataRecord = static_cast<CCDSNAPMetadataRecord*>( aRecordPointer );
-            iMetadataRecordStatus = ECmmRecordStatusLoaded;
-            }
-            break;
-        default:
-            {
-            ret = KErrNotFound;
-            }
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETRECORDPOINTER_EXIT );
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// Gets a reference to the requested record pointer.
-// ---------------------------------------------------------------------------
-//
-TInt CCmmDestinationInstance::GetRecordPointer(
-        const TCmmDbRecords& aDestRecord,
-        CommsDat::CCDRecordBase*& aRecordPointer )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETRECORDPOINTER_ENTRY );
-
-    TInt ret( KErrNone );
-    aRecordPointer = NULL;
-    switch ( aDestRecord )
-        {
-        case ECmmDestNetworkRecord:
-            {
-            aRecordPointer = static_cast<CommsDat::CCDRecordBase*>( iNetworkRecord );
-            }
-            break;
-        case ECmmDestApRecord:
-            {
-            aRecordPointer = static_cast<CommsDat::CCDRecordBase*>( iDestApRecord );
-            }
-            break;
-        case ECmmDestMetadataRecord:
-            {
-            aRecordPointer = static_cast<CommsDat::CCDRecordBase*>( iMetadataRecord );
-            }
-            break;
-        default:
-            {
-            ASSERT( 0 );
-            ret = KErrNotFound;
-            }
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETRECORDPOINTER_EXIT );
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// Save the contents of this destination into database. All connection methods
-// including embedded destination, that the client has open handles to, are
-// also updated.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::UpdateL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_UPDATEL_ENTRY );
-
-    if ( AllMandatoryRecordsContainData() )
-        {
-        // Check for metadata conflicts.
-        if ( ConflictingMetadataFoundL() )
-            {
-            OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_UPDATEL_EXIT );
-
-            User::Leave( KErrAlreadyExists );
-            }
-
-        // Check that the destination name is still valid and not in use already.
-        if ( iCache->DestinationExistsWithNameL( iNetworkRecord->iRecordName.GetL(), iId ) )
-            {
-            OstTraceFunctionExit0( DUP1_CCMMDESTINATIONINSTANCE_UPDATEL_EXIT );
-
-            User::Leave( KErrAlreadyExists );
-            }
-
-        iCache->UpdateDestinationL( *this );
-        }
-    else
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    OstTraceFunctionExit0( DUP2_CCMMDESTINATIONINSTANCE_UPDATEL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get the destination name.
-// ---------------------------------------------------------------------------
-//
-TDesC& CCmmDestinationInstance::GetDestinationNameL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETDESTINATIONNAMEL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestNetworkRecord );
-
-    if ( !iNetworkRecord )
-        {
-        OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETDESTINATIONNAMEL_EXIT );
-
-        User::Leave( KErrCorrupt );
-        }
-
-    OstTraceFunctionExit0( DUP1_CCMMDESTINATIONINSTANCE_GETDESTINATIONNAMEL_EXIT );
-    return iNetworkRecord->iRecordName.GetL();
-    }
-
-// ---------------------------------------------------------------------------
-// Get the localised destination name.
-// ---------------------------------------------------------------------------
-//
-HBufC* CCmmDestinationInstance::GetLocalisedDestinationNameL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETLOCALISEDDESTINATIONNAMEL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestNetworkRecord );
-
-    if ( !iNetworkRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    TUint32 purpose( 0 );
-    GetMetadataL( CMManager::ESnapMetadataPurpose, purpose );
-    HBufC* resolvedText( NULL );
-    TBool isLocalised( EFalse );
-    switch ( purpose )
-        {
-        case CMManager::ESnapPurposeInternet:
-            {
-            _LIT( KDestinationTextId, "txt_occ_dblist_internet");
-            resolvedText = CCmManagerTextResolver::ResolveTextL( KDestinationTextId );
-            isLocalised = ETrue;
-            }
-            break;
-        case CMManager::ESnapPurposeOperator:
-            {
-            _LIT( KDestinationTextId, "txt_occ_dblist_operator_services");
-            resolvedText = CCmManagerTextResolver::ResolveTextL( KDestinationTextId );
-            isLocalised = ETrue;
-            }
-            break;
-        case CMManager::ESnapPurposeIntranet:
-            {
-            _LIT( KDestinationTextId, "txt_occ_dblist_intranet");
-            resolvedText = CCmManagerTextResolver::ResolveTextL( KDestinationTextId );
-            isLocalised = ETrue;
-            }
-            break;
-        default:
-            break;
-        }
-
-    // Not Internet, operator or intranet, or something went wrong.
-    if ( !isLocalised || ( isLocalised && !resolvedText ) )
-        {
-        resolvedText = TPtrC( iNetworkRecord->iRecordName ).AllocL();
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETLOCALISEDDESTINATIONNAMEL_EXIT );
-    return resolvedText;
-    }
-
-// ---------------------------------------------------------------------------
-// Set the destination name.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetDestinationNameL( const TDesC& aDestinationName )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETDESTINATIONNAMEL_ENTRY );
-
-    // Write action, load all records.
-    LoadAllRecordsL();
-
-    iNetworkRecord->iRecordName.SetL( aDestinationName );
-    iDestApRecord->iRecordName.SetL( aDestinationName );
-
-    iNetworkRecordStatus = ECmmRecordStatusModified;
-    iDestApRecordStatus = ECmmRecordStatusModified;
-    iStatus = ECmmDestinationStatusChanged;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETDESTINATIONNAMEL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get the destination icon.
-// ---------------------------------------------------------------------------
-//
-HBufC* CCmmDestinationInstance::GetDestinationIconL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETDESTINATIONICONL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestMetadataRecord );
-
-    if ( !iMetadataRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    HBufC* icon( NULL );
-    icon = TPtrC( iMetadataRecord->iIconFileName ).AllocL();
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETDESTINATIONICONL_EXIT );
-    return icon;
-    }
-
-// ---------------------------------------------------------------------------
-// Set the destination icon.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetDestinationIconL( const TDesC& aDestinationIcon )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETDESTINATIONICONL_ENTRY );
-
-    // Write action, load all records.
-    LoadAllRecordsL();
-
-    iMetadataRecord->iIconFileName.SetL( aDestinationIcon );
-
-    iMetadataRecordStatus = ECmmRecordStatusModified;
-    iStatus = ECmmDestinationStatusChanged;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETDESTINATIONICONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get metadata of specified type.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::GetMetadataL(
-        const CMManager::TSnapMetadataField& aMetadataField,
-        TUint32& aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETMETADATAL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestMetadataRecord );
-
-    if ( !iMetadataRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    switch ( aMetadataField )
-        {
-        case CMManager::ESnapMetadataInternet:
-            aMetadata = ( TUint32 )( iMetadataRecord->iMetadata ) &
-                    CMManager::ESnapMetadataInternet;
-            break;
-        case CMManager::ESnapMetadataHighlight:
-            aMetadata = ( TUint32 )( iMetadataRecord->iMetadata ) &
-                    CMManager::ESnapMetadataHighlight;
-            break;
-        case CMManager::ESnapMetadataHiddenAgent:
-            aMetadata = ( TUint32 )( iMetadataRecord->iMetadata ) &
-                    CMManager::ESnapMetadataHiddenAgent;
-            break;
-        case CMManager::ESnapMetadataDestinationIsLocalised:
-            aMetadata = ( ( TUint32 )( iMetadataRecord->iMetadata ) &
-                    CMManager::ESnapMetadataDestinationIsLocalised ) >> 4;
-            break;
-        case CMManager::ESnapMetadataPurpose:
-            aMetadata = ( ( TUint32 )( iMetadataRecord->iMetadata ) &
-                    CMManager::ESnapMetadataPurpose ) >> 8;
-            break;
-        default:
-            User::Leave( KErrArgument );
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETMETADATAL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of specified type.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataL(
-        const CMManager::TSnapMetadataField& aMetadataField,
-        const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATAL_ENTRY );
-
-    // Write action, load all records.
-    LoadAllRecordsL();
-
-    switch ( aMetadataField )
-        {
-        case CMManager::ESnapMetadataInternet:
-            SetMetadataInternetL( aMetadata );
-            break;
-        case CMManager::ESnapMetadataHighlight:
-            SetMetadataHighlight( aMetadata );
-            break;
-        case CMManager::ESnapMetadataHiddenAgent:
-            SetMetadataHiddenAgentL( aMetadata );
-            break;
-        case CMManager::ESnapMetadataDestinationIsLocalised:
-            SetMetadataLocalizationL( aMetadata );
-            break;
-        case CMManager::ESnapMetadataPurpose:
-            SetMetadataPurposeL( aMetadata );
-            break;
-        default:
-            User::Leave( KErrArgument );
-            break;
-        }
-
-    iMetadataRecordStatus = ECmmRecordStatusModified;
-    iStatus = ECmmDestinationStatusChanged;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATAL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Get destination protection level.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::GetProtectionL( CMManager::TProtectionLevel& aProtectionLevel )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_GETPROTECTIONL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestMetadataRecord );
-
-    if ( !iMetadataRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    TUint32 value = ( ( TUint32 )( iMetadataRecord->iMetadata ) &
-            KDestProtectionLevelMask ) >> KBitsToShiftDestProtectionLevel;
-    switch ( value )
-        {
-        case CMManager::EProtLevel0:
-            aProtectionLevel = CMManager::EProtLevel0;
-            break;
-        case CMManager::EProtLevel1:
-            aProtectionLevel = CMManager::EProtLevel1;
-            break;
-        case CMManager::EProtLevel2:
-            aProtectionLevel = CMManager::EProtLevel2;
-            break;
-        case CMManager::EProtLevel3:
-            aProtectionLevel = CMManager::EProtLevel3;
-            break;
-        default:
-            User::Leave( KErrCorrupt );
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_GETPROTECTIONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set destination protection level.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetProtectionL(
-        CMManager::TProtectionLevel aProtectionLevel )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETPROTECTIONL_ENTRY );
-
-    // Write action, load all records.
-    LoadAllRecordsL();
-
-    // Protection level is saved to CommsDat during update-call, so we need to
-    // keep track of both the original value and the currently set new value.
-    iCurrentProtectionLevel = aProtectionLevel;
-    if ( !iProtectionChanged )
-        {
-        GetProtectionL( iLastProtectionLevel );
-        }
-    if ( aProtectionLevel == iLastProtectionLevel )
-        {
-        iProtectionChanged = EFalse;
-        }
-    else
-        {
-        iProtectionChanged = ETrue;
-        }
-
-    // Read current metadata without protection bits.
-    TUint32 currentMetadata =
-            ( ( TUint32 )( iMetadataRecord->iMetadata ) & ( ~KDestProtectionLevelMask ) );
-    // Add new protection bits.
-    iMetadataRecord->iMetadata =
-            currentMetadata | ( aProtectionLevel << KBitsToShiftDestProtectionLevel );
-
-    iMetadataRecordStatus = ECmmRecordStatusModified;
-    iStatus = ECmmDestinationStatusChanged;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETPROTECTIONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Return true if protection level has been changed.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::ProtectionChanged()
-    {
-    return iProtectionChanged;
-    }
-
-// ---------------------------------------------------------------------------
-// Return the previous valid protection level of this connection method
-// instance.
-// ---------------------------------------------------------------------------
-//
-CMManager::TProtectionLevel CCmmDestinationInstance::LastProtectionLevel()
-    {
-    return iLastProtectionLevel;
-    }
-
-// ---------------------------------------------------------------------------
-// Return the protection level currently set into this destination instance.
-// ---------------------------------------------------------------------------
-//
-CMManager::TProtectionLevel CCmmDestinationInstance::CurrentProtectionLevelL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CURRENTPROTECTIONLEVELL_ENTRY );
-
-    CMManager::TProtectionLevel protLevel( iCurrentProtectionLevel );
-    if ( !iProtectionChanged )
-        {
-        GetProtectionL( protLevel );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CURRENTPROTECTIONLEVELL_EXIT );
-    return protLevel;
-    }
-
-// ---------------------------------------------------------------------------
-// Adds a connection method into this destination. Returns the index (priority)
-// in the connection method array where the connection method was added.
-// Embedded destinations can not be added with this method, use
-// AddEmbeddedDestinationL() instead.
-// ---------------------------------------------------------------------------
-//
-TInt CCmmDestinationInstance::AddConnMethodL(
-        CCmmConnMethodInstance& aConnMethodInstance )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_ADDCONNMETHODL_ENTRY );
-
-    TUint32 connMethodId( aConnMethodInstance.GetId() );
-
-    // Check that the connection method is not an embedded destination.
-    if ( aConnMethodInstance.IsEmbeddedDestination() )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // Check that the connection method is not already inside this destination.
-    for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( connMethodId == iConnMethodItemArray[i].iId )
-            {
-            User::Leave( KErrAlreadyExists );
-            }
-        }
-
-    // Remove the connection method from delete list, if found there.
-    for ( TInt i = 0; i < iConnMethodsToBeDeleted.Count(); i++ )
-        {
-        if ( connMethodId == iConnMethodsToBeDeleted[i] )
-            {
-            iConnMethodsToBeDeleted.Remove( i );
-            break;
-            }
-        }
-
-    // Get the priority value of this connection method according to bearer.
-    TUint32 bearerType( aConnMethodInstance.GetBearerType() );
-    TUint bearerPriority( 0 );
-    iCache->BearerPriorityFromIapRecordL(
-            ( CommsDat::CCDIAPRecord* )aConnMethodInstance.GetPluginDataInstance()
-                    ->iGenRecordArray[KIapRecordIndex],
-            bearerPriority );
-    TCmmConnMethodItem item( connMethodId, bearerType, bearerPriority, 0 );
-
-    // Find out the correct position for the connection method inside this
-    // destination.
-
-    // If the destination contains 1 or more connection methods of the same
-    // bearer type, position the new connection method after the last of these
-    // connection methods.
-    // If not, position the connection method before the first connection
-    // method found that has an equal or greater bearer based priority.
-
-    // The relevant connection method item count is the number of connection
-    // methods excluding a possible embedded destination.
-    TInt relevantCount = iConnMethodItemArray.Count();
-    if ( relevantCount > 0 && iConnMethodItemArray[ relevantCount - 1 ].IsEmbedded() )
-        {
-        relevantCount--;
-        }
-    // The final position will be between 0 and relevantCount.
-    TInt index( relevantCount );
-
-    TBool positionFound( EFalse );
-    TBool connMethodIsVirtual = aConnMethodInstance.GetBoolAttributeL( CMManager::ECmVirtual );
-    if ( connMethodIsVirtual )
-        {
-        // Ask link information only if this is a virtual IAP.
-        TUint32 linkedIapId = aConnMethodInstance.GetIntAttributeL( CMManager::ECmNextLayerIapId );
-        if ( linkedIapId == 0 )
-            {
-            // If this is a virtual IAP that doesn't point to an IAP, position it at
-            // the end of the list.
-            item.iPriority = CMManager::KDataMobilitySelectionPolicyPriorityWildCard;
-            index = relevantCount;
-            positionFound = ETrue;
-            }
-        else
-            {
-            // If this is a virtual IAP that links to another IAP, position it
-            // as if it was that IAP.
-            TCmmConnMethodItem linkedItem;
-            TInt err = iCache->GetConnMethodItem( linkedIapId, linkedItem );
-            if ( err )
-                {
-                User::Leave( KErrArgument );
-                }
-            if ( linkedItem.IsVirtual() )
-                {
-                // This is a virtual IAP linking to another virtual IAP.
-                index = relevantCount;
-                positionFound = ETrue;
-                }
-            bearerType = linkedItem.iBearerType;
-            bearerPriority = linkedItem.iBearerPriority;
-            }
-        }
-
-    if ( !positionFound )
-        {
-        // Search for any connection methods with the same bearer type.
-        for ( TInt i = 0; i < relevantCount; i++ )
-            {
-            if ( iConnMethodItemArray[i].iBearerType == bearerType )
-                {
-                index = i + 1;
-                positionFound = ETrue;
-                // Don't break, need find last item.
-                }
-            }
-        }
-    if ( !positionFound )
-        {
-        // No connection method found with the same bearer type. Position
-        // the connection method according to bearer priority.
-        for ( TInt i = 0; i < relevantCount; i++ )
-            {
-            if ( iConnMethodItemArray[i].iBearerPriority >= bearerPriority )
-                {
-                index = i;
-                break;
-                }
-            }
-        }
-
-    // Add the connection method item into this destination at the correct
-    // position (priority).
-    iConnMethodItemArray.InsertL( item, index );
-
-    SetStatus( ECmmDestinationStatusChanged );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_ADDCONNMETHODL_EXIT );
-    return index;
-    }
-
-// ---------------------------------------------------------------------------
-// Adds an embedded destination into this destination. Returns the index in
-// the connection method array where the connection method was added.
-// ---------------------------------------------------------------------------
-//
-TInt CCmmDestinationInstance::AddEmbeddedDestinationL(
-        const CCmmDestinationInstance& aEmbeddedDestinationInstance )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_ADDEMBEDDEDDESTINATIONL_ENTRY );
-
-    TUint32 embeddedDestinationId( aEmbeddedDestinationInstance.GetId() );
-
-    // Check that not adding itself.
-    if ( embeddedDestinationId == iId )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // Check that the embedded destination is not already an embedded
-    // destination in this destination.
-    if ( HasEmbeddedWithId( embeddedDestinationId ) )
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-
-    // A destination can not be added into a destination that is itself an
-    // embedded destination.
-    if ( iCache->DestinationIsEmbedded( iId ) )
-        {
-        User::Leave( KErrNotSupported );
-        }
-
-    // A destination can not be added into a destination that already has an
-    // embedded destination.
-    if ( HasEmbedded() || iCache->DestinationHasEmbedded( iId ) )
-        {
-        User::Leave( KErrNotSupported );
-        }
-
-    // A destination that already has an embedded destination can not be added
-    // into a destination.
-    if ( aEmbeddedDestinationInstance.HasEmbedded() ||
-            iCache->DestinationHasEmbedded( embeddedDestinationId ) )
-        {
-        User::Leave( KErrNotSupported );
-        }
-
-    // Check session side destination instances for all clients.
-    // - Check that any destination instance does not contain aDestinationId as
-    //   embedded destination.
-    // - Check that any destination instance for aEmbeddedDestinationId does
-    //   not contain an embedded destination.
-    if ( iCmmSession->EmbeddedDestinationConflictsFromAllSessions( iId, embeddedDestinationId ) )
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-
-    // Add the embedded destination at the end of the connection method item array.
-    TInt index = iConnMethodItemArray.Count();
-    TCmmConnMethodItem item(
-            embeddedDestinationId,
-            KUidEmbeddedDestination,
-            CMManager::KDataMobilitySelectionPolicyPriorityWildCard,
-            CMManager::KDataMobilitySelectionPolicyPriorityWildCard );
-    iConnMethodItemArray.AppendL( item );
-
-    SetStatus( ECmmDestinationStatusChanged );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_ADDEMBEDDEDDESTINATIONL_EXIT );
-    return index;
-    }
-
-// ---------------------------------------------------------------------------
-// Delete a connection method that belongs to this destination. If the
-// connection method belongs to any other destination, it is only removed from
-// this destination and not deleted. Does not call update.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::DeleteConnMethodFromDestinationL(
-        const CCmmConnMethodInstance& aConnMethodInstance )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_DELETECONNMETHODFROMDESTINATIONL_ENTRY );
-
-    // Check that the connection method is inside this destination.
-    TUint32 connMethodId( aConnMethodInstance.GetId() );
-    TInt index( KErrNotFound );
-    for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( connMethodId == iConnMethodItemArray[i].iId )
-            {
-            index = i;
-            break;
-            }
-        }
-    if ( index < 0 )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // Check if the connection method removal is blocked by any virtual IAPs.
-    if ( ConnMethodInDestinationButLocked( connMethodId ) )
-        {
-        User::Leave( KErrLocked );
-        }
-
-    // Check if any virtual IAP points to this connection method, thus blocking
-    // the delete.
-    if ( iCache->ConnMethodPointedToByVirtualIap( connMethodId ) )
-        {
-        User::Leave( KErrLocked );
-        }
-
-    // Check that the connection method is not in use by an active connection.
-    if ( iCache->CheckIfCmConnected( connMethodId ) )
-        {
-        User::Leave( KErrInUse );
-        }
-
-    // This will also remove an embedded destination.
-    iConnMethodItemArray.Remove( index );
-    SetStatus( ECmmDestinationStatusChanged );
-
-    // If this connection method is an embedded destination, then removing it
-    // from this destination is enough. The destination is not deleted.
-    if ( !aConnMethodInstance.IsEmbeddedDestination() )
-        {
-        // Add connection method to delete list only if not referenced from any
-        // other destination (in database or in any destination handles for the
-        // client currently beeing served).
-        if ( !iCache->ConnMethodInOtherDestination( connMethodId, iId ) &&
-                !iCmmSession->ConnMethodInOtherDestination( connMethodId, iId ) )
-            {
-            if ( iConnMethodsToBeDeleted.Find( connMethodId ) == KErrNotFound )
-                {
-                iConnMethodsToBeDeleted.AppendL( connMethodId );
-                }
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_DELETECONNMETHODFROMDESTINATIONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Remove a connection method from this destination. If the second attribute
-// aTestIfConnected is false, the test to check if connection method is in use
-// is skipped. In this case this should have been already tested by the caller.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::RemoveConnMethodFromDestinationL(
-        const CCmmConnMethodInstance& aConnMethodInstance,
-        const TBool aTestIfConnected )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_REMOVECONNMETHODFROMDESTINATIONL_ENTRY );
-
-    // Check that the connection method is inside this destination.
-    TUint32 connMethodId( aConnMethodInstance.GetId() );
-    TInt index( KErrNotFound );
-    for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( connMethodId == iConnMethodItemArray[i].iId )
-            {
-            index = i;
-            break;
-            }
-        }
-    if ( index < 0 )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // Check if the connection method removal is blocked by any virtual IAPs.
-    if ( ConnMethodInDestinationButLocked( connMethodId ) )
-        {
-        User::Leave( KErrLocked );
-        }
-
-    if ( aTestIfConnected )
-        {
-        // Check that the connection method is not in use by an active connection.
-        if ( iCache->CheckIfCmConnected( connMethodId ) )
-            {
-            User::Leave( KErrInUse );
-            }
-        }
-
-    // This will also remove an embedded destination.
-    iConnMethodItemArray.Remove( index );
-    SetStatus( ECmmDestinationStatusChanged );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_REMOVECONNMETHODFROMDESTINATIONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Modifies the priority of a connection method inside this destination.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::ModifyConnMethodPriorityL(
-        CCmmConnMethodInstance& aConnMethodInstance,
-        TUint aIndex )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_MODIFYCONNMETHODPRIORITYL_ENTRY );
-
-    // Check index range.
-    if ( aIndex >= iConnMethodItemArray.Count() )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // Check if the connection method is in this destination. Also store the
-    // current index of the connection method.
-    TInt oldIndex( KErrNotFound );
-    for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( iConnMethodItemArray[i].iId == aConnMethodInstance.GetId() )
-            {
-            oldIndex = i;
-            break;
-            }
-        }
-    if ( oldIndex == KErrNotFound )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    // If connection method is an embedded destination, just return silently.
-    if ( aConnMethodInstance.IsEmbeddedDestination() )
-        {
-        OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_MODIFYCONNMETHODPRIORITYL_EXIT );
-        return;
-        }
-
-    // If connection method is a virtual IAP linking to a destination, just return silently.
-    if ( aConnMethodInstance.GetBoolAttributeL( CMManager::ECmVirtual ) &&
-            aConnMethodInstance.GetIntAttributeL( CMManager::ECmNextLayerIapId ) == 0 )
-        {
-        OstTraceFunctionExit0( DUP1_CCMMDESTINATIONINSTANCE_MODIFYCONNMETHODPRIORITYL_EXIT );
-        return;
-        }
-
-    // If the given index points to any wildcard priority connection method,
-    // adjust it so it points to the last priority position.
-    TUint numberOfConnMethodsWithPriority( NumberOfConnMethodsWithPriority() );
-    if ( aIndex >= numberOfConnMethodsWithPriority )
-        {
-        if ( numberOfConnMethodsWithPriority == 0 )
-            {
-            // Can't be 0, since aConnMethodInstance is not a wildcard IAP and
-            // is in the array.
-            ASSERT( 0 );
-            User::Leave( KErrCorrupt );
-            }
-        aIndex = numberOfConnMethodsWithPriority - 1;
-        }
-
-    // Check if the priority is changing from current.
-    if ( oldIndex == aIndex )
-        {
-        OstTraceFunctionExit0( DUP2_CCMMDESTINATIONINSTANCE_MODIFYCONNMETHODPRIORITYL_EXIT );
-        return;
-        }
-
-    // Change the location of the connection method to reflect the new priority.
-    TCmmConnMethodItem item = iConnMethodItemArray[oldIndex];
-    iConnMethodItemArray.Remove( oldIndex );
-    iConnMethodItemArray.InsertL( item, ( TInt )aIndex );
-
-    SetStatus( ECmmDestinationStatusChanged );
-
-    OstTraceFunctionExit0( DUP3_CCMMDESTINATIONINSTANCE_MODIFYCONNMETHODPRIORITYL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Finds a connection method instance that belongs to the same session and
-// matches the provided ID. Return NULL if no match is found.
-// ---------------------------------------------------------------------------
-//
-CCmmConnMethodInstance* CCmmDestinationInstance::FindConnMethodInstanceFromSessionById(
-        const TUint32 aConnMethodId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_FINDCONNMETHODINSTANCEFROMSESSIONBYID_ENTRY );
-
-    CCmmConnMethodInstance* connMethodInstance = iCmmSession->
-            FindConnMethodInstanceById( aConnMethodId );
-
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_FINDCONNMETHODINSTANCEFROMSESSIONBYID_EXIT );
-    return connMethodInstance;
-    }
-
-// ---------------------------------------------------------------------------
-// Finds a destination instance that belongs to the same session and matches
-// the provided ID. Return NULL if no match is found.
-// ---------------------------------------------------------------------------
-//
-CCmmDestinationInstance* CCmmDestinationInstance::FindDestinationInstanceFromSessionById(
-        const TUint32 aDestinationId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_FINDDESTINATIONINSTANCEFROMSESSIONBYID_ENTRY );
-
-    CCmmDestinationInstance* destInstance =
-            iCmmSession->FindDestinationInstanceById( aDestinationId );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_FINDDESTINATIONINSTANCEFROMSESSIONBYID_EXIT );
-    return destInstance;
-    }
-
-// ---------------------------------------------------------------------------
-// Check from all open destination handles in the same session if the given
-// connection method is inside any of them. The given destination is skipped.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::ConnMethodInOtherDestinationInSession(
-        const TUint32 aConnMethodId,
-        const TUint32 aDestinationId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CONNMETHODINOTHERDESTINATIONINSESSION_ENTRY );
-
-    TBool inOtherSession = iCmmSession->
-            ConnMethodInOtherDestination( aConnMethodId, aDestinationId );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CONNMETHODINOTHERDESTINATIONINSESSION_EXIT );
-    return inOtherSession;
-    }
-
-// ---------------------------------------------------------------------------
-// Check if the given connection method is in this destination. Include
-// embedded destinations.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::ValidConnMethodIdInDestinationIncludeEmbedded(
-        const TUint32 aConnMethodId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_VALIDCONNMETHODIDINDESTINATIONINCLUDEEMBEDDED_ENTRY );
-
-    TBool validity( EFalse );
-    if ( aConnMethodId > 0 )
-        {
-        for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-            {
-            if ( iConnMethodItemArray[i].iId == aConnMethodId )
-                {
-                validity = ETrue;
-                break;
-                }
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_VALIDCONNMETHODIDINDESTINATIONINCLUDEEMBEDDED_EXIT );
-    return validity;
-    }
-
-// ---------------------------------------------------------------------------
-// Check if the given connection method is inside this destination and if it
-// is in a 'locked' status. A locked connection method can't be deleted nor
-// removed from the destination. A connection method becomes locked if it is
-// the only remaining connection method in a destination and a virtual IAP
-// points into that destination.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::ConnMethodInDestinationButLocked(
-        const TUint32 aConnMethodId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CONNMETHODINDESTINATIONBUTLOCKED_ENTRY );
-
-    TBool result( EFalse );
-    if ( iConnMethodItemArray.Count() == 1 )
-        {
-        if ( iConnMethodItemArray[0].iId == aConnMethodId )
-            {
-            if ( iCache->DestinationPointedToByVirtualIap( iId ) )
-                {
-                result = ETrue;
-                }
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CONNMETHODINDESTINATIONBUTLOCKED_EXIT );
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// Counts how many connection methods that require priority information are
-// currently in this destination. This excludes any virtual IAPs that point to
-// a destination or any embedded destinations from the count. Assumes the
-// connection method array is in order so all wildcard priority IAPs are at the
-// end of the list.
-// ---------------------------------------------------------------------------
-//
-TUint CCmmDestinationInstance::NumberOfConnMethodsWithPriority() const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_NUMBEROFCONNMETHODSWITHPRIORITY_ENTRY );
-
-    TUint count( iConnMethodItemArray.Count() );
-
-    for ( TUint i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( iConnMethodItemArray[i].IsEmbedded() || iConnMethodItemArray[i].iPriority ==
-                CMManager::KDataMobilitySelectionPolicyPriorityWildCard )
-            {
-            count--;
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_NUMBEROFCONNMETHODSWITHPRIORITY_EXIT );
-    return count;
-    }
-
-// ---------------------------------------------------------------------------
-// Check if this destination has an embedded destination. Checks the current
-// (possibly unsaved) status of this destination handle, not the current status
-// in database.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::HasEmbedded() const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_HASEMBEDDED_ENTRY );
-
-    TBool result( EFalse );
-
-    // If there is an embedded destination, it will be at the very last
-    // position in the connection method item array.
-    TInt index = iConnMethodItemArray.Count() - 1;
-    if ( index >= 0 )
-        {
-        if ( iConnMethodItemArray[index].IsEmbedded() )
-            {
-            result = ETrue;
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_HASEMBEDDED_EXIT );
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// Check if this destination has an embedded destination with the specified ID.
-// Checks the current (possibly unsaved) status of this destination handle, not
-// the current status in database.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::HasEmbeddedWithId( const TUint32 aDestinationId ) const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_HASEMBEDDEDWITHID_ENTRY );
-
-    TBool result( EFalse );
-
-    // If there is an embedded destination, it will be at the very last
-    // position in the connection method item array.
-    TInt index = iConnMethodItemArray.Count() - 1;
-    if ( index >= 0 )
-        {
-        // No need to check bearer, since ID will not match anyway if the last
-        // item is not an embedded destination.
-        if ( iConnMethodItemArray[index].iId == aDestinationId )
-            {
-            result = ETrue;
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_HASEMBEDDEDWITHID_EXIT );
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// After update/delete to database, refresh temporary ID to real ID if
-// necessary and refresh status information for any related handles for
-// all client sessions.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::RefreshHandlesForAllSessions( const TCmmIdStruct& aIdStruct )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_REFRESHHANDLESFORALLSESSIONS_ENTRY );
-
-    iCmmSession->RefreshHandlesForAllSessions( aIdStruct );
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_REFRESHHANDLESFORALLSESSIONS_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// If the destination contains a connection method with matching temporary ID,
-// updates the ID to real ID. This is done after the connection method has been
-// successfully saved into the database.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::RefreshConnMethodId( const TCmmIdStruct& aIdStruct )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_REFRESHCONNMETHODID_ENTRY );
-
-    for ( TInt i = 0; i < iConnMethodItemArray.Count(); i++ )
-        {
-        if ( iConnMethodItemArray[i].iId == aIdStruct.iTemporaryId )
-            {
-            iConnMethodItemArray[i].iId = aIdStruct.iRealId;
-            break;
-            }
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_REFRESHCONNMETHODID_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Called after this destination has been updated and database transaction has
-// completed successfully. Sets the internal state of this destination instance
-// to reflect the new valid state.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::UpdateSuccessful()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_UPDATESUCCESSFUL_ENTRY );
-
-    SetStatus( ECmmDestinationStatusValid );
-    SetStatusForAllRecords( ECmmRecordStatusLoaded );
-    iConnMethodsToBeDeleted.Reset();
-    iProtectionChanged = EFalse;
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_UPDATESUCCESSFUL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Checks if all mandatory records contain data and are ready to be saved into
-// database.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::AllMandatoryRecordsContainData() const
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_ALLMANDATORYRECORDSCONTAINDATA_ENTRY );
-
-    TBool result( ETrue );
-
-    if ( iNetworkRecordStatus != ECmmRecordStatusLoaded &&
-            iNetworkRecordStatus != ECmmRecordStatusModified )
-        {
-        result = EFalse;
-        }
-    if ( iDestApRecordStatus != ECmmRecordStatusLoaded &&
-            iDestApRecordStatus != ECmmRecordStatusModified )
-        {
-        result = EFalse;
-        }
-    if ( iMetadataRecordStatus != ECmmRecordStatusLoaded &&
-            iMetadataRecordStatus != ECmmRecordStatusModified )
-        {
-        result = EFalse;
-        }
-    if ( !iNetworkRecord || !iDestApRecord || !iMetadataRecord )
-        {
-        result = EFalse;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_ALLMANDATORYRECORDSCONTAINDATA_EXIT );
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// Loads a requested type of record from database if it is not yet loaded.
-//
-// Currently all records are loaded when client opens a handle to a
-// destination, but if future optimizations are added and records are only
-// loaded when needed, the functionality of this method becomes essential.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::LoadRecordIfMissingL( TCmmDbRecords aRecordType )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_REFRESHRECORDL_ENTRY );
-
-    TCmmRecordStatus status( ECmmRecordStatusBlank );
-    switch ( aRecordType )
-        {
-        case ECmmDestNetworkRecord:
-            status = iNetworkRecordStatus;
-            break;
-        case ECmmDestApRecord:
-            status = iDestApRecordStatus;
-            break;
-        case ECmmDestMetadataRecord:
-            status = iMetadataRecordStatus;
-            break;
-        default:
-            User::Leave( KErrCorrupt ); // Error, unknown type.
-            break;
-        }
-
-    switch ( status )
-        {
-        // Fallthrough intended
-        case ECmmRecordStatusBlank:
-            iCache->LoadDestinationRecordL( *this, aRecordType );
-            break;
-        case ECmmRecordStatusLoaded:
-        case ECmmRecordStatusModified:
-            // Record is up-to-date.
-            break;
-        case ECmmRecordStatusExpired:
-        case ECmmRecordStatusUnsaved:
-        default:
-            User::Leave( KErrCorrupt ); // Error, invalid or unknown status.
-            break;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_REFRESHRECORDL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Loads all records from database that are not up-to-date.
-// Guarantees the record pointers are valid or leaves.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::LoadAllRecordsL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_LOADALLRECORDSL_ENTRY );
-
-    LoadRecordIfMissingL( ECmmDestNetworkRecord );
-    LoadRecordIfMissingL( ECmmDestApRecord );
-    LoadRecordIfMissingL( ECmmDestMetadataRecord );
-
-    if ( !iNetworkRecord || !iDestApRecord || !iMetadataRecord )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_LOADALLRECORDSL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of type ESnapMetadataInternet.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataInternetL( const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATAINTERNETL_ENTRY );
-
-    if ( aMetadata )
-        {
-        if ( iCache->DestinationExistsWithMetadataLocalizedL(
-                *this,
-                CMManager::ELocalisedDestInternet ) )
-            {
-            User::Leave( KErrAlreadyExists );
-            }
-        // Clear ESnapMetadataHiddenAgent-bit.
-        TUint32 value = iMetadataRecord->iMetadata & ( ~CMManager::ESnapMetadataHiddenAgent );
-
-        // Set old ESnapMetadataInternet-bit.
-        value = value | CMManager::ESnapMetadataInternet;
-
-        // Clear ESnapMetadataDestinationIsLocalised-bits.
-        value = value & ( ~CMManager::ESnapMetadataDestinationIsLocalised );
-        // Set ELocalisedDestInternet-value.
-        iMetadataRecord->iMetadata = value | ( CMManager::ELocalisedDestInternet << 4 );
-        value = value | ( CMManager::ELocalisedDestInternet << 4 );
-
-        // Clear ESnapMetadataPurpose-bits.
-        value = value & ( ~CMManager::ESnapMetadataPurpose );
-        // Set ESnapPurposeInternet-value.
-        iMetadataRecord->iMetadata = value | ( CMManager::ESnapPurposeInternet << 8 );
-        }
-    else
-        {
-        // Clear old ESnapMetadataInternet-bit,
-        // ESnapMetadataDestinationIsLocalised-bits and CMManager::ESnapMetadataPurpose-bits.
-        TUint32 temp = ~( CMManager::ESnapMetadataInternet |
-                CMManager::ESnapMetadataDestinationIsLocalised |
-                CMManager::ESnapMetadataPurpose );
-        iMetadataRecord->iMetadata = iMetadataRecord->iMetadata & temp;
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATAINTERNETL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of type ESnapMetadataHighlight.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataHighlight( const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATAHIGHLIGHTL_ENTRY );
-
-    // TODO: Old CmManager does not perform any duplicate checks when setting highlight.
-    // Now with single click this is not used anymore anyway. So I suggest we don't add any checks here.
-    if ( aMetadata )
-        {
-        // Set ESnapMetadataHighlight-bit.
-        iMetadataRecord->iMetadata =
-                iMetadataRecord->iMetadata | CMManager::ESnapMetadataHighlight;
-        }
-    else
-        {
-        // Clear ESnapMetadataHighlight-bit.
-        iMetadataRecord->iMetadata =
-                iMetadataRecord->iMetadata & ( ~CMManager::ESnapMetadataHighlight );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATAHIGHLIGHTL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of type ESnapMetadataHiddenAgent.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataHiddenAgentL( const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATAHIDDENAGENTL_ENTRY );
-
-    if ( aMetadata )
-        {
-        TUint32 metadataInternet( iMetadataRecord->iMetadata &
-                CMManager::ESnapMetadataInternet );
-        TUint32 metadataLocalized( ( iMetadataRecord->iMetadata &
-                CMManager::ESnapMetadataDestinationIsLocalised ) >> 4 );
-        TUint32 metadataPurpose( ( iMetadataRecord->iMetadata &
-                CMManager::ESnapMetadataPurpose ) >> 8 );
-        if ( metadataInternet ||
-                ( metadataLocalized == CMManager::ELocalisedDestInternet ) ||
-                ( metadataPurpose == CMManager::ESnapPurposeInternet ) )
-            {
-            // Not allowed to set ESnapMetadataHiddenAgent if destination is
-            // localized or has purpose set.
-            User::Leave( KErrArgument );
-            }
-        // Set ESnapMetadataHiddenAgent-bit.
-        iMetadataRecord->iMetadata =
-                iMetadataRecord->iMetadata | CMManager::ESnapMetadataHiddenAgent;
-        }
-    else
-        {
-        // Clear ESnapMetadataHiddenAgent-bit.
-        iMetadataRecord->iMetadata =
-                iMetadataRecord->iMetadata & ( ~CMManager::ESnapMetadataHiddenAgent );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATAHIDDENAGENTL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of type ESnapMetadataDestinationIsLocalised.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataLocalizationL( const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATALOCALIZATIONL_ENTRY );
-
-    // Check that aMetadata is within valid range.
-    if ( aMetadata > CMManager::ELocalisedDestIntranet )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    TUint32 temp = ~(
-            CMManager::ESnapMetadataInternet |
-            CMManager::ESnapMetadataDestinationIsLocalised |
-            CMManager::ESnapMetadataPurpose );
-    if ( aMetadata == CMManager::ENotLocalisedDest )
-        {
-        // Clear old ESnapMetadataInternet-bit,
-        // ESnapMetadataDestinationIsLocalised-bits and ESnapMetadataPurpose-bits.
-        iMetadataRecord->iMetadata = iMetadataRecord->iMetadata & temp;
-        }
-    else
-        {
-        if ( iCache->DestinationExistsWithMetadataLocalizedL( *this, aMetadata ) )
-            {
-            User::Leave( KErrAlreadyExists );
-            }
-
-        // Clear old ESnapMetadataInternet-bit,
-        // ESnapMetadataDestinationIsLocalised-bits and ESnapMetadataPurpose-bits.
-        TUint32 value = iMetadataRecord->iMetadata & temp;
-        switch ( aMetadata )
-            {
-            case CMManager::ELocalisedDestInternet:
-                {
-                // Clear ESnapMetadataHiddenAgent-bit.
-                value = value & ( ~CMManager::ESnapMetadataHiddenAgent );
-                // Set old ESnapMetadataInternet-bit.
-                value = value | CMManager::ESnapMetadataInternet;
-                // Set ESnapPurposeInternet-value.
-                value = value | ( CMManager::ESnapPurposeInternet << 8 );
-                }
-                break;
-            case CMManager::ELocalisedDestWap:
-                {
-                // Set ESnapPurposeOperator-value.
-                value = value | ( CMManager::ESnapPurposeOperator << 8 );
-                }
-                break;
-            case CMManager::ELocalisedDestMMS:
-                {
-                // Set ESnapMetadataHiddenAgent-bit.
-                value = value | CMManager::ESnapMetadataHiddenAgent;
-                // Set ESnapPurposeMMS-value.
-                value = value | ( CMManager::ESnapPurposeMMS << 8 );
-                }
-                break;
-            case CMManager::ELocalisedDestIntranet:
-                {
-                // Set ESnapPurposeIntranet-value.
-                value = value | ( CMManager::ESnapPurposeIntranet << 8 );
-                }
-                break;
-            default:
-                User::Leave( KErrArgument );
-                break;
-            }
-        // Set ESnapMetadataDestinationIsLocalised-value.
-        iMetadataRecord->iMetadata = value | ( aMetadata << 4 );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATALOCALIZATIONL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Set metadata of type ESnapMetadataPurpose.
-// ---------------------------------------------------------------------------
-//
-void CCmmDestinationInstance::SetMetadataPurposeL( const TUint32 aMetadata )
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_SETMETADATAPURPOSEL_ENTRY );
-
-    // Check that aMetadata is within valid range.
-    if ( aMetadata > CMManager::ESnapPurposeIntranet )
-        {
-        User::Leave( KErrArgument );
-        }
-
-    TUint32 temp = ~(
-            CMManager::ESnapMetadataInternet |
-            CMManager::ESnapMetadataDestinationIsLocalised |
-            CMManager::ESnapMetadataPurpose );
-    if ( aMetadata == CMManager::ESnapPurposeUnknown )
-        {
-        // Clear old ESnapMetadataInternet-bit,
-        // ESnapMetadataDestinationIsLocalised-bits and ESnapMetadataPurpose-bits.
-        iMetadataRecord->iMetadata = iMetadataRecord->iMetadata & temp;
-        }
-    else
-        {
-        if ( iCache->DestinationExistsWithMetadataPurposeL( *this, aMetadata ) )
-            {
-            User::Leave( KErrAlreadyExists );
-            }
-
-        // Clear old ESnapMetadataInternet-bit,
-        // ESnapMetadataDestinationIsLocalised-bits and ESnapMetadataPurpose-bits.
-        TUint32 value = iMetadataRecord->iMetadata & temp;
-
-        switch ( aMetadata )
-            {
-            case CMManager::ESnapPurposeInternet:
-                {
-                // Clear ESnapMetadataHiddenAgent-bit.
-                value = value & ( ~CMManager::ESnapMetadataHiddenAgent );
-                // Set old ESnapMetadataInternet-bit.
-                value = value | CMManager::ESnapMetadataInternet;
-                // Set ELocalisedDestInternet-value.
-                value = value | ( CMManager::ELocalisedDestInternet << 4 );
-                }
-                break;
-            case CMManager::ESnapPurposeOperator:
-                {
-                // Set ELocalisedDestWap-value.
-                value = value | ( CMManager::ELocalisedDestWap << 4 );
-                }
-                break;
-            case CMManager::ESnapPurposeMMS:
-                {
-                // Set ESnapMetadataHiddenAgent-bit.
-                value = value | CMManager::ESnapMetadataHiddenAgent;
-                // Set ELocalisedDestMMS-value.
-                value = value | ( CMManager::ELocalisedDestMMS << 4 );
-                }
-                break;
-            case CMManager::ESnapPurposeIntranet:
-                {
-                // Set ELocalisedDestIntranet-value.
-                value = value | ( CMManager::ELocalisedDestIntranet << 4 );
-                }
-                break;
-            default:
-                User::Leave( KErrArgument );
-                break;
-            }
-        // Set ESnapMetadataPurpose-value.
-        iMetadataRecord->iMetadata = value | ( aMetadata << 8 );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_SETMETADATAPURPOSEL_EXIT );
-    }
-
-// ---------------------------------------------------------------------------
-// Checks the current metadata for this destination, and verifies there is no
-// other conflicting destinations in the database.
-// ---------------------------------------------------------------------------
-//
-TBool CCmmDestinationInstance::ConflictingMetadataFoundL()
-    {
-    OstTraceFunctionEntry0( CCMMDESTINATIONINSTANCE_CONFLICTINGMETADATAFOUNDL_ENTRY );
-
-    TBool result( EFalse );
-    TUint32 metadataInternet( iMetadataRecord->iMetadata &
-            CMManager::ESnapMetadataInternet );
-    TUint32 metadataLocalized( ( iMetadataRecord->iMetadata &
-            CMManager::ESnapMetadataDestinationIsLocalised ) >> 4 );
-    TUint32 metadataPurpose( ( iMetadataRecord->iMetadata &
-            CMManager::ESnapMetadataPurpose ) >> 8 );
-
-    if ( metadataPurpose )
-        {
-        // Some metadata is set, need to check conflicts in database.
-        switch ( metadataPurpose )
-            {
-            // Fallthrough intended.
-            case CMManager::ESnapPurposeInternet:
-            case CMManager::ESnapPurposeOperator:
-            case CMManager::ESnapPurposeMMS:
-            case CMManager::ESnapPurposeIntranet:
-                result = iCache->DestinationExistsWithMetadataPurposeL(
-                        *this,
-                        metadataPurpose );
-                break;
-            default:
-                User::Leave( KErrCorrupt ); // Invalid metadata.
-                break;
-            }
-        }
-    else if ( metadataLocalized )
-        {
-        // Error, metadataPurpose was not set. Continue anyway.
-        switch ( metadataLocalized )
-            {
-            // Fallthrough intended.
-            case CMManager::ELocalisedDestInternet:
-            case CMManager::ELocalisedDestWap:
-            case CMManager::ELocalisedDestMMS:
-            case CMManager::ELocalisedDestIntranet:
-                result = iCache->DestinationExistsWithMetadataLocalizedL(
-                        *this,
-                        metadataLocalized );
-                break;
-            default:
-                User::Leave( KErrCorrupt ); // Invalid metadata.
-                break;
-            }
-        }
-    else if ( metadataInternet )
-        {
-        // Error, metadataPurpose and metadataLocalized was not set. Continue anyway.
-        result = iCache->DestinationExistsWithMetadataLocalizedL(
-                *this,
-                CMManager::ELocalisedDestInternet );
-        }
-
-    OstTraceFunctionExit0( CCMMDESTINATIONINSTANCE_CONFLICTINGMETADATAFOUNDL_EXIT );
-    return result;
-    }
-
-// End of file