diff -r 000000000000 -r 307788aac0a8 sipplugins/sippsipsettingsui/src/sipsettlistsipprofsetdestlistitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipplugins/sippsipsettingsui/src/sipsettlistsipprofsetdestlistitem.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,267 @@ +/* +* Copyright (c) 2007 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: The modified list item for the destinations +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include //GUI Resource +#include +#include "sipsettlistsipprofsetdestlistitem.h" +#include "sipsettlistsipprofsetmodel.h" +#include "gssippluginlogger.h" +// LOCAL CONSTANTS AND MACROS + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetDestListItem::CSIPSettListSIPProfSetDestListItem +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSIPSettListSIPProfSetDestListItem::CSIPSettListSIPProfSetDestListItem( + TInt aResourceId, + TInt& aIndex, + CSIPSettListSIPProfSetModel* aModel ) : + CAknEnumeratedTextPopupSettingItem( aResourceId, aIndex ), + iModel( aModel ), + iEnumValue( aIndex ), + iBackupValue( aIndex ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::CSIPSettListSIPProfSetDestListItem" ) + } + +// Destructor +CSIPSettListSIPProfSetDestListItem::~CSIPSettListSIPProfSetDestListItem() + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::~CSIPSettListSIPProfSetDestListItem" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetDestListItem::ValueMatches +// Compares enumeration values to see if a match can be found from +// the list of current destinations +// ----------------------------------------------------------------------------- +// +TBool CSIPSettListSIPProfSetDestListItem::ValueMatches( + CArrayPtr* aArray ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::ValueMatches" ) + TInt i( 0 ); + TBool found = EFalse; + TInt count( aArray->Count() ); + + for ( i = 0; i < count; i++ ) + { + if ( aArray->At( i )->EnumerationValue() == iEnumValue ) + { + found = ETrue; + i = count; + } + } + + return found; + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetDestListItem::InitializeListL() +// Initializes the enumeration list/txt pairs for the pop-up list +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetDestListItem::InitializeListL( + CArrayPtr*& aTextArray, + CArrayPtr*& aNullTextArray ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::InitializeListL" ) + // The text-enumerated thing pair + aTextArray = new ( ELeave ) CArrayPtrFlat( KTextArray ); + TCleanupItem clItem( ResetAndDestroy, aTextArray ); + CleanupStack::PushL( clItem ); + + // This must be valid, but is empty + aNullTextArray = new ( ELeave ) CArrayPtrFlat( KNullTextArray ); + CleanupStack::PushL( aNullTextArray ); + + iModel->GetDestinationsListL( aTextArray, iEnumValue ); + + // Ownership has changed, we can pop the arrays + CleanupStack::Pop( aNullTextArray ); + CleanupStack::Pop(); // clItem + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetDestListItem::CompleteConstructionL +// Fetches and changes the lists after the construction is completed +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetDestListItem::CompleteConstructionL() + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::CompleteConstructionL" ) + CArrayPtr* textArray = NULL; + CArrayPtr* nullTextArray = NULL; + + CAknEnumeratedTextPopupSettingItem::CompleteConstructionL(); + + // Read the AP list + InitializeListL( textArray, nullTextArray ); + + // Check that we are pointing to an actual thing, otherwise + // we need to modify this + if ( textArray->Count() > KErrNone && !ValueMatches( textArray ) ) + { + // Should display text 'None' when the AP is not found + textArray->ResetAndDestroy(); + iEnumValue = KUnknownAPUID; + } + + // Set new text arrays + SetEnumeratedTextArrays( textArray, nullTextArray ); + + // Update the lists internally + HandleTextArrayUpdateL(); + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetADestListItem::EditItemL +// Called before the pop-up list is shown. Updates it, if there was a +// non-matching destination UID at the start-up +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetDestListItem::EditItemL( + TBool aCalledFromMenu ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::EditItemL" ) + // Set backup value. + iBackupValue = iEnumValue; + + if ( iEnumValue == KUnknownAPUID ) + { + // destination was not found, create list for user to change the + // destination. + // The destination will be anyway changed; no matter does the user + // press Cancel or not..(Chosen destination will be the first one + // on the list, if user presses Cancel) + CArrayPtr* textArray = NULL; + CArrayPtr* nullTextArray = NULL; + InitializeListL( textArray, nullTextArray ); + + if ( textArray->Count() > KErrNone ) + { + // There might be situation that no destinationss exist. + iEnumValue = textArray->At( KErrNone )->EnumerationValue(); + } + + SetEnumeratedTextArrays( textArray, nullTextArray ); + HandleTextArrayUpdateL(); + } + + CAknEnumeratedTextPopupSettingItem::EditItemL( aCalledFromMenu ); + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetDestListItem::ResetAndDestroy +// For deleting array in case of leave +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetDestListItem::ResetAndDestroy( TAny* aPointerArray ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::ResetAndDestroy" ) + CArrayPtrFlat* array = + static_cast*>( aPointerArray ); + array->ResetAndDestroy(); + delete array; + } + +// ----------------------------------------------------------------------------- +// CGSSettListSIPProfSetAPListItem::HandleSettingPageEventL +// From MAknSettingPageObserver +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetDestListItem::HandleSettingPageEventL( + CAknSettingPage* /*aSettingPage*/, TAknSettingPageEvent aEventType ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::HandleSettingPageEventL Start" ) + if ( aEventType == EEventSettingCancelled ) + { + // If new profile or access point was not defined. + if ( iBackupValue == KUnknownAPUID ) + { + // Set text to setting page. + CArrayPtr* textArray = NULL; + CArrayPtr* nullTextArray = NULL; + + InitializeListL( textArray, nullTextArray ); + textArray->ResetAndDestroy(); + + SetEnumeratedTextArrays( textArray, nullTextArray ); + HandleTextArrayUpdateL(); + } + + // Setting page cancelled. + iEnumValue = iBackupValue; + + // Update internal value. + this->LoadL(); + } + else if ( iBackupValue == KUnknownAPUID ) + { //if not defined before && now defined && 'ok' pressed + // Load and initialize the dialog text + HBufC* dlgTxt = StringLoader::LoadLC( + R_SIP_QUERY_SELECT_DESTINATION ); + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + CleanupStack::PushL( dlg ); + dlg->SetPromptL( *dlgTxt ); + CleanupStack::Pop( dlg ); + + if ( !dlg->ExecuteLD( R_SIP_DESTINATION_CONFIRMATION_DLG ) ) + { + // Set text to setting page. + CArrayPtr* textArray = NULL; + CArrayPtr* nullTextArray = NULL; + + InitializeListL( textArray, nullTextArray ); + textArray->ResetAndDestroy(); + + SetEnumeratedTextArrays( textArray, nullTextArray ); + HandleTextArrayUpdateL(); + + // Setting page cancelled. + iEnumValue = iBackupValue; + + // Update internal value. + this->LoadL(); + } + else + { + if ( iModel->APUID() != TUint32(KUnknownAPUID) ) + { + iModel->CleanAPUid(); + } + } + + CleanupStack::PopAndDestroy( dlgTxt ); + } + __GSLOGSTRING("CSIPSettListSIPProfSetDestListItem::HandleSettingPageEventL End" ) + } + +// End of File