cmmanager/cmmgr/Framework/Src/cmconnsettingsuiimpl.cpp
branchRCL_3
changeset 58 83ca720e2b9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cmmgr/Framework/Src/cmconnsettingsuiimpl.cpp	Wed Sep 01 12:23:51 2010 +0100
@@ -0,0 +1,1163 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation of application setting UI.
+*
+*/
+
+#include <coemain.h>
+#include <featmgr.h>
+#include <data_caging_path_literals.hrh>
+#include <StringLoader.h>
+#include <cmmanager.rsg>
+#include <AknsUtils.h>
+#include <ConnectionUiUtilities.h>
+
+
+#include <cmcommonconstants.h>
+#include "cmapplicationsettingsui.h"
+#include <cmmanager.h>
+#include "cmmanagerimpl.h"
+#include "cmdestinationimpl.h"
+#include "cmmanagerimpl.h"
+#include <cmpluginbaseeng.h>
+#include <cmpluginbase.h>
+#include "cmconnsettingsuiimpl.h"
+#include "cmconnselectrbpage.h"
+
+using namespace CMManager;
+
+typedef struct
+    {
+    TInt                iCmIapId;
+    TInt                iCmDefaultPriority;
+    }TCmListItem;
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::NewL
+//---------------------------------------------------------------------------
+//
+EXPORT_C CCmConnSettingsUiImpl* CCmConnSettingsUiImpl::NewL( CCmManagerImpl* aCCmManagerImpl )
+    {
+    CCmConnSettingsUiImpl* self = 
+                                new (ELeave) CCmConnSettingsUiImpl();
+    CleanupStack::PushL( self );
+    self->ConstructL( aCCmManagerImpl );
+    CleanupStack::Pop( self );   // self
+    return self;
+    }
+    
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::NewL
+//---------------------------------------------------------------------------
+//
+CCmConnSettingsUiImpl* CCmConnSettingsUiImpl::NewWithoutTablesL()
+    {
+    CCmConnSettingsUiImpl* self = 
+                                new (ELeave) CCmConnSettingsUiImpl();
+    CleanupStack::PushL( self );
+    self->iCreateTables = EFalse;
+    self->ConstructL( NULL );
+    CleanupStack::Pop( self );   // self
+    return self;
+    }    
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::TCmDCSettingSelection
+//---------------------------------------------------------------------------
+//
+CCmConnSettingsUiImpl::CCmConnSettingsUiImpl()
+    : iResourceReader( *CCoeEnv::Static() )
+    , iAreDestinations ( ETrue )
+    , iShowAlwaysAsk( EFalse )
+    , iShowEasyWlan( EFalse )
+    , iShowVirtualCMs( ETrue )
+    , iShowEmptyDestinations( EFalse )
+    , iShowAskOnce( EFalse )
+    , iShowUncat( EFalse )
+    , iShowDefConn( EFalse )
+    , iUsePassedDestinationArray( EFalse )
+    , iHelpContext ( KSET_HLP_APP_DEST_ASSOC_VIEW )
+    , iCreateTables( ETrue )
+    {
+    }
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::~TCmDCSettingSelection
+//---------------------------------------------------------------------------
+//
+CCmConnSettingsUiImpl::~CCmConnSettingsUiImpl()
+    {
+    if ( iOwnCmManager )
+        {
+        delete iCmManagerImpl;
+        }    
+    iResourceReader.Close();
+    iItems.Close();
+    iPassedDestinations.Close();
+    }
+
+//---------------------------------------------------------------------------
+// CCmConnSettingsUiImpl::LoadResourceL
+// Load the resource for the dll module
+//---------------------------------------------------------------------------
+//
+TInt CCmConnSettingsUiImpl::LoadResourceL ()
+    {    
+    // Add resource file.
+    TParse* fp = new(ELeave) TParse(); 
+    TInt err = fp->Set( KACMManagerResDirAndFileName, 
+                        &KDC_RESOURCE_FILES_DIR, 
+                        NULL ); 
+    if ( err != KErrNone)
+        {
+        User::Leave( err );
+        }   
+
+    TFileName resourceFileNameBuf = fp->FullName();
+    delete fp;
+
+    iResourceReader.OpenL( resourceFileNameBuf );
+    return err;
+    }
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::ConstructL()
+//---------------------------------------------------------------------------
+//
+void CCmConnSettingsUiImpl::ConstructL( CCmManagerImpl* aCCmManagerImpl )
+    {
+    iOwnCmManager = !(aCCmManagerImpl);
+    if ( iOwnCmManager )
+        {
+        if (iCreateTables)
+            {
+            iCmManagerImpl = CCmManagerImpl::NewL();            
+            }
+        else
+            {
+            iCmManagerImpl = CCmManagerImpl::NewL(EFalse);                            
+            }
+        }
+    else
+        {
+        iCmManagerImpl = aCCmManagerImpl;
+        }
+    LoadResourceL();
+    AknsUtils::SetAvkonSkinEnabledL( ETrue );
+    }
+
+//---------------------------------------------------------------------------
+// CCmConnSettingsUiImpl::ShowConnSelectRadioPageL
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::ShowConnSelectRadioPageL( 
+                                           TCmDCSettingSelection& aSelection, 
+                                           const TInt aTitleStringResource,
+                                           TBearerFilterArray& aFilterArray )
+    {
+    TBool retVal( EFalse );
+//    aSelection.iResult = EDCAlwaysAsk;
+
+    CDesCArrayFlat* items = 
+                    new ( ELeave ) CDesCArrayFlat( KCmArrayBigGranularity );
+    CleanupStack::PushL( items );
+    
+    if (iAreDestinations)
+        {
+        BuildDestinationArrayL( items, aFilterArray );        
+        }
+    else    
+        {
+        BuildCMArrayL( items, aFilterArray ); 
+               
+        }
+    // Uncategorized connection methods
+    RPointerArray<CCmPluginBase> uncatArray( KCmArraySmallGranularity );
+    CCmManagerImpl::CleanupResetAndDestroyPushL< RPointerArray<CCmPluginBase> >( uncatArray );
+    if ( iShowUncat )
+        {
+        BuildUncatArrayL( uncatArray, items,
+                    aFilterArray);
+        }
+    //appending items in reverse order of priority    
+    // Check if Ask Once should be shown 
+    if ( iShowAskOnce )
+        {
+        HBufC* buf = StringLoader::LoadLC( R_CMMANAGERUI_SETT_ASK_ONCE );
+        items->InsertL( 0, *buf );
+        iItems.InsertL( KDestItemAskOnce, 0 );
+        CleanupStack::PopAndDestroy( buf );    
+        }
+
+    // Check if Always Ask should be shown
+    if ( iShowAlwaysAsk )
+        {
+        HBufC* buf = StringLoader::LoadLC( R_CMMANAGERUI_SETT_ALWAYS_ASK );
+        items->InsertL( 0, *buf );
+        iItems.InsertL( KDestItemAlwaysAsk, 0 );
+        CleanupStack::PopAndDestroy( buf );    
+        }
+    // Check if Default Connection should be shown 
+    //feautre flag
+    if ( iCmManagerImpl->IsDefConnSupported() )
+        {
+        //client's selection
+        if ( iShowDefConn )
+            {
+            HBufC* buf = StringLoader::LoadLC( R_CMMANAGERUI_SETT_DEFAULT_CONNECTION );
+            items->InsertL( 0, *buf );
+            iItems.InsertL( KDestItemDefaultConnection, 0 );
+            CleanupStack::PopAndDestroy( buf );    
+            } 
+        }
+    if (!items->Count())
+        {
+        User::Leave(KErrConnectionNotFound);           
+        }
+    
+    TInt listIndex(0);
+    
+    if (iAreDestinations)
+        {
+        switch ( aSelection.iResult )
+                {
+                case EDCDestination:
+                    {
+                    TInt newIndex = iItems.Find(aSelection.iId);
+                    if (newIndex >=0)
+                        {
+                        listIndex = newIndex;
+                        }
+                    break;
+                    }
+                case EDCConnectionMethod:
+                    {
+                    TInt err(KErrNotFound);
+                    CCmPluginBase* cm = NULL;
+                    TRAP( err, cm = iCmManagerImpl->GetConnectionMethodL(aSelection.iId));
+                    if ( err == KErrNone )
+                        {
+                        // connection method is valid
+                        CleanupStack::PushL( cm );
+                        TUint32 parentId = 0;
+                        CCmDestinationImpl* parent = cm->ParentDestination();
+                        if (parent)
+                            {
+                            // it has a parent, get it's id
+                            parentId = parent->Id();
+                            delete parent;
+                            }
+                        else
+                            {
+                            // no parent means Uncategorised
+                            parentId = KDestItemUncategorized;
+                            }
+                        // get the index based on id    
+                        TInt tempIndex = iItems.Find( parentId );
+                        if ( tempIndex != KErrNotFound )
+                            {
+                            // found destination id in list
+                            listIndex = tempIndex;
+                            }                            
+                        CleanupStack::PopAndDestroy( cm );
+                        }
+                    break;
+                    }
+                case EDCDefaultConnection:
+                    {
+                    TInt newIndex = iItems.Find(KDestItemDefaultConnection);
+                    if (newIndex >=0)
+                        {
+                        listIndex = newIndex;
+                        }
+                    break;
+                    }
+                case EDCAlwaysAsk:
+                    {
+                    TInt newIndex = iItems.Find(KDestItemAlwaysAsk);
+                    if (newIndex >=0)
+                        {
+                        listIndex = newIndex;
+                        }
+                    break;
+                    }
+                case EDCAskOnce:
+                    {
+                    TInt newIndex = iItems.Find(KDestItemAskOnce);
+                    if (newIndex >=0)
+                        {
+                        listIndex = newIndex;
+                        }
+                    break;
+                    }                
+                default: // use default value (0)
+                    {
+                    break;
+                    }                            
+                }
+            }
+         else
+            {
+            if (aSelection.iResult == EDCConnectionMethod)
+                {
+                TInt newIndex = iItems.Find(aSelection.iId);
+                if (newIndex >=0)
+                    {
+                    listIndex = newIndex;
+                    }
+                }
+            }
+    
+    if ( aTitleStringResource == R_CMMANAGERUI_DEFAULT_CONNECTION_TITLE )
+        {
+        // It is not allowed to choose Connection Methods 
+        // in Default connection -dialog.
+        //
+        iOpenDestination = EFalse;
+        }
+    
+    if ( UserSelectionDlgL( listIndex, items, aSelection, 
+                            aTitleStringResource,
+                            iOpenDestination) )
+        {
+        // Handle selection
+        
+        switch ( aSelection.iResult )
+            {
+            case EDCConnectionMethod:
+                {
+                // from the first list?
+                if (!iAreDestinations)
+                    {
+                    aSelection.iId = iItems[listIndex];
+                    retVal = ETrue;                    
+                    }
+                else
+                    {
+                    // Uncategorised?
+                    TUint32 destId = iItems[ listIndex ];
+                    if ( destId == KDestItemUncategorized )
+                        {
+                        TBearerFilterArray emptyFilter;
+                        retVal = ShowConnectionMethodsL( uncatArray, 
+                                        aSelection, aTitleStringResource, emptyFilter );
+                        }
+                    else
+                        {
+                        RPointerArray<CCmPluginBase> cmArray ( KCmArrayMediumGranularity );
+                        if ( iShowVirtualCMs ) //create a flat list to show cms in embedded destinations
+                            {
+                            iCmManagerImpl->CreateFlatCMListLC( destId, cmArray);
+                            }
+                         else
+                            {
+                            //append only the cms in the destination
+                            iCmManagerImpl->AppendCmListLC( destId, cmArray ); 
+                            }
+                        retVal = ShowConnectionMethodsL( cmArray, 
+                                        aSelection, aTitleStringResource,
+                                        aFilterArray );
+                        CleanupStack::PopAndDestroy( &cmArray );
+                        }                    
+                    }
+                break;
+                }
+            case EDCDestination:
+                {
+                // Store the destination Id
+                aSelection.iId = iItems[listIndex];
+                retVal = ETrue;
+                break;
+                }
+            case EDCAlwaysAsk:
+                {
+                // nothing more to do
+                retVal = ETrue;
+                break;
+                }        
+            case EDCDefaultConnection:
+                {
+                // nothing more to do
+                retVal = ETrue;
+                break;
+                }            
+            case EDCAskOnce:
+                {
+                // nothing more to do
+                retVal = ETrue;
+                break;
+                }            
+            default:
+                {
+                break;
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &uncatArray );
+    CleanupStack::PopAndDestroy( items );
+
+    return retVal;
+    }
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::RunSettingsL()
+//---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCmConnSettingsUiImpl::RunApplicationSettingsL( 
+                                        TCmSettingSelection& aSelection, 
+                                        TUint aListItems,
+                                        TBearerFilterArray& aFilterArray)
+    {
+    iItems.Close();
+    iAreDestinations = ETrue;
+    if (!aListItems)
+        {
+        User::Leave(KErrArgument);        
+        }
+    if ( !iCmManagerImpl->IsDefConnSupported() &&
+         !(aListItems & EShowAlwaysAsk) &&  
+         !(aListItems & EShowConnectionMethods) &&  
+         !(aListItems & EShowDestinations) 
+         )
+        {
+        // default conn would be the only one but not supported
+        User::Leave(KErrNotSupported);   
+        }
+
+    if ( aListItems & EShowDefaultConnection )
+        {
+        EnableDefConn( ETrue );        
+        }
+    else
+        {
+        EnableDefConn( EFalse );                
+        }
+    if (aListItems & EShowAlwaysAsk)
+        {
+        EnableAlwaysAsk( ETrue );
+        }
+    else
+        {
+        EnableAlwaysAsk( EFalse );
+        }
+    if ( (aListItems & EShowConnectionMethods) && (aListItems & EShowDestinations) )
+        {
+        iOpenDestination = ETrue;
+        iShowUncat = ETrue;
+        }
+    else
+        {
+        iOpenDestination = EFalse;
+        }
+    if ( (aListItems & EShowConnectionMethods) && !(aListItems & EShowDestinations) )
+        {
+        iAreDestinations = EFalse;
+        GetCMArrayL( );            
+        }
+    else if ( aListItems & EShowDestinations )
+        {
+        if (iUsePassedDestinationArray)
+            {
+            // now fill up iItems
+            for( TInt i=0; i<iPassedDestinations.Count(); i++)
+                {
+                iItems.Append(iPassedDestinations[i]);
+                }
+            }
+        else
+            {
+            iCmManagerImpl->AllDestinationsL( iItems );
+            TInt i( 0 );
+            TInt count = iItems.Count();
+            for ( i=0; i < count; i++ )
+                {
+                if ( iItems[i] > 0 && iItems[i] < 255 )
+                    {
+                    CCmDestinationImpl* dest = 
+        	                            iCmManagerImpl->DestinationL( iItems[i] );
+                    CleanupStack::PushL( dest );
+        	        if ( dest->IsHidden() )
+                        {
+                        iItems.Remove(i);
+                        i--;
+                        count = count-1;
+                        }
+                    CleanupStack::PopAndDestroy();
+                    }
+                }
+            iItems.Compress();
+            }
+        }
+
+    TBool ret = EFalse;
+    TCmDCSettingSelection userDefSelection;
+
+    // convert selection
+    switch ( aSelection.iResult )
+        {
+        case EDestination: 
+            {
+            userDefSelection.iResult = EDCDestination; 
+            userDefSelection.iId = aSelection.iId;        
+            break;
+            }
+            
+        case EConnectionMethod: 
+            {
+            userDefSelection.iResult = EDCConnectionMethod; 
+            userDefSelection.iId = aSelection.iId;        
+            break;
+            }
+
+        case EDefaultConnection: 
+            {
+            userDefSelection.iResult = EDCDefaultConnection; 
+            userDefSelection.iId = 0;
+            break;
+            }
+
+        case EAlwaysAsk: 
+            {
+            userDefSelection.iResult = EDCAlwaysAsk; 
+            userDefSelection.iId = 0;
+            break;
+            }
+
+        default: 
+            {
+            // do not leave, perhaps there was no default selection
+            }                            
+        }
+    
+    
+    
+    if ( ShowConnSelectRadioPageL( userDefSelection, 
+            R_CMMANAGERUI_SETT_DESTINATION , aFilterArray))
+        {
+        switch ( userDefSelection.iResult )
+            {
+            case EDCDestination:
+                {
+                aSelection.iResult = EDestination;
+                aSelection.iId = userDefSelection.iId;
+                break;
+                }
+            case EDCConnectionMethod:
+                {
+                aSelection.iResult = EConnectionMethod;
+                aSelection.iId = userDefSelection.iId;
+                break;
+                }
+            case EDCDefaultConnection:
+                {
+                aSelection.iResult = EDefaultConnection;
+                aSelection.iId = 0;
+                break;
+                }
+            case EDCAlwaysAsk:
+                {
+                aSelection.iResult = EAlwaysAsk;
+                aSelection.iId = 0;
+                break;
+                }
+            default: //should not ever get here, unhandled branch
+                {
+                User::Leave( KErrGeneral );
+                break;
+                }                            
+            }
+        ret = ETrue;
+        }
+    else
+        {
+        ret = EFalse;
+        }
+    return ret;        
+    }    
+
+    
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::RunDefaultConnecitonRBPageL()
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::RunDefaultConnecitonRBPageL( 
+                                          TCmDCSettingSelection& aSelection )
+    {
+    iHelpContext = KSET_HLP_DEFAULT_CONN;
+    iItems.Close();
+    iOpenDestination = ETrue;
+    iCmManagerImpl->AllDestinationsL( iItems );
+    EnableAlwaysAsk( EFalse );
+    EnableAskOnce( EFalse );
+    EnableUncat( EFalse );
+    TBearerFilterArray aFilterArray;
+    iAreDestinations = ETrue;
+    iShowEmptyDestinations = ETrue;
+    return  ShowConnSelectRadioPageL( aSelection , 
+        R_CMMANAGERUI_DEFAULT_CONNECTION_TITLE, aFilterArray );
+    }
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::GetCMArrayL()
+//---------------------------------------------------------------------------
+//
+void CCmConnSettingsUiImpl::GetCMArrayL( )
+    {
+    iCmManagerImpl->ConnectionMethodL( iItems, ETrue, EFalse,EFalse, ETrue );
+    TInt count = iItems.Count();
+
+    if ( !iShowVirtualCMs )
+        {
+        // Don't show virtual CMs
+        for ( TInt i = 0; i < count; i++ )
+            {
+            if ( IsCmVirtualL( iItems[i] ) )
+                {
+                iItems.Remove( i );
+                count--;
+                i--;
+                }
+            }
+        }
+    }
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::BuildCMArrayL()
+//---------------------------------------------------------------------------
+//
+void CCmConnSettingsUiImpl::BuildCMArrayL( CDesCArrayFlat* aItems, 
+                                           TBearerFilterArray& aFilterArray )
+    {
+    // Add the New Connection Item        
+    for ( TInt i = 0; i < iItems.Count(); i++ )
+        {
+        CCmPluginBase* cm = NULL;
+        TInt err(KErrNone);
+        TRAP( err, cm = iCmManagerImpl->GetConnectionMethodL(iItems[i]));
+        if (err == KErrNoMemory)
+        {
+            User::Leave(KErrNoMemory);
+        }
+        else if (err != KErrNone)
+        {
+            continue;
+        }                            
+        CleanupStack::PushL( cm );
+        if (aFilterArray.Count())
+            {
+            TUint cmBearerType = cm->GetIntAttributeL( ECmBearerType );
+            if ( aFilterArray.Find( cmBearerType ) == KErrNotFound )
+                {
+                CleanupStack::PopAndDestroy( cm );            
+                iItems.Remove(i);
+                i--;
+                continue;    
+                }
+            }
+        // CM Iap Id
+        TUint32 cmId = cm->GetIntAttributeL( ECmId );
+                                
+        // Should virtual bearer types be shown?
+        if ( iShowVirtualCMs || !IsCmVirtualL( cmId ) )
+            {
+            // CM name
+            HBufC* cmName = cm->GetStringAttributeL( ECmName );
+            CleanupStack::PushL( cmName );
+            // embedded destination has a special text format
+            aItems->AppendL( *cmName );
+            CleanupStack::PopAndDestroy( cmName );
+            }
+        CleanupStack::PopAndDestroy( cm );            
+        }
+    }
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::BuildDestinationArray()
+//---------------------------------------------------------------------------
+//
+void CCmConnSettingsUiImpl::BuildDestinationArrayL( CDesCArrayFlat* aItems, 
+                                         TBearerFilterArray& aFilterArray )
+    {
+    /*
+     * The behavior of this function is as follow.
+     * 1. If aFilterArray.Count() == 0 (This just means no filter provided by user) then the function will
+     *    show all of available destinations (if iShowVirtualCMs == ETrue; Otherwise, destination with only
+     *    virtualCMs will be filted out) (default).
+     * 2. If aFilterArray.Count() != 0 then destination with only unavailable bearer-type IAPs will be 
+     *    filted out.
+     */
+    TInt count = iItems.Count();           
+    // Add the New Connection Item
+    for ( TInt i = 0; i < count; i++ )
+        {
+        // Get the destinations from their IDs
+        CCmDestinationImpl* dest = 
+                            iCmManagerImpl->DestinationL( iItems[i] );
+        CleanupStack::PushL( dest );
+
+        TInt cmCount = dest->ConnectionMethodCount();
+        TInt validCmCount = cmCount;
+        
+        if ( !iUsePassedDestinationArray )
+            {
+            // Check if empty destinations should be displayed
+            if ( !iShowVirtualCMs || aFilterArray.Count())
+                {            
+                for ( TInt j = 0; j < cmCount; j++ )
+                    {
+                    CCmPluginBase& cm = *dest->GetConnectionMethodL(j);
+                    // check if this destination only contains virtual CMs
+                    if (!iShowVirtualCMs)// See if the virtual CM (Default in case no filter provided by user)
+                        {
+                        // CM Iap Id
+                        TUint32 cmIapId = cm.GetIntAttributeL( ECmId );                
+                        // real CMs were found
+                        if ( IsCmVirtualL( cmIapId ) )
+                            {
+                            validCmCount--;
+                            continue;
+                            }
+                        // We can not break the loop with else case here
+                        // for cm might be filted out by aFilterArray
+                        }
+                    
+                    if (aFilterArray.Count()) // See if the CM is filtered out
+                        {                       
+                        TUint cmBearerType = cm.GetIntAttributeL( ECmBearerType );
+                        if ( aFilterArray.Find( cmBearerType ) == KErrNotFound )
+                            {
+                            validCmCount--;
+                            }
+                        else
+                            {
+                            break;//there is at least one CM in this dest    
+                            }                    
+                        }
+                    }
+                }
+            }
+        
+        // check if the destination should be omitted
+        // check if empty destinations should be displayed
+        
+        // We can use a destination to make a connection only
+        // if it contains something else than an empty embedded
+        // destination. Otherwise, consider it empty.
+        TBool canUseDestToConnect = dest->CanUseToConnectL();
+        
+        if ( iDestinationToOmit != iItems[i] && 
+                            ( ( validCmCount && canUseDestToConnect )
+                               || iShowEmptyDestinations ) )
+            {
+            // Check whether the MMS SNAP is in question. 
+            // It should not be shown on the UI in the destinations list
+            TInt snapMetadata = 0;
+            TRAPD( metaErr, snapMetadata = dest->MetadataL( CMManager::ESnapMetadataPurpose ));
+            if ( metaErr == KErrNone && snapMetadata == CMManager::ESnapPurposeMMS )
+                {
+                iItems.Remove(i);
+                count--;
+                i--;
+                }
+            else
+                {
+                HBufC* destName = dest->NameLC();
+
+                aItems->AppendL( *destName );
+                CleanupStack::PopAndDestroy( destName );
+                }
+            }
+        else
+            {
+            iItems.Remove(i);
+            count--;
+            i--;
+            }
+            
+        CleanupStack::PopAndDestroy( dest );
+        }
+    }
+    
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::BuildUncatArrayL()
+//---------------------------------------------------------------------------
+//
+void CCmConnSettingsUiImpl::BuildUncatArrayL( RPointerArray<CCmPluginBase>& aUncatArray,
+                                           CDesCArrayFlat* aItems, 
+                                           TBearerFilterArray& aFilterArray )
+    {
+    if ( iShowEasyWlan )
+        {
+        // Get the uncategorised CMs including EasyWLAN
+        iCmManagerImpl->AppendUncatCmListL( aUncatArray, ETrue, ETrue, ETrue );
+        }
+    else
+        {
+        iCmManagerImpl->AppendUncatCmListL( aUncatArray );
+        }
+    
+    // Remove hidden Connection Methods
+    for ( TInt i = 0; i < aUncatArray.Count(); i++ )
+        {
+        if ( aUncatArray[i]->GetBoolAttributeL( ECmHidden ) )
+            {
+            delete aUncatArray[i];
+            aUncatArray.Remove(i);
+            i--;
+            }
+        }
+        
+    if (aFilterArray.Count())
+        {
+        for ( TInt i = 0; i < aUncatArray.Count(); i++ )
+            {
+            CCmPluginBase* cm = aUncatArray[i];
+            TUint cmBearerType = cm->GetIntAttributeL( ECmBearerType );
+            if ( aFilterArray.Find( cmBearerType ) == KErrNotFound )
+                {
+                delete aUncatArray[i];
+                aUncatArray.Remove(i);
+                i--;
+                }
+            }
+        }
+    TInt count = aUncatArray.Count();
+
+    if ( !iShowVirtualCMs )
+        {
+        // Don't show virtual CMs
+        for ( TInt i = 0; i < count; i++ )
+            {
+            if ( IsCmVirtualL( aUncatArray[i]->GetIntAttributeL( ECmId ) ) )
+                {
+                delete aUncatArray[i];
+                aUncatArray.Remove( i );
+                count--;
+                i--;
+                }
+            }
+        }
+    // Show the 'Uncategorised' destination
+    if ( count )
+        {
+        HBufC* buf = StringLoader::LoadLC( R_CMMANAGERUI_DEST_UNCATEGORIZED );
+        aItems->AppendL( *buf );
+        CleanupStack::PopAndDestroy( buf );        
+        iItems.AppendL( KDestItemUncategorized );
+        }
+    }
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::UserSelectionDlgL()
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::UserSelectionDlgL( 
+                                        TInt& aDestSelected, 
+                                        CDesCArrayFlat* aItems, 
+                                        TCmDCSettingSelection& aSelection, 
+                                        const TInt aTitleStringResource, 
+                                        TBool aOpenDestination)
+    {
+    // Should an item be highlighted?
+    if ( aSelection.iResult == EDCDestination )
+        {
+        for ( TInt i = 0; i < iItems.Count(); i++ )
+            {
+            if ( iItems[i] == aSelection.iId )
+                {
+                aDestSelected = i;
+                }
+            }
+        }
+    
+    HBufC* buf = StringLoader::LoadLC( aTitleStringResource );
+    TInt dialogResourceId = R_RADIO_BUTTON_SETTING_PAGE_OK_CANCEL;
+    if ( aOpenDestination ) // OPTIONS/CANCEL is available only if we can open
+                            //destinations
+        {
+        dialogResourceId = R_RADIO_BUTTON_SETTING_PAGE;
+        }
+    CCMConnSelectRBPage* page = 
+                        new ( ELeave ) CCMConnSelectRBPage( dialogResourceId,
+                                                         aDestSelected, 
+                                                         aItems,
+                                                         *iCmManagerImpl,
+                                                         aSelection.iResult,
+                                                         iItems,
+                                                         iAreDestinations,
+                                                         aOpenDestination ,
+                                                         iHelpContext );
+    CleanupStack::PushL( page );
+    page->SetSettingTextL( *buf );
+    CleanupStack::Pop( page );
+    
+    CleanupStack::PopAndDestroy( buf );
+    buf = NULL;
+    
+    return page->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+    }    
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::UserSelectedUncatItemL()
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::UserSelectedUncatItemL(
+                                           RPointerArray<CCmPluginBase>& aUncatArray,
+                                           TCmDCSettingSelection& aSelection, 
+                                        const TInt aTitleStringResource )
+    {
+    TBool retVal( EFalse );
+    CDesCArrayFlat* items = 
+                    new ( ELeave ) CDesCArrayFlat( KCmArrayBigGranularity );
+    CleanupStack::PushL( items );
+
+    TInt cmSelected( 0 );
+
+    TInt count = aUncatArray.Count();
+    for ( TInt i = 0; i < count; ++i )     
+        {
+        CCmPluginBase* cm = NULL;
+        TRAPD( err,
+               cm = iCmManagerImpl->GetConnectionMethodL( aUncatArray[i]->GetIntAttributeL( ECmId) ) 
+               );
+        
+        if ( !err )
+            {
+            CleanupStack::PushL( cm );
+            HBufC* cmName = cm->GetStringAttributeL( ECmName );
+            CleanupStack::PushL( cmName );
+            items->AppendL( *cmName );
+            
+            // Virtual CMs have underlying CMs, highlight
+            if ( cm->GetBoolAttributeL( ECmVirtual ) )
+                {
+                TUint32 iapId (0);
+                iapId = cm->GetIntAttributeL( ECmNextLayerIapId );
+                if ( iapId && iapId == aSelection.iId )
+                    {
+                    cmSelected = i;
+                    }
+                }            
+            CleanupStack::PopAndDestroy( 2, cm );
+            }
+        else
+            {
+            //not handled iap, remove from list
+            aUncatArray.Remove( i );
+            count--;
+            i--;
+            }
+        }
+    
+    
+    CAknRadioButtonSettingPage* rbPage = 
+                new ( ELeave ) CAknRadioButtonSettingPage(
+                                    R_RADIO_BUTTON_SETTING_PAGE_OK_CANCEL, 
+                                    cmSelected, 
+                                    items );
+    CleanupStack::PushL( rbPage );
+                        
+    HBufC* buf = StringLoader::LoadLC( aTitleStringResource );    
+    rbPage->SetSettingTextL( *buf );
+    CleanupStack::PopAndDestroy( buf );
+    
+    if ( rbPage->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+        {
+        CCmPluginBase* cm = 
+                iCmManagerImpl->GetConnectionMethodL( aUncatArray[cmSelected]->GetIntAttributeL( ECmId) );
+
+        // ECmIapId can be surely queried here. It won't leave, but PushL to be
+        // on the safe side
+        CleanupStack::PushL( cm );
+        aSelection.iId = cm->GetIntAttributeL( ECmId );
+        CleanupStack::PopAndDestroy( cm );
+
+        aSelection.iResult = EDCConnectionMethod; 
+        
+        retVal = ETrue;
+        }
+    CleanupStack::Pop( rbPage );
+    CleanupStack::PopAndDestroy( items );
+    
+    return retVal;
+    }
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::ShowConnectionMethodsL()
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::ShowConnectionMethodsL( 
+                    RPointerArray<CCmPluginBase>& aCmArray, TCmDCSettingSelection& aSelection, 
+                    const TInt aTitleStringResource,
+                    TBearerFilterArray& aFilterArray  )
+    {
+    TInt retVal ( EFalse );
+    
+    // List texts
+    CDesCArrayFlat* items = 
+            new ( ELeave ) CDesCArrayFlat( KCmArrayMediumGranularity );
+    CleanupStack::PushL( items );
+    
+    // keeps track of the CMs in the list
+    
+    // idArray is used to put valid IAP ID.
+    // aFilterArray might filt some of IAPs (e.g., virtual IAPs) out. In this case,
+    // aCmArray can not be used to select IAP. So, idArray may be used for IAP selection
+    // for it only stores valid IAPs (i.e., not filted-out IAPs).
+    RArray<TUint32> idArray;
+    TInt cmSelected( 0 );
+    TInt j( 0 );
+    
+    // Collect item texts
+    TInt cmCount = aCmArray.Count();
+    for ( TInt i = 0; i < cmCount; i++ )
+        {
+        // CM info
+        if (aFilterArray.Count())
+            {
+            TUint cmBearerType = aCmArray[i]->GetIntAttributeL( ECmBearerType );
+            if ( aFilterArray.Find( cmBearerType ) == KErrNotFound )
+                {
+                continue;    
+                }
+            }
+        
+        // CM Iap Id
+        TUint32 cmIapId = aCmArray[i]->GetIntAttributeL( ECmId );
+        
+        // Should virtual bearer types be shown?
+        if ( iShowVirtualCMs || !IsCmVirtualL( cmIapId ) )
+            {
+            // CM name
+            HBufC* name = aCmArray[i]->GetStringAttributeL( ECmName );
+            CleanupStack::PushL( name );
+            
+            items->AppendL( *name );
+            idArray.Append( cmIapId );
+            
+             // Virtual CMs have underlying CMs, highlight
+            if ( cmIapId == aSelection.iId )
+                {
+                cmSelected = j;
+                j++;
+                }
+            
+            CleanupStack::PopAndDestroy( name );
+            }
+        }
+    
+    // create the dialog             
+    CAknRadioButtonSettingPage* dlg = 
+                            new ( ELeave ) CAknRadioButtonSettingPage(
+                                    R_RADIO_BUTTON_SETTING_PAGE_OK_CANCEL,
+                                    cmSelected, 
+                                    items );
+    CleanupStack::PushL( dlg );
+    
+    // Title
+    HBufC* title = StringLoader::LoadLC ( aTitleStringResource );
+    dlg->SetSettingTextL( *title );
+    
+    // Show the dialog
+    if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+        {
+        aSelection.iId = idArray[cmSelected];
+        aSelection.iResult = EDCConnectionMethod; 
+        retVal = ETrue;
+        }
+    idArray.Close();
+    
+    CleanupStack::PopAndDestroy( title );
+    CleanupStack::Pop( dlg );
+    CleanupStack::PopAndDestroy( items );
+    
+    return retVal;
+    }
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::IsCmVirtualL
+//---------------------------------------------------------------------------
+//
+TBool CCmConnSettingsUiImpl::IsCmVirtualL( TUint32 aIapId )
+    {
+    // check if bearer is virtual
+    TInt bearerType = iCmManagerImpl->GetConnectionMethodInfoIntL( 
+                                                aIapId, ECmBearerType );
+    return iCmManagerImpl->GetBearerInfoBoolL( bearerType, ECmVirtual );
+    }
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::CreateDefaultConnectionNameL
+//---------------------------------------------------------------------------
+//
+HBufC* CCmConnSettingsUiImpl::CreateDefaultConnectionNameL( 
+                                            TCmDefConnValue aSelection )
+    {
+    HBufC* ret = NULL;
+    switch ( aSelection.iType )
+        {
+        case ECmDefConnDestination:
+            {
+            CCmDestinationImpl* dest = 
+                        iCmManagerImpl->DestinationL( aSelection.iId );
+            CleanupStack::PushL( dest );
+            ret = dest->NameLC();
+            CleanupStack::Pop( ret );
+            CleanupStack::PopAndDestroy( dest );
+            break;
+            }
+        case ECmDefConnConnectionMethod:
+            {
+            ret = iCmManagerImpl->GetConnectionMethodInfoStringL( 
+                                                aSelection.iId, ECmName );
+            break;
+            }
+        }
+    return ret;
+    }
+   
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::SetDestinationArrayToUseL
+//---------------------------------------------------------------------------
+//
+EXPORT_C void CCmConnSettingsUiImpl::SetDestinationArrayToUseL(
+                                         RArray<TUint32> aDestinationArray )
+    {
+    iPassedDestinations.Close();
+    for (TInt i=0; i<aDestinationArray.Count(); i++)
+        {
+        iPassedDestinations.AppendL(aDestinationArray[i]);
+        }
+    
+    iUsePassedDestinationArray = ETrue;
+    }
+
+
+//---------------------------------------------------------------------------
+//  CCmConnSettingsUiImpl::ClearDestinationArrayToUse
+//---------------------------------------------------------------------------
+//
+EXPORT_C void CCmConnSettingsUiImpl::ClearDestinationArrayToUse()
+    {
+    iPassedDestinations.Close();
+    iUsePassedDestinationArray = EFalse;
+    }
+
+