diff -r 8ee96d21d9bf -r 7e0eff37aedb gssettingsuis/Gs/GSFramework/src/GSShimmedView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gssettingsuis/Gs/GSFramework/src/GSShimmedView.cpp Wed Sep 01 12:20:44 2010 +0100 @@ -0,0 +1,318 @@ +/* +* Copyright (c) 2006-1008 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: Shim view +* +*/ + +#include "GSShimmedView.h" + +// System includes +#include +#include + +// User includes +#include "GSPluginAndViewIdCache.h" +#include +#include +#include + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------------------------- +// CGSShimmedView::CGSShimmedView +// +// +// ---------------------------------------------------------------------------- +// +CGSShimmedView::CGSShimmedView( TUid aViewId, + CGSPluginAndViewIdCache& aCache, + CCoeAppUi& aAppUi ) +: CActive( KMaxTInt ), iViewId( aViewId ), iCache( aCache ), iAppUi( aAppUi ) + { + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::~CGSShimmedView +// +// +// ---------------------------------------------------------------------------- +// +CGSShimmedView::~CGSShimmedView() + { + Cancel(); + DeregisterView(); + iCache.HandleShimDestruction( iViewId ); + delete iCustomMessage; + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::ConstructL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::ConstructL() + { + RegisterViewL(); + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::NewLC +// +// +// ---------------------------------------------------------------------------- +// +CGSShimmedView* CGSShimmedView::NewLC( TUid aViewId, + CGSPluginAndViewIdCache& aCache, + CCoeAppUi& aAppUi ) + { + CGSShimmedView* self = new(ELeave) CGSShimmedView( aViewId, aCache, aAppUi ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::ViewId +// +// +// ---------------------------------------------------------------------------- +// +TVwsViewId CGSShimmedView::ViewId() const + { + const TVwsViewId ret( KUidGS, iViewId ); + return ret; + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::ViewActivatedL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::ViewActivatedL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + const TBool isLoaded = iCache.IsPluginLoaded( iViewId ); + if ( isLoaded == EFalse ) + { + HBufC8* customMessage = aCustomMessage.AllocL(); + delete iCustomMessage; + iCustomMessage = customMessage; + + iCustomMessageId = aCustomMessageId; + + iCache.SetPriorToPlaceholderActiveViewId( aPrevViewId ); + SetState( EStateActivatingPlaceholderView ); + } + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::ViewDeactivated +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::ViewDeactivated() + { + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::RunL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::RunL() + { + // NB: At this point, we are the active view. + + switch( iState ) + { + default: + case EStateInactive: + break; + + case EStateActivatingPlaceholderView: + StateActivatePlaceholderViewL(); + break; + + case EStateLoadingPlugin: + StateLoadPluginL(); + break; + + case EStateDeletingSelf: + SetState( EStateInactive, EFalse ); + delete this; + break; + } + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::RegisterViewL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::RegisterViewL() + { + iAppUi.RegisterViewL( *this ); + iIsRegistered = ETrue; + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::DeregisterView +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::DeregisterView() + { + if ( iIsRegistered ) + { + iAppUi.DeregisterView( *this ); + } + iIsRegistered = EFalse; + } + + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::DoCancel +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::DoCancel() + { + // Nothing to do here - requests already completed + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::SetState +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::SetState( TState aState, TBool aCompleteRequest ) + { + Cancel(); + // + iState = aState; + // + if ( aCompleteRequest ) + { + if ( !IsAdded() ) + { + // Add only on-demand to avoid cluttering the scheduler + CActiveScheduler::Add( this ); + } + + // Complete ourselves to continue activation process asynchronously + // via RunL(). + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + } + + +// ---------------------------------------------------------------------------- +// CGSShimmedView::StateActivatePlaceholderViewL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::StateActivatePlaceholderViewL() + { + iCache.ActivatePlaceholderViewL(); + SetState( EStateLoadingPlugin ); + } + + +//Disabling warning caused by err variable used inside macros +#pragma diag_suppress 550 +// ---------------------------------------------------------------------------- +// CGSShimmedView::StateLoadPluginL +// +// +// ---------------------------------------------------------------------------- +// +void CGSShimmedView::StateLoadPluginL() + { + CAknViewAppUi& appUi = static_cast< CAknViewAppUi& >( iAppUi ); + + // As a fall back, we'll try to activate the view that was being + // displayed prior to us attempting to load a plugin. + TUid viewIdToActivate = iCache.PriorToPlaceholderActiveViewId().iViewUid; + + // Get the implementation uid that contains this view. + const TUid impUid = iCache.PluginImplementationUidForView( iViewId ); + + if ( impUid != KNullUid ) + { + CGSPluginLoader* loader = CGSPluginLoader::NewL( &appUi ); + CleanupStack::PushL( loader ); + + // Now try to load the specific instance of the GS plugin that + // implements the real view's concrete implementation. + // + // Since the act of loading a plugin will also attempt to register + // that plugin with the app ui (since a GS plugin "is a" view) we + // must first unregister the shim view. If there was an error + // loading the plugin, then we'll re-register the shim. + DeregisterView(); + + CGSPluginInterface* plugin = NULL; + TRAPD( loadError, plugin = &loader->LoadSyncL( KGSPluginInterfaceUid, impUid ) ); + CleanupStack::PopAndDestroy( loader ); + + if ( loadError == KErrNone ) + { + // .. and set us up to activate the newly loaded plugin view. + viewIdToActivate = iViewId; + + // Set ourselves up to be destroyed in the next RunL callback + SetState( EStateDeletingSelf ); + } + else + { + // Didn't manage to load plugin. Re-register the view + // and bail out. + SetState( EStateInactive, EFalse ); + RegisterViewL(); + } + } + + appUi.ActivateLocalViewL( viewIdToActivate, iCustomMessageId, *iCustomMessage ); + } +//Enabling warnings +#pragma diag_default 550 + + + + + +// End of File