convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifierimpl.cpp
changeset 0 a4daefaec16c
child 11 6134b5029079
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifierimpl.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,1090 @@
+/*
+* Copyright (c) 2008-2009 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 "cchuilogger.h"
+#include "cchuicommon.hrh"
+#include "cchuinotifierimpl.h"
+#include "cchuipluginbrandinghandler.h"
+#include "cchuinotifconnectionhandler.h"
+#include "cchuicallstatelistener.h"
+
+
+// ======== 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 );
+    }
+
+CCCHUiNotifierImpl::~CCCHUiNotifierImpl()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierImpl::~CCCHUiNotifierImpl - IN" );	
+    
+    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 );
+    
+    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 );
+        }
+    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.
+        }
+      
+    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 ];        
+          
+        if ( ECchUiCommandCopyGprs == commandArray[ result ] )
+            {
+            ShowGprsSelectionL( aServiceId );
+            }
+        CCHUIDEBUG( "ShowNoConnectionsQueryL - write and complete" );   
+        iMessage.WriteL( iReplySlot, 
+            TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+        CompleteMessage( KErrNone );    
+        }
+    else
+        {
+        CCHUIDEBUG( "ShowNoConnectionsQueryL - complete with cancel" ); 
+        CompleteMessage( KErrCancel );
+        }
+    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.
+        }
+
+    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();
+    
+    if( iListQueryDialog )
+        {
+        // write result, result now holds the item number
+        if ( KErrNotFound != result )
+            {
+            iResultParams.iDialogMode = type;
+            iResultParams.iServiceId = aServiceId;
+            iResultParams.iOperationCommand = commandArray[ result ];    
+            
+            if ( ECchUiCommandCopyGprs == commandArray[ result ] )
+                {
+                ShowGprsSelectionL( aServiceId );
+                }
+            CCHUIDEBUG( "ShowChangeConnectionQueryL - write and complete" );  
+            iMessage.WriteL( iReplySlot, 
+                TPckgBuf<TCCHUiNotifierParams>( iResultParams ) );
+            CompleteMessage( KErrNone );    
+            }
+        else
+            {
+            CCHUIDEBUG( "ShowChangeConnectionQueryL - complete with cancel" ); 
+            CompleteMessage( KErrCancel );
+            }
+        
+        iListQueryDialog = NULL;
+        }
+    
+    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 );
+    
+    // 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 );
+        }
+    
+    CleanupStack::PopAndDestroy( &iapName );
+    
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowConfirmChangeConnectionL - OUT" );
+    } 
+
+// ---------------------------------------------------------------------------
+// Shows gprs iap selection.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierImpl::ShowGprsSelectionL( TUint aServiceId )
+	{ 
+	CCHUIDEBUG( "CCCHUiNotifierImpl::ShowGprsSelectionL - IN" );	
+
+    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
+    CCchUiNotifConnectionHandler* connHandler = 
+        CCchUiNotifConnectionHandler::NewLC();
+    sourceSnap = connHandler->GetGprsAccessPointsL( *arrayforDialog, iapIds ); 
+    CleanupStack::PopAndDestroy( connHandler );    
+    
+    CCHUIDEBUG( "ShowGprsSelectionL - set item array" );	
+    dialog->SetItemTextArray( arrayforDialog );
+    dialog->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    
+    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
+        {
+        User::Leave( KErrCancel );
+        }
+
+    CleanupStack::PopAndDestroy( string );
+    CleanupStack::PopAndDestroy( arrayforDialog );     
+    CleanupStack::PopAndDestroy( &iapIds );
+
+    CCHUIDEBUG( "CCCHUiNotifierImpl::ShowGprsSelectionL - OUT" );
+	}   	
+
+// ---------------------------------------------------------------------------
+// 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 )
+	    {
+	    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" );	
+
+	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 );	
+    
+    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" );	
+
+	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 );	
+    
+    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() )
+        {
+        aListItems.AppendL( *useGprs ); 
+        aCommandArray.AppendL( ECchUiCommandCopyGprs ); 
+        }
+
+    CleanupStack::PopAndDestroy( useGprs ); 
+    CleanupStack::PopAndDestroy( searchWlan );  
+    
+    CCHUIDEBUG( 
+            "CCCHUiNotifierImpl::FillChangeCurrentConnectionListboxL - OUT" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// 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" );
+    
+    CRCSEProfileRegistry* cRCSEProfileRegistry;
+    cRCSEProfileRegistry = CRCSEProfileRegistry::NewLC();
+    TBool ret = EFalse;
+    RPointerArray<CRCSEProfileEntry> entries;
+    cRCSEProfileRegistry->FindByServiceIdL( iServiceId, entries );
+    if( entries.Count() )
+        {
+        ret = CRCSEProfileEntry::EOn == entries[ 0 ]->iAllowVoIPoverWCDMA;
+        }
+    
+    entries.ResetAndDestroy();
+    entries.Close();
+    CleanupStack::PopAndDestroy(); //cRCSEProfileRegistry
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// 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;
+    
+    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" );
+    }