--- /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 <csxhelp/imng.hlp.hrh>
+
+#include <aknlists.h>
+#include <commdb.h>
+#include <ApSettingsHandlerUI.h>
+#include <aputils.h>
+#include <aknsettingitemlist.h>
+#include <aknsettingpage.h>
+#include <akntextsettingpage.h>
+#include <AknPopupSettingPage.h>
+#include <akntitle.h>
+#include <aknquerydialog.h>
+#include <e32math.h>
+#include <cimpssapsettingsstore.h>
+#include <cimpssapsettings.h>
+#include <cimpssapsettingslist.h>
+#include <aknnotewrappers.h> // branding
+#include <stringloader.h>
+#include <AknIconArray.h>
+#include <data_caging_path_literals.hrh>
+#include <apsettings.mbg>
+#include <AknsUtils.h>
+#include <AknsConstants.h>
+#include <pathinfo.h>
+#include <aknmessagequerydialog.h>
+
+#include <hlplch.h>
+#include <featmgr.h>
+#include <aknsettingpage.h>
+#include <aknpasswordsettingpage.h>
+#include <cimpspresenceconnectionuing.h>
+#include <impspresenceconnectionuiconstsng.h>
+
+#include <CPEngNWSessionSlotID2.h>
+
+#include <barsread.h>
+#include <bautils.h>
+#include <sysutil.h>
+
+#include <CWVSettingsUIng.rsg>
+#include <aknutils.h>
+
+#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 <centralrepository.h>
+
+// 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<KWVSettingsServerNameMaxLength> 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 <CEikListBox*> ( 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<CWVSettingsUIDefineNewServerDialog*>( 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<CEikEdwin*>( 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<CWVSettingsUserIDSettingPage*>( 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<KWVSettingsServerNameMaxLength> 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<KWVSettingsServerNameMaxLength> 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<CGulIcon>* 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