convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifierimpl.cpp
branchRCL_3
changeset 22 d38647835c2e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifierimpl.cpp	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,1347 @@
+/*
+* Copyright (c) 2008-2010 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:  Actual notifier implementation
+*
+*/
+
+
+#include <eikenv.h>
+#include <bautils.h>
+#include <eikclbd.h>
+#include <eikimage.h>
+#include <cchuinotif.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <cenrepnotifyhandler.h>
+#include <ctsydomainpskeys.h>
+#include <crcseprofileregistry.h>
+#include <sipprofile.h>
+#include <sipmanagedprofileregistry.h>
+#include <AknNotiferAppServerApplication.h>  // Application Key enable/disable
+
+#include "cchuilogger.h"
+#include "cchuicommon.hrh"
+#include "cchuinotifierimpl.h"
+#include "cchuipluginbrandinghandler.h"
+#include "cchuinotifconnectionhandler.h"
+#include "cchuicallstatelistener.h"
+
+const TUint32 KBearerSettingWlanOnly = 1;
+
+// ======== MEMBER FUNCTIONS ========
+
+CCCHUiNotifierImpl::CCCHUiNotifierImpl()
+    {
+    }
+
+CCCHUiNotifierImpl* CCCHUiNotifierImpl::NewL()
+    {
+    CCCHUiNotifierImpl* self = new (ELeave) CCCHUiNotifierImpl();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+void CCCHUiNotifierImpl::ConstructL()
+    {
+    CCCHUiNotifierBase::ConstructL();
+    iCallStateListener = CCchUiCallStateListener::NewL( *this );
+    iSipProfileRegistry = CSIPManagedProfileRegistry::NewL( *this );
+    }
+
+CCCHUiNotifierImpl::~CCCHUiNotifierImpl()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::~CCCHUiNotifierImpl - IN" );	
+    
+    if ( iAppKeyBlocked )
+        {
+        // Remove application key blocking
+        (void) ((CAknNotifierAppServerAppUi*)
+            iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+        iAppKeyBlocked = EFalse;
+        }
+    
+    CCCHUiNotifierBase::Cancel();
+    iListQueryDialog = NULL;
+    delete iBrandingHandler;
+    delete iCallStateListener;
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::~CCCHUiNotifierImpl - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// RunL
+// From CActive.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::RunL(  )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::RunL - IN" );
+
+    switch( iDialogMode )
+        {
+        // Only ECchUiDialogTypeNoConnectionAvailable is launched via RunL
+        // currently.
+        case MCchUiObserver::ECchUiDialogTypeNoConnectionAvailable:
+            {
+            CCHUIDEBUG( "CCCHUiNotifierImpl::RunL - ECchUiDialogTypeNoConnectionAvailable" );               
+            ShowNoConnectionsQueryL( iReplySlot, iMessage, iServiceId, EFalse );
+            }
+            break;    
+
+        default:
+            {
+            CCHUIDEBUG( "CCCHUiNotifierImpl::RunL - Does nothing" );
+            }
+            break;    
+        }    
+        
+    CCHUIDEBUG( "   CCCHUiNotifierImpl::RunL - OUT" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Cancelling method.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::Cancel()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::Cancel - IN" );
+    if ( iListQueryDialog )
+        {
+        delete iListQueryDialog;
+        iListQueryDialog = NULL;
+        CCCHUiNotifierBase::Cancel();
+        }
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::Cancel - OUT" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Shows username & password query.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowUsernamePasswordQueryL(
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage, 
+    TUint aServiceId,
+    const TDesC& aUserName )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowUsernamePasswordQueryL - IN" );
+    
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+    
+    HBufC* userName = HBufC::NewLC( KUserNameLength );
+    HBufC* passWord = HBufC::NewLC( KPasswordLength );
+
+    // Set current username
+    userName->Des().Copy( aUserName );
+    
+    TPtr ptrUserName( userName->Des() );
+    TPtr ptrPassWord( passWord->Des() );
+
+    CCHUIDEBUG( "ShowUsernamePasswordQueryL - create query");	
+    
+    CAknMultiLineDataQueryDialog* dlg = CAknMultiLineDataQueryDialog::NewL( 
+        ptrUserName, ptrPassWord );
+     
+    // Block application key while showing query
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); 
+    iAppKeyBlocked = ETrue;
+    
+    if ( dlg->ExecuteLD( R_CCHUINOTIF_USERNAME_PWD_DIALOG ) )
+        {	
+        iResultParams.iDialogMode = 
+            MCchUiObserver::ECchUiDialogTypeAuthenticationFailed;
+        iResultParams.iServiceId = aServiceId;
+        iResultParams.iUsername = *userName;
+        iResultParams.iPwd = *passWord;
+        iMessage.WriteL( iReplySlot, 
+                         TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+        CompleteMessage(KErrNone);                              
+        }
+    else
+        {
+        CCHUIDEBUG( "ShowUsernamePasswordQueryL - cancelled" );	
+        CompleteMessage( KErrCancel );
+        }
+    
+    // Remove application key blocking
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+    iAppKeyBlocked = EFalse;
+    
+    CleanupStack::PopAndDestroy( passWord );
+    CleanupStack::PopAndDestroy( userName );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowUsernamePasswordQueryL - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// Shows no connections query.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowNoConnectionsQueryL(
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage, 
+    TUint aServiceId,
+    TBool aNoConnectionsDefined )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowNoConnectionsQueryL - IN" );	
+    
+    iServiceId = aServiceId;
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+
+    CDesCArray* arrayforDialog = new (ELeave) CDesCArrayFlat( 3 );
+    CleanupStack::PushL( arrayforDialog );  
+    
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - form content" );	
+
+    RArray<TCchUiOperationCommand> commandArray;
+    CleanupClosePushL( commandArray );
+
+    TInt result = KErrNotFound;
+    MCchUiObserver::TCchUiDialogType currentType = 
+        MCchUiObserver::ECchUiDialogTypeNotSet;
+    HBufC* string = NULL;
+    if ( aNoConnectionsDefined )
+        {
+        string = StringLoader::LoadLC( 
+            R_QTN_CCHUINOTIF_NO_CONNECTIONS_DEFINED_HEADING );
+        FillNoConnectionsDefinedListboxL( *arrayforDialog, commandArray );                        
+        currentType = MCchUiObserver::ECchUiDialogTypeNoConnectionDefined;            
+        }
+    else
+        {
+        string = StringLoader::LoadLC( 
+            R_QTN_CCHUINOTIF_NO_CONNECTIONS_HEADING );
+        FillNoConnectionsAvailableListboxL( 
+                *arrayforDialog, commandArray, aServiceId );
+        currentType = MCchUiObserver::ECchUiDialogTypeNoConnectionAvailable;
+        }
+
+    iListQueryDialog = new (ELeave) CAknListQueryDialog( &result );
+    iListQueryDialog->PrepareLC( R_CCHUINOTIF_NO_CONNECTIONS_AVAILABLE );
+
+    iListQueryDialog->MessageBox()->SetMessageTextL( string );
+
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - form heading" );	
+    
+    // Set heading ie. service name
+    HBufC* serviceName = HBufC::NewLC( KServiceNameLength );
+    TPtr serviceNamePtr( serviceName->Des() );
+    GetServiceNameL( aServiceId, serviceNamePtr );    
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - set heading" );  
+    iListQueryDialog->QueryHeading()->SetTextL( serviceNamePtr );
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - heading set ok" );   
+    CleanupStack::PopAndDestroy(); // serviceName
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - proceed to list items" );    
+      
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - set item array" );   
+    iListQueryDialog->SetItemTextArray( arrayforDialog );
+    iListQueryDialog->SetOwnershipType( ELbmDoesNotOwnItemArray );
+      
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - retrieve branded icon" );    
+    CFbsBitmap* myBitmap = NULL;
+    CFbsBitmap* myMask = NULL;
+    TRAPD( err, BrandingHandlerL().RetrieveServiceIconL( 
+        aServiceId, myBitmap, myMask ) );
+    CCHUIDEBUG2( "ShowNoConnectionsQueryL - brand err: %d", err );  
+      
+    if ( !err && iListQueryDialog->QueryHeading() )
+        {
+        CleanupStack::PushL( myBitmap );
+        CleanupStack::PushL( myMask );
+        CEikImage* image = new (ELeave) CEikImage();
+        image->SetPicture( myBitmap, myMask );     
+        CleanupStack::Pop( myMask );
+        CleanupStack::Pop( myBitmap );     
+        CleanupStack::PushL( image );    
+        iListQueryDialog->QueryHeading()->SetHeaderImageL( image );
+        iListQueryDialog->QueryHeading()->ActivateL();
+        CleanupStack::PopAndDestroy( image );
+        }
+    else if ( !err )
+        {
+        delete myMask;
+        delete myBitmap;
+          }
+    else
+        {
+        // Error occurred in RetrieveServiceIconL. Nothing to do.
+        }
+         
+    // Block application key while showing query
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); 
+    iAppKeyBlocked = ETrue;
+    
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - run dialog" );   
+    iListQueryDialog->RunLD();
+    CCHUIDEBUG( "ShowNoConnectionsQueryL - run dialog done" );
+
+    // write result, result now holds the item number
+    if ( KErrNotFound != result )
+        {
+        iResultParams.iDialogMode = currentType;
+        iResultParams.iServiceId = aServiceId;
+        iResultParams.iOperationCommand = commandArray[ result ];        
+        TInt error = KErrNone;  
+        if ( ECchUiCommandCopyGprs == commandArray[ result ] )
+            {
+            error = ShowGprsSelectionL( aServiceId );
+            }
+        if ( !error )
+            {
+            CCHUIDEBUG( "ShowNoConnectionsQueryL - write and complete" );   
+            iMessage.WriteL( iReplySlot, 
+                TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+            CompleteMessage( KErrNone );  
+            }
+        else
+            {
+            CCHUIDEBUG( "ShowNoConnectionsQueryL - complete with cancel" ); 
+            CompleteMessage( error );
+            }
+        }
+    else
+        {
+        CCHUIDEBUG( "ShowNoConnectionsQueryL - complete with cancel" ); 
+        CompleteMessage( KErrCancel );
+        }
+    
+    // Remove application key blocking
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+    iAppKeyBlocked = EFalse;
+    
+    CleanupStack::PopAndDestroy( string );
+    CleanupStack::PopAndDestroy( &commandArray );
+    CleanupStack::PopAndDestroy( arrayforDialog );    
+      
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowNoConnectionsQueryL - OUT" );   
+    }
+
+// ---------------------------------------------------------------------------
+// Shows change connection query.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowChangeConnectionQueryL(
+    TInt aReplySlot,
+    const RMessagePtr2& aMessage,
+    TUint aServiceId, 
+    TInt aIapId )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowChangeConnectionQueryL - IN" );   
+    
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+
+    CDesCArray* arrayforDialog = new (ELeave) CDesCArrayFlat( 3 );
+    CleanupStack::PushL( arrayforDialog );
+    
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - form content" ); 
+
+    RArray<TCchUiOperationCommand> commandArray;
+    CleanupClosePushL( commandArray );
+
+    TInt result = KErrNotFound;
+    MCchUiObserver::TCchUiDialogType type = 
+        MCchUiObserver::ECchUiDialogTypeChangeConnection;
+    HBufC* string = NULL;
+       
+    RBuf iapName;
+    CleanupClosePushL( iapName );
+    
+    // If we have current connection, show it in query heading
+    if ( aIapId )
+        {
+        CurrentConnectionNameL( 
+            aServiceId, 
+            aIapId,
+            iapName );
+        
+        string = StringLoader::LoadLC( 
+            R_QTN_CCHUINOTIF_CHANGE_CURRENT_CONNECTION_HEADING, iapName ); 
+        
+        FillChangeCurrentConnectionListboxL( *arrayforDialog, commandArray );
+        }
+    else // otherwise show in heading that we have no current connection
+        {
+        string = StringLoader::LoadLC( 
+            R_QTN_CCHUINOTIF_CHANGE_CONNECTION_HEADING );
+        
+        FillChangeConnectionListboxL( *arrayforDialog, commandArray );
+        }
+    
+    iListQueryDialog = new (ELeave) CAknListQueryDialog( &result );
+    iListQueryDialog->PrepareLC( R_CCHUINOTIF_CHANGE_CONNECTION_QUERY );
+
+    iListQueryDialog->MessageBox()->SetMessageTextL( string );
+    
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - form heading" ); 
+    // Set heading ie. service name
+    HBufC* serviceName = HBufC::NewLC( KServiceNameLength );
+    TPtr serviceNamePtr( serviceName->Des() );
+    GetServiceNameL( aServiceId, serviceNamePtr );    
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - set heading" );  
+    iListQueryDialog->QueryHeading()->SetTextL( serviceNamePtr );
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - heading set ok" );   
+    CleanupStack::PopAndDestroy(); // serviceName
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - proceed to list items" );    
+    
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - set item array" );   
+    iListQueryDialog->SetItemTextArray( arrayforDialog );
+    iListQueryDialog->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - retrieve branded icon" );    
+
+    CFbsBitmap* myBitmap = NULL;
+    CFbsBitmap* myMask = NULL;
+    TRAPD( err, BrandingHandlerL().RetrieveServiceIconL( 
+        aServiceId, myBitmap, myMask ) );
+
+    CCHUIDEBUG2( "ShowChangeConnectionQueryL - brand err: %d", err );
+    
+    if ( !err && iListQueryDialog->QueryHeading() )
+        {
+        CleanupStack::PushL( myBitmap );
+        CleanupStack::PushL( myMask );
+        CEikImage* image = new (ELeave) CEikImage();
+        image->SetPicture( myBitmap, myMask );      
+        CleanupStack::Pop( myMask );
+        CleanupStack::Pop( myBitmap );    
+        CleanupStack::PushL( image );               
+        iListQueryDialog->QueryHeading()->SetHeaderImageL( image );
+        iListQueryDialog->QueryHeading()->ActivateL();
+        CleanupStack::PopAndDestroy( image );
+        }
+    else if ( !err )
+        {
+        delete myMask;
+        delete myBitmap;
+        }
+    else
+        {
+        // Error occurred in RetrieveServiceIconL. Nothing to do.
+        }
+   
+    // Block application key while showing query
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); 
+    iAppKeyBlocked = ETrue;
+    
+    CCHUIDEBUG( "ShowChangeConnectionQueryL - run dialog" );
+    
+    // List query dialog is deleted via RunLD except if there is
+    // incoming call at the same time the dialog is shown on screen.
+    // In case of incoming call CallStateChanged() method handles
+    // the deletion
+    iListQueryDialog->RunLD();
+    // coverity[check_after_deref]
+    if( iListQueryDialog )
+        {
+        // write result, result now holds the item number
+        if ( KErrNotFound != result )
+            {
+            iResultParams.iDialogMode = type;
+            iResultParams.iServiceId = aServiceId;
+            iResultParams.iOperationCommand = commandArray[ result ];    
+            TInt error = KErrNone;
+            if ( ECchUiCommandCopyGprs == commandArray[ result ] )
+                {
+                error = ShowGprsSelectionL( aServiceId );
+                }
+            if ( !error )
+                {
+                CCHUIDEBUG( "ShowChangeConnectionQueryL - write and complete" );  
+                iMessage.WriteL( iReplySlot, 
+                    TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+                CompleteMessage( KErrNone );    
+                }
+            else
+                {
+                CCHUIDEBUG( "ShowChangeConnectionQueryL - complete with cancel" ); 
+                CompleteMessage( error );
+                }
+            }
+        else
+            {
+            CCHUIDEBUG( "ShowChangeConnectionQueryL - complete with cancel" ); 
+            CompleteMessage( KErrCancel );
+            }
+        
+        iListQueryDialog = NULL;
+        }
+    
+    // Remove application key blocking
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+    iAppKeyBlocked = EFalse;
+    
+    CleanupStack::PopAndDestroy( string );    
+    CleanupStack::PopAndDestroy( &iapName );   
+    CleanupStack::PopAndDestroy( &commandArray );
+    CleanupStack::PopAndDestroy( arrayforDialog );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowChangeConnectionQueryL - OUT" );   
+    }
+	
+// ---------------------------------------------------------------------------
+// Shows defective settings error note.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowDefectiveSettingsL( 
+    TInt aReplySlot, 
+	const RMessagePtr2& aMessage, 
+	TUint aServiceId )
+	{ 
+	CCHUIDEBUG( "CCCHUiNotifierImpl::ShowDefectiveSettingsL - IN" );
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+    
+    // Get service name
+    HBufC* serviceName = HBufC::NewLC( KServiceNameLength );
+    TPtr serviceNamePtr( serviceName->Des() );
+    GetServiceNameL( aServiceId, serviceNamePtr ); 
+    
+    // Show info note about defective settings
+    HBufC* defectiveText = StringLoader::LoadLC( 
+        R_QTN_SERVTAB_CONN_ESTABLSH_FAILED_PERMANENTLY_NOTE_TEXT, serviceNamePtr );
+    CAknInformationNote* note = 
+        new( ELeave ) CAknInformationNote( ETrue );
+    note->SetTimeout(CAknNoteDialog::ELongTimeout);
+    note->ExecuteLD( *defectiveText );   
+    CleanupStack::PopAndDestroy( defectiveText );     
+    CleanupStack::PopAndDestroy( serviceName );
+    
+    iResultParams.iDialogMode = 
+        MCchUiObserver::ECchUiDialogTypeDefectiveSettings;
+    iResultParams.iServiceId = aServiceId;
+    iMessage.WriteL( iReplySlot, 
+                     TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+    CompleteMessage(KErrNone);                              
+
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowDefectiveSettingsL - OUT" );	
+	}    	
+	
+// ---------------------------------------------------------------------------
+// Shows error in connection error note.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowErrorInConnectionNoteL( 
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage, 
+    TUint aServiceId )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowErrorInConnectionL - IN" ); 
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+    
+    // Show info note about error in connection 
+    //(access point not suitable for internet calls)
+    HBufC* noteText = StringLoader::LoadLC( 
+        R_QTN_VOIP_ERROR_IN_CONNECTION_NOTE_TEXT );
+    CAknInformationNote* note = 
+        new( ELeave ) CAknInformationNote( ETrue );
+    note->SetTimeout(CAknNoteDialog::ELongTimeout);
+    note->ExecuteLD( *noteText );   
+    CleanupStack::PopAndDestroy( noteText );
+    
+    iResultParams.iDialogMode = 
+        MCchUiObserver::ECchUiDialogTypeErrorInConnection;
+    iResultParams.iServiceId = aServiceId;
+    iMessage.WriteL( iReplySlot, 
+                     TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+    CompleteMessage(KErrNone);                              
+
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowErrorInConnectionL - OUT" ); 
+    }  
+
+// ---------------------------------------------------------------------------
+// Shows invalid username/password note.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowInvalidUsernamePasswordNoteL( 
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage, 
+    TUint aServiceId )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowInvalidUsernamePasswordNoteL - IN" );
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+        
+    // Show info note about invalid username password
+    HBufC* textForNote = StringLoader::LoadLC( 
+        R_QTN_VOIP_WRONG_SIP_AUTH_NOTE_TEXT );
+    CAknInformationNote* note = 
+        new( ELeave ) CAknInformationNote( ETrue );
+    note->SetTimeout(CAknNoteDialog::ELongTimeout);
+    note->ExecuteLD( *textForNote );   
+    CleanupStack::PopAndDestroy( textForNote );
+        
+    iResultParams.iDialogMode = 
+        MCchUiObserver::ECchUiDialogTypeUsernamePasswordFailed;
+    iResultParams.iServiceId = aServiceId;
+    iMessage.WriteL( iReplySlot, 
+                     TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+    CompleteMessage(KErrNone);                              
+
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::ShowInvalidUsernamePasswordNoteL - OUT" );
+    } 
+
+// ---------------------------------------------------------------------------
+// Shows confirmation note to change connection.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowConfirmChangeConnectionL( 
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage,
+    TUint aServiceId,
+    TInt aIapId )
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowConfirmChangeConnectionL - IN" ); 
+    
+    CCHUIDEBUG2( 
+        "ShowConfirmChangeConnectionL - aServiceId: %d", aServiceId );
+    CCHUIDEBUG2( 
+        "ShowConfirmChangeConnectionL - aIapId: %d", aIapId );
+
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+        
+    // Show confirmation note to change connection
+    RBuf iapName;
+    CleanupClosePushL( iapName );
+        
+    CurrentConnectionNameL( 
+        aServiceId, 
+        aIapId,
+        iapName );
+    
+    HBufC* textForQuery = NULL;
+    CAknQueryDialog* query = 
+               new( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone );
+    
+    CleanupStack::PushL( query );
+    
+    TBool askToRemoveOldConnection( EFalse );
+     
+    // Check if current connection is used by any other service
+    if ( aIapId && !ConnectionUsedByOthersL( aServiceId, aIapId ) )
+        {
+        // connection not used by others -> ask to remove old connection
+        askToRemoveOldConnection = ETrue;
+        }
+    
+    if ( askToRemoveOldConnection )
+        {
+        CCHUIDEBUG( 
+            "ShowConfirmChangeConnectionL - ask to remove connection" );
+        
+        query->PrepareLC( 
+            R_CCHUINOTIF_REMOVE_AND_CHANGE_CONNECTION_CONFIRMATION_QUERY );
+        
+        textForQuery = StringLoader::LoadLC( 
+            R_QTN_SERVTAB_AP_VOIP_NOT_SUPPORTED_RECONNECT_QUERY_TEXT, 
+            iapName );
+        }
+    else
+        {
+        CCHUIDEBUG( 
+            "ShowConfirmChangeConnectionL - ask to change connection" );
+        
+        query->PrepareLC( R_CCHUINOTIF_CHANGE_CONNECTION_CONFIRMATION_QUERY );
+        
+        textForQuery = StringLoader::LoadLC( 
+            R_QTN_SERVTAB_AP_VOIP_NOT_SUPPORTED_QUERY_TEXT, iapName );  
+        }
+    
+    CCHUIDEBUG( "ShowConfirmChangeConnectionL - set prompt" );
+    
+    query->SetPromptL( *textForQuery );    
+    CleanupStack::PopAndDestroy( textForQuery );
+    CleanupStack::Pop( query );
+       
+    // Block application key while showing query
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); 
+    iAppKeyBlocked = ETrue;
+    
+    // Run query
+    if( query->RunLD() )
+        {
+        iResultParams.iDialogMode = 
+            MCchUiObserver::ECchUiDialogTypeConfirmChangeConnection;
+        iResultParams.iServiceId = aServiceId;
+       
+        if ( askToRemoveOldConnection )
+            {
+            CCHUIDEBUG( 
+                "ShowConfirmChangeConnectionL - set remove old connection");
+            
+            iResultParams.iRemoveOldConnection = ETrue;
+            iResultParams.iCurrentConnectionIapId = aIapId;
+            }     
+        else
+            {
+            iResultParams.iRemoveOldConnection = EFalse;
+            }
+            
+        iMessage.WriteL( iReplySlot, 
+                         TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+        
+        CCHUIDEBUG( "ShowConfirmChangeConnectionL - complete message" ); 
+        
+        CompleteMessage( KErrNone );                  
+        }
+    else
+        {
+        CCHUIDEBUG( "ShowConfirmChangeConnectionL - canceled" );
+        
+        CompleteMessage( KErrCancel );
+        }
+    
+    // Remove application key blocking
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+    iAppKeyBlocked = EFalse;
+    
+    CleanupStack::PopAndDestroy( &iapName );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowConfirmChangeConnectionL - OUT" );
+    } 
+
+// ---------------------------------------------------------------------------
+// Shows gprs iap selection.
+// ---------------------------------------------------------------------------
+//
+TInt CCCHUiNotifierImpl::ShowGprsSelectionL( TUint aServiceId )
+	{ 
+	CCHUIDEBUG( "CCCHUiNotifierImpl::ShowGprsSelectionL - IN" );	
+	
+	TInt error = KErrNone;
+    RArray<TUint32> iapIds;
+    CleanupClosePushL( iapIds );
+
+    CDesCArray* arrayforDialog = new (ELeave) CDesCArrayFlat( 3 );
+    CleanupStack::PushL( arrayforDialog );            
+    CCHUIDEBUG( "ShowGprsSelectionL - form content" );	
+
+    TInt result = KErrNotFound;
+    HBufC* string = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_SELECT_GPRS_ACCESS_POINT_HEADING );
+
+    CAknListQueryDialog* dialog = new (ELeave) CAknListQueryDialog( &result );
+    dialog->PrepareLC( R_CCHUINOTIF_SELECT_GPRS_DIALOG );
+
+    CCHUIDEBUG( "ShowGprsSelectionL - form heading" );	
+	dialog->QueryHeading()->SetTextL( *string );
+	    
+    CCHUIDEBUG( "ShowGprsSelectionL - set item array" );	
+    
+    TUint sourceSnap = KErrNone;
+    // Fill array here
+    sourceSnap = InternetGprsApsMissingFromServiceSnapL(
+        *arrayforDialog, iapIds );
+    
+    CCHUIDEBUG( "ShowGprsSelectionL - set item array" );	
+    dialog->SetItemTextArray( arrayforDialog );
+    dialog->SetOwnershipType( ELbmDoesNotOwnItemArray );
+      
+    // Block application key while showing query
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(ETrue); 
+    iAppKeyBlocked = ETrue;
+    
+    CCHUIDEBUG( "ShowGprsSelectionL - run dialog" );
+    
+    dialog->RunLD();
+
+    // write result, result now holds the item number
+    if ( KErrNotFound != result )
+        {
+        iResultParams.iServiceId = aServiceId;
+        iResultParams.iGprsSourceSnap = sourceSnap;
+        iResultParams.iGprsIapId = iapIds[ result ];
+        }
+    else
+        {
+        error = KErrCancel;
+        }
+    
+    // Remove application key blocking
+    (void) ((CAknNotifierAppServerAppUi*)
+        iEikEnv->EikAppUi())->SuppressAppSwitching(EFalse);    
+    iAppKeyBlocked = EFalse;
+
+    CleanupStack::PopAndDestroy( string );
+    CleanupStack::PopAndDestroy( arrayforDialog );     
+    CleanupStack::PopAndDestroy( &iapIds );
+
+    CCHUIDEBUG2( "CCCHUiNotifierImpl::ShowGprsSelectionL -return %d", error );
+    return error;
+	}   	
+
+// ---------------------------------------------------------------------------
+// Returns handle to branding handler.
+// ---------------------------------------------------------------------------
+//
+CCchUiPluginBrandingHandler& CCCHUiNotifierImpl::BrandingHandlerL()
+    {
+    if ( !iBrandingHandler )
+        {
+        iBrandingHandler = 
+            CCchUiPluginBrandingHandler::NewL( *iSettings );    
+        }
+    return *iBrandingHandler;
+    }
+
+// ---------------------------------------------------------------------------
+// Fills list items and commands for no connections available dialog
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::FillNoConnectionsAvailableListboxL( 
+	CDesCArray& aListItems, 
+	RArray<TCchUiOperationCommand>& aCommandArray,
+	TUint aServiceId )
+	{
+	CCHUIDEBUG( 
+	    "CCCHUiNotifierImpl::FillNoConnectionsAvailableListboxL - IN" );	
+	
+	HBufC* connectWhenAv = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_CONNECT_WHEN_AV_TEXT );
+	HBufC* searchWlan = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_SEARCH_WLAN_NO_COVERAGE_TEXT );	
+	HBufC* useGprs = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_USE_GPRS_NO_COVERAGE_TEXT );	
+	    
+	// Item is available only for SIP protocol services.
+	// Check if service supports SIP/VoIP.
+	TBool sipVoip( EFalse );
+	TRAPD( err, sipVoip = IsSIPVoIPL( aServiceId ) );
+	
+	if ( !err && sipVoip && IsVoIPOverWCDMAAllowedL() )
+	    {
+	    aListItems.AppendL( *connectWhenAv );
+	    aCommandArray.AppendL( ECchUiCommandConnectWhenAvailable );
+	    }
+    
+    aListItems.AppendL( *searchWlan );
+    aCommandArray.AppendL( ECchUiCommandSearchWlan );
+    
+    if ( !IsPhoneOfflineL() && IsGprsIapsAvailableL() 
+            && IsVoIPOverWCDMAAllowedL() )
+        {
+        aListItems.AppendL( *useGprs );	
+        aCommandArray.AppendL( ECchUiCommandCopyGprs );    
+        }
+
+    CleanupStack::PopAndDestroy( useGprs );	
+    CleanupStack::PopAndDestroy( searchWlan );	
+    CleanupStack::PopAndDestroy( connectWhenAv );
+    
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::FillNoConnectionsAvailableListboxL - OUT" ); 
+	}
+
+// ---------------------------------------------------------------------------
+// Fills list items and commands for no connections defined dialog.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::FillNoConnectionsDefinedListboxL( 
+	CDesCArray& aListItems, RArray<TCchUiOperationCommand>& aCommandArray )
+	{
+	CCHUIDEBUG( 
+	    "CCCHUiNotifierImpl::FillNoConnectionsDefinedListboxL - IN" );	
+
+    CleanupClosePushL( aCommandArray );
+	
+	HBufC* searchWlan = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_SEARCH_WLAN_NOT_DEF_TEXT );
+	
+	HBufC* useGprs = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_USE_GPRS_NOT_DEF_TEXT );	
+	
+    aListItems.AppendL( *searchWlan );
+    aCommandArray.AppendL( ECchUiCommandSearchWlan );
+
+    if ( !IsPhoneOfflineL() && IsGprsIapsAvailableL() 
+            && IsVoIPOverWCDMAAllowedL() )
+        {
+        aListItems.AppendL( *useGprs );	
+        aCommandArray.AppendL( ECchUiCommandCopyGprs );    
+        }
+
+    CleanupStack::PopAndDestroy( useGprs );	
+    CleanupStack::PopAndDestroy( searchWlan );	
+    CleanupStack::Pop( &aCommandArray );
+    
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::FillNoConnectionsDefinedListboxL - OUT" );  	    
+	}
+	
+// ---------------------------------------------------------------------------
+// Fills list items and commands for no connections defined dialog
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::FillNoConnectionsFoundListboxL( 
+	CDesCArray& aListItems, RArray<TCchUiOperationCommand>& aCommandArray )
+	{
+	CCHUIDEBUG( "CCCHUiNotifierImpl::FillNoConnectionsFoundListboxL - IN" );	
+	
+	CleanupClosePushL( aCommandArray );
+
+	HBufC* searchWlan = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_SEARCH_WLAN_NOT_FOUND_TEXT );	
+	
+	HBufC* useGprs = StringLoader::LoadLC( 
+		R_QTN_CCHUINOTIF_USE_GPRS_NOT_FOUND_TEXT );	
+	
+    aListItems.AppendL( *searchWlan );
+    aCommandArray.AppendL( ECchUiCommandSearchWlan );
+
+    if ( !IsPhoneOfflineL() && IsGprsIapsAvailableL() 
+            && IsVoIPOverWCDMAAllowedL() )
+        {
+        aListItems.AppendL( *useGprs );	
+        aCommandArray.AppendL( ECchUiCommandCopyGprs );    
+        }
+
+    CleanupStack::PopAndDestroy( useGprs );	
+    CleanupStack::PopAndDestroy( searchWlan );	
+    CleanupStack::Pop( &aCommandArray );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::FillNoConnectionsFoundListboxL - OUT" );  
+	}	
+
+// ---------------------------------------------------------------------------
+// Fills list items and commands for change current connection dialog
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::FillChangeCurrentConnectionListboxL( 
+    CDesCArray& aListItems, RArray<TCchUiOperationCommand>& aCommandArray )
+    {
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::FillChangeCurrentConnectionListboxL - IN" ); 
+    
+    HBufC* searchWlan = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_SEARCH_WLAN_CHANGE_CURRENT_CONNECTION_TEXT );  
+        
+    HBufC* useGprs = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_USE_GPRS_CHANGE_CURRENT_CONNECTION_TEXT ); 
+        
+    aListItems.AppendL( *searchWlan );
+    aCommandArray.AppendL( ECchUiCommandSearchWlan );
+    
+    if ( !IsPhoneOfflineL() && IsGprsIapsAvailableL() &&
+        IsVoIPOverWCDMAAllowedL() &&
+        IsServiceSnapMissingInternetGprsApsL() )
+        {
+        aListItems.AppendL( *useGprs ); 
+        aCommandArray.AppendL( ECchUiCommandCopyGprs ); 
+        }
+
+    CleanupStack::PopAndDestroy( useGprs ); 
+    CleanupStack::PopAndDestroy( searchWlan );
+    
+    CCHUIDEBUG( 
+            "CCCHUiNotifierImpl::FillChangeCurrentConnectionListboxL - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHUiNotifierImpl::IsServiceSnapMissingInternetGprsApsL
+// ---------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierImpl::IsServiceSnapMissingInternetGprsApsL() const
+    {
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::IsServiceSnapMissingInternetGprsApsL - IN" );
+    
+    TBool isMissingGPRSIap = EFalse;
+    
+    RArray<TUint32> iapIds;
+    CleanupClosePushL( iapIds );
+    
+    CDesCArray* iaps = new (ELeave) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( iaps );
+    
+    InternetGprsApsMissingFromServiceSnapL( *iaps, iapIds );
+    
+    if ( iapIds.Count() )
+        {
+        isMissingGPRSIap = ETrue;
+        }
+    CleanupStack::PopAndDestroy( iaps );
+    CleanupStack::PopAndDestroy( &iapIds );
+    
+    CCHUIDEBUG2( 
+        "CCCHUiNotifierImpl::IsServiceSnapMissingInternetGprsApsL - return: %d", isMissingGPRSIap );
+    
+    return isMissingGPRSIap;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCHUiNotifierImpl::InternetGprsApsMissingFromServiceSnapL
+// ---------------------------------------------------------------------------
+//
+TUint32 CCCHUiNotifierImpl::InternetGprsApsMissingFromServiceSnapL(
+    CDesCArray& aIaps, RArray<TUint32>& aIapIds ) const
+    {
+    CCHUIDEBUG( 
+        "CCCHUiNotifierImpl::InternetGprsApsMissingFromServiceSnapL - IN" );
+    
+    TUint32 internetSnapId = KErrNone;
+    
+    CCchUiNotifConnectionHandler* connHandler = 
+        CCchUiNotifConnectionHandler::NewLC();
+    
+    CDesCArray* voipGprsIaps = new (ELeave) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( voipGprsIaps );
+    
+    RArray<TUint32> voipGprsIapIds;
+    CleanupClosePushL( voipGprsIapIds );
+
+    connHandler->GetGprsAccessPointsSetToServiceSnapL(
+        *voipGprsIaps, voipGprsIapIds, iCurrentConnectionIapId );
+
+    CDesCArray* internetGprsIapNames = new (ELeave) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( internetGprsIapNames );
+    
+    RArray<TUint32> internetGprsIapIds;
+    CleanupClosePushL( internetGprsIapIds );
+    
+    TRAPD( err, internetSnapId = connHandler->GetGprsAccessPointsL(
+        *internetGprsIapNames, internetGprsIapIds ) );
+    CCHUIDEBUG2( "-GetGprsAccessPointsL -Trap err = %d", err );
+    
+    if ( !KErrNone == err && !KErrNotFound == err )
+        {
+        User::Leave( err );
+        }
+    
+    for ( TInt i( 0 ); i < internetGprsIapIds.Count(); i++ )
+        {
+        TBool found = EFalse;
+        for ( TInt j( 0 ); j < voipGprsIapIds.Count() && !found; j++ )
+            {
+            found = connHandler->IsConnectionMethodSimilarL(
+                internetGprsIapIds[ i ], voipGprsIapIds[ j ] ); 
+            }
+        if ( !found )
+            {
+            CCHUIDEBUG2(
+                "IsVoIPSNAPMissingInternetGPRSAp -missing GPRS AP id: %d", internetGprsIapIds[ i ] );
+            aIapIds.AppendL( internetGprsIapIds[ i ] );
+            aIaps.AppendL( internetGprsIapNames->MdcaPoint( i ) );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &internetGprsIapIds );
+    CleanupStack::PopAndDestroy( internetGprsIapNames );
+    CleanupStack::PopAndDestroy( &voipGprsIapIds );
+    CleanupStack::PopAndDestroy( voipGprsIaps );
+    CleanupStack::PopAndDestroy( connHandler );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::InternetGprsApsMissingFromServiceSnapL - OUT" );
+    
+    return internetSnapId;
+    }
+
+// ---------------------------------------------------------------------------
+// Fills list items and commands for change connection dialog.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::FillChangeConnectionListboxL( 
+    CDesCArray& aListItems, RArray<TCchUiOperationCommand>& aCommandArray )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::FillChangeConnectionListboxL - IN" ); 
+    
+    HBufC* searchWlan = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_SEARCH_WLAN_CHANGE_CONNECTION_TEXT );  
+           
+    HBufC* useGprs = StringLoader::LoadLC( 
+        R_QTN_CCHUINOTIF_USE_GPRS_CHANGE_CONNECTION_TEXT ); 
+           
+    aListItems.AppendL( *searchWlan );
+    aCommandArray.AppendL( ECchUiCommandSearchWlan );
+
+    if ( !IsPhoneOfflineL() && IsGprsIapsAvailableL() 
+            && IsVoIPOverWCDMAAllowedL() )
+        {
+        aListItems.AppendL( *useGprs ); 
+        aCommandArray.AppendL( ECchUiCommandCopyGprs ); 
+        }
+
+    CleanupStack::PopAndDestroy( useGprs ); 
+    CleanupStack::PopAndDestroy( searchWlan );
+       
+    CCHUIDEBUG( "CCCHUiNotifierImpl::FillChangeConnectionListboxL - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// Check if VoIP over WCDMA is allowed
+// ---------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierImpl::IsVoIPOverWCDMAAllowedL()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::IsVoIPOverWCDMAAllowed - IN" );
+    
+    TBool allowed( EFalse );
+    CRCSEProfileRegistry* cRCSEProfileRegistry;
+    cRCSEProfileRegistry = CRCSEProfileRegistry::NewLC();
+    
+    RPointerArray<CRCSEProfileEntry> entries;
+   
+    CleanupStack::PushL( TCleanupItem ( ResetAndDestroy, &entries ) );  //CS
+ 
+    cRCSEProfileRegistry->FindByServiceIdL( iServiceId, entries );
+    if( entries.Count() )
+        {
+        RArray<TSettingIds> settingIdArray;
+        CleanupClosePushL( settingIdArray );    // CS 3
+        settingIdArray = entries[ 0 ]->iIds;
+        TInt sipProfileId( KErrNotFound );
+        for ( TUint i( 0 ) ; i < settingIdArray.Count() ; i++ )
+            {
+            if ( settingIdArray[ i ].iProfileType == 
+                CRCSEProfileEntry::EProtocolSIP )
+                {
+                sipProfileId = settingIdArray[ i ].iProfileId;
+                }
+            }
+        TUint32 bearerSetting( KErrNone );
+        if ( KErrNotFound != sipProfileId )
+            {
+            CSIPProfile* profile = 
+                iSipProfileRegistry->ProfileL( sipProfileId );
+            CleanupStack::PushL( profile ); // CS 4
+            User::LeaveIfError( 
+                profile->GetParameter( KBearerType, bearerSetting ) );
+            if ( KBearerSettingWlanOnly != bearerSetting )
+                {
+                allowed = ETrue;
+                }
+            CleanupStack::PopAndDestroy( profile ); // CS 3
+            }
+        CleanupStack::Pop( &settingIdArray ); // CS 2
+        }
+    
+    CleanupStack::PopAndDestroy( &entries ); // clItem    CS 1
+    
+    CleanupStack::PopAndDestroy(); //cRCSEProfileRegistry   CS 0
+    
+    return allowed;
+    }
+
+// ---------------------------------------------------------------------------
+// For deleting RPointerArray in case of leave
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ResetAndDestroy( TAny* aPointerArray )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ResetAndDestroy - IN" );
+    if ( aPointerArray )
+        {
+        RPointerArray<CRCSEProfileEntry>* array =
+            reinterpret_cast<RPointerArray<CRCSEProfileEntry>*>( aPointerArray );
+        TInt i = array->Count();
+        array->ResetAndDestroy();
+        array->Close();
+        }
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ResetAndDestroy - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CCCHUiNotifierBase.
+// ---------------------------------------------------------------------------
+//
+CCCHUiNotifierImpl::TNotifierInfo CCCHUiNotifierImpl::RegisterL()
+    {
+    iInfo.iUid=KCchUiNotifierUid;
+    iInfo.iChannel=KCchUiNotifierChannel;
+    iInfo.iPriority=ENotifierPriorityVHigh;
+    return iInfo;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CCCHUiNotifierBase.
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CCCHUiNotifierImpl::UpdateL( const TDesC8& /*aBuffer*/ )
+    {
+    TPtrC8 ret( KNullDesC8 );
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CCCHUiNotifierBase.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::StartL(
+    const TDesC8& aBuffer, 
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage)
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::StartL - IN" );
+    
+    __ASSERT_DEBUG( iMessage.IsNull(), User::Leave( KErrAlreadyExists ) );
+    
+    // Read aBuffer for control information
+    TCCHUiNotifierParams param;
+    TPckgC<TCCHUiNotifierParams> pckg(param);
+    pckg.Set( aBuffer );
+
+    CCCHUiNotifierBase::StartL( aBuffer, aReplySlot, aMessage );    
+    iDialogMode = pckg().iDialogMode;
+    iServiceId = pckg().iServiceId;
+    iCurrentConnectionIapId = pckg().iCurrentConnectionIapId;
+    
+    switch( pckg().iDialogMode )
+        {
+        case MCchUiObserver::ECchUiDialogTypeUsernamePasswordFailed:
+            {
+            CCHUIDEBUG( "StartL - wrong username/password" ); 
+            ShowInvalidUsernamePasswordNoteL( 
+                aReplySlot, aMessage, pckg().iServiceId );
+            }
+            break;
+        case MCchUiObserver::ECchUiDialogTypeAuthenticationFailed:
+            {
+            CCHUIDEBUG( "StartL - auth failed" );	
+            ShowUsernamePasswordQueryL( 
+                aReplySlot, aMessage, pckg().iServiceId, pckg().iUsername );
+            }
+            break;
+
+        case MCchUiObserver::ECchUiDialogTypeNoConnectionAvailable:
+            {
+            CCHUIDEBUG( "StartL - no connections" );	            
+            // Do nothing here. Uses RunL to show notifier instead. 
+            // Needed for cancel functionality.
+            }
+            break;    
+        case MCchUiObserver::ECchUiDialogTypeNoConnectionDefined:
+            {
+            CCHUIDEBUG( "StartL - no conn defined" );	                        
+            ShowNoConnectionsQueryL( 
+                aReplySlot, aMessage, pckg().iServiceId, ETrue );
+            }
+            break;
+        case MCchUiObserver::ECchUiDialogTypeDefectiveSettings:
+            {
+            CCHUIDEBUG( "StartL - defective settings" );	                        
+            ShowDefectiveSettingsL( 
+                aReplySlot, aMessage, pckg().iServiceId );
+            }
+            break;          
+        case MCchUiObserver::ECchUiDialogTypeErrorInConnection:
+            {
+            CCHUIDEBUG( "StartL - error in connection" );                            
+            ShowErrorInConnectionNoteL( 
+                aReplySlot, aMessage, pckg().iServiceId );
+            }
+            break;
+        case MCchUiObserver::ECchUiDialogTypeConfirmChangeConnection:
+            {
+            CCHUIDEBUG( "StartL - confirm change connection" );                            
+            ShowConfirmChangeConnectionL( 
+                aReplySlot,
+                aMessage,
+                pckg().iServiceId, 
+                pckg().iCurrentConnectionIapId );
+            }
+            break;
+        case MCchUiObserver::ECchUiDialogTypeChangeConnection:
+            {
+            CCHUIDEBUG( "StartL - change connection" );                        
+            ShowChangeConnectionQueryL( 
+                aReplySlot,
+                aMessage,
+                pckg().iServiceId,
+                pckg().iCurrentConnectionIapId );
+            }
+            break;     
+        default:
+            {
+            User::Leave( KErrNotSupported );
+            }
+            break;    
+        }
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::StartL - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MCchUiCallStateObserver.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::CallStateChanged( TInt aCallState )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::CallStateChangedL - Start" );
+    
+    switch( aCallState )
+        {
+        case EPSCTsyCallStateRinging:
+            {
+            if ( iListQueryDialog )
+                {
+                delete iListQueryDialog;
+                iListQueryDialog = NULL;
+                
+                CompleteMessage( KErrCancel );
+                CCCHUiNotifierBase::Cancel();
+                }
+            }
+            break;
+        default:
+            {
+            // Nothing to do.
+            }
+            break;
+        }
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::CallStateChangedL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MSIPProfileRegistryObserver.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ProfileRegistryEventOccurred( 
+    TUint32 /*aSIPProfileId*/, 
+    TEvent /*aEvent*/ )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MSIPProfileRegistryObserver.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ProfileRegistryErrorOccurred(
+    TUint32 /*aSIPProfileId*/,
+    TInt /*aError*/ )
+    {
+    }