diff -r 05bc53fe583b -r 83ca720e2b9a cmmanager/cmmgr/Framework/Src/selectdestination.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmmanager/cmmgr/Framework/Src/selectdestination.cpp Wed Sep 01 12:23:51 2010 +0100 @@ -0,0 +1,285 @@ +/* +* 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: Shows the "Select destination:" dialog, where the user can +* select one of the available destinations. +* +*/ + +#include +#include +#include +#include +#include "selectdestinationdlg.h" +#include +#include +#include "cmdestinationimpl.h" +#include "cmlogger.h" +#include "cmmanagerimpl.h" + +#include + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::CSelectDestinationDlg +// ---------------------------------------------------------------------------- +// +CSelectDestinationDlg::CSelectDestinationDlg( TInt aDummyIndex, + TUint32& aDestinationId ) + : CAknListQueryDialog( &aDummyIndex ) + , iDestinationId( aDestinationId ) + , iDestinations( KCmArrayMediumGranularity ) + { + CLOG_CREATE; + } + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::ConstructL +// ---------------------------------------------------------------------------- +// +void CSelectDestinationDlg::ConstructL( CCmManagerImpl& aCmManager, + RArray* aDestArray ) + { + LOGGER_ENTERFN( "CSelectDestinationDlg::ConstructL" ); + RArray destinations( KCmArrayMediumGranularity ); + CleanupClosePushL( destinations ); + + aCmManager.AllDestinationsL( destinations ); + + TBool mmsFound = EFalse; + for ( TInt i = 0; i < destinations.Count(); i++ ) + { + CCmDestinationImpl* dest = aCmManager.DestinationL( destinations[i] ); + CleanupStack::PushL( dest ); + + // Don't count the current destination + if ( dest->Id() == iDestinationId ) + { + CleanupStack::PopAndDestroy( dest ); + continue; + } + + // Do not give the option to copy into a Level 1 Protected Destination + if ( dest->ProtectionLevel() == CMManager::EProtLevel1 ) + { + CleanupStack::PopAndDestroy( dest ); + continue; + } + + // check if the destination is valid as parent (e.g. for VPN) + if ( aDestArray && aDestArray->Find( dest->Id() ) == KErrNotFound ) + { + CleanupStack::PopAndDestroy( dest ); + continue; + } + + // Skip the MMS Snap, it it not shown in the list + if ( !mmsFound ) + { + TInt snapMetadata = 0; + TRAPD(metaErr, snapMetadata = dest->MetadataL( CMManager::ESnapMetadataPurpose )); + if ( metaErr == KErrNone && snapMetadata == CMManager::ESnapPurposeMMS ) + { + CleanupStack::PopAndDestroy( dest ); + mmsFound = ETrue; + continue; + } + } + + iDestinations.AppendL( dest ); + CleanupStack::Pop( dest ); + } + CleanupStack::PopAndDestroy( &destinations ); + } + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::~CSelectDestinationDlg +// ---------------------------------------------------------------------------- +// +CSelectDestinationDlg::~CSelectDestinationDlg() + { + for ( TInt i = 0; i < iDestinations.Count(); i++ ) + { + delete iDestinations[i]; + } + iDestinations.Close(); + CLOG_CLOSE; + } + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::NewL +// ---------------------------------------------------------------------------- +// +CSelectDestinationDlg* CSelectDestinationDlg::NewL( TUint32& aDestinationId, + CCmManagerImpl& aCmManager, + RArray* aDestArray ) + { + CSelectDestinationDlg* self = NewLC( aDestinationId, aCmManager, aDestArray ); + + CleanupStack::Pop( self ); + + return self; + } + + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::NewLC +// ---------------------------------------------------------------------------- +// +CSelectDestinationDlg* CSelectDestinationDlg::NewLC( TUint32& aDestinationId, + CCmManagerImpl& aCmManager, + RArray* aDestArray ) + { + CSelectDestinationDlg* self = + new (ELeave) CSelectDestinationDlg( 0, aDestinationId ); + + CleanupStack::PushL( self ); + + self->ConstructL( aCmManager, aDestArray ); + + return self; + } + + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::OkToExitL +// ---------------------------------------------------------------------------- +// +TBool CSelectDestinationDlg::OkToExitL( TInt aButtonId ) + { + TBool result = EFalse; + + if ( aButtonId == EAknSoftkeySelect || aButtonId == EAknSoftkeyOk ) + { + iDestinationId = iDestinations[ ListBox()->CurrentItemIndex() ]->Id(); + + result = ETrue; + } + else if ( aButtonId == EAknSoftkeyCancel ) + { + iDestinationId = 0; + + result = ETrue; + } + + CLOG_WRITE_2( "CSelectDestinationDlg::OkToExitL dest ID: [%d], result: [%d]", + iDestinationId, result ); + + return result; + } + + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::PreLayoutDynInitL +// ---------------------------------------------------------------------------- +// +void CSelectDestinationDlg::PreLayoutDynInitL() + { + LOGGER_ENTERFN( "CSelectDestinationDlg::PreLayoutDynInitL" ); + // Let the base class do its job first + CAknListQueryDialog::PreLayoutDynInitL(); + + // Set the description field on the query + HBufC* desc = + StringLoader::LoadLC( R_CMWIZARD_SELECT_DESTINATION_DESCRIPTION ); + + MessageBox()->SetMessageTextL( desc ); + CleanupStack::PopAndDestroy( desc ); + + // Specify the item text array + CDesCArrayFlat* itemArray = + new (ELeave) CDesCArrayFlat( KCmArrayMediumGranularity ); + SetItemTextArray( itemArray ); + SetOwnershipType( ELbmOwnsItemArray ); + + // Note: we don't have to put 'itemArray' on to the cleanup stack, as the + // model has already taken this object over. + + for ( TInt i = 0; i < iDestinations.Count(); i++ ) + { + // Here we take advantage of the fact that our icon array is ordered. + // That is, the indices of the icons in the array will always be + // in sync with those in the item text array (i.e. each bearer will + // have the right icon associated with it). + HBufC* destName = iDestinations[i]->NameLC(); + HBufC* lineText = + TCmCommonUi::FormattedTextForListBoxLC( i, *destName ); + + itemArray->AppendL( *lineText ); + CleanupStack::PopAndDestroy( 2, destName ); // destName, lineText + } + + // Icons ... + SetIconsL(); + } + + +// ---------------------------------------------------------------------------- +// CSelectDestinationDlg::SetIconsL() +// ---------------------------------------------------------------------------- +// +void CSelectDestinationDlg::SetIconsL() + { + CArrayPtr* icons = + new (ELeave) CArrayPtrFlat( KCmArrayMediumGranularity ); + CleanupStack::PushL( icons ); + + for ( TInt i = 0; i < iDestinations.Count(); i++ ) + { + CGulIcon* icon = iDestinations[i]->IconL(); + CleanupStack::PushL( icon ); + + icons->AppendL( icon ); + + CleanupStack::Pop( icon ); // icon array took over ownership + } + + SetIconArrayL( icons ); // ownership passed, too + + CleanupStack::Pop( icons ); + } + + +// ---------------------------------------------------------------------------- +// void CSelectDestinationDlg::HandleResourceChange +// ---------------------------------------------------------------------------- +// +void CSelectDestinationDlg::HandleResourceChange( TInt aType ) + { + if ( aType == KAknsMessageSkinChange ) + { + CAknListQueryDialog::HandleResourceChange( aType ); + + TRAP_IGNORE( SetIconsL() ); + + SizeChanged(); + } + else + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect ); + + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( TRect( TPoint( 0, 0 ), + mainPaneRect.Size() ), + AKN_LAYOUT_WINDOW_list_gen_pane( 0 ) ); + + ListBox()->SetRect( layoutRect.Rect() ); + } + + // Base call + CAknListQueryDialog::HandleResourceChange( aType ); + } + }