diff -r 000000000000 -r 307788aac0a8 sipplugins/sippsipsettingsui/src/sipsettlistsipprofsetitemlist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipplugins/sippsipsettingsui/src/sipsettlistsipprofsetitemlist.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,545 @@ +/* +* Copyright (c) 2005 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 item list of profile setting view +* +*/ + + +// INCLUDE FILES + +#include "sipsettlistsipprofsetmodel.h" +#include "sipsettlistsipprofsetitemlist.h" +#include "sipsettlistsipprofsetaplistitem.h" +#include "sipsettlistsipprofsetdestlistitem.h" +#include "sipsettlistsipprofsettypelistitem.h" +#include "sipsettlistsipprofsetprovlistitem.h" +#include "sipsettlistsipsrvtextsetitem.h" +#include "sipsettlistsipprxsetview.h" +#include "sipsettlistsipregsetview.h" +#include "sipserversettingvalidator.h" +#include "viewid.h" +#include +#include //GUI Resource +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gssippluginlogger.h" + +// LOCAL CONSTS + +const TInt KProxyServerIndex = 8; +const TInt KRegistrarServerIndex = 9; +const TInt KInitialIndex = -1; +const TInt KServiceProfileIETF = 0; +const TInt KServiceProfile3GPP = 1; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::CSIPSettListSIPProfSetItemList +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSIPSettListSIPProfSetItemList::CSIPSettListSIPProfSetItemList( + CSIPSettListSIPProfSetModel* aModel, + CAknTitlePane* aPane, + TSIPSettingsData& aData ) : + iModel( aModel ), + iPane( aPane ), + iProfileData( aData ), + iDestIndex( KInitialIndex ), + iAPIndex( KInitialIndex ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::CSIPSettListSIPProfSetItemList" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetItemList::ConstructL( + CCoeControl* aParent ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::ConstructL" ) + SetContainerWindowL( *aParent ); + ConstructFromResourceL( R_SIP_SETTING_VIEW_ITEM_LIST ); + + ListBox()->CreateScrollBarFrameL( ETrue ); + ListBox()->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + ListBox()->View()->ItemDrawer()->SetFlags( CTextListItemDrawer::ESingleClickEnabled ); + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSIPSettListSIPProfSetItemList* CSIPSettListSIPProfSetItemList::NewL( + CCoeControl* aParent, + CSIPSettListSIPProfSetModel* aModel, + CAknTitlePane* aPane ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::NewL" ) + CSIPSettListSIPProfSetItemList* self = + new ( ELeave ) CSIPSettListSIPProfSetItemList( + aModel, aPane, aModel->Settings() ); + + CleanupStack::PushL( self ); + self->ConstructL( aParent ); + CleanupStack::Pop( self ); + + return self; + } + + +// Destructor +CSIPSettListSIPProfSetItemList::~CSIPSettListSIPProfSetItemList() + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::~CSIPSettListSIPProfSetItemList" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::CreateSettingItemL +// Creates the items to the list +// ----------------------------------------------------------------------------- +// +CAknSettingItem* CSIPSettListSIPProfSetItemList::CreateSettingItemL( + TInt aSettingId ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::CreateSettingItemL" ) + CAknSettingItem* item = NULL; + + switch ( aSettingId ) + { + case EGSItemProviderName: + iProviderName = new ( ELeave ) + CSIPSettListSIPProfSetProvListItem( EGSItemProviderName, + iProfileData.iProviderName, + iPane ); + item = iProviderName; + break; + + case EGSItemServiceProfile: + iServiceProfile = new ( ELeave ) + CSIPSettListSIPProfSetTypeListItem( EGSItemServiceProfile, + iProfileData.iServiceProfileIndex, + iModel ); + item = iServiceProfile; + break; + + case EGSItemDefaultDest: + iDefaultDest = new ( ELeave ) + CSIPSettListSIPProfSetDestListItem( EGSItemDefaultDest, + iDestIndex, + iModel ); + item = iDefaultDest; + break; + + case EGSItemDefaultAP: + iDefaultAP = new ( ELeave ) + CSIPSettListSIPProfSetAPListItem( EGSItemDefaultAP, + iAPIndex, + iModel ); + if( iDestIndex != KUnknownAPUID ) + { + iDefaultAP->SetHidden( ETrue ) ; + + } + item = iDefaultAP; + break; + + case EGSItemUsername: + iUsername = new ( ELeave ) CSIPSettListSIPSrvTextSetItem( + EGSItemUsername, iProfileData.iUsername, + SIPServerSettingValidator::ValidateServerUsernameL ); + item = iUsername; + break; + + case EGSItemCompression: + iCompression = new ( ELeave ) + CAknEnumeratedTextPopupSettingItem( + EGSItemCompression, iProfileData.iCompression ); + item = iCompression; + break; + + case EGSItemRegistration: + iRegistration = new ( ELeave ) + CAknEnumeratedTextPopupSettingItem( + EGSItemRegistration, iProfileData.iRegistrationMode ); + item = iRegistration; + break; + + case EGSItemSecurity: + iSecurity = new ( ELeave ) + CAknEnumeratedTextPopupSettingItem( + EGSItemSecurity, iProfileData.iSecurity ); + item = iSecurity; + break; + + case EGSItemProxyServer: + iProxyServer = new ( ELeave ) CAknBigSettingItemBase( + EGSItemProxyServer ); + item = iProxyServer; + break; + + case EGSItemRegistrarServer: + iRegistrarServer = new ( ELeave ) CAknBigSettingItemBase( + EGSItemRegistrarServer ); + item = iRegistrarServer; + break; + + default: + // Leave if no matching ID is found + User::Leave( KErrNotSupported ); + break; + } + + return item; + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::HandleListBoxEventL +// Manages list box events +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetItemList::HandleListBoxEventL( + CEikListBox* aListBox, + TListBoxEvent aEventType ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::HandleListBoxEventL Start" ) + if ( aEventType == EEventEnterKeyPressed || + aEventType == EEventItemSingleClicked ) + { + // If currently shown profile is locked, show a note and return. + TInt currentIndex = aListBox->CurrentItemIndex(); + currentIndex = SettingItemArray()->ItemIndexFromVisibleIndex( currentIndex ); + if ( iModel->ProfileLocked() && + currentIndex != KProxyServerIndex && + currentIndex != KRegistrarServerIndex ) + { + HBufC* lockedText = + StringLoader::LoadLC( R_QTN_SIP_INFONOTE_PROFILE_LOCKED ); + CAknInformationNote* lockedNote = new (ELeave) CAknInformationNote(); + lockedNote->ExecuteLD( *lockedText ); + CleanupStack::PopAndDestroy( lockedText ); + return; + } + + if ( currentIndex == KProxyServerIndex ) + { + CAknViewAppUi* appUi = + static_cast( iEikonEnv->AppUi() ); + // Store settings to variables before changing view + StoreSettingsL(); + appUi->ActivateLocalViewL( KSettListSIPProxyServerView ); + return; + } + else if ( currentIndex == KRegistrarServerIndex ) + { + CAknViewAppUi* appUi = + static_cast( iEikonEnv->AppUi() ); + // Store settings to variables before changing view + StoreSettingsL(); + appUi->ActivateLocalViewL( KSettListSIPRegistrarServerView ); + return; + } + else if ( currentIndex == EGSItemServiceProfile || + currentIndex == EGSItemCompression || + currentIndex == EGSItemSecurity ) + { + SetNextSettingItemL( currentIndex ); + aListBox->ActivateL(); + aListBox->HandleItemAdditionL(); + return; + } + else + { + // Do nothing here, HandleListBoxEventL() is executed + } + } + CAknSettingItemList::HandleListBoxEventL( aListBox, aEventType ); + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::HandleListBoxEventL End" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::EditItemL +// Manages list box events +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetItemList::EditItemL( + TInt /*aIndex*/, + TBool aCalledFromMenu ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::EditItemL Start" ) + TInt index = ListBox()->CurrentItemIndex(); + + index = SettingItemArray()->ItemIndexFromVisibleIndex(index); + // If currently shown profile is locked, show a note and return. + if ( iModel->ProfileLocked() && + index != KProxyServerIndex && index != KRegistrarServerIndex ) + { + HBufC* lockedText = + StringLoader::LoadLC( R_QTN_SIP_INFONOTE_PROFILE_LOCKED ); + CAknInformationNote* lockedNote = new (ELeave) CAknInformationNote(); + lockedNote->ExecuteLD( *lockedText ); + CleanupStack::PopAndDestroy( lockedText ); + return; + } + + if ( index == KProxyServerIndex || index == KRegistrarServerIndex ) + { + HandleListBoxEventL( ListBox(), EEventEnterKeyPressed ); + } + else if ( index == EGSItemProviderName ) + { + HBufC* defValue = StringLoader::LoadLC( R_QTN_DEF_PROFILE_NAME ); + HBufC* oldValue = HBufC::NewLC( KMaxSIPProviderNameLength ); + oldValue->Des().Copy( iProfileData.iProviderName ); + + TBool cancel( EFalse ); + while ( !cancel ) + { + // Show setting page and get new profile name. + CAknSettingItemList::EditItemL( index, aCalledFromMenu ); + iProviderName->StoreL(); + + AknTextUtils::StripCharacters( + iProfileData.iProviderName, KAknStripListControlChars ); + + // Show Title info using new value + CEikStatusPane* sp = iAvkonAppUi->StatusPane(); + CAknTitlePane* title = static_cast( + sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + title->SetTextL( *oldValue ); + + HBufC* newName = HBufC::NewLC( KMaxSIPProviderNameLength ); + newName->Des().Copy( iProfileData.iProviderName ); + + // If both texts are same, assume that we pressed cancel. + if ( !iProfileData.iProviderName.Compare( oldValue->Des() ) ) + { + title->SetTextL( *newName ); + cancel = ETrue; + } + else + { + // Check that new name is unique. If not, show confirmation + // query for further actions. + if ( !iModel->CheckDuplicateNameL( iProfileData.iProviderName ) ) + { + CAknQueryDialog* query = new( ELeave ) + CAknQueryDialog( CAknQueryDialog::ENoTone ); + query->PrepareLC( R_SIP_SERVICE_PROVIDER_CONF_QUERY ); + HBufC* string = StringLoader::LoadL( + R_QTN_SIP_ITEMS_WITH_SAME_NAME, newName->Des() ); + CleanupStack::PushL( string ); + query->SetPromptL( *string ); + CleanupStack::PopAndDestroy( string ); + + // Show confirmation query. + if ( query->RunLD() ) + { + // Copy old text back to the editor. + iProfileData.iProviderName.Copy( oldValue->Des() ); + } + else + { + iProfileData.iProviderName.Copy( oldValue->Des() ); + cancel = ETrue; + } + + iProviderName->LoadL(); + } + else + { + title->SetTextL( *newName ); + cancel = ETrue; + } + } + CleanupStack::PopAndDestroy( newName ); + } + + // If canceled, copy setting back to right place. + if ( !iProfileData.iProviderName.Length() ) + { + iProfileData.iProviderName.Copy( oldValue->Des() ); + iProviderName->LoadL(); + } + + CleanupStack::PopAndDestroy( oldValue ); + CleanupStack::PopAndDestroy( defValue ); + iProviderName->LoadL(); + iProviderName->UpdateListBoxTextL(); + } + // Remove nonallowed characters from setting data if needed. + else if ( index == EGSItemUsername ) + { + CAknSettingItemList::EditItemL( index, aCalledFromMenu ); + iUsername->StoreL(); + + AknTextUtils::StripCharacters( + iProfileData.iUsername, KAknStripListControlChars ); + + iUsername->LoadL(); + iUsername->UpdateListBoxTextL(); + } + // Display information note if there are no destinations defined. + else if (index == EGSItemDefaultDest && (iModel->DestinationsCountL() <= 0)) + { + HBufC* noDestinationsText = + StringLoader::LoadLC( R_QTN_SIP_INFONOTE_NO_DESTINATIONS_DEFINED ); + CAknInformationNote* noDestinationsNote = + new (ELeave) CAknInformationNote(); + noDestinationsNote->ExecuteLD( *noDestinationsText ); + CleanupStack::PopAndDestroy( noDestinationsText ); + } + else + { + CAknSettingItemList::EditItemL( index, aCalledFromMenu ); + if( index == EGSItemDefaultDest && iDestIndex != KUnknownAPUID ) + + { + iDefaultAP->SetHidden(ETrue) ; + HandleChangeInItemArrayOrVisibilityL(); + } + } + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::EditItemL End" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::StoreSettingsL +// stores the settings of the items and maps the index of the access point +// to the UID +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetItemList::StoreSettingsL() + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::StoreSettingsL Start" ) + CAknSettingItemList::StoreSettingsL(); + + // map the index of selected destination/access point to its UID + if ( iDestIndex >= 0 ) + { + // if destination is set => AP not set + iProfileData.iAPIndex = KDefaultIAP; + iProfileData.iSNAPIndex = iModel->SNAPUID( iDestIndex ); + } + else + { + iProfileData.iSNAPIndex = KDefaultIAP; + if ( iAPIndex >= 0 ) + { + iProfileData.iAPIndex = iModel->APUID( iAPIndex ); + } + else + { + iProfileData.iAPIndex = KDefaultIAP; + } + } + + // map the index of selected service profile to its profile data. + if( iProfileData.iServiceProfileIndex >= 0 ) + { + iProfileData.iServiceProfile = iModel->ProfileTypeInfo( iProfileData.iServiceProfileIndex ); + } + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::StoreSettingsL End" ) + } + +// ----------------------------------------------------------------------------- +// CSIPSettListSIPProfSetItemList::SetNextSettingItemL +// Changes current setting item setting to next one. +// ----------------------------------------------------------------------------- +// +void CSIPSettListSIPProfSetItemList::SetNextSettingItemL( TInt aSettingId ) + { + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::SetNextSettingItemL Start" ) + TSIPProfileTypeInfo::TSIPProfileClass prevClass = + TSIPProfileTypeInfo::EOther; + TInt prevIndex = 0; + + switch ( aSettingId ) + { + case EGSItemServiceProfile: // Service profile setting. + iServiceProfile->StoreL(); + + prevClass = iModel->ProfileTypeInfo( + iProfileData.iServiceProfileIndex ).iSIPProfileClass; + prevIndex = iProfileData.iServiceProfileIndex; + + if ( iProfileData.iServiceProfileIndex == KServiceProfileIETF ) + { + iProfileData.iServiceProfileIndex = KServiceProfile3GPP; + } + else + { + iProfileData.iServiceProfileIndex = KServiceProfileIETF; + } + // Get text for setting based on index value. + iProfileData.iServiceProfile = + iModel->ProfileTypeInfo( iProfileData.iServiceProfileIndex ); + if ( iProfileData.iServiceProfile.iSIPProfileClass != + prevClass ) + { // Check if next index is valid + iServiceProfile->LoadL(); + iServiceProfile->UpdateListBoxTextL(); + } + else + { // Not valid, use the same index as before this function call + iProfileData.iServiceProfileIndex = prevIndex; + } + break; + case EGSItemCompression: // Compression mode setting. + iCompression->StoreL(); + if ( iProfileData.iCompression == EGSComprNo ) + { + iProfileData.iCompression = EGSComprYes; + } + else + { + iProfileData.iCompression = EGSComprNo; + } + iCompression->LoadL(); + iCompression->UpdateListBoxTextL(); + break; + case EGSItemSecurity: // Security mode setting. + iSecurity->StoreL(); + if ( iProfileData.iSecurity == EGSSecurityOff ) + { + iProfileData.iSecurity = EGSSecurityOn; + } + else + { + iProfileData.iSecurity = EGSSecurityOff; + } + iSecurity->LoadL(); + iSecurity->UpdateListBoxTextL(); + break; + default: // Other setting items are not supported. + User::Leave( KErrNotSupported ); + break; + } + __GSLOGSTRING("CSIPSettListSIPProfSetItemList::SetNextSettingItemL End" ) + } + +// End of file