wvuing/IMPSServiceSettingsUI/Src/CWVSettingsUIDefineNewServerDialog.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /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