/*
* 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
*
*/


#include <csc.rsg>
#include <eikclb.h>
#include <apgcli.h> 
#include <hlplch.h>
#include <featmgr.h>
#include <aknview.h>
#include <akntitle.h>
#include <aknlists.h>
#include <cchclient.h>
#include <AknsUtils.h>
#include <StringLoader.h>
#include <cscsettingsui.h>
#include <xSPViewServices.h>
#include <AiwServiceHandler.h>
#include <mspnotifychangeobserver.h>

#include "csc.hrh"
#include "cscappui.h"
#include "csclogger.h"
#include "cscdialog.h"
#include "cscconstants.h"
#include "cscserviceview.h"
#include "cscnoteutilities.h"
#include "cscengcchhandler.h"
#include "cscservicecontainer.h"
#include "cscengstartuphandler.h"
#include "cscengservicehandler.h"
#include "cscengbrandinghandler.h"
#include "cscengservicepluginhandler.h"
#include "cscenguiextensionpluginhandler.h"



// ======== MEMBER FUNCTIONS ========

const TUid KAIAppUid = { 0x102750F0 }; // active idle app uid

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CCSCServiceView::CCSCServiceView( 
    CCSCEngServicePluginHandler& aServicePluginHandler,
    CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler,
    CCSCEngStartupHandler& aStartupHandler,
    CCSCEngServiceHandler& aServiceHandler,
    CCSCEngBrandingHandler& aBrandingHandler,
    CCSCEngCCHHandler& aCCHHandler )
    :
    iServicePluginHandler( aServicePluginHandler ),
    iUiExtensionPluginHandler( aUiExtensionPluginHandler ),
    iStartupHandler( aStartupHandler ),
    iServiceHandler( aServiceHandler ),
    iBrandingHandler( aBrandingHandler ),
    iCCHHandler( aCCHHandler ),
    iStartup( ETrue )
    {
    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CCSCServiceView::ConstructL()
    {
    CSCDEBUG( "CCSCServiceView::ConstructL - begin" );
    
    BaseConstructL( R_CSC_VIEW_SERVICE );
    iSettingsUi = CCSCSettingsUi::NewL( *iEikonEnv );
                     
    CSCDEBUG( "CCSCServiceView::ConstructL - end" );
    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//      
CCSCServiceView* CCSCServiceView::NewL( 
    CCSCEngServicePluginHandler& aServicePluginHandler,
    CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler,
    CCSCEngStartupHandler& aStartupHandler,
    CCSCEngServiceHandler& aServiceHandler,
    CCSCEngBrandingHandler& aBrandingHandler,
    CCSCEngCCHHandler& aCCHHandler )
    {
    CCSCServiceView* self = 
        CCSCServiceView::NewLC( 
            aServicePluginHandler, 
            aUiExtensionPluginHandler, 
            aStartupHandler,
            aServiceHandler,
            aBrandingHandler,
            aCCHHandler );
    
    CleanupStack::Pop( self );
    return self;
    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CCSCServiceView* CCSCServiceView::NewLC( 
    CCSCEngServicePluginHandler& aServicePluginHandler,
    CCSCEngUiExtensionPluginHandler& aUiExtensionPluginHandler,
    CCSCEngStartupHandler& aStartupHandler,
    CCSCEngServiceHandler& aServiceHandler,
    CCSCEngBrandingHandler& aBrandingHandler,
    CCSCEngCCHHandler& aCCHHandler )
    {
    CCSCServiceView* self = 
        new( ELeave ) CCSCServiceView( 
            aServicePluginHandler, 
            aUiExtensionPluginHandler, 
            aStartupHandler,
            aServiceHandler,
            aBrandingHandler,
            aCCHHandler );
    
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CCSCServiceView::~CCSCServiceView()
    {
    CSCDEBUG( "CCSCServiceView::~CCSCServiceView - begin" );
    
    iOfferedPluginUids.Reset();
    
    delete iSettingsUi;
    delete iContainer;
    delete iEngTimer;
    
    CSCDEBUG( "CCSCServiceView::~CCSCServiceView - end" );
    }


// ---------------------------------------------------------------------------
// CCSCServiceView::InitializeWithStartupParametersL
// ---------------------------------------------------------------------------
//
void CCSCServiceView::InitializeWithStartupParametersL()
    {
    CSCDEBUG( "CCSCServiceView::InitializeWithStartupParametersL" );
    
    CCSCEngStartupHandler::TAction action = iStartupHandler.GetParamAction();
    TBool isServiceViewDefault = 
        CCSCEngStartupHandler::EOpenSettingsUi != action;
    TUint serviceId = iStartupHandler.GetParamServiceId();
    TUid tabViewId( KNullUid );
    tabViewId.iUid = iServiceHandler.ServiceTabViewIdL( serviceId );
    iSettingsUi->InitializeL( 
        tabViewId, serviceId, isServiceViewDefault ? this : NULL );
    }


// ---------------------------------------------------------------------------
// From class CAknView.
// Handles the commands. If the command is command which is require to
// display outline-screen, the command display outline-screen
// corresponded to required.
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::HandleCommandL( TInt aCommand )
    {
    CSCDEBUG2( "CCSCServiceView::HandleCommandL aCommand: %d", aCommand );
        
    switch ( aCommand )
        {
        case EAknSoftkeyOpen:
        case ECSCCmdOpen:
        case EAknSoftkeySelect:
            HandleListboxItemOpenL();
            break;
        case ECSCCommandDelete:
            iContainer->DeleteServiceL();
            break;
        case EAknCmdHelp:
            if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                CArrayFix<TCoeHelpContext>* buf = AppUi()->AppHelpContextL();
                HlpLauncher::LaunchHelpApplicationL(
                    iEikonEnv->WsSession(), buf );
                }
            break;         
        // Exit menu command.    
        case EAknSoftkeyExit:
        case EAknSoftkeyBack:
            AppUi()->HandleCommandL( EEikCmdExit );
            break;
        // Let appui handle other commands.    
        default:
            CSCDEBUG( "CCSCServiceView::HandleCommandL: !!DEFAULT!!" );
            AppUi()->HandleCommandL( aCommand );
            break;
        }
    }    
        

// ---------------------------------------------------------------------------
// From class CAknView.
// The ID of view.
// ---------------------------------------------------------------------------
// 
TUid CCSCServiceView::Id() const
    {
    return KCSCServiceViewId;
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Handle foreground event.
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::HandleForegroundEventL( TBool aForeground )
    {
    if ( aForeground )
        {
        ExecuteStartupActionsL( ETrue );
        }
    }


// ---------------------------------------------------------------------------
// For handling ui extension plug-in exits
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::HandleUiExtensionExitL()
    {
    CSCDEBUG( "CCSCServiceView::HandleUiExtensionExit - begin" );
    
    AppUi()->ActivateLocalViewL( KCSCServiceViewId );
    
    TUid appUid = iStartupHandler.GetParamAppUid();
                          
    if ( appUid.iUid )
        {
        // Open application matching uid
        RApaLsSession session;
        CleanupClosePushL( session );
        
        User::LeaveIfError(session.Connect());
 
        TFileName fileName;
        TThreadId threadId;

        User::LeaveIfError(
            session.StartDocument( fileName, appUid, threadId ) );
                
        CleanupStack::PopAndDestroy( &session );
                       
        // Reset startup parameter app uid
        iStartupHandler.ResetUid( CCSCEngStartupHandler::EAppUid );
        }
         
    CSCDEBUG( "CCSCServiceView::HandleUiExtensionExit - end" );
    }


// ---------------------------------------------------------------------------
// For updating service view
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::UpdateServiceViewL()
    {
    CSCDEBUG( "CCSCServiceView::UpdateServiceViewL - begin" );
    
    iContainer->UpdateServiceViewL();
    
    CSCDEBUG( "CCSCServiceView::UpdateServiceViewL - end" );
    }


// ---------------------------------------------------------------------------
// For deleting service.
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::DeleteServiceL( TUint serviceId )
    {
    CSCDEBUG( "CCSCServiceView::DeleteServiceL - begin" );
    
    TUid pluginUid( KNullUid );
    TInt32 servicePluginId( 0 );
    
    TRAPD( err, servicePluginId = 
        iServiceHandler.ServiceSetupPluginIdL( serviceId ) );
    
    if ( !err && servicePluginId )
        {
        pluginUid.iUid = servicePluginId;
        iContainer->HandleServicePluginRemovationL( pluginUid );
        }
    else
        {
        iContainer->DeleteServiceL();
        }
    
    CSCDEBUG( "CCSCServiceView::DeleteServiceL - end" );
    }

// ---------------------------------------------------------------------------
// Shows information about failed configuration.
// ---------------------------------------------------------------------------
//
void CCSCServiceView::ServiceConfiguringFailedL( TInt aIndex )
    {
    CSCDEBUG( "CCSCServiceView::ServiceConfiguringFailedL - begin" );
    
    TServicePluginInfo pluginInfo;
    
    if ( iServicePluginHandler.PluginCount( 
        CCSCEngServicePluginHandler::EInitialized ) > aIndex )
        {
        pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( aIndex );
        
        if ( pluginInfo.iProviderName.Length() )
            {
            CCSCNoteUtilities::ShowInformationNoteL( 
                CCSCNoteUtilities::ECSCUnableToConfigureNote, 
                    pluginInfo.iProviderName );
            }
        
        // Try to remove uncomplete settings by calling service setup plugin.
        iServicePluginHandler.DoRemovationL( pluginInfo.iPluginsUid, EFalse );
        }   
          
    AppUi()->ActivateLocalViewL( KCSCServiceViewId );
        
    CSCDEBUG( "CCSCServiceView::ServiceConfiguringFailedL - end" );    
    }
 
 
// ---------------------------------------------------------------------------
// Hides dialog wait note.
// ---------------------------------------------------------------------------
//
 void CCSCServiceView::HideDialogWaitNote()
    {
    if ( iContainer )
        {
        iContainer->HideDialogWaitNote();
        }
    }
   
// ---------------------------------------------------------------------------
// From class MEikListBoxObserver.
// For handling list box events.
// ---------------------------------------------------------------------------
//
void CCSCServiceView::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
                                           TListBoxEvent aEventType )
    {
    CSCDEBUG2( "CCSCServiceView::HandleListBoxEventL aEventType: %d",
        aEventType );
    
    switch( aEventType )
        {
        case EEventEnterKeyPressed:
        case EEventItemSingleClicked:
            HandleListboxItemOpenL();
            break;
        default:
            CSCDEBUG( "CCSCServiceView::HandleListBoxEventL !!DEFAULT!!" );
            break;
        }
    }


// ---------------------------------------------------------------------------
// From class MCSCServiceContainerObserver.
// Update softkey.
// ---------------------------------------------------------------------------
//
void CCSCServiceView::UpdateCbaL()
    {
    if( !Cba() )
       {
       return;
       }
    
    TInt commandId ( EAknSoftkeyOpen );
    HBufC* selectText = StringLoader::LoadLC( R_CSC_MSK_SELECT );
    HBufC* openText = StringLoader::LoadLC( R_CSC_MSK_OPEN );
    
    if( iContainer->CurrentItemIndex() >= 0 )
        {
        if( iContainer->ListBoxItem().iPluginUid != KAccountCreationPluginUID )
            {
            Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
                commandId, *openText );
            }
        else
            {
            commandId = EAknSoftkeySelect;
            Cba()->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition,
                commandId, *selectText );
            }
        }
    else
        {
        Cba()->MakeCommandVisibleByPosition( 
            CEikButtonGroupContainer::EMiddleSoftkeyPosition, EFalse );
        }
    
    Cba()->DrawDeferred();
    CleanupStack::PopAndDestroy( openText );
    CleanupStack::PopAndDestroy( selectText );
    }


// ---------------------------------------------------------------------------
// For handling listbox item opening
// ---------------------------------------------------------------------------
//
void CCSCServiceView::HandleListboxItemOpenL()
    {
    CSCDEBUG( "CCSCServiceView::HandleListboxItemOpen - begin" );

    TListBoxItem item = iContainer->ListBoxItem();
    
    switch ( item.iItemType )
        {
        case TListBoxItem::EUiExtension:
            {
            iUiExtensionPluginHandler.LaunchUiExtensionL( 
                item.iPluginUid, Id() );
            break;
            }
        case TListBoxItem::EGeneralService:
        case TListBoxItem::EServicePlugin:
            {
            iSettingsUi->InitializeL( Id(), item.iServiceId, this );
            iSettingsUi->LaunchSettingsUiL();
            break;
            }
        default:
            {
            User::Leave( KErrArgument );
            break;
            }       
        }
                       
    CSCDEBUG( "CCSCServiceView::HandleListboxItemOpen - end" );
    }

    
// ---------------------------------------------------------------------------
// For changing text in the title pane.
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::SetTitlePaneTextL() const
    {
    CSCDEBUG( "CCSCServiceView::SetTitlePaneTextL - begin" );
    
    CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
    
    CAknTitlePane* titlePane =
        static_cast<CAknTitlePane*> ( statusPane->ControlL(
            TUid::Uid( EEikStatusPaneUidTitle ) ) );
       
    HBufC* text = iEikonEnv->AllocReadResourceLC( R_CSC_SERVICE_VIEW_TITLE );
    titlePane->SetTextL( text->Des() );
    CleanupStack::PopAndDestroy( text );
        
    CSCDEBUG( "CCSCServiceView::SetTitlePaneTextL - end" );
    }


// ---------------------------------------------------------------------------
// Handle service configuration.
// ---------------------------------------------------------------------------
// 
TBool CCSCServiceView::HandleServiceConfigurationL( TUid aUid )
    {
    CSCDEBUG( "CCSCServiceView::HandleServiceConfigurationL" );
    
    TInt initializedCount( iServicePluginHandler.PluginCount( 
            CCSCEngServicePluginHandler::EInitialized ) );
    
    TBool canceled( EFalse );
    TServicePluginInfo pluginInfo;
    
    iUid = aUid;
    
    if ( KNullUid != aUid ) 
        {
        for ( TInt i( 0 ) ; i < initializedCount ; i++ )
            {            
            pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( i );
            
            if ( aUid == pluginInfo.iPluginsUid && !pluginInfo.iProvisioned )
                {                
                iStartupHandler.ResetUid( CCSCEngStartupHandler::EPluginUid );
                
                iOfferedPluginUids.Append( pluginInfo.iPluginsUid );
                
                iPluginInfo = pluginInfo;
                
                iNextPluginIndex = i;
                
                delete iEngTimer;
                iEngTimer = NULL;
                iEngTimer = CCSCEngTimer::NewL( *this );
                
                iEngTimer->StartTimer( CCSCEngTimer::ENoteDelayTimer );
                
                break;
                }
            }   
        
        }
    else
        {
        for ( TInt j( 0 ) ; j < initializedCount ; j++ )
            {            
            pluginInfo = iServicePluginHandler.ItemFromPluginInfoArray( j );                      
            
            if ( !pluginInfo.iProvisioned )
                {   
                iOfferedPluginUids.Append( pluginInfo.iPluginsUid );
                
                iPluginInfo = pluginInfo;
                
                iNextPluginIndex = j;
                
                delete iEngTimer;
                iEngTimer = NULL;
                iEngTimer = CCSCEngTimer::NewL( *this );

                iEngTimer->StartTimer( CCSCEngTimer::ENoteDelayTimer );
                
                break;
                }
            }
        }
    
    return canceled;
    }


// ---------------------------------------------------------------------------
// Executes startup actions based on startup parameters.
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::ExecuteStartupActionsL( 
        TBool aForeGroundEvent, 
        TBool aLaunchedFromAi )
    {
    CSCDEBUG( "CCSCServiceView::ExecuteStartupActionsL - begin" );
    
    CCSCEngStartupHandler::TAction action = iStartupHandler.GetParamAction();
    TUid pluginUid = iStartupHandler.GetParamPluginUid();
    TUint serviceId = iStartupHandler.GetParamServiceId();
    
    switch( action )
        {
        case  CCSCEngStartupHandler::EAddSetupPluginService:
            {
            if ( KNullUid != pluginUid )
                {
                HandleServiceConfigurationL( pluginUid );
                }           
            break;
            }
        case  CCSCEngStartupHandler::ERemoveSetupPluginService:
            {
            if ( KNullUid != pluginUid && !aForeGroundEvent )
                {
                TRAPD( err, iContainer->HandleServicePluginRemovationL( 
                        pluginUid ) );
                
                // If error in service plugin removal, close csc.
                if ( err )
                    {
                    AppUi()->RunAppShutter();
                    }
                }
            break;
            }
        case  CCSCEngStartupHandler::EOpenUiExtension:
            {
            if ( KNullUid != pluginUid )
                {
                TRAP_IGNORE( 
                    iUiExtensionPluginHandler.LaunchUiExtensionL( 
                        pluginUid, Id(), aLaunchedFromAi ) );
                              
                iStartupHandler.ResetUid( 
                    CCSCEngStartupHandler::EPluginUid );
                }
            break;
            }
        case  CCSCEngStartupHandler::EOpenSettingsUi:
            {
            if ( serviceId )
                {
                TUid tabview( KNullUid );
                tabview.iUid = iServiceHandler.ServiceTabViewIdL( serviceId );
                iSettingsUi->InitializeL( tabview, serviceId, NULL );
                iSettingsUi->LaunchSettingsUiL();
                iStartupHandler.ResetServiceId();
                }
            break;
            }
        // Default action is to check unprovisioned service setup plugins.    
        default:
            {
            TInt initializedCount( iServicePluginHandler.PluginCount( 
                CCSCEngServicePluginHandler::EInitialized ) );
                          
             for ( TInt i( 0 ) ; i < initializedCount ; i++ )
                 {
                 TBool alreadyOffered( EFalse );
                        
                 TServicePluginInfo pluginInfo = 
                     iServicePluginHandler.ItemFromPluginInfoArray( i );
                        
                 for ( TInt j( 0 ); j < iOfferedPluginUids.Count() ; j++ )
                     {
                     if ( pluginInfo.iPluginsUid == iOfferedPluginUids[ j ] )
                         {
                         alreadyOffered = ETrue;
                         break;
                         }
                     }
                        
                 if ( !pluginInfo.iProvisioned && !alreadyOffered )
                     {                
                     TBool canceled = HandleServiceConfigurationL( 
                         pluginInfo.iPluginsUid );
                            
                     if ( !canceled )
                         {                    
                         break;
                         }
                     }
                 }
            break;
            }
        }
    
    CSCDEBUG( "CCSCServiceView::ExecuteStartupActionsL - end" );
    }


// ---------------------------------------------------------------------------
// From class CAknView.
// Dynamically initializes the contents of the menu list
// ---------------------------------------------------------------------------
// 
void CCSCServiceView::DynInitMenuPaneL( TInt aResourceId, 
                                        CEikMenuPane* aMenuPane )
    {
    CSCDEBUG( "CCSCServiceView::DynInitMenuPaneL - begin" );
    
    if ( R_CSC_SERVICEVIEW_MENU == aResourceId && aMenuPane )
        {    
        TBool itemSpecificCommandsEnabled = 
            MenuBar()->ItemSpecificCommandsEnabled();
        
        if( ( iContainer->CurrentItemIndex() >= 0 ) &&
            itemSpecificCommandsEnabled )
            {
            if( iContainer->ListBoxItem().iPluginUid != 
                KAccountCreationPluginUID )
                {
                aMenuPane->SetItemDimmed( EAknSoftkeySelect, ETrue );
                aMenuPane->SetItemDimmed( EAknSoftkeyOpen, EFalse );
                }
            else
                {
                aMenuPane->SetItemDimmed( EAknSoftkeySelect, EFalse );
                aMenuPane->SetItemDimmed( EAknSoftkeyOpen, ETrue );
                }
            }
        else
            {
            aMenuPane->SetItemDimmed( EAknSoftkeySelect, ETrue );
            aMenuPane->SetItemDimmed( EAknSoftkeyOpen, ETrue );
            }

        // ===================================================================
        // Delete service menu option.
        // ===================================================================
        //        
        if ( !itemSpecificCommandsEnabled )
            {
            TInt index = iContainer->CurrentItemIndex();
            TPoint penDownPoint = iContainer->PenDownPoint();
            iContainer->ListBox().View()->XYPosToItemIndex( 
                penDownPoint, index );
            iContainer->SetCurrentIndex( index );
            }
                     
        if ( TListBoxItem::EUiExtension == 
            iContainer->ListBoxItem().iItemType )
            {
            aMenuPane->SetItemDimmed( ECSCCommandDelete, ETrue );
            aMenuPane->SetItemSpecific( ECSCCommandDelete, EFalse ); 
            }
        else
            {
            aMenuPane->SetItemDimmed( ECSCCommandDelete, EFalse );
            aMenuPane->SetItemSpecific( ECSCCommandDelete, ETrue );    
            }           
        }
        
    CSCDEBUG( "CCSCServiceView::DynInitMenuPaneL - end" );
    }

         
// ---------------------------------------------------------------------------
// From class CAknView.
// Creates the Container class object.
// ---------------------------------------------------------------------------
//
void CCSCServiceView::DoActivateL( const TVwsViewId& aPrevViewId,
                                   TUid /*aCustomMessageId*/,
                                   const TDesC8& /*aCustomMessage*/)
    {
    CSCDEBUG( "CCSCServiceView::DoActivateL - begin" );
              
    // Create container if it's not exists.
    if( !iContainer )
        {        
        iContainer = CCSCServiceContainer::NewL( 
                ClientRect(),
                *this,
                iServicePluginHandler, 
                iUiExtensionPluginHandler,
                iServiceHandler,
                iBrandingHandler,
                iCCHHandler );
                
        SetTitlePaneTextL();
        iContainer->SetMopParent( this );
        iContainer->SetListBoxObserver( this );
        iContainer->MakeVisible( ETrue );
        AppUi()->AddToStackL( *this, iContainer );
        iContainer->SetCurrentIndex( iCurrentIndex );
        }
     
    // Check startup parameters to see is there something to do with plugins.
    if ( iStartup )
        {
        iStartup = EFalse;        
        if ( KAIAppUid == aPrevViewId.iAppUid )
            {
            // launched from active idle
            iStartupHandler.SetStartedFromHomescreen( ETrue );
            }
        else
            {
            iStartupHandler.SetStartedFromHomescreen( EFalse );
            }
        }

    UpdateCbaL();
    
    CSCDEBUG( "CCSCServiceView::DoActivateL - end" );
    }


// ---------------------------------------------------------------------------
// From class CAknView.
// Deletes the Container class object.
// ---------------------------------------------------------------------------
//
void CCSCServiceView::DoDeactivate()
    {
    CSCDEBUG( "CCSCServiceView::DoDeactivate - begin" );
                    
    if ( iContainer )
        {
        iCurrentIndex = iContainer->CurrentItemIndex();
        AppUi()->RemoveFromStack( iContainer );
        delete iContainer; 
        iContainer = NULL;
        }
    
    CSCDEBUG( "CCSCServiceView::DoDeactivate - end" );
    }
	
	
// ---------------------------------------------------------------------------
// From class MCSCEngTimerObserver.
// CCSCServiceView::TimerExpired
// ---------------------------------------------------------------------------
//
void CCSCServiceView::TimerExpired()
    {
    CSCDEBUG( "CCSCServiceView::TimerExpired - begin" );
    
    iStartupHandler.ResetUid( CCSCEngStartupHandler::EPluginUid );
    iOfferedPluginUids.Append( iPluginInfo.iPluginsUid );
    
    CCSCNoteUtilities::TCSCNoteType 
        type = CCSCNoteUtilities::ECSCConfigureServiceQuery;
    
    if ( CCSCNoteUtilities::ShowCommonQueryL( 
       type, iPluginInfo.iProviderName ) )
       {        
       iServicePluginHandler.DoProvisioningL( 
               iPluginInfo.iPluginsUid, KCSCServiceViewId );
       }
   
    iNextPluginIndex++;
    TInt pluginCount = iServicePluginHandler.PluginCount( 
            CCSCEngServicePluginHandler::EInitialized );
    
    for ( ; iNextPluginIndex < pluginCount; iNextPluginIndex++ )
        {
        CSCDEBUG2( "CCSCServiceView::TimerExpired -iNextPluginIndex = %d",
            iNextPluginIndex );
        
        iPluginInfo =
            iServicePluginHandler.ItemFromPluginInfoArray( iNextPluginIndex );
        
        if ( KNullUid != iUid )
            {
            if ( iUid == iPluginInfo.iPluginsUid && !iPluginInfo.iProvisioned )
                {
                iEngTimer->StartTimer( CCSCEngTimer::ENoteDelayTimer );
                break;
                }
            }
        else
            {
            if ( !iPluginInfo.iProvisioned )
                {
                iEngTimer->StartTimer( CCSCEngTimer::ENoteDelayTimer );
                break;
                }
            }
        }
    CSCDEBUG( "CCSCServiceView::TimerExpired - end" );
    }
	
