commsconfig/cscapplicationui/src/cscservicecontainer.cpp
branchRCL_3
changeset 22 d38647835c2e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscapplicationui/src/cscservicecontainer.cpp	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,972 @@
+/*
+* Copyright (c) 2007-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:  CSC Application´s Service View´s Container
+*
+*/
+
+
+#include <fbs.h>
+#include <csc.mbg>
+#include <csc.rsg>
+#include <e32std.h>
+#include <aknapp.h>
+#include <gulicon.h>
+#include <eikclbd.h>
+#include <aknlists.h>
+#include <pathinfo.h>
+#include <coecntrl.h>
+#include <AknsUtils.h>
+#include <cchclient.h>
+#include <akncontext.h>
+#include <AknIconArray.h>
+#include <StringLoader.h>
+#include <aknViewAppUi.h>
+#include <AiwServiceHandler.h>
+#include <mspnotifychangeobserver.h>
+#include <cscengsettingscleanupplugininterface.h>
+
+#include <csxhelp/voip.hlp.hrh>
+#include <data_caging_path_literals.hrh>
+
+#include "mcscservicecontainerobserver.h"
+#include "csclogger.h"
+#include "cscdialog.h"
+#include "cscconstants.h"
+#include "cscapplication.h"
+#include "cscnoteutilities.h"
+#include "cscengcchhandler.h"
+#include "cscservicecontainer.h"
+#include "cscengservicehandler.h"
+#include "cscengbrandinghandler.h"
+#include "cscengservicepluginhandler.h"
+#include "cscenguiextensionpluginhandler.h"
+
+const TUint KServiceListItemTextMaxLength = 64;
+const TUint KMaxUiExetnsionNameLength = 64;
+
+// Format of the list item string.
+_LIT( KServiceListItemTextFormat, "%d\t%S\t" );
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCServiceContainer::CCSCServiceContainer( 
+    MCSCServiceContainerObserver& aContainerObserver,
+    CCSCEngServicePluginHandler& aServicePluginHandler,
+    CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler,
+    CCSCEngServiceHandler& aServiceHandler,
+    CCSCEngBrandingHandler& aBrandingHandler,
+    CCSCEngCCHHandler& aCCHHandler ):
+    iContainerObserver( aContainerObserver ),
+    iServicePluginHandler( aServicePluginHandler ),
+    iUiExtensionPluginHandler( aUiExtensionPluginHandler ),
+    iServiceHandler( aServiceHandler ),
+    iBrandingHandler( aBrandingHandler ),
+    iCCHHandler( aCCHHandler )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::ConstructL( const TRect& aRect )
+    {
+    CSCDEBUG( "CCSCServiceContainer::ConstructL - begin" );
+    
+    CreateWindowL(); 
+    iDialog = CCSCDialog::NewL();
+    
+    iListBox = new (ELeave) CAknDouble2LargeStyleListBox;
+    iListBox->SetContainerWindowL( *this );
+    iListBox->ConstructL( this, EAknGenericListBoxFlags );
+    iListBox->HideSecondRow( ETrue );
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+    
+    HBufC* emptyTxt = StringLoader::LoadLC( R_QTN_CSC_NO_SERVICES_INSTALLED );
+    iListBox->View()->SetListEmptyTextL( *emptyTxt );
+    CleanupStack::PopAndDestroy( emptyTxt );
+    
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                                 CEikScrollBarFrame::EOff,
+                                                 CEikScrollBarFrame::EAuto );
+    
+    CTextListBoxModel* model = iListBox->Model();
+    MDesCArray* textArray = model->ItemTextArray();
+    iListBoxItems = static_cast<CDesCArray*>( textArray );
+    
+    iEikMenuBar = new ( ELeave ) CEikMenuBar();
+    iEikMenuBar->ConstructL( this, NULL, R_CSC_SERVICEVIEW_MENUBAR );
+    
+    SetRect( aRect );
+    
+    UpdateServiceViewL();
+    
+    ActivateL();
+
+    CSCDEBUG( "CCSCServiceContainer::ConstructL - end" );
+    }
+    
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCServiceContainer* CCSCServiceContainer::NewL( 
+    const TRect& aRect,
+    MCSCServiceContainerObserver& aContainerObserver,
+    CCSCEngServicePluginHandler& aServicePluginHandler,
+    CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler,
+    CCSCEngServiceHandler& aServiceHandler,
+    CCSCEngBrandingHandler& aBrandingHandler,
+    CCSCEngCCHHandler& aCCHHandler )
+    {
+    CCSCServiceContainer* self = 
+        new ( ELeave ) CCSCServiceContainer( 
+            aContainerObserver,
+            aServicePluginHandler, 
+            aUiExtensionPluginHandler,
+            aServiceHandler,
+            aBrandingHandler,
+            aCCHHandler );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCServiceContainer::~CCSCServiceContainer()
+    {
+    CSCDEBUG( "CCSCServiceContainer::~CCSCServiceContainer - begin" );
+    
+    delete iDialog;        
+    delete iArray;   
+    delete iListBox;    
+    delete iEikMenuBar;
+    
+    iListBoxItemArray.Reset();
+    iListBoxItemArray.Close();
+    
+    CSCDEBUG( "CCSCServiceContainer::~CCSCServiceContainer - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Updates services to listbox.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::UpdateServiceViewL()
+    {
+    CSCDEBUG( "CCSCServiceContainer::UpdateServiceViewL - begin" );
+    
+    TInt currentItemIndex = CurrentItemIndex();
+    
+    // Reset listbox items and item array
+    iListBoxItems->Reset();
+    iListBoxItemArray.Reset();
+        
+    // Find and add Ui Extension Plug-ins
+    iUiExtensionCount = iUiExtensionPluginHandler.PluginCount();
+    
+    // Create icon array or cleanup iconarray if it already exists
+    CArrayPtr<CGulIcon>* iconArray =  
+        iListBox->ItemDrawer()->ColumnData()->IconArray();
+    
+    if ( !iconArray )
+        {
+        iconArray = new( ELeave ) CAknIconArray( 1 );
+         // Set icon array for ListBox.
+        iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
+        }
+    else
+        {
+        iconArray->ResetAndDestroy();
+        }
+
+    // move add new service plugin to top
+    RArray<TUiExtensionPluginInfo> uiPlugins;
+    CleanupClosePushL( uiPlugins );
+    
+    for( TInt i = 0; i < iUiExtensionCount; i++ )
+        {
+        TUiExtensionPluginInfo uiExtension = 
+            iUiExtensionPluginHandler.ItemFromPluginInfoArray( i );
+                        
+        if ( KAccountCreationPluginUID == uiExtension.iPluginsUid )
+            {
+            uiPlugins.InsertL( uiExtension, 0 );
+            }
+        else
+            {
+            uiPlugins.AppendL( uiExtension );
+            }
+        }
+  
+    iListBoxItemHeight = iListBox->ItemHeight();
+    
+    TInt iconSize( 0 );
+    if ( iListBoxItemHeight == KItemHeightPortrait )
+        {
+        iconSize = iListBoxItemHeight - KIconSizeCorrectionPortrait;
+        }
+    else
+        {
+        iconSize = iListBoxItemHeight - KIconSizeCorrectionLandscape;
+        }
+                 
+    for ( TUint i( 0 ) ; i < iUiExtensionCount ; i++ )
+        {
+        TUiExtensionPluginInfo uiExtension = uiPlugins[i];
+                        
+        if ( 0 == uiExtension.iPlace )
+            {                        
+            TBuf<KMaxUiExetnsionNameLength> extensionName;
+            extensionName.Copy( uiExtension.iUiExtensionName );
+                
+            // To keep track which kind of listbox items we have
+            TListBoxItem listBoxItem;
+            listBoxItem.iItemType = TListBoxItem::EUiExtension;
+            listBoxItem.iPluginUid = uiExtension.iPluginsUid;
+                        
+            iListBoxItemArray.Append( listBoxItem );
+            
+            // Set icon for ui extension
+            SetIconL( listBoxItem, iconArray, iconSize );
+                                                
+            TBuf<KServiceListItemTextMaxLength> listBoxItemText;          
+            
+            listBoxItemText.Format(
+                KServiceListItemTextFormat,
+                iconArray->Count() - 1,
+                &extensionName );
+            
+            iListBoxItems->AppendL( listBoxItemText );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &uiPlugins );
+    
+    // Get services  
+    RArray<TUint> serviceIds;
+    CleanupClosePushL( serviceIds );
+    
+    TRAPD( err, iServiceHandler.GetAllServiceIdsL( serviceIds ) );
+            
+    for ( TInt i(0) ; i < serviceIds.Count() && !err ; i++ )
+        {                
+        // Check service validity from cch before adding to listbox
+        if ( iCCHHandler.IsServiceValidL( serviceIds[ i ] ) )
+            {
+            TBuf<KServiceListItemTextMaxLength> listBoxItemText;          
+            HBufC* serviceString = NULL;
+                            
+            serviceString = StringLoader::LoadLC( 
+                R_QTN_CSC_SERVICE_LISTBOX_ITEM, 
+                iServiceHandler.ServiceNameL( serviceIds[ i ] ) );
+                            
+            // To keep track which kind of listbox items we have
+            TListBoxItem listBoxItem;
+            listBoxItem.iServiceId = serviceIds[ i ];
+                        
+            // Set icon for service
+            SetIconL( listBoxItem, iconArray, iconSize );
+                        
+            listBoxItemText.Format(
+                KServiceListItemTextFormat,
+                iconArray->Count() - 1,
+                serviceString );
+                       
+            iListBoxItems->AppendL( listBoxItemText );    
+                                           
+            TInt32 servicePluginId( 0 );
+            TInt err2( KErrNone );
+                        
+            // Find service plug-in id if service has one
+            TRAP( 
+                err2, servicePluginId = 
+                iServiceHandler.ServiceSetupPluginIdL( serviceIds[ i ] ) );
+                                                              
+            if ( !err2 && servicePluginId )
+                {            
+                listBoxItem.iItemType = TListBoxItem::EServicePlugin;
+                listBoxItem.iPluginUid.iUid = servicePluginId;
+                }
+            else if ( KErrNotFound == err2 )
+                {
+                listBoxItem.iItemType = TListBoxItem::EGeneralService;
+                }
+                        
+            iListBoxItemArray.Append( listBoxItem );    
+
+            CleanupStack::PopAndDestroy( serviceString );   
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &serviceIds );  
+    
+    UpdateListboxL();
+    
+    if( iListBoxItemArray.Count() > 0 )
+    	{
+        if ( 0 <= currentItemIndex && 
+           ( iListBoxItemArray.Count() > currentItemIndex  ) )
+            {
+            iListBox->SetCurrentItemIndexAndDraw( currentItemIndex );
+            }
+        else
+            {
+            iListBox->SetCurrentItemIndexAndDraw( 0 );
+            }
+    	}
+    	
+    CSCDEBUG( "CCSCServiceContainer::UpdateSerUpdateServiceViewL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Update listbox. Handle item addition and drawing.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::UpdateListboxL()
+    {
+    CSCDEBUG( "CCSCServiceContainer::UpdateListboxL - begin" );
+    
+    iListBox->HandleItemAdditionL(); 
+    
+    CSCDEBUG( "CCSCServiceContainer::UpdateListboxL - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns current item index of listbox.
+// ---------------------------------------------------------------------------
+//
+TInt CCSCServiceContainer::CurrentItemIndex() const
+    {
+    CSCDEBUG2( 
+    "CCSCServiceContainer::CurrentItemIndex:%d",iListBox->CurrentItemIndex());
+    
+    return iListBox->CurrentItemIndex();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns currently selected list box item.
+// ---------------------------------------------------------------------------
+//
+TListBoxItem CCSCServiceContainer::ListBoxItem()
+    {    
+    return iListBoxItemArray[ CurrentItemIndex() ];
+    }
+
+// ---------------------------------------------------------------------------
+// Returns reference to listbox.
+// ---------------------------------------------------------------------------
+//
+CAknDouble2LargeStyleListBox& CCSCServiceContainer::ListBox()
+    {    
+    return *iListBox;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns pen down point.
+// ---------------------------------------------------------------------------
+//
+TPoint CCSCServiceContainer::PenDownPoint()
+    {
+    return iPenDownPoint;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns service count.
+// ---------------------------------------------------------------------------
+//
+TInt CCSCServiceContainer::ServiceCount()
+    {
+    TUint serviceCount( 0 );
+    
+    for ( TInt i ( 0 ) ; i < iListBoxItemArray.Count() ; i++ )
+        {
+        //Add count if list box item type is general service or service plugin
+        if ( 
+            TListBoxItem::EGeneralService == iListBoxItemArray[i].iItemType ||
+            TListBoxItem::EServicePlugin == iListBoxItemArray[i].iItemType )
+            {
+            serviceCount++;
+            }
+        }
+    
+    return serviceCount;
+    }
+
+// ---------------------------------------------------------------------------
+// Set current item index.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::SetCurrentIndex( TInt aIndex )
+    {
+    CSCDEBUG2( "CCSCServiceContainer::SetCurrentIndex: aIndex=%d", aIndex );
+    
+    if( ( aIndex < iListBoxItemArray.Count() ) && ( aIndex >= 0 ) )
+        {
+        iListBox->SetCurrentItemIndex( aIndex );
+        }
+    else
+        {
+        iListBox->SetCurrentItemIndex( 0 );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Deletes service.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::DeleteServiceL()
+    {
+    CSCDEBUG( "CCSCServiceContainer::DeleteServiceL - begin" );
+    
+    if (  iListBoxItemArray.Count() )
+        {
+        TListBoxItem item = ListBoxItem();
+
+        // Show confirmation query for service deletion                        
+        if ( CCSCNoteUtilities::ShowCommonQueryL( 
+            CCSCNoteUtilities::ECSCDeleteServiceQuery, 
+            iServiceHandler.ServiceNameL( item.iServiceId ) ) )
+            {
+            TBool  disabled = iCCHHandler.IsServiceDisabled( item.iServiceId );
+               
+            // if enabled -> show unable to delete note
+            if ( !disabled )
+                {
+                CCSCNoteUtilities::ShowInformationNoteL( 
+                    CCSCNoteUtilities::ECSCUnableToDeleteNote,
+                        iServiceHandler.ServiceNameL( item.iServiceId ) );
+                return;
+                }
+            
+            // First check if there is a service plugin UID.
+            TInt count = iServicePluginHandler.PluginCount( 
+                CCSCEngServicePluginHandler::EInitialized );
+            TBool setupPlugin( EFalse );
+            for ( TInt i = 0; i < count && !setupPlugin; i++ )
+                 {
+                 TServicePluginInfo pluginInfo = 
+                     iServicePluginHandler.ItemFromPluginInfoArray( i );
+                 if ( pluginInfo.iPluginsUid == item.iPluginUid )
+                     {
+                     CSCDEBUG2( "   DeleteServiceL - plugin UID match found: %d",
+                         item.iPluginUid );
+                     setupPlugin = ETrue;
+                     }
+                 }
+
+            if ( setupPlugin )
+                {
+                HandleServicePluginRemovationL( item.iPluginUid );
+                }
+            else
+                {
+                TRAPD( err, LaunchCleanupPluginL( item.iServiceId ) );
+                if ( KErrNone != err )
+                    {
+                    iServiceHandler.DeleteServiceL( item.iServiceId );
+                    }
+                }
+            }
+        }
+    
+    CSCDEBUG( "CCSCServiceContainer::DeleteServiceL - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// Handles service plugin removation.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::HandleServicePluginRemovationL( const TUid& aUid )
+    {
+    CSCDEBUG( 
+         "CCSCServiceContainer::HandleServicePluginRemovationL - begin" );  
+    
+    TUint serviceId( 0 );   
+    ResolveServiceIdL( aUid, serviceId );
+    if ( !serviceId )
+        {
+        User::Leave( KErrNotFound );
+        }
+        
+    TBool disabled = iCCHHandler.IsServiceDisabled( serviceId );
+        
+    // If service is not disabled, try to disable it
+    if ( !disabled )
+        {
+        iDialog->LaunchWaitNoteL( R_QTN_CSC_REMOVING_SERVICE );
+        User::LeaveIfError( iCCHHandler.DisableService( serviceId ) );
+        return;
+        } 
+        
+    // Remove service plugin
+    TInt error( KErrNone );
+    TRAP( error, iServicePluginHandler.DoRemovationL( aUid, EFalse ) );
+        
+    // If error, remove remainging setting by cleanupplugin
+    if ( error )
+        {
+        error = KErrNone;
+        TRAP( error, LaunchCleanupPluginL( serviceId ) );
+               
+        if ( error )
+            {
+            iServiceHandler.DeleteServiceL( serviceId );
+            }  
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Updates container data because of layout change.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::HandleResourceChange( TInt aType )
+    {
+    CSCDEBUG( "CCSCServiceContainer::HandleResourceChange - begin" );
+    
+    if( aType == KAknsMessageSkinChange ||
+        aType == KEikDynamicLayoutVariantSwitch )
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, 
+                                           mainPaneRect );
+        SetRect( mainPaneRect );
+        DrawNow();
+        iListBox->DrawNow();
+        
+        // Get handler to status pane.
+        CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+        if ( statusPane )
+            {
+            statusPane->DrawNow();
+            }
+        }
+    
+    CCoeControl::HandleResourceChange( aType );
+    
+    CSCDEBUG( "CCSCServiceContainer::HandleResourceChange - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets listbox observer.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::SetListBoxObserver( 
+    MEikListBoxObserver* aObserver )
+    {
+    iListBox->SetListBoxObserver( aObserver );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Hides dialog wait note.
+// ---------------------------------------------------------------------------
+//
+ void CCSCServiceContainer::HideDialogWaitNote()
+    {
+    iDialog->DestroyWaitNote();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Launches cleanup plugin to remove settings.
+// ---------------------------------------------------------------------------
+//
+ void CCSCServiceContainer::LaunchCleanupPluginL( TUint aServiceId ) const
+    {
+    CSCDEBUG( "CCSCServiceContainer::LaunchCleanupPluginL - begin" );
+    
+    RImplInfoPtrArray implInfoArray;
+    CleanupStack::PushL( TCleanupItem( 
+    ResetAndDestroy, &implInfoArray ) );
+                    
+    REComSession::ListImplementationsL(
+        KCSCSettingsCleanupPluginInterfaceUid,
+        implInfoArray );
+        
+    for ( TInt i( 0 ) ; i < implInfoArray.Count() ; i++ )
+        {                    
+        CCSCEngSettingsCleanupPluginInterface* plugin = 
+            CCSCEngSettingsCleanupPluginInterface::NewL( 
+                implInfoArray[ i ]->ImplementationUid() );
+        
+        CleanupStack::PushL( plugin );
+        
+        if ( CCSCEngSettingsCleanupPluginInterface::ESipVoIPCleanupPlugin 
+            == plugin->PluginType() )
+            {
+            plugin->RemoveSettingsL( aServiceId );
+            }
+        
+        CleanupStack::PopAndDestroy( plugin );
+        }
+                        
+    CleanupStack::PopAndDestroy( &implInfoArray );
+    REComSession::FinalClose();
+    
+    CSCDEBUG( "CCSCServiceContainer::LaunchCleanupPluginL - end" );
+    }
+ 
+ 
+ // ---------------------------------------------------------------------------
+ // Resolve service id from service plugi uid.
+ // ---------------------------------------------------------------------------
+ //
+ void CCSCServiceContainer::ResolveServiceIdL( 
+     const TUid& aUid, TUint& aServiceId )
+     {     
+     RArray<TUint> serviceIds;
+     CleanupClosePushL( serviceIds );
+     iServiceHandler.GetAllServiceIdsL( serviceIds );
+     
+     TInt serviceCount(  serviceIds.Count() );
+     
+     if ( serviceCount )
+         {
+         for ( TInt i = 0 ; i < serviceCount ; i++ )
+              {
+              TInt32 serviceSetupPluginId( KErrNotFound );
+              TRAPD( err, serviceSetupPluginId = 
+                  iServiceHandler.ServiceSetupPluginIdL( serviceIds[ i ] ) );
+                  
+              if ( KErrNone == err && 
+                  serviceSetupPluginId == aUid.iUid )
+                  {
+                  aServiceId = serviceIds[ i ];
+                  break;
+                  }
+              }
+         }
+     else
+         {
+         User::Leave( KErrNotFound );
+         }
+         
+     CleanupStack::PopAndDestroy( &serviceIds );
+     }
+
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Offer key events for controls.
+// ---------------------------------------------------------------------------
+// 
+TKeyResponse CCSCServiceContainer::OfferKeyEventL( 
+    const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    CSCDEBUG2( 
+        "CCSCServiceContainer::OfferKeyEventL: aKeyEvent: %d", 
+            aKeyEvent.iScanCode );
+    
+    TKeyResponse result( EKeyWasNotConsumed );
+    
+    if ( iEikMenuBar->ItemSpecificCommandsEnabled() && 
+        EKeyBackspace  == aKeyEvent.iCode &&
+        ( TListBoxItem::EUiExtension != ListBoxItem().iItemType ) )
+        {
+        DeleteServiceL();
+        result = EKeyWasConsumed;
+        }
+    else
+        {
+        result = iListBox->OfferKeyEventL( aKeyEvent, aType );
+        }
+
+    iContainerObserver.UpdateCbaL();        
+    
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Returns component controls.
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CCSCServiceContainer::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iListBox;
+        default:
+            return NULL;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Handle pointer event.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::HandlePointerEventL(
+    const TPointerEvent& aPointerEvent )
+    {
+    iPenDownPoint = aPointerEvent.iPosition;
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCEngCCHObserver
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::ServiceStatusChanged(
+    TUint /*aServiceId*/, 
+    TCCHSubserviceType /*aType*/, 
+    const TCchServiceStatus& /*aServiceStatus*/ )
+    {
+    // not used
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Handles controls size changes.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::SizeChanged()
+    {
+    if ( iListBox )
+        {
+        iListBox->SetRect( Rect() );
+        
+        // Update view if portrait/landscape change happened
+        if ( iListBoxItemHeight != iListBox->ItemHeight() )
+            {
+            TRAP_IGNORE( UpdateServiceViewL() );
+            }        
+        }
+    }
+    
+
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Handles focus changes.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::FocusChanged( TDrawNow aDrawNow )
+    {
+    CCoeControl::FocusChanged( aDrawNow );
+    
+    if( iListBox )
+        {
+        iListBox->SetFocus( IsFocused() );
+        }            
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// From class CoeControl
+// Counts components controls.
+// ---------------------------------------------------------------------------
+//
+TInt CCSCServiceContainer::CountComponentControls() const
+    {
+    return 1; // only iListBox
+    }
+
+
+// -----------------------------------------------------------------------------
+// From class CoeControl
+// For getting help context
+// -----------------------------------------------------------------------------
+//
+void CCSCServiceContainer::GetHelpContext( 
+    TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KCscHelpUid;
+    aContext.iContext = KVOIP_HLP_CSC;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets icons for lisbox items.
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::SetIconL( const TListBoxItem& aListBoxItem,
+    CArrayPtr<CGulIcon>* aIconArray, TInt aIconSize )
+    {
+    CSCDEBUG( "CCSCServiceContainer::SetIconL - begin" );
+         
+    if ( NULL == aIconArray )
+        {
+        return;
+        }
+                 
+    TFileName iconsFileName = TParsePtrC( PathInfo::RomRootPath() ).Drive();
+    iconsFileName.Append( KDC_APP_BITMAP_DIR );
+    iconsFileName.Append( KCSCAifFile );
+    
+    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+    
+    if ( TListBoxItem::EUiExtension == aListBoxItem.iItemType )
+        {   
+        // specific icon for accountcreationplugin
+        if ( KAccountCreationPluginUID == aListBoxItem.iPluginUid )
+            {
+            aIconArray->AppendL( AknsUtils::CreateGulIconL( 
+                    skinInstance, 
+                    KAknsIIDDefault,
+                    iconsFileName, 
+                    EMbmCscQgn_prop_voip_new_service, 
+                    EMbmCscQgn_prop_voip_new_service ) );
+            }
+        // specific icon for advanced settings plugin (sip voip settings)
+        else if ( KAdvancedSettingsPluginUID == aListBoxItem.iPluginUid )
+            {
+            aIconArray->AppendL( AknsUtils::CreateGulIconL( 
+                    skinInstance, 
+                    KAknsIIDDefault,
+                    iconsFileName, 
+                    EMbmCscQgn_prop_set_voip_advanced, 
+                    EMbmCscQgn_prop_set_voip_advanced ) );
+            }
+        else // generic icon
+            {
+            aIconArray->AppendL( AknsUtils::CreateGulIconL( 
+                    skinInstance, 
+                    KAknsIIDDefault,
+                    iconsFileName,
+                    EMbmCscQgn_prop_set_service, 
+                    EMbmCscQgn_prop_set_service ) );
+            }
+        } 
+    // Service in question, try to get branded icon. If fails use default icon
+    else 
+        {
+        CSCDEBUG( "CCSCServiceContainer::SetIconL - branded icon" );
+        CFbsBitmap* bitmap = NULL;
+        CFbsBitmap* mask = NULL;
+        
+        // Get service brand id and branded icon(s).       
+        TRAPD( err, 
+            TBuf16<KBrandIdMaxLength> brandId16 ( KNullDesC );
+            iServiceHandler.BrandIdL( 
+                aListBoxItem.iServiceId, 
+                brandId16 );
+            
+            TBuf8<KBrandIdMaxLength> brandId8 ( KNullDesC8 );
+            brandId8.Copy( brandId16 );
+            iBrandingHandler.GetServiceBrandIconL( brandId8, bitmap, 
+                mask, aIconSize ); );
+        // Use default icons if error.
+        if ( KErrNone != err )
+            {
+            aIconArray->AppendL( AknsUtils::CreateGulIconL( 
+                skinInstance, 
+                KAknsIIDDefault,
+                iconsFileName,
+                EMbmCscQgn_prop_set_service, 
+                EMbmCscQgn_prop_set_service ) );
+            }
+        // Use branded icons if KErrNone.    
+        else
+            {
+            if ( bitmap )
+                {
+                CSCDEBUG( "CCSCServiceContainer::SetIconL - branded icon" );
+                CleanupStack::PushL( bitmap );
+                CleanupStack::PushL( mask );
+                
+                CFbsBitmap* newBitmap = new (ELeave) CFbsBitmap;     
+                if ( KErrNone == newBitmap->Duplicate( bitmap->Handle() ) )
+                    {
+                    CleanupStack::PushL( newBitmap );
+                    //ownership transferred (newBitmap)
+                    
+                    //Create new mask
+                    CFbsBitmap* newMask = new (ELeave) CFbsBitmap; 
+                    if( KErrNone == newMask->Duplicate( mask->Handle() ) )
+                        {
+                        CSCDEBUG( "CCSCServiceContainer::SetIconsL - branded newMASK" );
+                        
+                        CleanupStack::PushL ( newMask );
+                        CGulIcon* icon = CGulIcon::NewL( 
+                            AknIconUtils::CreateIconL( newBitmap ),
+                            AknIconUtils::CreateIconL( newMask ) );
+                        
+                        CleanupStack::Pop( newMask );
+                        CleanupStack::Pop( newBitmap );
+                    
+                        CleanupStack::PushL( icon );     
+                        aIconArray->AppendL( icon );
+                        CleanupStack::Pop( icon );
+                        CSCDEBUG( "CCSCServiceContainer::SetIconsL - branded newMASK done" );
+                        }
+                    else
+                        {
+                        CSCDEBUG( "CCSCServiceContainer::SetIconsL - Error creating mask duplicate" );
+                        CleanupStack::PopAndDestroy( newBitmap );
+                        delete newMask;
+                        newMask = NULL;
+                        }
+                    }
+                else
+                    {
+                    delete newBitmap;
+                    newBitmap = NULL;
+                    
+                    aIconArray->AppendL( AknsUtils::CreateGulIconL( 
+                        skinInstance, 
+                        KAknsIIDDefault,
+                        iconsFileName,
+                        EMbmCscQgn_prop_set_service, 
+                        EMbmCscQgn_prop_set_service ) );  
+                    }
+                
+                CleanupStack::PopAndDestroy( mask );
+                CleanupStack::PopAndDestroy( bitmap );
+                }
+            }
+        }
+             
+    CSCDEBUG( "CCSCServiceContainer::SetIconsL - end" );
+    }    
+
+
+// ---------------------------------------------------------------------------
+// CCSCServiceContainer::ResetAndDestroy
+// ---------------------------------------------------------------------------
+//
+void CCSCServiceContainer::ResetAndDestroy( TAny* aArray )
+    {
+    CSCDEBUG( "CCSCServiceContainer::ResetAndDestroy - end" );	
+    
+    if ( aArray )
+        {
+        RImplInfoPtrArray* array = 
+            reinterpret_cast<RImplInfoPtrArray*>( aArray );
+        array->ResetAndDestroy();
+        }
+    
+    CSCDEBUG( "CCSCServiceContainer::ResetAndDestroy - end" );
+    }
+