diff -r 000000000000 -r f72a12da539e idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,692 @@ +/* +* Copyright (c) 2008 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: Data class to hold widget info +* +*/ + +// System includes +#include + +// User includes +#include "xnappuiadapter.h" +#include "xncomposer.h" +#include "xnodtparser.h" +#include "xnresource.h" +#include "xnodt.h" +#include "xnnode.h" +#include "xnplugindata.h" +#include "xnviewdata.h" +#include "xnviewmanager.h" +#include "xnoomsyshandler.h" + +// Constants +_LIT8( KStateWaitConfirmation, "WaitForConfirmation" ); +_LIT8( KStateConfirmed, "Confirmed" ); +_LIT8( KStateError, "Error" ); + +// ============================ LOCAL FUNCTIONS ================================ + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CXnPluginData::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnPluginData* CXnPluginData::NewL( CXnPluginData& aParent ) + { + CXnPluginData* self = CXnPluginData::NewLC( aParent ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnPluginData* CXnPluginData::NewLC( CXnPluginData& aParent ) + { + CXnPluginData* self = new ( ELeave ) CXnPluginData( aParent ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::CXnPluginData() +// C++ constructor +// ----------------------------------------------------------------------------- +// +CXnPluginData::CXnPluginData( CXnPluginData& aParent ) + : iParent( &aParent ), iManager( iParent->ViewManager() ) + { + // Plugin data is removable by default + iFlags.Set( EIsRemovable ); + // Assume plugins ready + iFlags.Set( EIsDataPluginsReady ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::CXnPluginData() +// C++ constructor +// ----------------------------------------------------------------------------- +// +CXnPluginData::CXnPluginData( CXnViewManager& aManager ) + : iParent( NULL ), iManager( aManager ) + { + // This constructor overload is used by CXnRootData + // Assume plugins are ready + iFlags.Set( EIsDataPluginsReady ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::~CXnPluginData() +// C++ default destructor. +// ----------------------------------------------------------------------------- +// +CXnPluginData::~CXnPluginData() + { + RevertPluginState(); + + if ( iLoader ) + { + iLoader->Cancel(); + } + + delete iLoader; + + Flush(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::ConstructL() +// 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CXnPluginData::ConstructL() + { + iLoader = CPeriodic::NewL( CActive::EPriorityUserInput ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::LoadL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::LoadL() + { + if ( Occupied() || PluginState().CompareF( KStateError ) == 0 ) + { + return; + } + + if ( !CXnOomSysHandler::HeapAvailable( WIDGET_MIN_MEM ) ) + { + ViewManager().OomSysHandler().HandlePotentialOomL(); + return; + } + + iFlags.Clear( EIsEmpty ); + iFlags.Set( EIsRemovable ); + + TRAPD( error, + + if ( iManager.Composer().ComposeWidgetL( *this ) == KErrNone ) + { + iManager.Parser().LoadWidgetL( *this ); + } + ); + + if ( Empty() ) + { + // All done + return; + } + + if ( error || !Occupied() ) + { + if( error == KErrNoMemory ) + { + ViewManager().OomSysHandler().HandlePotentialOomL(); + } + + // Mark this plugin ready, View Manager will remove it + DataPluginsLoadCompletedL( KErrGeneral ); + } + else + { + if ( Active() ) + { + // Load data plugins will set confirmation state to "wait" + LoadDataPluginsL(); + } + else + { + // Composed succesfully to inactive page. Set confirmed + SetPluginStateL( KStateConfirmed ); + } + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::Destroy() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::Destroy() + { + if ( Occupied() ) + { + TRAP_IGNORE( + DestroyDataPluginsL(); + iManager.Parser().DestroyWidgetL( *this ); + ); + } + + Flush(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::LoadDataPluginsL +// Loads data plugins associated to the plugin +// ----------------------------------------------------------------------------- +// +void CXnPluginData::LoadDataPluginsL() + { + if ( !Active() || !Occupied() ) + { + iFlags.Set( EIsDataPluginsReady ); + + return; + } + + if ( iContentSourceNodes.Count() == 0 ) + { + DataPluginsLoadCompletedL( KErrNone ); + } + else + { + iLoader->Cancel(); + + iFlags.Clear( EIsDataPluginsReady ); + + iLoadIndex = 0; + + iLoader->Start( TTimeIntervalMicroSeconds32( 0 ), + TTimeIntervalMicroSeconds32( 0 ), + TCallBack( RunL, this ) ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::DataPluginsLoadCompletedL +// Indicates that all data plugins are loaded +// ----------------------------------------------------------------------------- +// +void CXnPluginData::DataPluginsLoadCompletedL( TInt aStatus ) + { + iFlags.Set( EIsDataPluginsReady ); + + const TDesC8& state( aStatus == KErrNone + ? KStateConfirmed() : KStateError() ); + + SetPluginStateL( state ); + + iManager.SetDataPluginLoadCompleteL( *this ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::DataPluginsLoaded +// Queries whether all data plugins are loaded +// ----------------------------------------------------------------------------- +// +TBool CXnPluginData::DataPluginsLoaded() const + { + return ( iFlags.IsSet( EIsDataPluginsReady ) ? ETrue : EFalse ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::DestroyDataPluginsL +// Remove data plugins associated to the plugin +// ----------------------------------------------------------------------------- +// +void CXnPluginData::DestroyDataPluginsL() + { + if ( Occupied() ) + { + iFlags.Set( EIsDataPluginsReady ); + + if ( iLoader->IsActive() ) + { + // Not all plugins loaded yet + iLoader->Cancel(); + + RevertPluginState(); + } + + // Create list of data plugins to be removed + RPointerArray< CXnNodeAppIf > list; + CleanupClosePushL( list ); + + for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ ) + { + list.AppendL( &iContentSourceNodes[i]->AppIfL() ); + } + + // Destruction is synchronous + iManager.AppUiAdapter().DestroyDataPluginsL( list ); + + CleanupStack::PopAndDestroy( &list ); + + User::Heap().Compress(); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetConfigurationIdL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetConfigurationIdL( const TDesC8& aConfigurationId ) + { + delete iConfigurationId; + iConfigurationId = NULL; + + iConfigurationId = aConfigurationId.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPluginIdL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPluginIdL( const TDesC8& aPluginId ) + { + delete iPluginId; + iPluginId = NULL; + + iPluginId = aPluginId.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPluginUidL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPluginUidL( const TDesC8& aPluginUid ) + { + delete iPluginUid; + iPluginUid = NULL; + + iPluginUid = aPluginUid.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPluginNameL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPluginNameL( const TDesC8& aPluginName ) + { + delete iPluginName; + iPluginName = NULL; + + iPluginName = aPluginName.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPublisherName () +// Set the publisher name +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPublisherNameL( const TDesC8& aPublisherName ) + { + delete iPublisherName; + iPublisherName = NULL; + + iPublisherName = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( aPublisherName ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPublisherName() +// Set the publisher name +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPublisherNameL( const TDesC& aPublisherName ) + { + delete iPublisherName; + iPublisherName = NULL; + + iPublisherName = aPublisherName.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPluginTypeL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPluginTypeL( const TDesC8& aPluginType ) + { + delete iPluginType; + iPluginType = NULL; + + iPluginType = aPluginType.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetPluginStateL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetPluginStateL( const TDesC8& aPluginState ) + { + if ( PluginState().CompareF( aPluginState ) != 0 ) + { + delete iPluginState; + iPluginState = NULL; + + iPluginState = aPluginState.AllocL(); + + // Tell new state to HSPS as well + iManager.UpdatePluginStateL( *this ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::RevertPluginState() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::RevertPluginState() + { + // Need to change state if it is not error + if ( Occupied() && PluginState().CompareF( KStateError ) != 0 ) + { + // For now on it is confirmed + TRAP_IGNORE( SetPluginStateL( KStateConfirmed ) ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetResources() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetResources( CArrayPtrSeg< CXnResource >* aResources ) + { + if ( iResources ) + { + iResources->ResetAndDestroy(); + + delete iResources; + iResources = NULL; + } + + iResources = aResources; + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::ResourcesL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::ResourcesL( CArrayPtrSeg< CXnResource >& aList ) const + { + for ( TInt i = 0; iResources && i < iResources->Count(); i++ ) + { + aList.AppendL( iResources->At(i) ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetControlL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetControlL( CXnNode* aNode ) + { + CXnControlAdapter* control( aNode->Control() ); + + if ( control ) + { + User::LeaveIfError( iControls.InsertInAddressOrder( control ) ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::ControlsL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::ControlsL( RPointerArray< CXnControlAdapter >& aList ) const + { + for ( TInt i = 0; i < iControls.Count(); i++ ) + { + aList.AppendL( iControls[i] ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetContentSourceNodeL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetContentSourceNodeL( CXnNode* aNode ) + { + User::LeaveIfError( iContentSourceNodes.InsertInAddressOrder( aNode ) ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::ContentSourceNodesL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::ContentSourceNodesL( RPointerArray< CXnNode >& aList ) const + { + for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ ) + { + aList.AppendL( iContentSourceNodes[i] ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetAppearanceNodeL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetAppearanceNodeL( CXnNode* aNode ) + { + User::LeaveIfError( iAppearanceNodes.InsertInAddressOrder( aNode ) ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::AppearanceNodesL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::AppearanceNodesL( RPointerArray< CXnNode >& aList ) const + { + for ( TInt i = 0; i < iAppearanceNodes.Count(); i++ ) + { + aList.AppendL( iAppearanceNodes[i] ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetInitialFocusNodeL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetInitialFocusNodeL( CXnNode* aNode ) + { + User::LeaveIfError( iInitialFocusNodes.InsertInAddressOrder( aNode ) ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::InitialFocusNodesL() +// ----------------------------------------------------------------------------- +// +void CXnPluginData::InitialFocusNodesL( RPointerArray< CXnNode >& aList ) const + { + for ( TInt i = 0; i < iInitialFocusNodes.Count(); i++ ) + { + aList.AppendL( iInitialFocusNodes[i] ); + } + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::Flush() +// Flushes this plugins data +// ----------------------------------------------------------------------------- +// +void CXnPluginData::Flush() + { + // Don't touch to iOwner, because this plugin might be reused later + + iFlags.ClearAll(); + + // This is default + iFlags.Set( EIsRemovable ); + iFlags.Set( EIsDataPluginsReady ); + + iNode = NULL; + + iLoadIndex = 0; + + delete iConfigurationId; + iConfigurationId = NULL; + + delete iPluginId; + iPluginId = NULL; + + delete iPluginUid; + iPluginUid = NULL; + + delete iPluginName; + iPluginName = NULL; + + delete iPluginType; + iPluginType = NULL; + + delete iPluginState; + iPluginState = NULL; + + delete iPublisherName; + iPublisherName = NULL; + + if ( iResources ) + { + iResources->ResetAndDestroy(); + delete iResources; + iResources = NULL; + } + + iControls.Reset(); + iContentSourceNodes.Reset(); + iAppearanceNodes.Reset(); + iInitialFocusNodes.Reset(); + iPopupNodes.Reset(); + iPluginsData.ResetAndDestroy(); + + User::Heap().Compress(); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::Empty() +// +// ----------------------------------------------------------------------------- +// +TBool CXnPluginData::Empty() const + { + return ( iFlags.IsSet( EIsEmpty ) ? ETrue : EFalse ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetEmpty() +// +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetEmptyL( const TDesC8& aPluginId ) + { + if ( Occupied() ) + { + User::Leave( KErrInUse ); + } + + HBufC8* id( aPluginId.AllocL() ); + + Flush(); + + // Takes ownership + iPluginId = id; + + iFlags.Set( EIsEmpty ); + iFlags.Clear( EIsRemovable ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::SetIsDisplayingPopup() +// +// ----------------------------------------------------------------------------- +// +void CXnPluginData::SetIsDisplayingPopup ( TBool aVisible, CXnNode* aNode ) + { + + if ( aVisible ) + { + iPopupNodes.InsertInAddressOrder( aNode ); + } + else + { + TInt index( iPopupNodes.Find( aNode ) ); + if ( index != KErrNotFound ) + { + iPopupNodes.Remove( index ); + } + } + } + + +//------------------------------------------------------------------------------ +// CXnPluginData::IsDisplayingPopup() +// +//------------------------------------------------------------------------------ +// +TBool CXnPluginData::IsDisplayingPopup() const + { + return ( iPopupNodes.Count() > 0 ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::RunL() +// +// ----------------------------------------------------------------------------- +// +/* static */ TInt CXnPluginData::RunL( TAny* aAny ) + { + CXnPluginData* self = static_cast< CXnPluginData* >( aAny ); + + self->iLoader->Cancel(); + + RPointerArray< CXnNodeAppIf >list; + CleanupClosePushL( list ); + + for ( TInt i = 0; i < self->iContentSourceNodes.Count(); i++ ) + { + list.AppendL( &self->iContentSourceNodes[i]->AppIfL() ); + } + + // State is "wait" until data plugins are loaded + self->SetPluginStateL( KStateWaitConfirmation ); + + TRAPD( err, self->iManager.AppUiAdapter().LoadDataPluginsL( list ) ); + + if ( err && self->Removable() ) + { + self->DataPluginsLoadCompletedL( err ); + } + else + { + self->DataPluginsLoadCompletedL( KErrNone ); + } + + CleanupStack::PopAndDestroy( &list ); + + return KErrNone; + } + +// End of file