diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIDefineNewServerDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIDefineNewServerDialog.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,1840 @@ +/* +* Copyright (c) 2003 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: Dialog for defining new server +* +*/ + + +// INCLUDE FILES +#include "CWVSettingsUIDefineNewServerDialog.h" +#include "CWVSettingsUIDefs.h" +#include "CWVSettingsUI.hrh" +#include "MWVSettingsObserverng.h" +#include "CWVSettingsUINGDialog.h" +#include "WVSettingsUIPanics.h" +#include "CWVSettingsUIDialogTitlePaneHandler.h" +#include "CWVSettingsUIDialogImp.h" +#include "IMPSPresenceLoginDetailValidator.h" +#include "cwvsettingsuseridsettingpage.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // branding +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include "CAExternalInterface.h" + +// The Settings have been moved to Cenrep (also retained in the Resource file), +// the enums for keys and central repository header is added here +// New rss file added for 401-1815 Ease of Instant Messaging branding +// These rss flags will be made available in ZCenrep also.. + +#include "VariantKeys.h" +#include + +// CONSTANTS + +const TUint KWhiteSpace16( ' ' ); + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::CWVSettingsUIDefineNewServerDialog +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWVSettingsUIDefineNewServerDialog::CWVSettingsUIDefineNewServerDialog( + TInt& aExitReason, + CIMPSSAPSettingsStore& aSAPSettingsStore, + TEditMode aEditMode, + MWVSettingsObserver& aObserver, + CWVSettingsUIDialogTitlePaneHandler& aTitlePaneHandler, + CWVSettingsUIDialogImp* aDialog, + TUint32& aNewUid, + CIMPSPresenceConnectionUi* aConnectionUI, + CIMPSSAPSettings* aServer /* = NULL */ ): + iExitReason( aExitReason ), + iSAPSettingsStore( &aSAPSettingsStore ), + iEditMode( aEditMode ), + iSAP( aServer ), + iIAPNamePtr( NULL, 0 ), + iServerNamePtr( NULL, 0 ), + iWVUserIdPtr( NULL, 0 ), + iPasswordPtr( NULL, 0 ), + iURLPtr( NULL, 0 ), + iObserver( &aObserver ), + iTitlePaneHandler ( &aTitlePaneHandler ), + iDialog ( aDialog ), + iStoreOldId ( ETrue ), + iOldUserIdPtr( NULL, 0 ), + iEdited ( EFalse ), + iNewUid( aNewUid ), + iProtected( EFalse ), + iConnectionUI( aConnectionUI ), + iIsDeleted( EFalse ), + isDisplayedSubDialog ( EFalse ) + { + iCoeEnv = CCoeEnv::Static(); + } + +// Destructor +CWVSettingsUIDefineNewServerDialog::~CWVSettingsUIDefineNewServerDialog() + { + if ( iSettingItemArray ) + { + iSettingItemArray->ResetAndDestroy(); + } + + if ( iConnectionUIOwned ) + { + delete iConnectionUI; + } + + delete iOldServerName; + + delete iSettingItemArray; + iSettingItemArray = NULL; + delete iIAPName; + delete iServerName; + delete iWVUserId; + delete iPassword; + delete iURL; + delete iAPUtils; + delete iAPSettingsHandler; + delete iCommsDb; + delete iOldUserId; + delete iSAP; + delete iOldPassword; + + if( iDlgLauncher && iDlgLauncher->IsActive() ) + { + iDlgLauncher->Cancel(); + } + delete iDlgLauncher; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::EditSapSettingsL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::EditSapSettingsL() + { + + TUint32 wapAp( 0 ); + + if ( iAPUtils->IAPExistsL( iIAP ) ) + { + wapAp = iAPUtils->WapIdFromIapIdL( iIAP ); + } + + TUint32 previousAp( wapAp ); + TInt returnFlags ( iAPSettingsHandler->RunSettingsL( wapAp, wapAp ) ); + + // was some item selected. Selecting with Pen doesn't cause + // KApUiEventSelected event. + TBool selected( returnFlags & KApUiEventSelected || wapAp != previousAp ); + + if ( selected ) + { + //got an new wap id - needs to be converted to IAP id + iIAP = iAPUtils->IapIdFromWapIdL( wapAp ); + iIAPHasValue = ETrue; + } + + // check if access point has been edited, selected or deleted + if ( ( selected ) || + ( returnFlags & KApUiEventEdited ) || + ( returnFlags & KApUiEventDeleted ) ) + { + iEdited = ETrue; + + //update IAP name field when selected, edited, or deleted + //if current has been deleted -> NameL() leaves + + TRAPD( err, iAPUtils->NameL( wapAp, iIAPNamePtr ) ) + + if ( err == KErrNotFound ) + { + // this error happens, if access point has been deleted + // we just empty the access point name + iIAPNamePtr.Zero(); + err = KErrNone; //ignore this error + } + else + { + //handle errors by leaving.. + User::LeaveIfError( err ); + } + + iSettingItemArray->At( ESAP )->LoadL(); + iSettingItemArray->At( ESAP )->UpdateListBoxTextL(); + } + + // it is checked later on if Exit was selected + return returnFlags; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::StoreAllItemsL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + +void CWVSettingsUIDefineNewServerDialog::StoreAllItemsL() + { + + if ( iSAP ) + { + if ( iSAP->Protection() == ESAPBrandProtection ) + { + iSAP->SetSAPUserIdL( *iWVUserId ); + iSAP->SetSAPUserPasswordL( *iPassword ); + iSAP->SetAccessPoint( iIAP ); + } + else + { + iSAP->SetSAPNameL( *iServerName ); + iSAP->SetSAPAddressL( *iURL ); + iSAP->SetSAPUserIdL( *iWVUserId ); + iSAP->SetSAPUserPasswordL( *iPassword ); + iSAP->SetAccessPoint( iIAP ); + } + + if ( iEditMode == ENewServer ) + { + iNewUid = iSAPSettingsStore->StoreNewSAPL( iSAP, EIMPSIMAccessGroup ); + } + else // Edit-mode + { + iSAPSettingsStore->UpdateOldSAPL( iSAP, iSAP->Uid() ); + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::AddItemL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::AddItemL( TDes& aBuffer, + TInt aId, + TInt aTitleResource, + TInt aDlgResource, + TBool aCompulsory /*= EFalse*/, + TBool aIconNeeded, /* = EFalse */ + TItemType aItemType /*= ETextItem*/ + ) + { + CAknSettingItem* settingItem = NULL; + TInt associatedResource( 0 ); + + switch ( aItemType ) + { + case ETextItem: + { + settingItem = new ( ELeave ) CAknTextSettingItem( aId, aBuffer ); + associatedResource = EEikCtEdwin; + break; + } + case EPasswordItem: + { + settingItem = new ( ELeave ) + CAknPasswordSettingItem( aId, CAknPasswordSettingItem::EAlpha, aBuffer ); + associatedResource = EEikCtSecretEd; + break; + } + default: + { + User::Leave( EServerDialogUnknownItemType ); + break; + } + } + + CleanupStack::PushL( settingItem ); + + HBufC* tempTitle = iEikonEnv->AllocReadResourceLC( aTitleResource ); + TBuf< KWVSettingsServerNameMaxLength > title ( *tempTitle ); + HBufC* itemTitle = title.AllocL(); + CleanupStack::PopAndDestroy( tempTitle ); + CleanupStack::PushL( itemTitle ); + + // Construct correct compulsory indicator string which might also include + // the protected icon. + HBufC* compulsory = HBufC::NewLC( KCompulsoryChar().Length() + + KIMPSIconIndex().Length() ); + TPtr compPtr( compulsory->Des() ); + + if ( aCompulsory ) + { + HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( R_SELECT_SETTING_COMPULSORY ); + settingItem->SetEmptyItemTextL( *text ); + CleanupStack::PopAndDestroy( text ); + compPtr.Append( KCompulsoryChar() ); + settingItem->SetSettingPageFlags( CAknTextSettingPage::EZeroLengthNotOffered ); + } + else + { + settingItem->SetEmptyItemTextL( KEmptyDesC ); + settingItem->SetSettingPageFlags( CAknTextSettingPage::EZeroLengthAllowed ); + } + + settingItem->ConstructL( EFalse, iOrdinal, title, NULL, aDlgResource, associatedResource ); + + if ( iProtected && aIconNeeded ) + { + // this item needs the protected icon + compPtr.Append( KIMPSIconIndex() ); + } + + // This is used not only to set the compulsory icon, but also the + // protected icon. + settingItem->SetCompulsoryIndTextL( compPtr ); + + iSettingItemArray->AppendL( settingItem ); + CleanupStack::PopAndDestroy( 2, itemTitle ); // compulsory, itemTitle + CleanupStack::Pop( settingItem ); + + iOrdinal++; + } + + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::LoadExistingItemL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::LoadExistingItemL() + { + iServerNamePtr.Copy( iSAP->SAPName().Left( iServerNamePtr.MaxLength() ) ); + iURLPtr.Copy( iSAP->SAPAddress().Left( iURLPtr.MaxLength() ) ); + iWVUserIdPtr.Copy( iSAP->SAPUserId().Left( iWVUserIdPtr.MaxLength() ) ); + iPasswordPtr.Copy( iSAP->SAPUserPassword().Left( iPasswordPtr.MaxLength() ) ); + iIAP = iSAP->AccessPoint(); + iIAPHasValue = ETrue; + + //update IAP name field when selected, edited, or deleted + //if current has been deleted -> NameL() leaves + TRAPD( err, iAPUtils->NameL( iAPUtils->WapIdFromIapIdL( iIAP ), + iIAPNamePtr ) ); + + if ( ( err == KErrNotFound ) && ( iIAP != 0 ) ) + { + // iIAP has a value, but it's not found + // so we can reset the value to zero + iIAP = 0; + } + + if ( ( err == KErrNoMemory ) || ( err == KErrDiskFull ) ) + { + User::Leave( err ); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::CompulsoryItemsFilled +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::CompulsoryItemsFilled() + { + TBool passed( ETrue ); + iFailedFields = 0; + + TInt compValues = GetCompulsoryItems(); + + if ( compValues & EWVSettingsViewServerName ) + { + if ( iServerNamePtr.Length() == 0 ) + { + passed = EFalse; + iFailedFields = iFailedFields | GenerateFlagValue( EServerName ); + } + } + + if ( compValues & EWVSettingsViewIAPName ) + { + if ( iIAPNamePtr.Length() == 0 ) + { + passed = EFalse; + iFailedFields = iFailedFields | GenerateFlagValue( ESAP ); + } + } + + if ( compValues & EWVSettingsViewURL ) + { + if ( iURLPtr.Length() == 0 ) + { + passed = EFalse; + iFailedFields = iFailedFields | GenerateFlagValue( EURL ); + } + } + + if ( compValues & EWVSettingsViewWVUserId ) + { + if ( iWVUserIdPtr.Length() == 0 ) + { + passed = EFalse; + iFailedFields = iFailedFields | GenerateFlagValue ( EWVId ); + } + } + + if ( compValues & EWVSettingsViewPassword ) + { + if ( iPasswordPtr.Length() == 0 ) + { + passed = EFalse; + iFailedFields = iFailedFields | GenerateFlagValue ( EPassword ); + } + } + + return passed; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::CompulGetCompulsoryItems +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::GetCompulsoryItems ( ) const + { + return EWVSettingsViewServerName | EWVSettingsViewIAPName | EWVSettingsViewURL; + } + + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::SignalStoreLToAllL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::SignalStoreLToAllL() const + { + TInt itemCount( iSettingItemArray->Count() ); + + for ( TInt index = 0; index < itemCount; ++index ) + { + iSettingItemArray->At( index )->StoreL(); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::FormUniqueServerNameL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::FormUniqueServerNameL() + { + HBufC* title = iEikonEnv->AllocReadResourceL( + RSC_WVSETTINGSVIEW_DEFAULT_SERVERNAME ); + iServerNamePtr.Copy( title->Left( iServerNamePtr.MaxLength() ) ); + delete title; + + TBool retStatus( EFalse ); + + //get existing server names + CDesCArrayFlat* serverNames = ServerListL(); + if ( serverNames ) + { + CleanupStack::PushL( serverNames ); + retStatus = FormUniqueNameL( *serverNames, iServerNamePtr ); + CleanupStack::PopAndDestroy( serverNames ); + } + + return retStatus; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::FormUniqueNameL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::FormUniqueNameL( const CDesCArray& aExistingNames, + TDes& aNameToForm ) + { + //calculate trailer length + TInt nameTrailerTotalLength = KWVSettingsViewServerNameTrailerDecorationStart().Length() + + KWVSettingsViewServerNameTrailerNumberWidth + + KWVSettingsViewServerNameTrailerDecorationEnd().Length(); + TInt position( 0 ); + TBool nameChanged( EFalse ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aNameToForm ); + if ( aExistingNames.Find( aNameToForm, position, ECmpFolded ) == 0 ) + { + //the name is found among the existing names + //search for passfull trailer + + //initial trailer number + TUint trailerNumber( KWVSettingsViewServerNameTrailerMinNumber ); + + //setup temp buff + HBufC* nameTryBuff = HBufC::NewLC( aNameToForm.MaxLength() ); + TPtr nameTry( nameTryBuff->Des() ); + + //truncate the server name copy, to hold the trailer + TInt availableSpaceForActualName( aNameToForm.MaxLength() - nameTrailerTotalLength ); + + //find passfull server name + TInt result( 0 ); + + TBuf tempBuf( KNullDesC ); + while ( result == 0 ) + { + // check how many numbers we need to have in the index + tempBuf.Zero(); + tempBuf.AppendNum( trailerNumber ); + TInt length ( tempBuf.Length() ); + // but we want to have atleast 2 + if ( length < 2 ) + { + length = 2; + } + + nameTry.Zero(); + nameTry.Copy( aNameToForm.Left( availableSpaceForActualName ) ); + nameTry.Append( KWVSettingsViewServerNameTrailerDecorationStart ); + nameTry.AppendNumFixedWidth( trailerNumber, EDecimal, length ); + nameTry.Append( KWVSettingsViewServerNameTrailerDecorationEnd ); + + //result == 0, if a matching descriptor is found. + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( nameTry ); + result = aExistingNames.Find( nameTry, position, ECmpFolded ); + trailerNumber++; + } + + if ( result != 0 ) + { + //free nameslot found + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( nameTry ); + aNameToForm.Zero(); + aNameToForm.Copy( nameTry.Left( aNameToForm.MaxLength() ) ); + nameChanged = ETrue; + } + + CleanupStack::PopAndDestroy( nameTryBuff ); // nameTryBuff + } + return nameChanged; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::ChangeFocusToInvalidCompulsoryField +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::ChangeFocusToInvalidCompulsoryField() const + { + TBool found( EFalse ); + TInt itemIndex( 0 ); + + do + { + if ( iFailedFields & GenerateFlagValue( itemIndex ) ) + { + iListbox->SetCurrentItemIndexAndDraw( itemIndex ); + found = ETrue; + } + else + { + itemIndex++; + } + + } while ( itemIndex < ELastItemMarker && !found ); + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::ProcessCommandL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::ProcessCommandL( TInt aCommand ) + { + HideMenu(); + + switch ( aCommand ) + { + case EAknSoftkeyEdit: // Flowthrough, MSK command + case EWVSettingsViewDefNewServerChange: + { + CEikListBox* listBox = + static_cast ( Control( EWVSettingsViewControlIdDefNewServer ) ); + HandleListBoxEventL( listBox, EEventEditingStarted ); + break; + } + // Help key support EWVSettingsViewCmdHelp is assigned EAknCmdHelp in + // CWSettingsUI.hrh + case EWVSettingsViewCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), + ( CCoeEnv::Static()->AppUi() )->AppHelpContextL () ); + break; + } + case EWVSettingsViewCmdExit: + { + TryExitL ( aCommand ); + iIsDeleted = ETrue; + break; + } + default: + { + CEikonEnv::Static()->EikAppUi()->HandleCommandL( aCommand ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::HandleListBoxEventL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::HandleListBoxEventL( CEikListBox* aListBox, + TListBoxEvent aEventType ) + { + if ( aEventType == EEventEnterKeyPressed || + aEventType == EEventEditingStarted || + aEventType == EEventItemDoubleClicked ) + { + TBool isPopup( aEventType == EEventEditingStarted ); + TInt index( aListBox->CurrentItemIndex() ); + + if ( iConnectionUI ) + { + CPEngNWSessionSlotID2* sessionSlotID = NULL; + TRAPD( error, sessionSlotID = + iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM ) ); + CleanupStack::PushL( sessionSlotID ); + TInt retVal( KErrNone ); + TIMPSConnectionOperation connOperation( EIMPSConnOppUnknown ); + + if ( error == KErrNone ) + { + // check if IM or PEC is connected to this server + CIMPSSAPSettings* loggedInSap = CIMPSSAPSettings::NewLC(); + retVal = iConnectionUI->GetLoggedInSapL( *sessionSlotID, *loggedInSap ); + + // check if we were logged in + if ( retVal != KErrNone ) + { + // we were not logged in + // check if the log in is ongoing + HBufC* buffer = NULL; + + // if connOperation is != EAppConnOppClientLogin, then buffer is not + // initialised + connOperation = iConnectionUI->CurrentConnectionOperationL( buffer ); + // check if there was an ongoing login operation + if ( connOperation == EIMPSConnOppClientLogin ) + { + // login was ongoing, set the sap name for later checks + CleanupStack::PushL( buffer ); + loggedInSap->SetSAPNameL( *buffer ); + CleanupStack::PopAndDestroy( buffer ); + } + } + + // check if there was an active connection or an ongoing login operation + if ( ( retVal == KErrNone ) || ( connOperation == EIMPSConnOppClientLogin ) ) + { + + if ( loggedInSap->SAPName().CompareF ( iSAP->SAPName() ) == 0 ) + { + if ( connOperation == EIMPSConnOppClientLogin ) + { + // a login operation is ongoing, we cannot let the user edit the settings + HBufC* prompt = StringLoader::LoadLC( + R_QTN_CHAT_LOGIN_ONGOING_NOTE, + loggedInSap->SAPName(), + iCoeEnv ); + + CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue ); + dlg->ExecuteLD( *prompt ); + CleanupStack::PopAndDestroy( 3, sessionSlotID ); // prompt, loggedInSap, sessionSlotID + return; + } + // this is the server we are logged in to + // we have to query if we should log out + else if ( !ConfirmLogoutL() ) + { + // user declined logout, we cannot delete this server + CleanupStack::PopAndDestroy( 2, sessionSlotID ); // loggedInSap, sessionSlotID + return; + } + } + } + CleanupStack::PopAndDestroy( loggedInSap ); + } + else if ( error != KErrNotFound ) + { + // we ignore not found error, since then we know that we dont have a connection + User::Leave( error ); + } + CleanupStack::PopAndDestroy( sessionSlotID ); + } + + switch ( index ) + { + case ESAP: + { + TInt returnFlags = EditSapSettingsL(); + + if ( ( returnFlags == KApUiEventExitRequested ) || + ( returnFlags == KApUiEventShutDownRequested ) ) + { + // Exit was selected from the menu + TryExitL ( EWVSettingsViewCmdExit ); + iIsDeleted = ETrue; + return; + } + else + { + break; + } + } + + + case EServerName: + { + if ( iSAP->Protection() == ESAPBrandProtection ) + { + // show note + CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( ETrue ); + CleanupStack::PushL( dlg ); + HBufC* noteText = iEikonEnv->AllocReadResourceL( R_QTN_WVSETTINGSVIEW_BRAND_SERVER_INFO ); + CleanupStack::Pop( dlg ); + CleanupStack::PushL( noteText ); + dlg->ExecuteLD( *noteText ); + CleanupStack::PopAndDestroy( noteText ); + } + else + { + TInt returnFlags = EditServerNameL( index ); + if ( returnFlags == EEikBidCancel ) + { + if( !iDlgLauncher->IsActive() ) + { + iDlgLauncher->Call(); + } + return; + } + } + break; + } + + case EURL: + { + if ( iProtected ) + { + // this sap is protected, we do not have URL item in the listbox + // so this item is actually user id + iStoreOldId = ETrue; + EditUserIdL ( index ); + } + else + { + HBufC* urlTitle = StringLoader::LoadL( R_WVSETTINGSVIEW_SETTING_CONF_URL_TITLE ); + CleanupStack::PushL( urlTitle ); + + // launch a T9-enabled text setting page + CAknSettingPage* dlg = new( ELeave ) CAknTextSettingPage( + urlTitle, + EAknSettingPageNoOrdinalDisplayed, // setting number (not used) + EAknCtSettingPage, // control type + 0, // editor resource id (not used) + R_WVSETTINGSVIEW_SETTING_CONF_URL, // setting page resource + iURLPtr, + CAknTextSettingPage::EPredictiveTextEntryPermitted ); + + dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ); + + iSettingItemArray->At( index )->LoadL(); + CleanupStack::PopAndDestroy( urlTitle ); + + iEdited = ETrue; + } + break; + } + + + case EWVSettingsViewWVUserIdIndex: + { + if ( iProtected ) + { + // this sap is protected, we do not have URL item in the listbox + // so this item is actually password + iStoreOldId = ETrue; + EditPasswordL ( index ); + } + else + { + iStoreOldId = ETrue; + EditUserIdL ( index ); + } + break; + } + + case EWVSettingsViewPasswordIndex: + { + iStoreOldId = ETrue; + EditPasswordL ( index ); + break; + } + + default: + { + iSettingItemArray->At( index )->EditItemL( isPopup ); + break; + } + } + if ( iSettingItemArray ) + { + iSettingItemArray->At( index )->UpdateListBoxTextL(); + + // Update title-pane if needed + if( index == EServerName ) + { + iTitlePaneHandler->SetTitlePaneTextL ( iSettingItemArray->At( index )->SettingTextL() ); + } + DrawNow(); + } + } + } + +TInt CWVSettingsUIDefineNewServerDialog::LaunchDlgCallback( TAny* aDlg ) + { + CWVSettingsUIDefineNewServerDialog* dlg = static_cast( aDlg ); + TRAP_IGNORE( dlg->CloseDialogL() ); + return EFalse; + } + + + +void CWVSettingsUIDefineNewServerDialog::CloseDialogL() + { + TryExitL ( EEikBidCancel ); + } +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::HandleSettingPageEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::HandleSettingPageEventL( + CAknSettingPage* aSettingPage, + TAknSettingPageEvent aEventType ) + { + switch ( aEventType ) + { + case EEventSettingChanged: + { + CCoeControl* ctrl = aSettingPage->EditorControl(); + if ( ctrl ) + { + CEikEdwin* edwin = static_cast( ctrl ); + if ( edwin->TextLength() == 0 && iDomainSelectionQuery ) + { + // User has cleared user id field, pop-up domain + // selection query + if ( iConnectionUI->DisplayDomainSelectionQueryL( iWVUserIdPtr, iSAP ) ) + { + edwin->SetTextL( &iWVUserIdPtr ); + edwin->SetCursorPosL( 0, EFalse ); + } + } + } + break; + } + default: + { + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::EditUserIdL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::EditUserIdL( TInt aIndex ) + { + __ASSERT_DEBUG( aIndex >= 0, User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + __ASSERT_DEBUG( aIndex < iSettingItemArray->Count(), + User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + + if ( iStoreOldId ) + { + iOldUserIdPtr.Copy( iWVUserIdPtr.Left( iWVUserIdPtr.MaxLength() ) ); + } + + // change input mode according to resource variation + // This function is provided to get the setting (mode of input) from Cenrep/Resource file. + TBool textualInput = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_USERID_TEXTUAL_INPUTMODE ); + + // Get setting item + CAknSettingItem* item = ( *iSettingItemArray )[ aIndex ]; + + TBool domainAccepted = EFalse; + if ( iDomainSelectionQuery && iWVUserIdPtr.Length() == 0 ) + { + // If domain query variation is enabled and user id length is 0 + // show domain selection query + if ( !iConnectionUI ) + { + // iConnectionUI is NULL if define new server dialog + // is launched in application start up when there aren't + // any servers defined + iConnectionUI = CIMPSPresenceConnectionUi::NewL( EIMPSConnClientIM ); + iConnectionUIOwned = ETrue; + } + + if ( iConnectionUI->DisplayDomainSelectionQueryL( iWVUserIdPtr, iSAP ) == 0 ) + { + // User cancelled dialog + iStoreOldId = ETrue; + item->LoadL(); + item->UpdateListBoxTextL(); + iListbox->DrawItem( aIndex ); + return; + } + else + { + domainAccepted = ETrue; + } + } + + CAknTextSettingPage* settingPage = new ( ELeave ) CWVSettingsUserIDSettingPage ( + R_WVSETTINGSVIEW_SETTING_CONF_WVUID, + iWVUserIdPtr, + CAknTextSettingPage::EZeroLengthAllowed + | CAknTextSettingPage::EPredictiveTextEntryPermitted ); + + CleanupStack::PushL( settingPage ); + + settingPage->ConstructL(); + CleanupStack::Pop( settingPage ); + + // Set flags to edwin -> domain not selected in editor when launched + if ( domainAccepted ) + { + settingPage->TextControl()->AddFlagToUserFlags( CEikEdwin::ENoAutoSelection ); + } + + if ( ! textualInput ) + { + // enable numeric input for the WVID field + settingPage->TextControl()->SetAknEditorInputMode( EAknEditorNumericInputMode ); + } + + TInt mode = CAknSettingPage::EUpdateWhenAccepted; + if ( iDomainSelectionQuery ) + { + mode = CAknSettingPage::EUpdateWhenChanged; + static_cast( settingPage )->SetSettingPageObserver( this ); + } + + if ( settingPage->ExecuteLD( ( CAknSettingPage::TAknSettingPageUpdateMode )mode ) ) + { + iEdited = ETrue; + // accepted + if ( iWVUserId->Length() > 0 ) + { + // check wv id + if ( !( IMPSPresenceLoginDetailValidator::ValidWVLoginIdL( *iWVUserId ) ) ) + { + // show a note about the wrong wvid and return to editing + HBufC* prompt = StringLoader::LoadLC( R_WVSETTINGSVIEW_ERROR_WRONG_WVID, *iWVUserId ); + // Code scanner warning neglected to put variable on cleanup stack (Id: 35) + // PrepareLC pushes the dialog into cleanupstack + CAknNoteDialog* dlg = new ( ELeave ) CAknNoteDialog( // CSI: 35 # See above + CAknNoteDialog::EErrorTone , CAknNoteDialog::ELongTimeout ); + + dlg->PrepareLC( R_WVSETTINGSVIEW_ERROR_NOTE_TEMPLATE ); + dlg->SetTextL( *prompt ); + dlg->RunLD(); + + CleanupStack::PopAndDestroy( prompt ); + iStoreOldId = EFalse; + EditUserIdL ( aIndex ); + } + } + else + { + if ( CheckAutoLoginValuesL() ) + { + // login type was automatic, we have to rollback changes + iWVUserIdPtr.Copy( iOldUserIdPtr.Left( iOldUserIdPtr.MaxLength() ) ); + } + } + } + else + { + // cancel pressed + iWVUserIdPtr.Copy( iOldUserIdPtr.Left( iOldUserIdPtr.MaxLength() ) ); + } + + iStoreOldId = ETrue; + item->LoadL(); + item->UpdateListBoxTextL(); + iListbox->DrawItem( aIndex ); + } + + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::EditPasswordL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::EditPasswordL( TInt aIndex ) + { + __ASSERT_DEBUG( aIndex >= 0, User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + __ASSERT_DEBUG( aIndex < iSettingItemArray->Count(), + User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + + //first just edit name + CAknSettingItem* item = ( *iSettingItemArray )[ aIndex ]; + + if ( iStoreOldId ) + { + TPtr oldPasswordPtr ( iOldPassword->Des() ); + oldPasswordPtr.Copy( iPasswordPtr.Left( iPasswordPtr.MaxLength() ) ); + } + + CAknAlphaPasswordSettingPage* settingPage = new ( ELeave ) + CAknAlphaPasswordSettingPage( + R_WVSETTINGSVIEW_SETTING_CONF_PW, + iPasswordPtr , + iPasswordPtr ); + CleanupStack::PushL( settingPage ); + + settingPage->ConstructL(); + CleanupStack::Pop( settingPage ); + + if ( settingPage->ExecuteLD() ) + { + // Check variation about password saving warning + // This function is provided to get the setting (password saving warning) from Cenrep/Resource file. + TBool showWarning = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_SAVE_PW_WARNING ); + + if ( showWarning && iPassword->Length() > 0 ) + { + + CCoeEnv* coeEnv = CCoeEnv::Static(); + + // Read texts from resources + HBufC* warningText = coeEnv->AllocReadResourceLC( + R_CHAT_SAVE_PW_WARNING ); + HBufC* warningHeading = coeEnv->AllocReadResourceLC( + R_CHAT_SAVE_PW_WARNING_HEADING ); + + // Show warning with message query dialog + // CodeScanner warning ignored because CS does not + // notice that PrepareLC puts the dialog to cleanupstack + CAknMessageQueryDialog* dlg = new ( ELeave ) CAknMessageQueryDialog(); // CSI: 35 # See comment above + dlg->PrepareLC( R_WVSETTINGSVIEW_MESSAGE_QUERY_DIALOG ); + dlg->QueryHeading()->SetTextL( *warningHeading ); + dlg->SetMessageTextL( *warningText ); + dlg->RunLD(); + + CleanupStack::PopAndDestroy( 2, warningText ); + } + + iEdited = ETrue; + // accepted + if ( iPassword->Length() == 0 ) + { + if ( CheckAutoLoginValuesL() ) + { + // login type was automatic, we have to rollback the changes + TPtr oldPasswordPtr ( iOldPassword->Des() ); + iPasswordPtr.Copy( oldPasswordPtr.Left( oldPasswordPtr.MaxLength() ) ); + } + } + } + else + { + // cancel pressed + TPtr oldPasswordPtr ( iOldPassword->Des() ); + iPasswordPtr.Copy( oldPasswordPtr.Left( oldPasswordPtr.MaxLength() ) ); + } + iStoreOldId = ETrue; + item->LoadL(); + item->UpdateListBoxTextL(); + iListbox->DrawItem( aIndex ); + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::CheckAutoLoginValuesL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::CheckAutoLoginValuesL() + { + TUint32 defaultSAPId( 0 ); + + if ( !iDialog ) + { + // if we dont have base dialog it means that chat launched this dialog byitself + // and that means that automatic login cannot be on so we can just return false + return EFalse; + } + + // Query for default SAP uid + iSAPSettingsStore->GetDefaultL( defaultSAPId, EIMPSIMAccessGroup ); + + if ( iSAP->Uid() == defaultSAPId ) + { + // check if the login type is automatic + // or automatic in home network + TInt imLoginType = iDialog->GetChatLoginType(); + if ( ( imLoginType == EWVSettingsChatLoginAutoAlways ) + || ( imLoginType == EWVSettingsChatLoginAutoInHomeNW ) + || ( imLoginType == EWVSettingsChatLoginApplicationLaunch ) ) + { + // show an information note, password cannot be removed if automatic login + + CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( ETrue ); + CleanupStack::PushL( dlg ); + HBufC* noteText = iEikonEnv->AllocReadResourceL( R_WVSETTINGSVIEW_ERROR_ID_PASSWORD_MISSING ); + CleanupStack::Pop( dlg ); + CleanupStack::PushL( noteText ); + dlg->ExecuteLD( *noteText ); + CleanupStack::PopAndDestroy( noteText ); + + + + // login type was automatic + return ETrue; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::EditServerNameL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::EditServerNameL( TInt aIndex ) + { + __ASSERT_ALWAYS( aIndex >= 0, User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + __ASSERT_ALWAYS( aIndex < iSettingItemArray->Count(), + User::Panic( KPanicText, EWVSettingsListArrayIndexOutOfBounds ) ); + + HBufC* srvTitle = StringLoader::LoadL( R_WVSETTINGSVIEW_SETTING_CONF_SERVER_TITLE ); + CleanupStack::PushL( srvTitle ); + + HBufC* oldServerName = iServerName->AllocLC(); + + // get the setting item, used later + CAknSettingItem* item = ( *iSettingItemArray )[ aIndex ]; + isDisplayedSubDialog = ETrue; + // launch a T9-enabled text setting page + CAknSettingPage* dlg = new( ELeave ) CAknTextSettingPage( + srvTitle, + EAknSettingPageNoOrdinalDisplayed, // setting number (not used) + EAknCtSettingPage, // control type + 0, // editor resource id (not used) + R_WVSETTINGSVIEW_SETTING_CONF_SERVER, // setting page resource + iServerNamePtr, + CAknTextSettingPage::EPredictiveTextEntryPermitted ); + + TBool returnvalue(dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged )); + if ( iIsDeleted ) + { + CleanupStack::PopAndDestroy( 2, srvTitle ); // oldServerName, srvTitle + isDisplayedSubDialog = EFalse; + return EEikBidCancel; + } + // update setting item too + item->LoadL(); + + //get edited text and get rid of listbox control characters + + if ( *iServerName != *oldServerName ) + { + // the server name was edited, check that it does not become a duplicate + + TPtr name = iServerName->Des(); + AknTextUtils::ReplaceCharacters( name, + KAknReplaceListControlChars, + TChar( KWhiteSpace16 ) ); + FormUniqueServerL(); + item->LoadL(); + // set on the flag that we should save the server + iEdited = ETrue; + } + + CleanupStack::PopAndDestroy( 2, srvTitle ); // oldServerName, srvTitle + + item->UpdateListBoxTextL(); + iListbox->DrawItem( aIndex ); + + iTitlePaneHandler->SetTitlePaneTextL ( *iServerName ); + isDisplayedSubDialog = EFalse; + return returnvalue; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::PreLayoutDynInitL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::PreLayoutDynInitL() + { + // Check disk space, use CCoeEnv's file server session + if ( SysUtil::FFSSpaceBelowCriticalLevelL( + &ControlEnv()->FsSession(), KWVSettingsServerSizeEstimate ) ) + { + // Don't show any own notes here + User::Leave( KErrDiskFull ); + } + + iCommsDb = CCommsDatabase::NewL( EDatabaseTypeIAP ); + iAPUtils = CApUtils::NewLC( *iCommsDb ); + CleanupStack::Pop( iAPUtils ); + + iDlgLauncher = new (ELeave) CAsyncCallBack( TCallBack( LaunchDlgCallback, this), + CActive::EPriorityStandard ); + CApSettingsHandler* apSettingsHnadler = CApSettingsHandler::NewLC( ETrue, // Start with selection ? + EApSettingsSelListIsPopUp, // desired list type + EApSettingsSelMenuSelectNormal, // desired menu type + KEApIspTypeAll, // Filtering criteria on ISP type + KWVSettingsViewBearerTypes, // Filtering criteria on bearer type + KEApSortNameAscending // Specifies the sort order to use + //- WLAN APN can not be used from IM Application + // + //EIPv4|EIPv6 + //End of + //The error was raised for 3.1 and we have fixed the same to 3.2 also) + ); + + /* To be uncommented once the CApSettingsHandler provides NewL methods. + // Code scanner warning ignored LC method is the only available and it is popped right after + iAPSettingsHandler = CApSettingsHandler::NewLC( // CSI: 49 # See above + ETrue, // Start with selection ? + EApSettingsSelListIsPopUp, // desired list type + EApSettingsSelMenuSelectNormal, // desired menu type + KEApIspTypeAll, // Filtering criteria on ISP type + KWVSettingsViewBearerTypes, // Filtering criteria on bearer type + KEApSortNameAscending, // Specifies the sort order to use + //WLAN APN can not be used from IM Application + EIPv4|EIPv6 + //End + //The error was raised for 3.1 and we have fixed the same to 3.2 also + + ); */ + iAPSettingsHandler = apSettingsHnadler; + + CleanupStack::Pop( apSettingsHnadler ); + + HBufC* popUpPrompt = iCoeEnv->AllocReadResourceLC( R_WVSETTINGSVIEW_SETTING_CONF_SAP_TITLE ); + iAPSettingsHandler->SetTextOverrideL( EPopupPromptText, *popUpPrompt ); + CleanupStack::PopAndDestroy( popUpPrompt ); //popUpPrompt + + iServerName = HBufC::NewL( KWVSettingsServerNameMaxLength ); + iServerNamePtr.Set( iServerName->Des() ); + + iIAPName = HBufC::NewL( KWVSettingsServerSAPMaxLength ); + iIAPNamePtr.Set( iIAPName->Des() ); + + iWVUserId = HBufC::NewL( KWVSettingsServerWVUserIdMaxLength ); + iWVUserIdPtr.Set( iWVUserId->Des() ); + + iOldUserId = HBufC::NewL( KWVSettingsServerWVUserIdMaxLength ); + iOldUserIdPtr.Set ( iOldUserId->Des() ); + + iPassword = HBufC::NewL( KWVSettingsServerPasswordMaxLength ); + iPasswordPtr.Set( iPassword->Des() ); + + iURL = HBufC::NewL( KWVSettingsServerURLMaxlength ); + iURLPtr.Set( iURL->Des() ); + + iOldPassword = HBufC::NewL( KWVSettingsServerPasswordMaxLength ); + + if ( iEditMode == EEditServer ) + { + LoadExistingItemL(); + } + else + { + iSAP = CIMPSSAPSettings::NewL(); + FormUniqueServerNameL(); + } + + if ( iObserver ) + { + // iObserver might not exist if we didn't get here through application settings + // update previous server name + iOldServerName = iObserver->CurrentServerNameLC(); + CleanupStack::Pop(); + // load resource branding for this server (settings contain branded items) + // if this is different server than old server + if ( iOldServerName->Compare( *iServerName ) != 0 ) + { + iObserver->ServerChangedL( *iServerName ); + } + } + + iTitlePaneHandler->SetTitlePaneTextL ( *iServerName ); + + // check if the sap is protected + if ( iSAP ) + { + // check if the sap is protected + if ( iSAP->Protection() == ESAPBrandProtection ) + { + iProtected = ETrue; + } + } + + iListbox = + static_cast< CAknSettingStyleListBox* >( Control( EWVSettingsViewControlIdDefNewServer ) ); + + // Create item-array starting from ordinal 0 + iSettingItemArray = new ( ELeave ) CAknSettingItemArray( ELastItemMarker, EFalse, 1 ); + + if ( iProtected ) + { + // protected server -> we need to load icon array + LoadIconArrayL(); + } + + AddItemL( iServerNamePtr, + EServerName, + R_WVSETTINGSVIEW_SETTING_CONF_SERVER_TITLE, + R_WVSETTINGSVIEW_SETTING_CONF_SERVER, + ETrue, + iProtected ); + + AddItemL( iIAPNamePtr, + ESAP, + R_WVSETTINGSVIEW_SETTING_CONF_SAP_TITLE, + R_WVSETTINGSVIEW_SETTING_CONF_SAP, + ETrue ); + + // if the sap is protected we do not show the URL field to the user + if ( !iProtected ) + { + AddItemL( iURLPtr, + EURL, + R_WVSETTINGSVIEW_SETTING_CONF_URL_TITLE, + R_WVSETTINGSVIEW_SETTING_CONF_URL, + ETrue ); + } + + + AddItemL( iWVUserIdPtr, + EWVId, + R_WVSETTINGSVIEW_SETTING_CONF_WVUID_TITLE, + R_WVSETTINGSVIEW_SETTING_CONF_WVUID ); + + AddItemL( iPasswordPtr, + EPassword, + R_WVSETTINGSVIEW_SETTING_CONF_PW_TITLE, + R_WVSETTINGSVIEW_SETTING_CONF_PW, + EFalse, + EFalse, + EPasswordItem ); + + CTextListBoxModel* model = iListbox->Model(); + model->SetItemTextArray( iSettingItemArray ); + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); // Ownership retained by us + + iSettingItemArray->RecalculateVisibleIndicesL(); + iListbox->CreateScrollBarFrameL( ETrue ); + iListbox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + iListbox->HandleItemAdditionL(); + iListbox->SetListBoxObserver( this ); + iListbox->UpdateScrollBarsL(); + + // Check domain query variation + // This function is provided to get the setting (domain query variation) from Cenrep/Resource file. + iDomainSelectionQuery = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_DOMAIN_SELECTION ); + + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::DynInitMenuPaneL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + // if we're displaying general menu and help feature is not supported.. + if ( aResourceId == R_WVSETTINGSVIEW_GENERAL_MENU && + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + // dimm the help menu item + aMenuPane->SetItemDimmed( EWVSettingsViewCmdHelp, ETrue ); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::PostLayoutDynInitL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::PostLayoutDynInitL() + { + if ( iEditMode == EEditServer ) + { + ChangeFocusToInvalidCompulsoryField(); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::OkToExitL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::OkToExitL( TInt aButtonId ) + { + + + if ( iExitReason == EApplicationExit ) + { + return EFalse; + } + + // show the menu + if ( aButtonId == EAknSoftkeyOptions ) + { + DisplayMenuL(); + return EFalse; + } + + if ( aButtonId == EAknSoftkeyEdit ) + { + // MSK command + ProcessCommandL( aButtonId ); + return EFalse; + } + + // Take old servername and ask UI components to extrernalize their state + TBuf serverName( *iServerName ); + SignalStoreLToAllL(); + + // If all the data is filled, then save, otherwise ask for deletion + if ( CompulsoryItemsFilled() ) + { + + if ( serverName != *iServerName ) + { + FormUniqueServerL(); + } + + // If everything went ok, then store server + // only try to save if something is edited + if ( iEdited ) + { + StoreAllItemsL(); + } + + if ( ( aButtonId == EWVSettingsViewCmdExit ) || ( aButtonId == EAknSoftkeyExit ) ) + { + iExitReason = EApplicationExit; + } + else + { + iExitReason = EServerSaved; + } + } + else + { + // if application exit requested, we don't show the query about deleting the server + if ( ( aButtonId == EAknSoftkeyExit ) || ( aButtonId == EWVSettingsViewCmdExit ) ) + { + iExitReason = EApplicationExit; + return ETrue; + } + CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + CleanupStack::PushL( dlg ); + + // Set prompt + HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( RSC_WVSETTINGSVIEW_COMPUL_QUERY ); + dlg->SetPromptL( *text ); + CleanupStack::PopAndDestroy( text ); + + CleanupStack::Pop( dlg ); + TInt ret( dlg->ExecuteLD( R_DELETE_CONFIRMATION_QUERY ) ); + + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + iExitReason = EMissingCompulsory; + } + else + { + // User declined delete -> return to form + ChangeFocusToInvalidCompulsoryField(); + return EFalse; + } + } + + // load resource branding for the previous server (settings contain branded items) + if ( iObserver ) + { + // iObserver might not exist if we didn't get here through application settings + // If edited server wasr different than old server, load old server resources + if ( iOldServerName->Compare( *iServerName ) != 0 ) + { + iObserver->ServerChangedL( *iOldServerName ); + } + } + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::GenerateFlagValue +// Generates safe value for given seed (enum). This needs +// because we use this number in single master-flag with OR-operations +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::GenerateFlagValue( TInt aSeed ) const + { + TInt generatedNumber( 1 ); + + for ( TInt i( 0 ); i < aSeed; ++i ) + { + generatedNumber *= 2; + } + + return generatedNumber; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::ServerListL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CDesCArrayFlat* CWVSettingsUIDefineNewServerDialog::ServerListL() const + { + TInt srvCount( iSAPSettingsStore->SAPCountL( EIMPSIMAccessGroup ) ); + + if ( srvCount > 0 ) + { + CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC(); + iSAPSettingsStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup ); + + //get existing server names + CDesCArrayFlat* serverNames = new( ELeave ) CDesCArrayFlat( srvCount ); + CleanupStack::PushL( serverNames ); + + for ( TInt ii( 0 ); ii < srvCount; ++ii ) + { + serverNames->AppendL( sapList->MdcaPoint( ii ) ); + } + + CleanupStack::Pop( serverNames ); + CleanupStack::PopAndDestroy( sapList ); + return serverNames; + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::FormUniqueServerL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::FormUniqueServerL() + { + TInt pos( 0 ); + CDesCArrayFlat* serverNames = ServerListL(); + + if ( !serverNames ) + { + return; + } + + CleanupStack::PushL( serverNames ); + + TBool serverExists( serverNames->Find( *iServerName, pos ) == 0 ); + + if ( serverExists ) + { + // the name is already in the list modify the new name + TBuf serverName; + serverName.Copy( ( *iServerName ).Left( serverName.MaxLength() ) ); + + if ( FormUniqueNameL( *serverNames, serverName ) ) + { + iServerNamePtr.Copy( serverName.Left( iServerNamePtr.MaxLength() ) ); + } + } + + CleanupStack::PopAndDestroy( serverNames ); + } + + +// --------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::OfferKeyEventL() +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +TKeyResponse CWVSettingsUIDefineNewServerDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if ( aKeyEvent.iCode == EKeyEscape ) + { + if ( isDisplayedSubDialog ) + { + iIsDeleted = ETrue; + } + else + { + TryExitL( EAknSoftkeyCancel ); + } + return EKeyWasConsumed; + } + + if ( iIsDeleted ) + { + return EKeyWasConsumed; + } + else + { + return iListbox->OfferKeyEventL( aKeyEvent, aType ); + } + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::ConfirmLogoutL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CWVSettingsUIDefineNewServerDialog::ConfirmLogoutL() + { + + // check if pec and chat are logged in + TBool loggedIn = iConnectionUI->LoggedInL( EIMPSConnClientIM ); + + if ( loggedIn ) + { + // ask confirmation about logging out + CAknQueryDialog* dlg = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone ); + CleanupStack::PushL( dlg ); + // Set prompt + HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( + R_WVSETTINGSVIEW_ERROR_ID_ACTIVE_CONNECTION ); + dlg->SetPromptL( *text ); + CleanupStack::PopAndDestroy( text ); + CleanupStack::Pop( dlg ); + TInt ret( dlg->ExecuteLD( R_ACTIVE_CONNECTION_CONFIRMATION_QUERY ) ); + + if ( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) + { + // user confirmed logout -> disconnect all open connections + CPEngNWSessionSlotID2* sessionSlotID = + iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM ); + CleanupStack::PushL( sessionSlotID ); + User::LeaveIfError( iConnectionUI->LogoutL( *sessionSlotID ) ); + CleanupStack::PopAndDestroy( sessionSlotID ); + return ETrue; + } + else + { + // the user declined the logout, we can just return EFalse + return EFalse; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::LoadIconArrayL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CWVSettingsUIDefineNewServerDialog::LoadIconArrayL() + { + // Create array for listbox graphics + CAknIconArray* icons = new ( ELeave ) CAknIconArray( 1 ); // one icon in array + CleanupStack::PushL( icons ); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + + TFileName bitmapfilepath; + bitmapfilepath.Append( TParsePtrC( PathInfo::RomRootPath() ).Drive() ); + bitmapfilepath.Append( KDC_APP_BITMAP_DIR() ); + bitmapfilepath.Append( KBitmapFile() ); + + AknsUtils::CreateIconLC( AknsUtils::SkinInstance(), + KAknsIIDQgnIndiSettProtectedAdd, + bitmap, mask, bitmapfilepath, + EMbmApsettingsQgn_indi_sett_protected_add, + EMbmApsettingsQgn_indi_sett_protected_add_mask ); + icons->AppendL( CGulIcon::NewL( bitmap, mask ) ); + CleanupStack::Pop( 2 ); // mask, bitmap + + CArrayPtr* oldIconArray = iListbox->ItemDrawer()->ColumnData()->IconArray(); + + if ( oldIconArray ) + { + oldIconArray->ResetAndDestroy(); + delete oldIconArray; + } + + // Transfer ownership to listbox + iListbox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + CleanupStack::Pop( icons ); + } +// --------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::MappedCommandId() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::MappedCommandId( TInt aButtonId ) + { + // change cancel id so avkon don't remap it to 0 + if ( aButtonId == EEikBidCancel ) + { + // This value has to be something else than EEikBidCancel + // returned value in here is NOT the return value of ExecuteLD. + return EEikBidCancel + 1; + } + return aButtonId; + } + +// ----------------------------------------------------------------------------- +// CWVSettingsUIDefineNewServerDialog::IntResourceValueL() +// @param aResourceId The resource ID to be fetched from Cenrep (if present) or else from the variation file +// ----------------------------------------------------------------------------- +// +TInt CWVSettingsUIDefineNewServerDialog::IntResourceValueL( TInt aResourceId ) + { + + TInt val( 0 ); + TInt err ( KErrNone ); + CRepository* rep = 0; + + TRAP( err, rep = CRepository::NewL( KCRUidIMNG ) ); + + if ( err == KErrNone ) + { + TInt key = aResourceId + KIMCUStartVariationID; + + err = rep->Get( key, val ); + + delete rep; + } + + if ( err != KErrNone ) + { + + TResourceReader reader; + + aResourceId = aResourceId + RSC_CRRSS_CHAT_VARIATION_IMPSCU_START_ID; + + CCoeEnv::Static()->CreateResourceReaderLC( + reader, + aResourceId ); + val = reader.ReadInt32(); + CleanupStack::PopAndDestroy(); // reader + + } + + return val; + + } + + + +/** + * Help key support - GetHelpContext is called by the framework on + * event EAknCmdHelp + * -------------------------------------------------------------------------------- + * CWVSettingsUIDefineNewServerDialog::GetHelpContext + * @param aContext The context dependent on the current view is passed by the framework. + */ +void CWVSettingsUIDefineNewServerDialog::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidChatClient; + aContext.iContext = KIMNG_HLP_DEFSERVER ; + } + + + +// End of File