--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cmmgr/Framework/Src/cmdlg.cpp Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,2044 @@
+/*
+* Copyright (c) 2006-2008 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 CCmDlg
+*
+*/
+
+#include <avkon.hrh>
+#include <eikdef.h>
+#include <eikenv.h>
+#include <eikedwin.h>
+#include <cmmanager.rsg>
+#include <data_caging_path_literals.hrh>
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <eikmenup.h>
+#include <StringLoader.h>
+#include <AknIconArray.h>
+#include <aknnavilabel.h>
+#include <cmmanager.mbg>
+#include <cmpluginembdestinationdef.h>
+#include <featmgr.h>
+
+#include <hlplch.h>
+#include <csxhelp/cp.hlp.hrh>
+
+#include "cmdlg.h"
+#include "cmmanager.hrh"
+#include "cmlistitem.h"
+#include "cmlistitemlist.h"
+#include <cmpluginbaseeng.h>
+#include <cmpluginbase.h>
+#include "cmdestinationimpl.h"
+#include <cmcommonui.h>
+#include <cmcommonconstants.h>
+#include <cmpbasesettingsdlg.h>
+#include "cmwizard.h"
+#include "selectdestinationdlg.h"
+#include <cmmanagerdef.h>
+#include <mcmdexec.h>
+#include "ccmdexec.h"
+#include "destdlg.h"
+#include "cmlogger.h"
+#include "cmconnsettingsuiimpl.h"
+
+using namespace CMManager;
+using namespace CommsDat;
+
+// ---------------------------------------------------------------------------
+// CCmDlg::ConstructAndRunLD
+// Constructs the dialog and runs it.
+// ---------------------------------------------------------------------------
+//
+TInt CCmDlg::ConstructAndRunLD( TUint32 aHighlight,
+ TUint32& aSelected )
+ {
+ CleanupStack::PushL( this );
+
+ iHighlight = aHighlight;
+ iSelected = &aSelected;
+
+ ConstructL( R_CM_MENUBAR );
+ PrepareLC( R_CM_DIALOG );
+ CleanupStack::Pop( this );
+
+ iModel = new( ELeave )CCmListboxModel();
+
+ iCmDestinationImpl = iCmManager->DestinationL( iDestUid );
+
+ iInfoPopupNoteController = CAknInfoPopupNoteController::NewL();
+
+ // Trace changes in CommsDat
+ iCmManager->WatcherRegisterL( this );
+
+ return RunLD();
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::NewL()
+// Two-phase dconstructor, second phase is ConstructAndRunLD
+// ---------------------------------------------------------------------------
+//
+CCmDlg* CCmDlg::NewL(CCmManagerImpl* aCmManager, TUint32 aDestUid,
+ CDestDlg* aDestDlg)
+ {
+ CCmDlg* self = new (ELeave) CCmDlg( aCmManager, aDestUid, aDestDlg );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::CCmDlg()
+// ---------------------------------------------------------------------------
+//
+CCmDlg::CCmDlg( CCmManagerImpl* aCmManager, TUint32 aDestUid,
+ CDestDlg* aDestDlg )
+ : iModelPassed( EFalse )
+ , iCmManager( aCmManager )
+ , iDestUid ( aDestUid )
+ , iPrioritising ( EFalse )
+ , iExitReason( KDialogUserBack )
+ , iEscapeArrived( EFalse )
+ , iExitduringProcessing( EFalse )
+ , iBackduringProcessing( EFalse )
+ , iDestDlg( aDestDlg )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::~CCmDlg
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCmDlg::~CCmDlg()
+ {
+ // iModel is deleted by the ListBox because LB owns the model...
+ // of course only after we passed ownership...
+ if ( !iModelPassed )
+ {
+ delete iModel;
+ }
+
+ delete iNaviDecorator;
+
+ if ( iTitlePane )
+ {
+ // set old text back, if we have it...
+ if ( iOldTitleText )
+ {
+ TRAP_IGNORE( iTitlePane->SetTextL( *iOldTitleText ) );
+ delete iOldTitleText; iOldTitleText = NULL;
+ }
+ }
+
+ delete iOldTitleText;
+
+ if(iCmDestinationImpl)
+ {
+ delete iCmDestinationImpl;
+ iCmDestinationImpl = NULL;
+ }
+
+ if ( iInfoPopupNoteController )
+ {
+ delete iInfoPopupNoteController;
+ }
+
+ if( iCmWizard )
+ {
+ delete iCmWizard;
+ }
+ iItemIndex.Close();
+
+ delete iCmdExec;
+ iCmdExec = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::PreLayoutDynInitL();
+// called by framework before dialog is shown
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::PreLayoutDynInitL()
+ {
+ iListbox = STATIC_CAST( CCmListbox*, Control( KCmListboxId ) );
+ iListbox->CreateScrollBarFrameL( ETrue );
+ iListbox->ScrollBarFrame()->SetScrollBarVisibilityL
+ ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+ iListbox->SetListBoxObserver( this );
+
+ iListbox->Model()->SetItemTextArray( iModel );
+ iModelPassed = ETrue;
+ InitTextsL();
+ HandleListboxDataChangeL();
+ iListbox->HandleItemAdditionL();
+
+ if ( iHighlight )
+ {
+ iListbox->ScrollToMakeItemVisible( iHighlight );
+ iListbox->SetCurrentItemIndexAndDraw( iHighlight );
+ }
+ ShowPopupNoteL();
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CAknDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+ if ( aResourceId == R_CM_MENU )
+ {
+ if (aResourceId == R_CM_MENU && !iCmManager->IsHelpOn())
+ {
+ aMenuPane->DeleteMenuItem( EAknCmdHelp );
+ }
+ // Menu items
+ TBool hideAdd ( EFalse );
+ TBool hideRename ( EFalse );
+ TBool hideDelete ( EFalse );
+ TBool hideCopy ( EFalse );
+ TBool hideMove ( EFalse );
+ TBool hidePrioritise( EFalse );
+
+ // Edit, Rename, Delete and Organise menu items are hidden if:
+ // 1. CM List is empty
+ // 2. Embedded Destinations
+ if ( !( iListbox->Model()->ItemTextArray()->MdcaCount() ) )
+ {
+ hideRename = ETrue;
+ hideDelete = ETrue;
+ hideCopy = ETrue;
+ hideMove = ETrue;
+ }
+ // Embedded destinations can be deleted but not edited
+ else if ( ( CurrentCML()->GetBoolAttributeL(ECmDestination) ) )
+ {
+ hideRename = ETrue;
+ }
+ // Only one CM in the list OR highlighted CM is a virtual CM
+ else if ( ( iListbox->Model()->ItemTextArray()->MdcaCount() == 1 ) )
+ {
+ hidePrioritise = ETrue;
+ }
+ // virtual CMs pointing to destinations
+ else if ( CurrentCML()->GetBoolAttributeL( ECmVirtual ) )
+ {
+ if ( CurrentCML()->GetIntAttributeL( ECmNextLayerSNAPId ) )
+ {
+ hidePrioritise = ETrue;
+ }
+ }
+ // No available destination to copy/move the CM to
+ RArray<TUint32> destinations( KCmArrayMediumGranularity );
+ CleanupClosePushL( destinations );
+ iCmManager->AllDestinationsL( destinations );
+ for ( TInt i = 0; i < destinations.Count(); i++ )
+ {
+ CCmDestinationImpl* dest =
+ iCmManager->DestinationL( destinations[i] );
+ CleanupStack::PushL( dest );
+ // Not allowed to copy/move CMs into Level1 protected destinations
+ if ( dest->ProtectionLevel() != CMManager::EProtLevel1 )
+ {
+ // iCmDestinationImpl is null in Uncat dlg - ignore
+ // Don't count the current destination
+ if ( !iCmDestinationImpl ||
+ dest->Id() != iCmDestinationImpl->Id() )
+ {
+ hideCopy = EFalse;
+ hideMove = EFalse;
+ CleanupStack::PopAndDestroy( dest );
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( dest );
+ }
+ CleanupStack::PopAndDestroy( &destinations );
+
+ // Show or hide menu items
+ if ( aResourceId == R_CM_MENU )
+ {
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmAdd, hideAdd );
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmRename, hideRename );
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmDelete, hideDelete );
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmPrioritise, hidePrioritise );
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmMoveToOtherDestination, hideMove );
+ aMenuPane->SetItemDimmed( ECmManagerUiCmdCmCopyToOtherDestination, hideCopy );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::InitTextsL
+// called before the dialog is shown
+// to initialize localized textual data
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::InitTextsL()
+ {
+ // set pane text if neccessary...
+ // pane text needed if not pop-up...
+ HBufC* primary =
+ iEikonEnv->AllocReadResourceLC( R_CMMANAGERUI_EMPTY_METHOD_VIEW_PRIMARY );
+ HBufC* secondary =
+ iEikonEnv->AllocReadResourceLC( R_CMMANAGERUI_EMPTY_METHOD_VIEW_SECONDARY );
+ CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat(2);
+ CleanupStack::PushL(items);
+ items->AppendL(primary->Des());
+ items->AppendL(secondary->Des());
+ HBufC* emptyText =
+ StringLoader::LoadLC( R_TWO_STRING_FOR_EMPTY_VIEW , *items);
+ iListbox->View()->SetListEmptyTextL( *emptyText );
+ CleanupStack::PopAndDestroy( emptyText );
+ CleanupStack::PopAndDestroy( items );
+ CleanupStack::PopAndDestroy( secondary );
+ CleanupStack::PopAndDestroy( primary );
+
+ iStatusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ iTitlePane = ( CAknTitlePane* )iStatusPane->ControlL(
+ TUid::Uid( EEikStatusPaneUidTitle ) );
+
+ iOldTitleText = iTitlePane->Text()->AllocL();
+ HBufC* name = iCmDestinationImpl->NameLC();
+ iTitlePane->SetTextL( *name );
+ CleanupStack::PopAndDestroy( name );
+
+ iNaviPane = ( CAknNavigationControlContainer* )
+ iStatusPane->ControlL(
+ TUid::Uid( EEikStatusPaneUidNavi ) );
+ iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
+ iNaviPane->PushL( *iNaviDecorator );
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::SetNoOfCMsL
+// ---------------------------------------------------------------------------
+//
+
+void CCmDlg::SetNoOfCMsL(TInt aCount)
+ {
+ if ( iNaviDecorator )
+ {
+ if ( iNaviDecorator->ControlType() ==
+ CAknNavigationDecorator::ENaviLabel)
+ {
+ CAknNaviLabel* naviLabel =
+ (CAknNaviLabel*)iNaviDecorator->DecoratedControl();
+ if (aCount)
+ {
+ HBufC* title = NULL;
+
+ if (aCount == 1)
+ {
+ title = StringLoader::LoadLC(
+ R_CMMANAGERUI_NAVI_ONE_CONN_METHOD );
+ }
+ else
+ {
+ title = StringLoader::LoadLC(
+ R_CMMANAGERUI_NAVI_MANY_CONN_METHODS,
+ aCount );
+ }
+
+ naviLabel->SetTextL(*title);
+ CleanupStack::PopAndDestroy( title );
+ }
+ else
+ {
+ naviLabel->SetTextL(KNullDesC);
+ }
+
+ iNaviPane->PushL( *iNaviDecorator );
+ }
+ }
+
+ }
+
+//----------------------------------------------------------
+// CCmDlg::CreateCustomControlL
+//----------------------------------------------------------
+//
+SEikControlInfo CCmDlg::CreateCustomControlL( TInt aControlType )
+ {
+ SEikControlInfo controlInfo;
+ controlInfo.iTrailerTextId = 0;
+ controlInfo.iFlags = 0;
+ if ( aControlType == KCmListboxType )
+ {
+ controlInfo.iControl = new ( ELeave ) CCmListbox;
+ }
+ else
+ {
+ controlInfo.iControl = NULL;
+ }
+ return controlInfo;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::OkToExitL
+// Good to know : EAknSoftkeyCancel is never called, because
+// EEikDialogFlagNotifyEsc flag is not set in the resource.
+// ---------------------------------------------------------------------------
+//
+TBool CCmDlg::OkToExitL( TInt aButtonId )
+ {
+ LOGGER_ENTERFN( "CCmDlg::OkToExitL" );
+
+ // Translate the button presses into commands for the appui & current
+ // view to handle
+ // Dialog should not exit
+ TBool retVal( EFalse );
+
+ switch ( aButtonId )
+ {
+ case EAknSoftkeyOk:
+ case ECmManagerUiCmdCmEdit:
+ {
+ if ( !iProcessing )
+ {
+ if ( CMCount() )
+ {
+ iProcessing = ETrue;
+ ProcessCommandL( aButtonId );
+ iProcessing = EFalse;
+ }
+ else
+ {
+ iProcessing = ETrue;
+ AddConnectionMethodL();
+ iProcessing = EFalse;
+ }
+ }
+ break;
+ }
+ case EAknSoftkeyClear:
+ {
+ ProcessCommandL( aButtonId );
+ break;
+ }
+ case ECmManagerUiCmdCmPrioOk:
+ {
+ if ( iPrioritising )
+ {
+ FinishPriorizingL( ETrue );
+ }
+
+ break;
+ }
+ case ECmManagerUiCmdCmPrioCancel:
+ {
+ if ( !MenuShowing() )
+ {
+ if ( iPrioritising )
+ {
+ FinishPriorizingL( EFalse );
+ }
+ }
+ break;
+ }
+ case ECmManagerUiCmdCmUserExit:
+ {
+ iCmManager->WatcherUnRegister();
+
+ iExitReason = KDialogUserExit;
+ break;
+ }
+ case EAknSoftkeyBack:
+ {
+ iCmManager->WatcherUnRegister();
+
+ if ( !iProcessing )
+ {
+ *iSelected = 0;
+ TryExitL( iExitReason );
+ }
+ else
+ {
+ iBackduringProcessing = ETrue;
+ }
+ break;
+ }
+ default:
+ {
+ if ( !iProcessing )
+ {
+ if ( aButtonId == EAknSoftkeyOptions )
+ {
+ DisplayMenuL();
+ }
+ else
+ {
+ retVal = ETrue;
+ }
+ }
+ if ( iProcessing )
+ {
+ iExitduringProcessing = ETrue;
+ if( aButtonId == KDialogUserExit )
+ {
+ retVal = ETrue;
+ }
+ }
+ break;
+ }
+ }
+ return retVal;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::HandleListBoxEventL
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType )
+ {
+ LOGGER_ENTERFN( "CCmDlg::HandleListBoxEventL" );
+
+ switch ( aEventType )
+ {
+ case EEventEnterKeyPressed:
+ {
+ if ( iPrioritising )
+ {
+ FinishPriorizingL( ETrue );
+ }
+ else
+ {
+ if ( !iProcessing )
+ {
+ delete iCmdExec;
+ iCmdExec = NULL;
+ iCmdExec = new (ELeave) CCmdExec(*this);
+ iCmdExec->Execute();
+ }
+ }
+ break;
+ }
+ case EEventItemSingleClicked:
+ {
+ if ( !iProcessing )
+ {
+ delete iCmdExec;
+ iCmdExec = NULL;
+ iCmdExec = new (ELeave) CCmdExec(*this);
+ iCmdExec->Execute();
+ }
+ break;
+ }
+ case EEventEditingStarted:
+ {
+ break;
+ }
+ case EEventEditingStopped:
+ {
+ break;
+ }
+ default:
+ {
+ break;
+ };
+ };
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCmDlg::ProcessCommandL
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::ProcessCommandL( TInt aCommandId )
+ {
+ LOGGER_ENTERFN( "CCmDlg::ProcessCommandL" );
+
+ if ( MenuShowing() )
+ {
+ HideMenu();
+ }
+
+ switch ( aCommandId )
+ {
+ // Connection Method Modification Commands
+ case ECmManagerUiCmdCmAdd:
+ {
+ if ( !iProcessing )
+ {
+ iProcessing = ETrue;
+ TRAPD( err, AddConnectionMethodL() );
+ // Memory full
+ if (err == KLeaveWithoutAlert || err == KErrNoMemory)
+ {
+ iProcessing = EFalse;
+ return;
+ }
+ iProcessing = EFalse;
+
+ if ( iBackduringProcessing )
+ {
+ iBackduringProcessing = EFalse;
+ TryExitL( KDialogUserBack );
+ }
+ }
+ break;
+ }
+
+ case ECmManagerUiCmdCmRename:
+ {
+ RenameConnectionMethodL();
+ break;
+ }
+
+ case EAknSoftkeyClear:
+ case ECmManagerUiCmdCmDelete:
+ {
+ if ( iPrioritising )
+ {
+ // Delete cannot be done if priorising has started.
+ break;
+ }
+ DeleteCurrentCmL();
+ break;
+ }
+
+ case ECmManagerUiCmdCmPrioritise:
+ {
+ PrioritiseConnectionMethodL();
+ break;
+ }
+
+ case ECmManagerUiCmdCmCopyToOtherDestination:
+ {
+ CopyConnectionMethodL();
+ break;
+ }
+
+ case ECmManagerUiCmdCmMoveToOtherDestination:
+ {
+ MoveConnectionMethodL();
+ break;
+ }
+
+ case EAknSoftkeyOk:
+ case ECmManagerUiCmdCmEdit:
+ {
+ EditConnectionMethodL();
+ break;
+ }
+
+ // Button Selection commands
+ case EAknSoftkeyOptions:
+ {
+ DisplayMenuL();
+ break;
+ }
+
+ case ECmManagerUiCmdCmUserExit:
+ {
+ iExitReason = KDialogUserExit;
+ }
+
+ case EAknSoftkeyBack:
+ {
+ if (!iProcessing)
+ {
+ *iSelected = 0;
+ TryExitL( iExitReason );
+ }
+ break;
+ }
+ case EAknCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+ iEikonEnv->EikAppUi()->AppHelpContextL() );
+ }
+ break;
+
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::DeleteCurrentCmL
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::DeleteCurrentCmL( )
+ {
+ LOGGER_ENTERFN( "CCmDlg::DeleteCurrentCmL" );
+
+ TCmDefConnValue oldConn;
+ if (iCmManager->IsDefConnSupported())
+ {
+ iCmManager->ReadDefConnL( oldConn );
+ }
+ CCmPluginBase* cm = CurrentCML();
+ if ( !cm )
+ {
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmProtected ) )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmIsLinked ) )//same check as KErrLocked below
+ {
+ TCmCommonUi::ShowNoteL(
+ R_QTN_NETW_CONSET_INFO_CANNOT_DELETE_VIRTUAL_REF,
+ TCmCommonUi::ECmErrorNote );
+
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmConnected ) )//same check as KErrInUse below
+ {
+ TCmCommonUi::ShowNoteL( R_CMMANAGERUI_INFO_CM_IN_USE_CANNOT_DELETE,
+ TCmCommonUi::ECmErrorNote );
+
+ return;
+ }
+
+ // EKOA-74KC3L: check if it is the last CM in a destination being referenced
+ // by a VPN
+ if ( iCmDestinationImpl &&
+ iCmDestinationImpl->ConnectionMethodCount() == 1 )
+ {
+ // it is definitely the last, but is it referenced?
+
+ // for each IAP in CM manager
+ // 1. check if it is virtual
+ // if not => goto 1.
+ // if yes:
+ // 2. check if it links to the destination of this CM
+ // if yes => carryOn = EFalse, ERROR
+ // if not: carryOn = ETrue
+
+ CommsDat::CMDBRecordSet<CommsDat::CCDIAPRecord>* iaps =
+ iCmManager->AllIapsL();
+
+ CleanupStack::PushL( iaps );
+
+ TBool carryOn = ETrue;
+ TUint32 destId = iCmDestinationImpl->Id();
+
+ // for each IAP in CM manager
+ for ( TInt i = 0; carryOn && i < iaps->iRecords.Count(); ++i )
+ {
+ CommsDat::CCDIAPRecord* rec = (*iaps)[i];
+ TUint32 bearerType = 0;
+
+ TRAP_IGNORE( bearerType =
+ iCmManager->BearerTypeFromIapRecordL( rec ) );
+ if ( !bearerType )
+ {
+ continue;
+ }
+
+ // check if it is virtual
+ if ( iCmManager->GetBearerInfoBoolL( bearerType, ECmVirtual ) )
+ {
+ // check if it links to the current destination
+ CCmPluginBase* plugin = NULL;
+ TRAP_IGNORE( plugin = iCmManager->GetConnectionMethodL(
+ rec->RecordId() ) );
+
+ if ( !plugin )
+ {
+ continue;
+ }
+
+ if ( plugin->IsLinkedToSnap( destId ) )
+ {
+ // the CM links to this destination, deletion not allowed
+ carryOn = EFalse;
+ }
+
+ delete plugin;
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy( iaps );
+
+ if ( !carryOn )
+ {
+ TCmCommonUi::ShowNoteL( R_QTN_NETW_CONSET_INFO_CANNOT_DELETE_VIRTUAL_REF,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ }
+
+
+ // If it's an embedded destination, show a warning
+ TBool showCmDeleteQuery( ETrue );
+ if ( cm->GetBoolAttributeL( ECmDestination ) )
+ {
+ if ( TCmCommonUi::ShowConfirmationQueryL(
+ R_CMMANAGERUI_QUEST_EMBEDDED_DEST_DELETE ) )
+ {
+ // user wants to delete, set flag to avoid 2nd query message
+ showCmDeleteQuery = EFalse;
+ }
+ else
+ {
+ return; // user cancelled delete request
+ }
+ }
+
+ HBufC* cmName = cm->GetStringAttributeL( ECmName );
+ CleanupStack::PushL( cmName );
+
+ // Query for CM deletion - which will be skipped in the case of embedded
+ // destintations
+ // Protected CM's cannot be deleted either
+ if ( !showCmDeleteQuery || iAlreadyConfirmedDelete ||
+ TCmCommonUi::ShowConfirmationQueryL(
+ R_CMMANAGERUI_QUEST_CM_DELETE,
+ *cmName ) )
+ {
+ TInt err = KErrNone;
+ if ( iCmDestinationImpl )
+ {
+ TRAP( err, iCmDestinationImpl->DeleteConnectionMethodL( *cm ) );
+ }
+ else
+ {
+ TRAP( err, (void)cm->DeleteL( ETrue ) );
+ }
+
+ switch ( err )
+ {
+ case KErrInUse: //shouldn't get here, already checked above
+ {
+ TCmCommonUi::ShowNoteL
+ ( R_CMMANAGERUI_INFO_CM_IN_USE_CANNOT_DELETE,
+ TCmCommonUi::ECmErrorNote );
+ }
+ break;
+
+ case KErrLocked://shouldn't get here, already checked above
+ {
+ TCmCommonUi::ShowNoteL
+ ( R_QTN_NETW_CONSET_INFO_CANNOT_DELETE_VIRTUAL_REF,
+ TCmCommonUi::ECmErrorNote );
+ }
+ break;
+
+ case KErrNone:
+ {
+ if ( iCmDestinationImpl )
+ {
+ iCmDestinationImpl->UpdateL();
+ }
+ if (iCmManager->IsDefConnSupported())
+ {
+ iDestDlg->ShowDefaultConnectionNoteL( oldConn );
+ }
+ HandleListboxDataChangeL();
+ }
+ break;
+
+ default:
+ {
+ }
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( cmName );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::RenameConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::RenameConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::RenameConnectionMethodL" );
+
+ CCmPluginBase* cm = CurrentCML();
+ if ( !cm )
+ {
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmProtected ) )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ if ( CurrentCmInUseL() )
+ {
+ return;
+ }
+
+ TBuf<KConnMethodNameMaxLength> buf;
+
+ HBufC* cmName = cm->GetStringAttributeL(ECmName);
+ CleanupStack::PushL(cmName);
+ buf.Copy(*cmName);
+
+ // Saves the recent naming method and set it to "Not accept"
+ TUint32 savedNM = cm->GetIntAttributeL( ECmNamingMethod );
+ cm->SetIntAttributeL( ECmNamingMethod, ENamingNotAccept );
+
+ // Asks the new name
+ TBool go = ETrue;
+ TInt ret = TCmCommonUi::ShowConfirmationQueryWithInputL(
+ R_CMMANAGERUI_PRMPT_CM_MAME,
+ buf );
+
+ // While the name is not unique or cancel pressed
+ while( ret && go )
+ {
+ // Tries to save the nem name. If it is not unique
+ // then ret == KErrArgument
+ TRAPD( err, cm->SetStringAttributeL( ECmName, buf ) );
+
+ if( KErrArgument == err )
+ {
+ // Opens a info note
+ HBufC* noteLine = StringLoader::LoadLC(
+ R_CMMANAGERUI_INFO_CM_ALREADY_IN_USE, buf );
+
+ TCmCommonUi::ShowNoteL( *noteLine, TCmCommonUi::ECmInfoNote );
+
+ CleanupStack::PopAndDestroy( noteLine );
+
+ // Asks the new name again
+ ret = TCmCommonUi::ShowConfirmationQueryWithInputL(
+ R_CMMANAGERUI_PRMPT_CM_MAME,
+ buf );
+ }
+ else
+ {
+ // New name is unique loop can stop
+ go = EFalse;
+ }
+ }
+
+ // Sets back the original naming method
+ cm->SetIntAttributeL( ECmNamingMethod, savedNM );
+
+ // If not cancel pressed the new name is set
+ if( ret )
+ {
+ cm->UpdateL();
+
+ HandleListboxDataChangeL();
+ }
+
+ CleanupStack::PopAndDestroy( cmName );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::PrioritiseConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::PrioritiseConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::PrioritiseConnectionMethodL" );
+
+ ButtonGroupContainer().SetCommandSetL( R_SOFTKEYS_PRIO_OK_CANCEL__OK );
+ iListbox->View()->SelectItemL( iListbox->CurrentItemIndex() );
+ iListbox->View()->DrawItem( iListbox->CurrentItemIndex() );
+ ButtonGroupContainer().DrawNow();
+ iPrioritising = ETrue;
+ iCmToPrioritise = iListbox->CurrentItemIndex();
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::AddConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::AddConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::AddConnectionMethodL" );
+
+ // Check first if parent destination is protected
+ if ( iCmDestinationImpl &&
+ iCmDestinationImpl->ProtectionLevel() == CMManager::EProtLevel1 )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ // Opens a Connection method creation wizard
+ iCmWizard = new (ELeave) CCmWizard( *iCmManager );
+
+ TInt itemstemp = iListbox->Model()->NumberOfItems();
+
+ TInt ret( KErrNone );
+ TRAPD( err, ret = iCmWizard->CreateConnectionMethodL( iCmDestinationImpl ) );
+ if ( err )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ ret = KErrCancel;
+ }
+ delete iCmWizard;
+ iCmWizard = NULL;
+
+
+ // If application wanted to be closed before then RunAppShutter()
+ // should be called here
+ if( iEscapeArrived )
+ {
+ ( ( CAknAppUi* )iEikonEnv->EikAppUi() )->RunAppShutter();
+ }
+
+ if( ret != KErrCancel )
+ {
+ iHighlight = ret;
+
+
+ // Update the middle soft key if this is the first cm added
+ if ( CMCount() == 1 )
+ {
+ HBufC* text = StringLoader::LoadLC( R_QTN_MSK_EDIT );
+ ButtonGroupContainer().SetCommandL( ECmManagerUiCmdCmEdit,
+ *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+ //HandleListboxDataChangeL();
+ TRAP( err, HandleListboxDataChangeL() );
+ if ( err )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+ iListbox->HandleItemAdditionL();
+
+ if (itemstemp < iListbox->Model()->NumberOfItems())
+ {
+ //first item cannot be deleted
+ iListbox->ScrollToMakeItemVisible(
+ iListbox->Model()->NumberOfItems() -1 );
+ iListbox->SetCurrentItemIndexAndDraw( iHighlight );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::CopyConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::CopyConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::CopyConnectionMethodL" );
+
+ CCmPluginBase* cm = CurrentCML();
+ if ( !cm )
+ {
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmProtected ) ||
+ ( iCmDestinationImpl &&
+ iCmDestinationImpl->ProtectionLevel() == CMManager::EProtLevel1 ) )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ TUint32 destId( 0 );
+
+ // build an array of possible parent destinations
+ TInt destCount=0;
+ TRAPD( retVal, destCount = iCmManager->DestinationCountL() );
+ if( retVal != KErrNone || destCount < 1 )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_NO_DESTINATION,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ RArray<TUint32> destArray( iCmManager->DestinationCountL() );
+ CleanupClosePushL( destArray );
+
+ iCmManager->AllDestinationsL( destArray );
+
+ // drop current destination (don't ask why)
+ if ( iCmDestinationImpl )
+ {
+ destId = iCmDestinationImpl->Id();
+
+ TInt index = destArray.Find( destId );
+ if ( index != KErrNotFound )
+ {
+ destArray.Remove( index );
+ }
+ }
+
+
+ // now filter the destinations
+ CurrentCML()->FilterPossibleParentsL( destArray );
+
+ // check if there are any remaining destinations
+ if ( !destArray.Count() )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_NO_VPN_STACKING,
+ TCmCommonUi::ECmErrorNote );
+ CleanupStack::PopAndDestroy( &destArray );
+ return;
+ }
+
+ // ok, there is at least 1, pop up the dialog
+ CSelectDestinationDlg* dlg = CSelectDestinationDlg::NewL( destId,
+ *iCmManager,
+ &destArray );
+
+ if ( dlg->ExecuteLD( R_CMMANAGER_LIST_QUERY_WITH_MSGBOX ) )
+ {
+ CCmDestinationImpl* dest = iCmManager->DestinationL( destId );
+ CleanupStack::PushL( dest );
+ if ( iCmDestinationImpl )
+ {
+ // create a copy of the current connection method
+ CCmPluginBase* cmCopy = cm->CreateCopyL();
+ CleanupStack::PushL( cmCopy );
+ // store it in commsdat
+ cmCopy->UpdateL();
+ dest->AddConnectionMethodL( *cmCopy );
+
+ CleanupStack::PopAndDestroy( cmCopy );
+ }
+ else
+ {
+ iCmManager->CopyConnectionMethodL( *dest, *( cm ) );
+ }
+
+ // Rare but UpdateL can leave that cause crash
+ TRAPD( err, dest->UpdateL() );
+ if( err < 0 )
+ {
+ CLOG_WRITE_1( "CCmDlg::CopyConnectionMethodL UpdateL: %d", err );
+ }
+
+ CleanupStack::PopAndDestroy( dest );
+ HandleListboxDataChangeL();
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( &destArray );
+ User::Leave( KErrCancel );
+ }
+
+ CleanupStack::PopAndDestroy( &destArray );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::MoveConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::MoveConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::MoveConnectionMethodL" );
+
+ CCmPluginBase* cm = CurrentCML();
+ if ( !cm )
+ {
+ return;
+ }
+
+ if ( cm->GetBoolAttributeL( ECmProtected ) ||
+ iCmDestinationImpl->ProtectionLevel() == CMManager::EProtLevel1 )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ return;
+ }
+
+ if ( CurrentCmInUseL() )
+ {
+ return;
+ }
+
+ // build an array of possible parent destinations
+ RArray<TUint32> destArray( iCmManager->DestinationCountL() );
+ CleanupClosePushL( destArray );
+
+ iCmManager->AllDestinationsL( destArray );
+
+ TUint32 destId( 0 );
+
+ // first remove the current parent (makes no sense moving a CM to its
+ // original destination)
+ if ( iCmDestinationImpl )
+ {
+ destId = iCmDestinationImpl->Id();
+
+ TInt index = destArray.Find( destId );
+ if ( index != KErrNotFound )
+ {
+ destArray.Remove( index );
+ }
+ }
+
+ // now filter the destinations
+ CurrentCML()->FilterPossibleParentsL( destArray );
+
+ // check if there are any remaining destinations
+ if ( !destArray.Count() )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_NO_VPN_STACKING,
+ TCmCommonUi::ECmErrorNote );
+ CleanupStack::PopAndDestroy( &destArray );
+ return;
+ }
+
+
+ CSelectDestinationDlg* dlg = CSelectDestinationDlg::NewL( destId,
+ *iCmManager,
+ &destArray );
+
+ if ( dlg->ExecuteLD( R_CMMANAGER_LIST_QUERY_WITH_MSGBOX ) )
+ {
+ CCmDestinationImpl* dest = iCmManager->DestinationL( destId );
+ CleanupStack::PushL( dest );
+ iCmManager->MoveConnectionMethodL( *iCmDestinationImpl,
+ *dest,
+ *( CurrentCML() ) );
+ CleanupStack::PopAndDestroy( dest );
+ iCmDestinationImpl->UpdateL();
+
+ HandleListboxDataChangeL();
+ }
+
+ CleanupStack::PopAndDestroy( &destArray );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::EditConnectionMethodL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::EditConnectionMethodL()
+ {
+ LOGGER_ENTERFN( "CCmDlg::EditConnectionMethodL" );
+
+ CCmPluginBase* cm = NULL;
+
+ TRAPD( err, cm = CurrentCML() );
+
+ if( err == KErrNotSupported )
+ {
+ return;
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+
+ // Must reload here in case another app changed the data (CurrentCML loads
+ // only if not already loaded)
+ cm->ReLoadL();
+
+ if ( cm->GetBoolAttributeL( ECmProtected ) ||
+ cm->GetBoolAttributeL( ECmDestination ) )
+ {
+ TCmCommonUi::ShowNoteL( R_CMWIZARD_CANNOT_PERFORM_FOR_PROTECTED,
+ TCmCommonUi::ECmErrorNote );
+ }
+ else if ( cm->GetBoolAttributeL( ECmBearerHasUi ) )
+ {
+ // check if the cm is in use
+ if ( !CurrentCmInUseL() )
+ {
+ TInt ret = cm->RunSettingsL();
+ if ( ret == KDialogUserExit )
+ {
+ TryExitL( KDialogUserExit );
+ }
+ else
+ {
+ if ( ret == KDialogUserDeleteConfirmed )
+ {
+ iAlreadyConfirmedDelete = ETrue;
+ DeleteCurrentCmL();
+ iAlreadyConfirmedDelete = EFalse;
+ }
+ if ( ret == KDialogUserDelete )
+ {
+ DeleteCurrentCmL();
+ }
+
+ // Reorder according to priorities, if needed
+ ReOrderCMsL();
+
+ HandleListboxDataChangeL();
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::ShowPopupNote
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::ShowPopupNoteL()
+ {
+ if ( iInfoPopupNoteController )
+ {
+ if ( iListbox->Model()->NumberOfItems() && !iPrioritising )
+ {
+ // Value is only shown for concrete bearer types - allow to leave
+ HBufC* bearer = NULL;
+ TRAPD( err, bearer =
+ CurrentCML()->GetStringAttributeL( ECmBearerNamePopupNote ) );
+
+ if ( !err )
+ {
+ CleanupStack::PushL( bearer );
+
+ HBufC* title = StringLoader::LoadLC(
+ R_CMMANAGERUI_POPUP_TITLE_DATA_BEARER );
+
+ HBufC* noteText = HBufC::NewLC( title->Size() +
+ 1 +
+ bearer->Size() );
+ noteText->Des().Append( *title );
+ noteText->Des().Append( KCmNewLine );
+ noteText->Des().Append( *bearer );
+ iInfoPopupNoteController->SetTextL( *noteText );
+ iInfoPopupNoteController->ShowInfoPopupNote();
+
+ CleanupStack::PopAndDestroy( 3, bearer );
+ }
+ else
+ {
+ iInfoPopupNoteController->HideInfoPopupNote();
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CCmDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ LOGGER_ENTERFN( "CCmDlg::OfferKeyEventL" );
+ CLOG_WRITE_1("Key iCode: %d", aKeyEvent.iCode );
+
+ TKeyResponse retVal ( EKeyWasNotConsumed );
+
+ if ( aKeyEvent.iCode == EKeyBackspace )
+ {
+ // While priorising delete item is disabled
+ if( !iPrioritising )
+ {
+ ProcessCommandL( ECmManagerUiCmdCmDelete );
+ }
+ retVal = EKeyWasConsumed;
+ }
+ else if ( aKeyEvent.iCode == EKeyEscape )
+ {
+ // Handling application close needs special care
+ // because of iCmWizard
+ if ( iCmWizard )
+ {
+ // if wizard alives then escape should do after wizard has ended.
+ CLOG_WRITE( "CCmDlg::OfferKeyEventL: Wizard in long process" );
+ iEscapeArrived = ETrue;
+ retVal = EKeyWasConsumed;
+ }
+ else
+ {
+ CLOG_WRITE( "CCmDlg::OfferKeyEventL:Escape" );
+ retVal = CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+ }
+ }
+ else
+ {
+ retVal = iListbox->OfferKeyEventL(aKeyEvent, aType);
+ if ( aKeyEvent.iCode == EKeyUpArrow ||
+ aKeyEvent.iCode == EKeyDownArrow )
+ {
+ ShowPopupNoteL();
+ }
+ }
+
+ return retVal;
+ }
+// ---------------------------------------------------------------------------
+// CCmDlg::HandleInfoPopupNoteEvent
+// called before the dialog is shown to initialize listbox data
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::HandleInfoPopupNoteEvent(
+ CAknInfoPopupNoteController* /*aController*/,
+ TAknInfoPopupNoteEvent /*aEvent*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::CurrentCML
+// Currently selected connection method in the list
+// ---------------------------------------------------------------------------
+//
+CCmPluginBase* CCmDlg::CurrentCML()
+ {
+ if ( iItemIndex.Count() == 0 )
+ {
+ return NULL;
+ }
+ return iCmDestinationImpl->GetConnectionMethodL(
+ iItemIndex[iListbox->CurrentItemIndex()]);
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::CMByIndexL
+// a connection method in the list
+// ---------------------------------------------------------------------------
+//
+CCmPluginBase* CCmDlg::CMByIndexL( TInt aIndex )
+ {
+ return iCmDestinationImpl->GetConnectionMethodL( aIndex );
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::CMCount
+// number of cms in the list
+// ---------------------------------------------------------------------------
+//
+TInt CCmDlg::CMCount()
+ {
+ return iCmDestinationImpl->ConnectionMethodCount();
+ }
+
+// ---------------------------------------------------------------------------
+// CCmDlg::HandleListboxDataChangeL
+// called before the dialog is shown to initialize listbox data
+// ---------------------------------------------------------------------------
+//
+void CCmDlg::HandleListboxDataChangeL()
+ {
+ TInt selected = 0;
+ if ( iListbox->CurrentItemIndex() )
+ {
+ selected = iListbox->CurrentItemIndex();
+ }
+
+ LOGGER_ENTERFN( "CCmDlg::HandleListboxDataChangeL" );
+ iCmManager->OpenTransactionLC();
+
+ RArray<TUint32> cmIds;
+ ConstructCMArrayL( cmIds );
+ CleanupClosePushL( cmIds );
+
+ // Remove hidden Connection Methods from the array if uncat folder
+ if ( !iCmDestinationImpl )
+ {
+ ClearHiddenCMsFromArrayL( cmIds );
+ }
+
+ /// Using test values for now.
+ CArrayPtr< CGulIcon >* icons = new( ELeave ) CAknIconArray( KCMGranularity );
+ CleanupStack::PushL( icons );
+ iModel->ResetAndDestroy();
+
+ MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+ TParse mbmFile;
+ User::LeaveIfError( mbmFile.Set( KManagerIconFilename,
+ &KDC_APP_BITMAP_DIR,
+ NULL ) );
+
+
+ icons->AppendL( AknsUtils::CreateGulIconL(
+ skinInstance,
+ KAknsIIDQgnIndiSettProtectedAdd,
+ mbmFile.FullName(),
+ EMbmCmmanagerQgn_indi_sett_protected_add,
+ EMbmCmmanagerQgn_indi_sett_protected_add_mask ) );
+
+ //0..1 are reserved indexes!
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+
+ AknsUtils::CreateColorIconLC( skinInstance,
+ KAknsIIDQgnIndiDefaultConnAdd,
+ KAknsIIDQsnIconColors,
+ EAknsCIQsnIconColorsCG13,
+ bitmap,
+ mask,
+ mbmFile.FullName(),
+ EMbmCmmanagerQgn_indi_default_conn_add,
+ EMbmCmmanagerQgn_indi_default_conn_add_mask,
+ AKN_LAF_COLOR( 215 ) );
+
+ CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); // Ownership transferred
+ CleanupStack::Pop( 2 ); // bitmap, mask
+
+ CleanupStack::PushL( icon );
+ icons->AppendL( icon );
+ CleanupStack::Pop( icon );
+
+ RArray<TUint> bearerIdArray = RArray<TUint>( KCmArrayBigGranularity );
+ CleanupClosePushL( bearerIdArray );
+
+ TCmDefConnValue sel;
+ TInt defUid = KErrNotFound;
+ if ( iCmManager->IsDefConnSupported() )
+ {
+ iCmManager->ReadDefConnL(sel);
+ if ( sel.iType == EDCConnectionMethod )
+ {
+ defUid = sel.iId;
+ }
+ }
+ iItemIndex.Reset();
+ for ( TInt i = 0; i < cmIds.Count(); i++ )
+ {
+ TInt iconId = KErrNotFound;
+ CCDAccessPointRecord* destAPRecord = NULL;
+ CCDIAPRecord* iapRecord = NULL;
+ HBufC* name = NULL;
+ TBool isDest( cmIds[i] > KCmDefaultDestinationAPTagId );
+ TUint recId( 0 );
+ TBool protect;
+ TUint32 bearerType( 0 );
+
+ if( isDest )
+ {
+ destAPRecord = static_cast<CCDAccessPointRecord *>(
+ CCDRecordBase::RecordFactoryL( KCDTIdAccessPointRecord ) );
+ CleanupStack::PushL( destAPRecord );
+ destAPRecord->iRecordTag = cmIds[i];
+ if ( !destAPRecord->FindL( iCmManager->Session() ) )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ name = TPtrC( destAPRecord->iRecordName ).AllocLC();
+
+ TProtectionLevel protLev = CCmDestinationImpl::ProtectionLevelL( *iCmManager, cmIds[i] );
+
+ protect = (protLev == EProtLevel1) || (protLev == EProtLevel2);
+
+ HBufC* destName = StringLoader::LoadL( R_QTN_NETW_CONSET_EMBEDDED_DEST,
+ *name );
+
+ CleanupStack::PopAndDestroy( name );
+ name = destName;
+ CleanupStack::PushL( name );
+
+ bearerType = KUidEmbeddedDestination;
+ }
+ else
+ {
+ recId = cmIds[i];
+ iapRecord = static_cast<CCDIAPRecord *>
+ (CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+ CleanupStack::PushL( iapRecord );
+
+ iapRecord->SetRecordId( recId );
+ iapRecord->LoadL( iCmManager->Session() );
+
+ TRAPD( err, bearerType = iCmManager->BearerTypeFromIapRecordL( iapRecord ) );
+
+ if( err == KErrNotSupported )
+ // This is unsupported connection method -> don't add it to the list
+ {
+ CleanupStack::PopAndDestroy( iapRecord );
+ continue;
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ name = TPtrC( iapRecord->iRecordName ).AllocLC();
+ protect = iapRecord->Attributes() & ECDProtectedWrite;
+
+ if ( bearerIdArray.Count() )
+ {
+ for ( TInt j = 0; j<bearerIdArray.Count(); j++ )
+ {
+ if ( bearerType == bearerIdArray[j] )
+ {
+ iconId = j+KCmReservedIconIndexCount;
+ }
+ }
+ }
+ }
+
+ if ( iconId == KErrNotFound )
+ {
+ TInt iconInt( 0 );
+ if( isDest )
+ // Embedded destinations has not constant icon.
+ {
+ iconInt = (TInt)CCmDestinationImpl::IconIdL( *iCmManager,
+ cmIds[i] );
+ }
+ else
+ {
+ iconInt = iCmManager->GetBearerInfoIntL( bearerType,
+ ECmBearerIcon );
+ }
+
+ if (iconInt)
+ {
+ if ( isDest )
+ {
+ // append zero - assuming that bearer type values differ from zero
+ bearerIdArray.Append( 0 );
+ }
+ else
+ {
+ bearerIdArray.Append( bearerType );
+ }
+
+ icons->AppendL( (CGulIcon*)iconInt );
+ iconId = bearerIdArray.Count()-1+KCmReservedIconIndexCount;
+ }
+ else
+ {
+ iconId = KCmReservedIconIndexCount;
+ }
+ }
+ TBool def = EFalse;
+ if ( defUid == recId )
+ {
+ def = ETrue;
+ }
+
+ TInt nextLayerSnapId = 0;
+ if( !isDest )
+ {
+ // Check if it is VPN over destination
+ // If yes the list item should have single line
+ CCmPluginBase* plugin = iCmManager->GetConnectionMethodL( cmIds[i] );
+ CleanupStack::PushL( plugin );
+
+ if( plugin->GetBoolAttributeL( ECmVirtual ) )
+ {
+ nextLayerSnapId = plugin->GetIntAttributeL( ECmNextLayerSNAPId );
+ }
+
+ CleanupStack::PopAndDestroy( plugin );
+ }
+
+ CCmListItem* item =
+ CCmListItem::NewLC(
+ recId,
+ name,
+ i,
+ iconId,
+ protect,
+ (nextLayerSnapId ? ETrue : EFalse),
+ // reasons for single line
+ ( isDest || !iCmDestinationImpl),
+ def );
+ CleanupStack::Pop( item );
+ CleanupStack::Pop( name );
+ CleanupStack::PopAndDestroy(); // iapRecord or nwRecord
+ CleanupStack::PushL( item );
+ iModel->AppendL( item );
+ CleanupStack::Pop( item );
+ iItemIndex.Append(i);
+ }
+
+ TInt cmCount = iItemIndex.Count();
+ SetNoOfCMsL( cmCount );
+
+ if ( !cmCount && iCmDestinationImpl )
+ {
+ HBufC* buf = 0;
+ // rare case probably only caused by bad configuration
+ if ( iCmDestinationImpl->ProtectionLevel() == EProtLevel1 )
+ {
+ buf = StringLoader::LoadLC( R_TEXT_SOFTKEY_OPTION );
+ }
+ else
+ {
+ buf = StringLoader::LoadLC( R_CMMANAGERUI_MSK_ADD_METHOD );
+ }
+ ButtonGroupContainer().SetCommandL( ECmManagerUiCmdCmEdit, *buf );
+ ButtonGroupContainer().DrawDeferred();
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+ CleanupStack::PopAndDestroy( &bearerIdArray );
+
+ CArrayPtr<CGulIcon>* oldIcons =
+ iListbox->ItemDrawer()->ColumnData()->IconArray();
+ if ( oldIcons )
+ {
+ oldIcons->ResetAndDestroy();
+ delete oldIcons;
+ }
+
+ iListbox->ItemDrawer()->ColumnData()->SetIconArray( icons );
+
+ CleanupStack::Pop( icons );
+ CleanupStack::PopAndDestroy( &cmIds );
+
+ iCmManager->CommitTransactionL( KErrNone );
+
+ iListbox->DrawNow();
+ iListbox->UpdateScrollBarsL();
+
+ TInt count = iListbox->Model()->NumberOfItems();
+ if ( count )
+ {
+ if ( count <= selected )
+ {
+ selected = count - 1; // index, so --
+ }
+ if ( selected >= 0 )
+ {
+ iListbox->ScrollToMakeItemVisible( selected);
+ iListbox->SetCurrentItemIndexAndDraw( selected );
+ }
+ }
+ }
+
+
+// --------------------------------------------------------------------------
+// CCmDlg::CurrentCmInUseL
+// --------------------------------------------------------------------------
+//
+TBool CCmDlg::CurrentCmInUseL()
+ {
+ TBool retVal = CurrentCML()->GetBoolAttributeL( ECmConnected );
+ if ( retVal )
+ {
+ TCmCommonUi::ShowNoteL( R_QTN_SET_NOTE_AP_IN_USE_EDIT,
+ TCmCommonUi::ECmErrorNote );
+ retVal = ETrue;
+ }
+ return retVal;
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::ConstructCMArrayL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::ConstructCMArrayL( RArray<TUint32>& aCmIds )
+ {
+ iCmDestinationImpl->ReLoadConnectionMethodsL();
+ iCmDestinationImpl->ConnectMethodIdArrayL( aCmIds );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::ClearHiddenCMsFromArrayL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::ClearHiddenCMsFromArrayL( RArray<TUint32>& aCmIds )
+ {
+ TBool hidden( EFalse );
+ TInt err( KErrNone );
+ for ( TInt index = 0; index < aCmIds.Count(); index++ )
+ {
+ TUint recId = aCmIds[index];
+ TRAP( err, hidden = iCmManager->GetConnectionMethodInfoBoolL( recId, ECmHidden ) );
+ if ( err || hidden )
+ {
+ aCmIds.Remove( index );
+ index--;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::GetHelpContext
+// --------------------------------------------------------------------------
+//
+void CCmDlg::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KHelpUidPlugin;
+ aContext.iContext = KSET_HLP_CONN_METHODS_VIEW;
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::FinishPriorizingL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::FinishPriorizingL( TBool aOkPushed )
+ {
+ LOGGER_ENTERFN( "CCmDlg::FinishPriorizing" );
+
+ iListbox->ClearSelection();
+ iPrioritising = EFalse;
+
+ if( aOkPushed )
+ {
+ if ( CurrentCML()->GetBoolAttributeL( ECmDestination ) ||
+ (CurrentCML()->GetBoolAttributeL( ECmVirtual ) &&
+ CurrentCML()->GetIntAttributeL( ECmNextLayerSNAPId )) )
+ {
+ // Priorising not possible
+ TCmCommonUi::ShowNoteL( R_CMMANAGERUI_INFO_PRIO_NOT_POSSIBLE,
+ TCmCommonUi::ECmInfoNote );
+ }
+ else
+ {
+ CCmPluginBase* cm = CMByIndexL(iCmToPrioritise);
+ iCmDestinationImpl->ModifyPriorityL(
+ *cm,
+ iListbox->CurrentItemIndex());
+ iCmDestinationImpl->UpdateL();
+ HandleListboxDataChangeL();
+ ShowPopupNoteL();
+ }
+ }
+ // Set the softkeys back
+ ButtonGroupContainer().SetCommandSetL(
+ R_SOFTKEYS_OPTIONS_BACK__EDIT );
+ ButtonGroupContainer().DrawDeferred();
+ }
+
+
+// --------------------------------------------------------------------------
+// CCmDlg::Execute
+// --------------------------------------------------------------------------
+//
+void CCmDlg::Execute()
+ {
+ LOGGER_ENTERFN( "CCmDlg::Execute" );
+
+ iInfoPopupNoteController->HideInfoPopupNote();
+
+ if(iPrioritising)
+ {
+ TRAPD( err, FinishPriorizingL( ETrue ) );
+ if ( err )
+ {
+ HandleLeaveError( err );
+ }
+ }
+ else
+ {
+ iProcessing = ETrue;
+
+ TRAPD( err, ProcessCommandL(ECmManagerUiCmdCmEdit) );
+ if ( err )
+ {
+ HandleLeaveError( err );
+ }
+
+ iProcessing = EFalse;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::HandleLeaveError
+// --------------------------------------------------------------------------
+//
+void CCmDlg::HandleLeaveError( TInt /*aError*/ )
+ {
+ if(iProcessing)
+ {
+ iProcessing = EFalse;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::HandleResourceChange
+// --------------------------------------------------------------------------
+//
+void CCmDlg::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+
+ if( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ DrawNow();
+ }
+
+ CAknDialog::HandleResourceChange(aType);
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::GetInsertIndexL
+// --------------------------------------------------------------------------
+//
+TInt CCmDlg::GetInsertIndexL( TInt aCount, TUint32 aPriority )
+ {
+ TInt ret = -1;
+ TUint32 priority;
+
+ for ( TInt index = 0; index < aCount; index++ )
+ {
+ CCmPluginBase* cm = iCmDestinationImpl->GetConnectionMethodL( iItemIndex[index] );
+
+ if ( cm->GetBoolAttributeL( ECmVirtual ) &&
+ !cm->GetIntAttributeL( ECmNextLayerSNAPId ) )
+ {
+ TUint32 underlying = cm->GetIntAttributeL( ECmNextLayerIapId );
+ if ( underlying != 0 )
+ {
+ // Find the index that this VPN Iap should be inserted
+ TUint32 underlyingBearer = iCmManager->BearerTypeFromCmIdL( underlying );
+ priority = iCmManager->GetBearerInfoIntL( underlyingBearer, ECmDefaultPriority );
+ }
+ else
+ {
+ priority = KDataMobilitySelectionPolicyPriorityWildCard;
+ }
+ }
+ else
+ {
+ priority = cm->Plugin()->GetIntAttributeL( ECmDefaultPriority );
+ }
+
+ if (priority > aPriority)
+ {
+ ret = index;
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::ReBuildItemIndexArrayL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::ReBuildItemIndexArrayL()
+ {
+ iCmManager->OpenTransactionLC();
+
+ RArray<TUint32> cmIds;
+ ConstructCMArrayL( cmIds );
+ CleanupClosePushL( cmIds );
+
+ // Remove hidden Connection Methods from the array if uncat folder
+ if ( !iCmDestinationImpl )
+ {
+ ClearHiddenCMsFromArrayL( cmIds );
+ }
+
+ iItemIndex.Reset();
+ for ( TInt i = 0; i < cmIds.Count(); i++ )
+ {
+ iItemIndex.Append(i);
+ }
+
+ CleanupStack::PopAndDestroy( &cmIds );
+
+ iCmManager->CommitTransactionL( KErrNone );
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::ReOrderCMsL
+// --------------------------------------------------------------------------
+//
+void CCmDlg::ReOrderCMsL()
+ {
+ ReBuildItemIndexArrayL();
+
+ TBool prioAllowed = ETrue;
+ TInt firstNotAllowedEntry = 0;
+ TInt index = 0;
+ TInt count = iItemIndex.Count();
+
+ if (!iCmDestinationImpl)
+ {
+ return;
+ }
+
+ // This part is to move a SANP-referred VPN Iap to the end of list if the VPN Iap is changed from
+ // IAP-referred to SNAP-referred.
+ for ( index = 0; index < count; index++ )
+ {
+ CCmPluginBase* cm = iCmDestinationImpl->GetConnectionMethodL( iItemIndex[index] );
+
+ if ( cm->GetBoolAttributeL( ECmDestination ) ||
+ (cm->GetBoolAttributeL( ECmVirtual ) &&
+ cm->GetIntAttributeL( ECmNextLayerSNAPId )) )
+ {
+ prioAllowed = EFalse;
+ firstNotAllowedEntry = index;
+ }
+ else
+ {
+ if ( !prioAllowed )
+ {
+ iCmDestinationImpl->ModifyPriorityL(*cm, firstNotAllowedEntry);
+ iCmDestinationImpl->UpdateL();
+ // start from the beginning
+ index = 0;
+ prioAllowed = ETrue;
+ continue;
+ }
+ }
+ }
+
+ // This part is to move a IAP-referred VPN Iap to a proper location of priority in list
+ // if the VAP Iap is changed from SNAP-referred to IAP-referred.
+ for ( index = 0; index < count; index++ )
+ {
+ CCmPluginBase* cm = iCmDestinationImpl->GetConnectionMethodL( iItemIndex[index] );
+
+ if ( cm->GetBoolAttributeL( ECmVirtual ) &&
+ !cm->GetIntAttributeL( ECmNextLayerSNAPId ) )
+ {
+ TUint32 underlying = cm->GetIntAttributeL( ECmNextLayerIapId );
+ if ( underlying != 0 )
+ {
+ // Find the index that this VPN Iap should be inserted
+ TUint32 underlyingBearer = iCmManager->BearerTypeFromCmIdL( underlying );
+ TUint32 underlyingPrio = iCmManager->GetBearerInfoIntL( underlyingBearer, ECmDefaultPriority );
+ TInt insertAt = GetInsertIndexL( index, underlyingPrio );
+
+ // Modify the priority of this VPN Iap
+ if (insertAt != -1)
+ {
+ iCmDestinationImpl->ModifyPriorityL( *cm, insertAt );
+ iCmDestinationImpl->UpdateL();
+ break;
+ }
+ }
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CCmDlg::CommsDatChanges
+// --------------------------------------------------------------------------
+//
+void CCmDlg::CommsDatChangesL()
+ {
+ if (iCmDestinationImpl)
+ {
+ // If the destination that is currently working on disappears
+ // with some reason then go back to parent view
+ if( !iCmManager->DestinationStillExistedL( iCmDestinationImpl ) )
+ {
+ iCmManager->WatcherUnRegister();
+ TryExitL( iExitReason );
+ return;
+ }
+ }
+
+ // Update list box
+ HandleListboxDataChangeL();
+ }