wvuing/IMPSConnectionUI/UISrc/CCnUiUiFacade.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/UISrc/CCnUiUiFacade.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,1766 @@
+/*
+* Copyright (c) 2004 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:  UI facade.
+*
+*/
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <aknnotewrappers.h>
+#include <aknquerydialog.h>
+#include <aknlistquerydialog.h>
+#include <aknwaitdialog.h>
+#include <TextResolver.h>
+#include <StringLoader.h>
+#include <eikenv.h>
+#include <impserrors.h>
+#include <AknIconArray.h>
+#include <AknIconUtils.h>
+#include <gulicon.h>
+#include <PathInfo.h>
+#include <avkon.mbg>
+#include <bldvariant.hrh>
+#include <aknsskininstance.h>
+#include <aknsutils.h>
+#include <bautils.h>
+#include <fbs.h>
+
+#include <PEngWVPresenceErrors2.h>
+#include <NetConError.h>
+#include <es_sock.h>
+#include 	"VariantKeys.h"
+
+#include <IMPSConnectionUiNG.rsg>
+#include <CAVariationNG.rsg>
+
+#include <e32property.h>    // RProperty
+
+#include <AknMessageQueryDialog.h>
+#include <eikbtgpc.h>
+#include <browserlauncher.h>
+
+#include "CnUiErrors.h"
+#include "CCnUiUiFacade.h"
+#include "CnUiResourceFileName.h"
+#include "CCnUiUsernameAndPwdQuery.h"
+#include "CCommandAbsorbingControl.h"
+#include "CCnUiWaitNoteContainer.h"
+#include "CCnUiQueryContainer.h"
+#include "ccnuidomainselectionquerydialog.h"
+#include "CCnUiTermsOfUseDlg.h"
+
+#include "CnUiPanics.h"
+#include "CIMPSSharedDataFactory.h"
+#include "MIMPSSharedData.h"
+#include "impspresenceconnectionuiconstsng.h"
+
+#include "CCnOUiUsernameAndPwdQuery.h"
+#include "impswapreguiddefs.h"
+#include 	<centralrepository.h>
+#include    "CCnUiConnOpener.h"
+
+
+//CONSTANTS
+//Max CSP error code
+//It is assumed that max CSP error id would be 999
+//==>thus the top CSP error code is CSP error base - 999
+const TInt KPEngErrorWVServerResponseTop = KPEngErrorWVServerResponseBase - 999;
+const TInt KCnUiErrGPRSConnectionNotAvailable = -4167; //stated explicitly in UI spec.
+
+// Backslash unicode
+const TUint KBackSlash = 0x005C;
+
+_LIT( KTab, "\t" );
+_LIT( KDirSeparator, "\\" );
+_LIT( KRelativeBrandPath, "\\system\\data\\branding\\" );
+_LIT( KModuleId, "IMApp" );
+_LIT( KBitmapFile, "logo.mbm" );
+_LIT( KCUITOUFile, "TOU.rsc" );
+//Max length of WAP registration URL
+#define KMaxRegUrlLength 20
+
+// ================= GLOBAL FUNCTIONS ====================
+// -----------------------------------------------------------------------------
+// CreateUiFacadeL()
+// -----------------------------------------------------------------------------
+//
+GLREF_C MCnUiUiFacade* CreateUiFacadeL()
+    {
+    return CCnUiUiFacade::NewL();
+    }
+
+GLREF_C MCnUiUiFacade* CreateUiFacadeLC()
+    {
+    CCnUiUiFacade* self = CCnUiUiFacade::NewL();
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+
+// ================= MEMBER FUNCTIONS =======================
+// Two-phased constructor.
+CCnUiUiFacade* CCnUiUiFacade::NewL()
+    {
+    CCnUiUiFacade* self = new ( ELeave ) CCnUiUiFacade();
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// Destructor
+CCnUiUiFacade::~CCnUiUiFacade()
+    {
+    RemoveUsedResourceFile();
+    delete iDefaultRssFileName;
+    delete iCommandAbsorber;
+    delete iIconArray;
+    delete iSharedData;
+    delete iBrLauncher;
+    iRFs.Close();
+    if ( iControl )
+        {
+        CCoeEnv::Static()->AppUi()->RemoveFromStack( iControl );
+        delete iControl;
+        iControl = NULL;
+        }
+    }
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCnUiUiFacade::CCnUiUiFacade()
+        : iResourceFileAdded( EFalse )
+    {
+    }
+
+
+// Symbian OS default constructor can leave.
+void CCnUiUiFacade::ConstructL()
+    {
+    iCoeEnv = CCoeEnv::Static();
+    __ASSERT_ALWAYS( iCoeEnv,
+                     CnUiPanicOrLeaveL( EIMPSConnUi_NoCoeEnv,
+                                        KErrNotSupported ) );
+
+    iCommandAbsorber = CCommandAbsorbingControl::NewL();
+
+    iSharedData = CIMPSSharedDataFactory::CreateTemporaryKeyHandlerL( NULL, KBrandingUid );
+    RProperty::Define( KBrandingUid,
+                       KBrandingResourceKey,
+                       RProperty::EByteArray,
+                       KIMPSPubSubReadPolicy, KIMPSPubSubWritePolicy );
+
+    RProperty::Define( KBrandingUid,
+                       KBrandingConnUIResourceKey,
+                       RProperty::EByteArray,
+                       KIMPSPubSubReadPolicy, KIMPSPubSubWritePolicy );
+
+    TFileName resourceFileName;
+    CnUiResourceFileName::NearestForCurrentLanguage( iCoeEnv->FsSession(),
+                                                     resourceFileName  );
+    iDefaultRssFileName = resourceFileName.AllocL();
+
+    // Check for branding
+    resourceFileName.Zero();
+    TInt err = iSharedData->GetStringKey(
+                   ( TIMPSSharedKeys )KBrandingConnUIResourceKey, resourceFileName );
+    if ( err != KErrNone || resourceFileName.Length() == 0 )
+        {
+        resourceFileName = *iDefaultRssFileName;
+        }
+
+    UseResourceFileL( resourceFileName );
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ConnProcessUi()
+// -----------------------------------------------------------------------------
+//
+MIMPSConnProcessUi& CCnUiUiFacade::ConnProcessUi()
+    {
+    return *this;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::CommandAbsorbOnLC()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::CommandAbsorbOnLC()
+    {
+    iCommandAbsorber->AbsorbCommandsLC();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::FlushCommandBuffer()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::FlushCommandBuffer()
+    {
+    iCommandAbsorber->FlushCommands();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::WaitNoteL()
+// -----------------------------------------------------------------------------
+//
+MCnUiConnWaitNote* CCnUiUiFacade::WaitNoteL( TCnUiConnectionWaitNotes aNoteId,
+                                             MCnUiWaitNoteObserver* aObserver )
+    {
+    TInt promptTextResourceId( 0 );
+    TInt noteResourceId( 0 );
+    switch ( aNoteId )
+        {
+        case ECnUiWaitNoteDisconnecting:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_WAIT_DISCONNECT;
+            noteResourceId = R_WAIT_NOTE_BLANK;
+            break;
+            }
+
+        case ECnUiWaitNotePlugin:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_FETCHING_CONTACT_LISTS;
+            noteResourceId = R_WAIT_NOTE_BLANK;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( promptTextResourceId, iCoeEnv );
+
+    CCnUiWaitNoteContainer* wNote = CCnUiWaitNoteContainer::NewL( noteResourceId,
+                                                                  *prompt,
+                                                                  aObserver );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return wNote;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::WaitNoteL()
+// -----------------------------------------------------------------------------
+//
+MCnUiConnWaitNote* CCnUiUiFacade::WaitNoteL( TCnUiConnectionWaitNotesDynText aNoteId,
+                                             const TDesC& aInsertText,
+                                             MCnUiWaitNoteObserver* aObserver )
+    {
+    TInt promptTextResourceId( 0 );
+    TInt noteResourceId( 0 );
+    switch ( aNoteId )
+        {
+        case ECnUiWaitNoteConnectingPEC:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_PEC_CON_TO_SERVER;
+            noteResourceId = R_WAIT_NOTE_WITH_CANCEL;
+            break;
+            }
+
+        case ECnUiWaitNoteConnectingChat:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_CON_TO_SERVER;
+            noteResourceId = R_WAIT_NOTE_WITH_CANCEL;
+            break;
+            }
+
+        case ECnUiWaitNoteReConnectingChat:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_SETTING_CON_TO_PEC2;
+            noteResourceId = R_WAIT_NOTE_WITH_CANCEL;
+            break;
+            }
+
+        case ECnUiWaitNoteReConnectingPEC:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_SETTING_CON_TO_CHAT2;
+            noteResourceId = R_WAIT_NOTE_WITH_CANCEL;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( promptTextResourceId, aInsertText, iCoeEnv );
+    CCnUiWaitNoteContainer* wNote = NULL;
+    TBool requireSignOnAnim = IntResourceValueL( RSC_CHAT_VARIATION_SHOW_SIGN_IN_ANIMATION );
+    if ( aNoteId == ECnUiWaitNoteConnectingChat && requireSignOnAnim )
+        {
+        iControl = CCnUiSignInControl::NewL( *prompt, aObserver );
+        CCoeEnv::Static()->AppUi()->AddToStackL( iControl );
+        }
+    else
+        {
+        wNote = CCnUiWaitNoteContainer::NewL( noteResourceId,
+                                              *prompt,
+                                              aObserver );
+        }
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return wNote;
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::QueryL()
+// -----------------------------------------------------------------------------
+//
+MCnUiConnQuery* CCnUiUiFacade::QueryL( TCnUiConnAsyncQuery aQueryId,
+                                       MCnUiConnQueryObserver& aObserver )
+    {
+    TInt promptTextResourceId( 0 );
+
+    switch ( aQueryId )
+        {
+        case ECnUiQueryActiveConnectionScheduledClose:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_SCHEDULED_TO_BE_CLOSED;
+            break;
+            }
+
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( promptTextResourceId, iCoeEnv );
+    CCnUiQueryContainer* query = CCnUiQueryContainer::NewL( ENBConfirmationQuery,
+                                                            *prompt,
+                                                            aObserver );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return query;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::QueryL()
+// -----------------------------------------------------------------------------
+//
+MCnUiConnQuery* CCnUiUiFacade::QueryL( TCnUiConnAsyncQueryDynText aQueryId,
+                                       const TDesC& aInsertText,
+                                       MCnUiConnQueryObserver& aObserver )
+    {
+    TInt promptTextResourceId( 0 );
+    switch ( aQueryId )
+        {
+        case ECnUiQueryActiveConnectionSuppressForScheduledConnection:
+            {
+            //res & type res ok
+            promptTextResourceId = R_QTN_CHAT_DISCON_OTHER_BECAUSE_SCHEDULING;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( promptTextResourceId, aInsertText, iCoeEnv );
+    CCnUiQueryContainer* query = CCnUiQueryContainer::NewL( ENBConfirmationQuery,
+                                                            *prompt,
+                                                            aObserver );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return query;
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::GetIntResourceValueL
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiUiFacade::GetIntResourceValueL( TInt aResourceId )
+    {
+    // Show user Identity, if variated so
+    TResourceReader reader;
+    TInt value( KErrNone );
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, aResourceId );
+    value = ResourceUtils::ReadTInt32L( reader );
+    CleanupStack::PopAndDestroy(); // reader
+
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowNoteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::ShowNoteL( TCnUiConnectionNotes aNoteId )
+    {
+    TInt resourceId( 0 );
+    TCnUiConnUiNoteType noteType = EInfoNote;
+    switch ( aNoteId )
+        {
+        case ECnUiConnectionOK:
+            {
+            //res & type ok
+            resourceId = R_QTN_CHAT_LOGIN_OK;
+            noteType = EInfoNote;
+            break;
+            }
+
+        case ECnUiDisconnectedIM:
+            {
+            //res & type ok
+            resourceId = R_QTN_CHAT_DISCONNECTED_CONF;
+            noteType = EConfirmationNote;
+            break;
+            }
+
+        case ECnUiDisconnectedPEC:
+            {
+            //res & type ok
+            resourceId = R_QTN_DYC_DISCONNECTED_CONF;
+            noteType = EConfirmationNote;
+            break;
+            }
+
+        case ECnUiDisconnectedAutomaticConnection:
+            {
+            //res & type ok
+            resourceId = R_QTN_CHAT_AUTOMATIC_CONN_ON;
+            noteType = EInfoNote;
+            break;
+            }
+
+
+        case ECnUiConnCanceled:
+            {
+            //res & type ok
+            resourceId = R_QTN_CHAT_LOGING_CANCELED;
+            noteType = EConfirmationNote;
+            break;
+            }
+
+
+        case ECnUiConnForceLogout:
+            {
+            //res & type ok
+            resourceId = R_QTN_CHAT_SERVER_DISCONNECTED_CLIENT;
+            noteType = EInfoNote;
+            break;
+            }
+
+
+        case ECnUiGPRSConnectionLost:
+            {
+            //Special case because here is used the system error text
+            HBufC* systemErrorText = SystemErrorTextOrNullForCodeL( KErrNetConNoGPRSNetwork );
+
+            //because supported error text are varied between releases, protect against
+            //unknown text ==> note is shown with best effort
+            if ( systemErrorText )
+                {
+                CleanupStack::PushL( systemErrorText );
+                //new code/////
+                if ( iControl )
+                    {
+                    CCoeEnv::Static()->AppUi()->RemoveFromStack( iControl );
+                    delete iControl;
+                    iControl = NULL;
+                    }
+                ///////////////
+                DoShowNoteL( *systemErrorText, EErrorNote );
+                CleanupStack::PopAndDestroy( systemErrorText ); //systemErrorText
+                }
+            return; //note is shown completely ==> return
+            // no break needed because of return
+            }
+
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+    TBool requireSignOnAnim = IntResourceValueL( RSC_CHAT_VARIATION_SHOW_SIGN_IN_ANIMATION );
+    if ( aNoteId == ECnUiConnectionOK && requireSignOnAnim )
+        {
+        iControl->PrepareForFocusGainL();
+        iControl->SetFocus( ETrue );
+        HBufC* prompt = iCoeEnv->AllocReadResourceLC( resourceId );
+        //CEikLabel* aSignInLabel = static_cast<CEikLabel*>(iControl->ComponentControl(0));
+        //aSignInLabel->SetTextL(*prompt);
+        iControl->AssignSignInText( *prompt );
+        iControl->HideStatus();
+        iControl->StopAnimation();
+        iControl->DrawNow();
+        CleanupStack::PopAndDestroy( prompt ); //prompt
+        }
+    else
+        {
+        //new code/////
+        if ( iControl )
+            {
+            CCoeEnv::Static()->AppUi()->RemoveFromStack( iControl );
+            delete iControl;
+            iControl = NULL;
+            }
+        ///////////////
+        DoShowNoteL( resourceId, noteType );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowNoteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::ShowNoteL( TCnUiConnectionNotesDynText aNoteId,
+                               const TDesC& aInsertText )
+    {
+    TInt promptTextResourceId( 0 );
+    TCnUiConnUiNoteType noteType = EErrorNote;
+
+    switch ( aNoteId )
+        {
+        case ECnUiImproperPresenceId:
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_ERROR_WRONG_WVID;
+            noteType = EErrorNote;
+            break;
+            }
+
+        case ECnUiConnOperationAllreadyRunning:
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_LOGIN_ONGOING_NOTE;
+            noteType = EInfoNote;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( promptTextResourceId, aInsertText, iCoeEnv );
+    DoShowNoteL( *prompt, noteType );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowLoginErrorNoteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::ShowLoginErrorNoteL( TInt aErrorCode )
+    {
+    //do first error code pre mapping
+    if ( aErrorCode == KErrCommsLineFail )
+        {
+        aErrorCode = KCnUiErrGPRSConnectionNotAvailable; //GPRS connection not available
+        }
+
+
+    //now map the error to note
+    TInt promptTextResourceId( KErrNotFound );
+    TCnUiConnUiNoteType noteType = EErrorNote;
+    switch ( aErrorCode )
+        {
+        case KErrNone:
+            {
+            //no error to show for KErrNone
+            return;
+            // no break needed because of return
+            }
+
+        case KErrCancel:
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_LOGING_CANCELED;
+            noteType = EConfirmationNote;
+            break;
+            }
+
+        case KCnUiErrorNetworkConnectionNotAllowed: //LoginFailedToOffLineMode
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_OFFLINE_NOT_POSSIBLE;
+            noteType = EErrorNote;
+            break;
+            }
+
+        //flow trough
+        case KPEngNwErrInvalidPassword:   //CSP - 409
+        case KPEngNwErrUnknownUser:       //CSP - 531
+        case KPEngNwErrInvalidOrUnSupportedUserProperties: //CSP - 702
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_LOGIN_PASSER_NOTE;
+            noteType = EErrorNote;
+            break;
+            }
+
+
+        case KPEngNwErrForbidden: //CSP - 403
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_LOGIN_ACCOUNT_LOST;
+            noteType = EErrorNote;
+            break;
+            }
+
+        //flow trough
+        case KPEngNwErrServiceNotSupported:   //CSP - 405
+        case KPEngNwErrServiceNotAgreed:      //CSP - 506
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_ERROR_SERVICE_ERR;
+            noteType = EErrorNote;
+            break;
+            }
+
+        //flow trough
+        case KPEngNwErrServiceUnavailable:   //CSP - 503
+        case KPEngNwErrMessageQueueIsFull:   //CSP - 507
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_ERROR_SERV_BUSY;
+            noteType = EErrorNote;
+            break;
+            }
+
+        //flow trough
+        case KPEngNwErrSessionExpired:        //CSP - 600
+        case KErrConnectionTerminated:        //login terminated by "red key" or from ConMan app.
+        case KErrDisconnected:
+        case KErrTimedOut:
+        case KErrCouldNotConnect:
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_LOGIN_CONERROR_NOTE;
+            noteType = EErrorNote;
+            break;
+            }
+
+
+        case KPEngNwErrForcedLogout:          //CSP - 601
+            {
+            //res ok & type other
+            promptTextResourceId = R_QTN_CHAT_SERVER_DISCONNECTED_CLIENT;
+            noteType = EConfirmedErrorNote;
+            break;
+            }
+
+        case KCnUiErrorInsufficientNWServerCapabilities:
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_INFO_NOT_SUP_CON;
+            noteType = EConfirmedErrorNoteMSKSelectIcon;
+            break;
+            }
+
+
+        case KPEngNwErrVersionNotSupported:   //CSP - 505
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_ERROR_GEN_ERROR;
+            noteType = EErrorNote;
+            break;
+            }
+
+
+        case KCnUiErrorSapMissingCompulsoryFields: //LoginMissingCompSettings
+            {
+            //res & type ok
+            promptTextResourceId = R_QTN_CHAT_SETT_COMP_MISS;
+            noteType = EErrorNote;
+            break;
+            }
+
+
+        default:
+            {
+            //no any specific note mapped to error code
+
+            //if error is unhandled CSP error ==> show default server error note
+            if ( ( KPEngErrorWVServerResponseTop <= aErrorCode ) &&
+                 ( aErrorCode <= KPEngErrorWVServerResponseBase ) )
+                {
+                promptTextResourceId = R_QTN_CHAT_ERROR_GEN_ERROR; //"Server error."
+                noteType = EErrorNote;
+                break;
+                }
+
+            // error from impsengine that has not mapped into presence server error
+            if ( ( KImpsGeneralError <= aErrorCode ) && ( aErrorCode <= KImpsErrorKeyIndexInvalid ) )
+                {
+                // map these to "No connection to service. Try again later."
+                promptTextResourceId = R_QTN_CHAT_LOGIN_CONERROR_NOTE;
+                noteType = EErrorNote;
+                break;
+                }
+
+            //If error code is mapped to some system
+            //error text, show it. Else default to own no connection error note.
+            HBufC* systemErrorText = SystemErrorTextOrNullForCodeL( aErrorCode );
+            if ( systemErrorText )
+                {
+                CleanupStack::PushL( systemErrorText );
+                //new code/////
+                if ( iControl )
+                    {
+                    CCoeEnv::Static()->AppUi()->RemoveFromStack( iControl );
+                    delete iControl;
+                    iControl = NULL;
+                    }
+                ////////////////
+                DoShowNoteL( *systemErrorText, EErrorNote );
+                CleanupStack::PopAndDestroy( systemErrorText ); //systemErrorText
+                return;
+                }
+            else
+                {
+                promptTextResourceId = R_QTN_CHAT_LOGIN_CONERROR_NOTE;  //"No connection to service. Try again later."
+                noteType = EErrorNote;
+                break;
+                }
+            }
+        }
+
+
+    if ( promptTextResourceId != KErrNotFound )
+        {
+        //error mapped to some internal error string ==> show it
+        // read variation flag values
+        TBool requireSignOnAnim = IntResourceValueL( RSC_CHAT_VARIATION_SHOW_SIGN_IN_ANIMATION );
+        if ( promptTextResourceId == R_QTN_CHAT_LOGING_CANCELED && requireSignOnAnim )
+            {
+            iControl->PrepareForFocusGainL();
+            iControl->SetFocus( ETrue );
+            HBufC* prompt = iCoeEnv->AllocReadResourceLC( promptTextResourceId );
+            //CEikLabel* aSignInLabel = static_cast<CEikLabel*>(iControl->ComponentControl(0));
+            //aSignInLabel->SetTextL(*prompt);
+            iControl->AssignSignInText( *prompt );
+            iControl->HideStatus();
+            iControl->StopAnimation();
+            iControl->DrawNow();
+            CleanupStack::PopAndDestroy( prompt ); //prompt
+            }
+        else
+            {
+            //new code/////
+            if ( iControl )
+                {
+                CCoeEnv::Static()->AppUi()->RemoveFromStack( iControl );
+                delete iControl;
+                iControl = NULL;
+                }
+            ////////////////
+            DoShowNoteL( promptTextResourceId, noteType );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowLogoutErrorNoteL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::ShowLogoutErrorNoteL( TInt aErrorCode )
+    {
+    //do first error code pre mapping
+    if ( aErrorCode == KErrCommsLineFail )
+        {
+        aErrorCode = KCnUiErrGPRSConnectionNotAvailable; //GPRS connection not available
+        }
+
+    //now map the error to note
+    TInt promptTextResourceId( KErrNotFound );
+    TCnUiConnUiNoteType noteType = EErrorNote;
+    switch ( aErrorCode )
+        {
+        case KErrNone:
+            {
+            //no error to show for KErrNone
+            return;
+            // no break needed because of return
+            }
+
+        //flow trough
+        case KErrDisconnected:
+        case KErrTimedOut:
+        case KErrCouldNotConnect:
+            {
+            promptTextResourceId = R_QTN_CHAT_ERROR_GEN_ERROR;
+            noteType = EErrorNote;
+            break;
+            }
+
+        //flow trough
+        case KPEngNwErrServiceUnavailable:   //CSP - 503
+        case KPEngNwErrMessageQueueIsFull:   //CSP - 507
+            {
+            promptTextResourceId = R_QTN_CHAT_ERROR_SERV_BUSY;
+            noteType = EErrorNote;
+            break;
+            }
+
+        default:
+            {
+            //no any specific note mapped to error code
+            //If error code is mapped to some system
+            //error text, show it. Else default to
+            //own default error note.
+            HBufC* systemErrorText = SystemErrorTextOrNullForCodeL( aErrorCode );
+            if ( systemErrorText )
+                {
+                CleanupStack::PushL( systemErrorText );
+                DoShowNoteL( *systemErrorText, EErrorNote );
+                CleanupStack::PopAndDestroy( systemErrorText ); //systemErrorText
+                return;
+                }
+            else
+                {
+                promptTextResourceId = R_QTN_CHAT_ERROR_GEN_ERROR;
+                noteType = EErrorNote;
+                }
+            break;
+            }
+        }
+
+    if ( promptTextResourceId != KErrNotFound )
+        {
+        //error mapped to some internal error string ==> show it
+        DoShowNoteL( promptTextResourceId, noteType );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ConfirmationQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::ConfirmationQueryL( TCnUiConnectionQueries aQueryId )
+    {
+    TInt resourceId( 0 );
+    switch ( aQueryId )
+        {
+        case ECnUiCloseConnectionToNetwork:
+            {
+            //res & type ok
+            resourceId = R_QTN_DYC_QUERY_EXIT_CONN_CLOSE;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+    HBufC* prompt = StringLoader::LoadLC( resourceId, iCoeEnv );
+    TBool selection = DoShowConfirmationQueryL( *prompt );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return selection;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ConfirmationQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::ConfirmationQueryL( TCnUiConnectionQueriesDynText aQueryId,
+                                         const TDesC& aInsertText )
+    {
+    TInt resourceId( 0 );
+    switch ( aQueryId )
+        {
+        case ECnUiDropPECLogin:
+            {
+            resourceId = R_QTN_CHAT_SETTING_CON_TO_CHAT;
+            break;
+            }
+
+        case ECnUiDropIMLogin:
+            {
+            resourceId = R_QTN_CHAT_SETTING_CON_TO_PEC;
+            break;
+            }
+
+        default:
+            {
+            CnUiPanicOrLeaveL( EIMPSConnUi_UnknownNoteID, KErrNotSupported );
+            break;
+            }
+        }
+
+
+    HBufC* prompt = StringLoader::LoadLC( resourceId, aInsertText, iCoeEnv );
+    TBool selection = DoShowConfirmationQueryL( *prompt );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    return selection;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::LoginQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::LoginQueryL( TDes& aUsername,
+                                  TDes& aPassword,
+                                  CIMPSSAPSettings& aSap,
+                                  TCnUiLoginDataQueryMode aMode )
+    {
+
+
+    //Check for compulsory settings
+    TInt compulsoryStatus = CCnUiConnOpener::CheckConnOpenCompulsorySettingsL( aSap );
+    if ( compulsoryStatus != KErrNone )
+        {
+        ShowLoginErrorNoteL( KCnUiErrorSapMissingCompulsoryFields );
+        return FALSE;
+        }
+    //
+
+    // Show WAP registration query, if variated so
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, RSC_CHAT_VARIATION_IMPSCU_SHOW_WAP_REGISTRATION_QUERY );
+
+    TBool showWapRegQuery  = ResourceUtils::ReadTInt32L( reader );
+    CleanupStack::PopAndDestroy(); // reader
+
+
+    if ( showWapRegQuery )
+        {
+        // Get pointer to WAP registration settings
+        CRepository* cenRep = CRepository::NewLC( KCRUidIMPSConnUI );
+
+        TBool  isWAPQueryShown( EFalse );
+        User::LeaveIfError( cenRep->Get( KFlagWapRegistrationDlgShown, isWAPQueryShown ) );
+
+        if ( !isWAPQueryShown )
+            {
+            isWAPQueryShown = ETrue;
+            User::LeaveIfError( cenRep->Set( KFlagWapRegistrationDlgShown, isWAPQueryShown ) );
+
+            if ( ShowWAPQueryL() == EAknSoftkeyOk )
+                {
+                if ( ShowTAndCDlgL() == EAknSoftkeyOk )
+                    {
+                    // Open browser with the specified URL
+                    HBufC16 *url = HBufC::NewLC( KMaxRegUrlLength );
+                    TPtr ptr( url->Des() );
+                    TInt urlLength;
+
+                    if ( cenRep->Get( KWAPRegistrationURL, ptr, urlLength ) == KErrOverflow )
+                        {
+                        //because there could be an overflow
+                        CleanupStack::PopAndDestroy( url );
+
+                        url = HBufC::NewLC( urlLength );
+                        ptr.Set( url->Des() );
+                        User::LeaveIfError( cenRep->Get( KWAPRegistrationURL, ptr, urlLength ) );
+                        }
+
+                    OpenWebBrowserL( *url );
+                    CleanupStack::PopAndDestroy( url );
+                    }
+                }
+            }
+
+        CleanupStack::PopAndDestroy( cenRep );
+        }
+
+
+
+    //check for branding
+    TInt showLoginQuery = KErrNone;
+
+    showLoginQuery = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_SHOW_UID_PW_QUERY ) ;
+
+    // if username or password is empty we show the query overriding the variation
+    if ( ( aUsername.Length() == 0 ) || ( aPassword.Length() == 0 ) )
+        {
+        showLoginQuery = ETrue;
+        }
+
+    if ( ! showLoginQuery )
+        {
+        // hide login query, assume as accepted
+        return ETrue;
+        }
+
+    // Show domain selection query, if variated so
+    TBool domainQuery = IntResourceValueL( RSC_CHAT_VARIATION_IMPSCU_DOMAIN_SELECTION );
+    if ( aUsername.Length() == 0 && domainQuery )
+        {
+        if ( DisplayDomainSelectionQueryL( aUsername, &aSap ) == 0 )
+            {
+            // User cancelled the query
+            return EFalse;
+            }
+        if ( aUsername.Length() > 0 )
+            {
+            // User selected a domain
+            aMode = ECnUiEditPrefilledUser;
+            }
+        }
+
+    TInt retVal( EAknSoftkeyCancel );
+
+    if ( showWapRegQuery )
+        {
+        //  For
+        CCnOUiUsernameAndPwdQuery* query;
+        query = CCnOUiUsernameAndPwdQuery::NewL( aUsername,
+                                                 aPassword,
+                                                 aMode,
+                                                 domainQuery,
+                                                 *this );
+
+        query->SetPredictiveTextInputPermitted( ETrue ); // T9
+
+        //executeLD returns CEikBidCancel if user cancels the query,
+        //else the return value maps to the button ID.
+        //do here conversion from button ID's to plain TBools...
+
+        query->PrepareLC( R_LOGIN_DATA_QUERY );
+
+        query->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_OPTIONS_CANCEL );
+        query->ButtonGroupContainer().DrawDeferred();
+
+        retVal = query->RunLD();
+        }
+    else
+        {
+        CCnUiUsernameAndPwdQuery* query;
+        query = CCnUiUsernameAndPwdQuery::NewL( aUsername,
+                                                aPassword,
+                                                aMode,
+                                                domainQuery,
+                                                *this );
+        query->SetPredictiveTextInputPermitted( ETrue ); // T9
+
+        //executeLD returns CEikBidCancel if user cancels the query,
+        //else the return value maps to the button ID.
+        //do here conversion from button ID's to plain TBools...
+        retVal = query->ExecuteLD( R_LOGIN_DATA_QUERY );
+        }
+    if ( retVal == EAknSoftkeyOk )
+        {
+        // Query accepted
+        return ETrue;
+        }
+    else if ( retVal == EAknSoftkeyExit && domainQuery )
+        {
+        // User cleared user id field, show domain selection query again
+        aUsername.Delete( 0, aUsername.Length() );
+        return LoginQueryL( aUsername, aPassword, aSap, aMode );
+        }
+
+
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowWAPQueryL
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiUiFacade::ShowWAPQueryL()
+    {
+    CAknMessageQueryDialog* msgQueryDlg = new( ELeave )CAknMessageQueryDialog( CAknMessageQueryDialog::ENoTone );
+    CleanupStack::PushL( msgQueryDlg );
+
+    msgQueryDlg->PrepareLC( R_MESSAGE_QUERY );
+
+    HBufC* resourceText = NULL;
+    resourceText = StringLoader::LoadLC( R_QTN_LSK_WAP_REG_ORANGE );
+    msgQueryDlg->ButtonGroupContainer().SetCommandL( 0, EAknSoftkeyOk, *resourceText );
+    CleanupStack::PopAndDestroy( resourceText );
+
+    resourceText = StringLoader::LoadLC( R_QTN_RSK_WAP_IGNORE_ORANGE );
+    msgQueryDlg->ButtonGroupContainer().SetCommandL( 2, EAknSoftkeyCancel, *resourceText );
+    CleanupStack::PopAndDestroy( resourceText );
+
+    resourceText = StringLoader::LoadL( R_QTN_NOTE_WAP_ORANGE );
+    msgQueryDlg->SetMessageText( *resourceText );
+
+    resourceText = StringLoader::LoadL( R_QTN_NOTE_TITLE_WAP_ORANGE );
+    msgQueryDlg->SetHeaderText( *resourceText );
+
+    CleanupStack::Pop( msgQueryDlg );
+
+    TInt command = msgQueryDlg->RunLD();
+    return command;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ShowTAndCDlgL
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiUiFacade::ShowTAndCDlgL()
+    {
+    CAknMessageQueryDialog* msgQueryDlg = new( ELeave )CAknMessageQueryDialog( CAknMessageQueryDialog::ENoTone );
+    CleanupStack::PushL( msgQueryDlg );
+
+    msgQueryDlg->PrepareLC( R_MESSAGE_QUERY );
+
+    HBufC* resourceText = NULL;
+    resourceText = StringLoader::LoadLC( R_QTN_IM_AGREE_LSK_REGISTER );
+    msgQueryDlg->ButtonGroupContainer().SetCommandL( 0, EAknSoftkeyOk, *resourceText );
+    CleanupStack::PopAndDestroy( resourceText );
+
+    resourceText = StringLoader::LoadLC( R_QTN_IM_REFUSE_RSK_REGISTER );
+    msgQueryDlg->ButtonGroupContainer().SetCommandL( 2, EAknSoftkeyCancel, *resourceText );
+    CleanupStack::PopAndDestroy( resourceText );
+
+    resourceText = StringLoader::LoadL( R_QTN_NOTE_TERMS_WAP_ORANGE );
+    msgQueryDlg->SetMessageText( *resourceText );
+
+    resourceText = StringLoader::LoadL( R_QTN_NOTE_TITLE_TERMS_WAP_ORANGE );
+    msgQueryDlg->SetHeaderText( *resourceText );
+
+    CleanupStack::Pop( msgQueryDlg );
+
+    TInt command = msgQueryDlg->RunLD();
+    return command;
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::OpenWebBrowserL
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::OpenWebBrowserL( const TDesC& aUrl )
+    {
+    if ( !iBrLauncher )
+        {
+        iBrLauncher = CBrowserLauncher::NewL();
+        }
+
+    //Asynchronous operation to launch the browser with aUrl
+    iBrLauncher->LaunchBrowserEmbeddedL( aUrl );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::MMCDrive
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::MMCDrive( TDes& aDrive ) const
+    {
+    TParsePtrC mmc( PathInfo::MemoryCardRootPath() );
+    aDrive.Zero();
+    aDrive.Append( mmc.Drive() );
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ConstructCompletePathAndCheck
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::ConstructCompletePathAndCheck( TDes& aResult,
+                                                    const TDesC& aModuleId,
+                                                    const TDesC& aAlternative,
+                                                    const TDesC& aFileName )
+    {
+    // Construct full path for wanted resource
+    // MMC drive letter must be here to make sure that TFindFile searches first
+    // MMC for the correct brand
+    MMCDrive( aResult );
+    aResult.Append( KRelativeBrandPath() );
+    aResult.Append( aModuleId );
+    aResult.Append( KDirSeparator );
+    aResult.Append( aAlternative );
+    aResult.Append( KDirSeparator );
+    aResult.Append( aFileName );
+
+    // Find the actual file
+    TFindFile fileFinder( CEikonEnv::Static()->FsSession() );
+    TInt err( fileFinder.FindByDir( aFileName, aResult ) );
+
+    // If file was found, then take the first appearance of it
+    // (order is correct aready)
+    if ( err == KErrNone )
+        {
+        aResult.Zero();
+        aResult.Append( fileFinder.File() );
+        }
+
+#ifdef _DEBUG
+    RDebug::Print( _L( "ConstructCompletePathAndCheck, TFindFile returned %d for %S" ), err, &aResult );
+#endif
+
+    // return was the file found or not
+    return err == KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::LoadServerIconsL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::LoadServerIconsL( MDesCArray& aServers )
+    {
+    TInt count( aServers.MdcaCount() );
+    __ASSERT_DEBUG( count > 0, User::Panic( KIMPSConnUi_PanicCat, KErrGeneral ) );
+    iIconArray = new( ELeave )CAknIconArray( count );
+
+    // load icons
+    TBool allEmpty( ETrue );
+    HBufC* pathBuf = HBufC::NewLC( KMaxFileName );
+    TPtr path( pathBuf->Des() );
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        if ( !ConstructCompletePathAndCheck( path, KModuleId,
+                                             aServers.MdcaPoint( i ), KBitmapFile ) )
+            {
+            // not found, use empty
+            AknIconUtils::CreateIconLC( bitmap, mask, AknIconUtils::AvkonIconFileName(),
+                                        EMbmAvkonQgn_prop_empty, EMbmAvkonQgn_prop_empty_mask );
+            CleanupStack::Pop( 2 ); // bitmap, mask
+            // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+            // CAknIconArray::AppendL takes ownership of the icon
+            CGulIcon* gulIcon = CGulIcon::NewL( bitmap, mask ); // CSI: 35 # See above
+            iIconArray->AppendL( gulIcon );
+            }
+        else
+            {
+            // load the icon that was found
+            AknIconUtils::CreateIconLC( bitmap, mask, path, 0, 1 );
+            CleanupStack::Pop( 2 ); // bitmap, mask
+            // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+            // CAknIconArray::AppendL takes ownership of the icon
+            CGulIcon* gulIcon = CGulIcon::NewL( bitmap, mask ); // CSI: 35 # See above
+            iIconArray->AppendL( gulIcon );
+            allEmpty = EFalse;
+            }
+        }
+    CleanupStack::PopAndDestroy( pathBuf );
+
+    if ( allEmpty )
+        {
+        // every icon is empty, delete whole array and show list without icons
+        delete iIconArray;
+        iIconArray = NULL;
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::OpenResourceFileLC()
+// !!!Notice!!!. Two variables in cleanupstack after call of this method.
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::OpenResourceFileLC( RResourceFile& aResourceFile )
+    {
+    TFileName resourceFileName;
+    iRFs.Close();
+    User::LeaveIfError( iRFs.Connect() );
+
+    TInt err = iSharedData->GetStringKey( ( TIMPSSharedKeys )KBrandingResourceKey, resourceFileName );
+    if ( err || !resourceFileName.Length() )
+        {
+        CnUiResourceFileName::NearestVariationForCurrentLanguage( iRFs, resourceFileName  );
+        }
+    aResourceFile.OpenL( iRFs, resourceFileName );
+    CleanupClosePushL( aResourceFile );
+    aResourceFile.ConfirmSignatureL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::IntResourceValueL()
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiUiFacade::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 )
+        {
+        RResourceFile resFile;
+        OpenResourceFileLC( resFile ); // Two items in cleanup stack.
+
+        aResourceId = aResourceId + RSC_CRRSS_CHAT_VARIATION_IMPSCU_START_ID;
+
+        // read the data to a buffer
+        TInt plainResourceId = 0x00000fff & aResourceId; // Remove offset from id
+        HBufC8* rawDataBuf = resFile.AllocReadLC( plainResourceId );
+
+        // it's now as ascii code: \x00 for 0, \x01 for 1, etc.
+        TUint value = ( *rawDataBuf )[ 0 ];
+
+        CleanupStack::PopAndDestroy( 2 ); // rawDataBuf, resFile
+
+        val = value;
+
+        }
+
+    return val;
+
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ServerToUseQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::ServerToUseQueryL( MDesCArray& aServers,
+                                        TInt aIndexToHighlight,
+                                        TInt& aSelectedIndex )
+    {
+    if ( aServers.MdcaCount() == 0 || aServers.MdcaCount() == 1 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    TRAPD( err, LoadServerIconsL( aServers ) );
+    if ( err != KErrNone )
+        {
+        // didn't manage to load bitmaps, try to show the list without them
+        delete iIconArray;
+        iIconArray = NULL;
+        }
+
+    TInt selection( -1 );
+    TInt retVal( -1 );
+    // Code scanner warning neglected to put variable on cleanup stack (Id: 35)
+    // PrepareLC pushes the dialog into cleanupstack
+    CAknListQueryDialog* listQuery = new ( ELeave ) CAknListQueryDialog( &selection ); // CSI: 35 # See above
+
+    if ( iIconArray )
+        {
+        // icon array exists, construct the query with icons
+        listQuery->PrepareLC( R_SERVER_TO_LOGIN_LISTQUERY_GRAPHIC );
+        listQuery->SetIconArrayL( iIconArray );
+        iIconArray = NULL; // listbox has the ownership of icon array
+
+        // construct formatted text array
+        TInt count( aServers.MdcaCount() );
+        CDesCArray* items = new( ELeave )CDesCArrayFlat( count );
+        CleanupStack::PushL( items );
+        for ( TInt i( 0 ); i < count; i++ )
+            {
+            TPtrC item( aServers.MdcaPoint( i ) );
+
+            // 5 is more than enough for formatted number in front of server list
+            HBufC* temp = HBufC::NewLC( item.Length() + KTab().Length() + 5 );
+            TPtr tempPtr( temp->Des() );
+            tempPtr.Num( i );
+            tempPtr.Append( KTab );
+            tempPtr.Append( item );
+
+            items->AppendL( tempPtr );
+            CleanupStack::PopAndDestroy( temp );
+            }
+
+        listQuery->SetItemTextArray( items );
+        listQuery->SetOwnershipType( ELbmOwnsItemArray );
+        CleanupStack::Pop( items ); // listbox model owns the item array
+        }
+    else
+        {
+        // icon array doesn't exist, construct the query without icons
+        listQuery->PrepareLC( R_SERVER_TO_LOGIN_LISTQUERY );
+
+        listQuery->SetItemTextArray( &aServers );
+        listQuery->SetOwnershipType( ELbmDoesNotOwnItemArray ); // listbox model doesn't own the item array
+        }
+
+    //check is the index to highlight on the range...
+    if ( ( aIndexToHighlight > 0 ) && ( aIndexToHighlight < aServers.MdcaCount() ) )
+        {
+        listQuery->ListBox()->SetCurrentItemIndex( aIndexToHighlight );
+        }
+
+    retVal = listQuery->RunLD(); //execute the selection
+
+
+    // if selection made and not cancelled
+    if ( ( selection >= 0 ) && ( retVal != 0 ) )
+        {
+        aSelectedIndex = selection;
+        return ETrue;
+        }
+
+
+    return EFalse;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::HandleIfError()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::HandleIfError( TInt aErr )
+    {
+    if ( aErr != KErrNone )
+        {
+        CEikonEnv::Static()->HandleError( aErr );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::SwitchResourceFileL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::SwitchResourceFileL( const TDesC& aNewResourceFile )
+    {
+    UseResourceFileL( aNewResourceFile );
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::DisplayDomainSelectionQueryL
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiUiFacade::DisplayDomainSelectionQueryL( TDes& aSelectedDomain,
+                                                  CIMPSSAPSettings* aSap /*= NULL*/ )
+    {
+    TInt selection( -1 );
+    TInt result( 0 );
+
+    CDesCArray* listTexts = NULL;
+
+    TResourceReader reader;
+    iCoeEnv->CreateResourceReaderLC( reader,
+                                     R_CHAT_VARIATION_IMPSCU_DOMAIN_SELECTION_LIST );
+
+    // Check if there are any predefined domains
+    // Check is needed because ReadDesC16ArrayResourceL
+    // panics if there aren't any items defined in resource array
+    if ( reader.ReadInt16() > 0 )
+        {
+        listTexts = iCoeEnv->ReadDesC16ArrayResourceL(
+                        R_CHAT_VARIATION_IMPSCU_DOMAIN_SELECTION_LIST );
+        }
+    else
+        {
+        listTexts = new ( ELeave ) CDesCArrayFlat( 1 ); // 1 for granularity
+        }
+
+    CleanupStack::PopAndDestroy(); // reader
+    CleanupStack::PushL( listTexts );
+    HBufC* lastItem = NULL;
+    lastItem = StringLoader::LoadLC( R_CHAT_LOGIN_SELECT_DOMAIN_OTHER );
+    listTexts->AppendL( lastItem->Des() );
+    CleanupStack::PopAndDestroy( ); // lastItem
+
+    CCnUiDomainSelectionQueryDialog* dlg =
+        CCnUiDomainSelectionQueryDialog::NewL( &selection, aSap );
+    dlg->PrepareLC( R_CHAT_VARIATION_IMPSCU_DOMAIN_SELECTION_QUERY );
+    dlg->SetItemTextArray( listTexts );
+    dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    result = dlg->RunLD();
+
+    // if selection made and it's not the last item,
+    // and query is not cancelled
+    if ( ( selection >= 0 ) && ( selection < ( listTexts->Count() - 1 ) )
+         && ( result != EAknSoftkeyCancel ) )
+        {
+        aSelectedDomain = listTexts->MdcaPoint( selection );
+        }
+    CleanupStack::PopAndDestroy( listTexts );
+
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::DisplayTermsOfUseAndQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::DisplayTermsOfUseAndQueryL()
+    {
+    TInt retVal = -1;
+
+    // Get branded resource file name
+    TFileName resourceFileName;
+    TInt err = iSharedData->GetStringKey(
+                   ( TIMPSSharedKeys )KBrandingResourceKey, resourceFileName );
+    if ( err != KErrNone || resourceFileName.Length() == 0 )
+        {
+        // No branded resources, return
+        return ETrue;
+        }
+
+    // Get current servers branding root
+    TChar backSlash( KBackSlash );
+    // Locate first backslash starting from the end of
+    // the path
+    TFileName touFileName;
+    TInt pos = resourceFileName.LocateReverse( backSlash );
+    if ( pos != KErrNotFound )
+        {
+        touFileName.Append( resourceFileName.Left( pos ) );
+        touFileName.Append( KDirSeparator );
+        touFileName.Append( KCUITOUFile );
+        BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), touFileName );
+        }
+    // Check that file exists
+    if ( !BaflUtils::FileExists( iCoeEnv->FsSession(), touFileName ) )
+        {
+        // No file for ToU, return
+        return ETrue;
+        }
+
+    CCnUiTermsOfUseDlg* dlg = CCnUiTermsOfUseDlg::NewLC( touFileName );
+    retVal = dlg->RunDialogLD( R_CNUI_TERMS_OF_USE_DIALOG );
+    CleanupStack::Pop( dlg );
+
+    if ( retVal == EAknSoftkeyCancel )
+        {
+        ShowNoteL( ECnUiConnCanceled );
+        return EFalse;
+        }
+    else
+        {
+        return ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::UseResourceFileL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::UseResourceFileL( const TDesC& aNewResourceFile )
+    {
+    RemoveUsedResourceFile();
+
+    if ( aNewResourceFile.Length() == 0 )
+        {
+        //empty resource file name ==> use the default resource
+        iResourceFileOffset = iCoeEnv->AddResourceFileL( *iDefaultRssFileName );
+        }
+    else
+        {
+        // Code scanner warning not using BaflUtils::NearestLanguageFile()
+        // when loading a resource file (Id: 53) ignored because
+        // the resource file given here is from branding and NearestLanguageFile
+        // is already used before it is given here
+        iResourceFileOffset = iCoeEnv->AddResourceFileL( aNewResourceFile ); // CSI: 53 # See above
+        }
+
+    iResourceFileAdded = ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::ResourceFileNameL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::ResourceFileNameL( TDes& aResourceFileName )
+    {
+    if ( aResourceFileName.MaxLength() < iDefaultRssFileName->Length() )
+        {
+        User::Leave( KErrOverflow );
+        }
+
+    aResourceFileName.Copy( *iDefaultRssFileName );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::RemoveUsedResourceFile()
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::RemoveUsedResourceFile()
+    {
+    if ( iCoeEnv && iResourceFileAdded )
+        {
+        iCoeEnv->DeleteResourceFile( iResourceFileOffset );
+        }
+
+    iResourceFileAdded = EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::SystemErrorTextOrNullForCodeL()
+// Private helper.
+// -----------------------------------------------------------------------------
+//
+HBufC* CCnUiUiFacade::SystemErrorTextOrNullForCodeL( TInt aErrorCode )
+    {
+    HBufC* systemErrorText = NULL;
+
+    TUint flags( 0 );
+    TInt id( 0 );
+
+    // Resolve the error
+    // Automatic context causes there to come the "default"
+    // context title for error note, like:
+    //"Internet: Could not resolve host address."
+    CTextResolver* textResolver = CTextResolver::NewLC();
+    TPtrC systemText( textResolver->ResolveErrorString( aErrorCode, id, flags,
+                                                        CTextResolver::ECtxAutomatic ) );
+    // textresolver seems to put OOM flag on in some cases when it does not find
+    // the error text
+    // if there is OOM flag on, but NO blank or unknown error flag, then
+    // we probably are running out of memory
+    if ( ( flags & EErrorResOOMFlag ) &&
+         !( flags & ETextResolverBlankErrorFlag ) &&
+         !( flags & ETextResolverUnknownErrorFlag ) )
+        {
+        User::Leave( KErrNoMemory );
+        }
+
+    if ( ( flags & ETextResolverBlankErrorFlag ) ||
+         ( flags & ETextResolverUnknownErrorFlag ) ||
+         ( systemText.Length() == 0 ) )
+        {
+        //Actual error is mapped to blank
+        //or it is a unknown error
+        systemErrorText = NULL;
+        }
+    else
+        {
+        //There should be some error text, use it
+        systemErrorText = systemText.AllocL();
+        }
+
+    CleanupStack::PopAndDestroy( textResolver ); //textResolver
+    return systemErrorText;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::DoShowNoteL()
+// Private helper.
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::DoShowNoteL( TInt aNoteTextResourceId, TCnUiConnUiNoteType aNoteType )
+    {
+    HBufC* prompt = iCoeEnv->AllocReadResourceLC( aNoteTextResourceId );
+    DoShowNoteL( *prompt, aNoteType );
+    CleanupStack::PopAndDestroy( prompt ); //prompt
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::DoShowNoteL()
+// Private helper.
+// -----------------------------------------------------------------------------
+//
+void CCnUiUiFacade::DoShowNoteL( const TDesC& aNotePrompt, TCnUiConnUiNoteType aNoteType )
+    {
+    if ( aNoteType == EConfirmedErrorNote )
+        {
+        CAknQueryDialog* query = CAknQueryDialog::NewL();
+        CleanupStack::PushL( query );
+        query->SetPromptL( aNotePrompt );
+        CleanupStack::Pop( query ); //query
+        query->ExecuteLD( R_CONFIRMED_ERROR_NOTE );
+        }
+    else if ( aNoteType == EConfirmedErrorNoteMSKSelectIcon )
+        {
+        CAknQueryDialog* query = CAknQueryDialog::NewL();
+        CleanupStack::PushL( query );
+        query->SetPromptL( aNotePrompt );
+        CleanupStack::Pop( query ); //query
+        query->ExecuteLD( R_CONFIRMED_ERROR_NOTE_MSK );
+        }
+    else
+        {
+        CAknResourceNoteDialog* note = NULL;
+        switch ( aNoteType )
+            {
+            case EInfoNote:
+                {
+                note = new ( ELeave ) CAknInformationNote( ETrue );
+                break;
+                }
+
+            case EConfirmationNote:
+                {
+                note = new ( ELeave ) CAknConfirmationNote( ETrue );
+                break;
+                }
+
+            //flow through
+            case EErrorNote:
+            default:
+                {
+                note = new ( ELeave ) CAknErrorNote( ETrue );
+                break;
+                }
+            }
+
+        note->ExecuteLD( aNotePrompt );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiUiFacade::DoShowConfirmationQueryL()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiUiFacade::DoShowConfirmationQueryL( const TDesC& aPromptText )
+    {
+    CAknQueryDialog* query = CAknQueryDialog::NewL();
+    CleanupStack::PushL( query );
+    query->SetPromptL( aPromptText );
+    CleanupStack::Pop( query ); //query
+    return query->ExecuteLD( R_GENERAL_QUERY );
+    }
+
+//  End of File