diff -r c743ef5928ba -r f966699dea19 idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp --- a/idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp Tue Feb 02 00:04:13 2010 +0200 +++ b/idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp Fri Feb 19 22:42:37 2010 +0200 @@ -17,8 +17,12 @@ // System includes #include +#include +#include +#include // User includes +#include #include "xnappuiadapter.h" #include "xncomposer.h" #include "xnodtparser.h" @@ -29,11 +33,9 @@ #include "xnviewdata.h" #include "xnviewmanager.h" #include "xnoomsyshandler.h" +#include "xnpanic.h" // Constants -_LIT8( KStateWaitConfirmation, "WaitForConfirmation" ); -_LIT8( KStateConfirmed, "Confirmed" ); -_LIT8( KStateError, "Error" ); // ============================ LOCAL FUNCTIONS ================================ @@ -73,8 +75,6 @@ { // Plugin data is removable by default iFlags.Set( EIsRemovable ); - // Assume plugins ready - iFlags.Set( EIsDataPluginsReady ); } // ----------------------------------------------------------------------------- @@ -86,8 +86,6 @@ : iParent( NULL ), iManager( aManager ) { // This constructor overload is used by CXnRootData - // Assume plugins are ready - iFlags.Set( EIsDataPluginsReady ); } // ----------------------------------------------------------------------------- @@ -97,8 +95,6 @@ // CXnPluginData::~CXnPluginData() { - RevertPluginState(); - if ( iLoader ) { iLoader->Cancel(); @@ -120,62 +116,48 @@ } // ----------------------------------------------------------------------------- -// CXnPluginData::LoadL() +// CXnPluginData::Load() // ----------------------------------------------------------------------------- // -void CXnPluginData::LoadL() +TInt CXnPluginData::Load() { - if ( Occupied() || PluginState().CompareF( KStateError ) == 0 ) + if ( Occupied() ) { - return; + return KErrInUse; } if ( !CXnOomSysHandler::HeapAvailable( WIDGET_MIN_MEM ) ) - { - ViewManager().OomSysHandler().HandlePotentialOomL(); - return; + { + return KErrNoMemory; } iFlags.Clear( EIsEmpty ); iFlags.Set( EIsRemovable ); + + TInt err( KErrNone ); - TRAPD( error, - - if ( iManager.Composer().ComposeWidgetL( *this ) == KErrNone ) - { - iManager.Parser().LoadWidgetL( *this ); - } - ); - - if ( Empty() ) + TRAP( err, err = iManager.Composer().ComposeWidgetL( *this ) ); + + if ( err == KErrNone ) { - // All done - return; + TRAP( err, iManager.Parser().LoadWidgetL( *this ) ); } - if ( error || !Occupied() ) + if ( err == KErrNone ) { - if( error == KErrNoMemory ) - { - ViewManager().OomSysHandler().HandlePotentialOomL(); - } + // Mark publishers as virgin + iVirginPublishers = ETrue; - // Mark this plugin ready, View Manager will remove it - DataPluginsLoadCompletedL( KErrGeneral ); + // Succesfully composed, try schedule publishers' loading + LoadPublishers(); } - else - { - if ( Active() ) - { - // Load data plugins will set confirmation state to "wait" - LoadDataPluginsL(); - } - else - { - // Composed succesfully to inactive page. Set confirmed - SetPluginStateL( KStateConfirmed ); - } - } + else if ( err == KXnErrPluginFailure ) + { + // Widget's configuration is broken, remove it + TRAP_IGNORE( iManager.UnloadWidgetFromPluginL( *this, ETrue ) ); + } + + return err; } // ----------------------------------------------------------------------------- @@ -186,112 +168,137 @@ { if ( Occupied() ) { - TRAP_IGNORE( - DestroyDataPluginsL(); - iManager.Parser().DestroyWidgetL( *this ); - ); + DestroyPublishers(); + + TRAP_IGNORE( iManager.Parser().DestroyWidgetL( *this ) ); } Flush(); } // ----------------------------------------------------------------------------- -// CXnPluginData::LoadDataPluginsL +// CXnPluginData::LoadPublishers // Loads data plugins associated to the plugin // ----------------------------------------------------------------------------- // -void CXnPluginData::LoadDataPluginsL() +void CXnPluginData::LoadPublishers() { - if ( !Active() || !Occupied() ) - { - iFlags.Set( EIsDataPluginsReady ); - + if ( !Active() || !Occupied() || iContentSourceNodes.Count() == 0 ) + { return; } - if ( iContentSourceNodes.Count() == 0 ) - { - DataPluginsLoadCompletedL( KErrNone ); - } - else + iLoader->Cancel(); + + iLoader->Start( TTimeIntervalMicroSeconds32( 50 ), + TTimeIntervalMicroSeconds32( 50 ), + TCallBack( PeriodicEventL, this ) ); + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::PeriodicEventL() +// +// ----------------------------------------------------------------------------- +// +/* static */ TInt CXnPluginData::PeriodicEventL( TAny* aAny ) + { + CXnPluginData* self = static_cast< CXnPluginData* >( aAny ); + + self->iLoader->Cancel(); + + TInt reason( EAiFwPluginStartup ); + + if ( self->LoadPublishers( reason ) != KErrNone ) { - iLoader->Cancel(); + self->iManager.UnloadWidgetFromPluginL( *self, ETrue ); - iFlags.Clear( EIsDataPluginsReady ); - - iLoadIndex = 0; - - iLoader->Start( TTimeIntervalMicroSeconds32( 0 ), - TTimeIntervalMicroSeconds32( 0 ), - TCallBack( RunL, this ) ); - } + self->ShowContentRemovedError(); + } + + return KErrNone; } // ----------------------------------------------------------------------------- -// CXnPluginData::DataPluginsLoadCompletedL -// Indicates that all data plugins are loaded +// CXnPluginData::LoadPublishers() +// // ----------------------------------------------------------------------------- // -void CXnPluginData::DataPluginsLoadCompletedL( TInt aStatus ) - { - iFlags.Set( EIsDataPluginsReady ); +TInt CXnPluginData::LoadPublishers( TInt aReason ) + { + TInt err( KErrNone ); - const TDesC8& state( aStatus == KErrNone - ? KStateConfirmed() : KStateError() ); + TRAP( err, + for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ ) + { + CXnNodeAppIf& plugin( iContentSourceNodes[i]->AppIfL() ); + + TInt retval( + iManager.AppUiAdapter().LoadPublisher( plugin, aReason ) ); + + if ( !err ) + { + err = retval; + } + } + ); + + iVirginPublishers = EFalse; - SetPluginStateL( state ); - - iManager.SetDataPluginLoadCompleteL( *this ); + if ( !Removable() ) + { + // Not allowed to remove even it fails + return KErrNone; + } + + return err; } // ----------------------------------------------------------------------------- -// CXnPluginData::DataPluginsLoaded -// Queries whether all data plugins are loaded -// ----------------------------------------------------------------------------- -// -TBool CXnPluginData::DataPluginsLoaded() const - { - return ( iFlags.IsSet( EIsDataPluginsReady ) ? ETrue : EFalse ); - } - -// ----------------------------------------------------------------------------- -// CXnPluginData::DestroyDataPluginsL +// CXnPluginData::DestroyPublishers // Remove data plugins associated to the plugin // ----------------------------------------------------------------------------- // -void CXnPluginData::DestroyDataPluginsL() +void CXnPluginData::DestroyPublishers() { if ( Occupied() ) { - iFlags.Set( EIsDataPluginsReady ); - - if ( iLoader->IsActive() ) - { - // Not all plugins loaded yet - iLoader->Cancel(); - - RevertPluginState(); - } + // If not all plugins loaded yet + iLoader->Cancel(); - // 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 ); + TRAP_IGNORE( DoDestroyPublishersL() ); User::Heap().Compress(); } } // ----------------------------------------------------------------------------- +// CXnPluginData::VirginPublishers +// +// ----------------------------------------------------------------------------- +// +TBool CXnPluginData::VirginPublishers() const + { + return iVirginPublishers; + } + +// ----------------------------------------------------------------------------- +// CXnPluginData::DoDestroyPublishersL +// Remove data plugins associated to the plugin +// ----------------------------------------------------------------------------- +// +void CXnPluginData::DoDestroyPublishersL() + { + for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ ) + { + CXnNodeAppIf& plugin( iContentSourceNodes[i]->AppIfL() ); + + // Destruction is synchronous + iManager.AppUiAdapter().DestroyPublisher( + plugin, EAiFwPluginShutdown ); + } + } + +// ----------------------------------------------------------------------------- // CXnPluginData::SetConfigurationIdL() // ----------------------------------------------------------------------------- // @@ -379,38 +386,6 @@ } // ----------------------------------------------------------------------------- -// 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() // ----------------------------------------------------------------------------- // @@ -540,12 +515,9 @@ iFlags.ClearAll(); // This is default - iFlags.Set( EIsRemovable ); - iFlags.Set( EIsDataPluginsReady ); + iFlags.Set( EIsRemovable ); iNode = NULL; - - iLoadIndex = 0; delete iConfigurationId; iConfigurationId = NULL; @@ -562,9 +534,6 @@ delete iPluginType; iPluginType = NULL; - delete iPluginState; - iPluginState = NULL; - delete iPublisherName; iPublisherName = NULL; @@ -624,8 +593,7 @@ // ----------------------------------------------------------------------------- // void CXnPluginData::SetIsDisplayingPopup ( TBool aVisible, CXnNode* aNode ) - { - + { if ( aVisible ) { iPopupNodes.InsertInAddressOrder( aNode ); @@ -633,6 +601,7 @@ else { TInt index( iPopupNodes.Find( aNode ) ); + if ( index != KErrNotFound ) { iPopupNodes.Remove( index ); @@ -640,7 +609,6 @@ } } - //------------------------------------------------------------------------------ // CXnPluginData::IsDisplayingPopup() // @@ -651,42 +619,42 @@ return ( iPopupNodes.Count() > 0 ); } -// ----------------------------------------------------------------------------- -// CXnPluginData::RunL() -// -// ----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// CXnPluginData::ShowContentRemovedError() // -/* static */ TInt CXnPluginData::RunL( TAny* aAny ) +//------------------------------------------------------------------------------ +// +void CXnPluginData::ShowContentRemovedError() { - CXnPluginData* self = static_cast< CXnPluginData* >( aAny ); - - self->iLoader->Cancel(); - - RPointerArray< CXnNodeAppIf >list; - CleanupClosePushL( list ); + TRAP_IGNORE( DoShowContentRemovedErrorL() ); + } - for ( TInt i = 0; i < self->iContentSourceNodes.Count(); i++ ) - { - list.AppendL( &self->iContentSourceNodes[i]->AppIfL() ); - } +//------------------------------------------------------------------------------ +// CXnPluginData::DoShowContentRemovedErrorL() +// +//------------------------------------------------------------------------------ +// +void CXnPluginData::DoShowContentRemovedErrorL() + { + HBufC* msg( StringLoader::LoadLC( R_QTN_HS_ERROR_WIDGETS_REMOVED ) ); - // State is "wait" until data plugins are loaded - self->SetPluginStateL( KStateWaitConfirmation ); - - TRAPD( err, self->iManager.AppUiAdapter().LoadDataPluginsL( list ) ); + CAknErrorNote* note = new ( ELeave ) CAknErrorNote; + CleanupStack::PushL( note ); + + note->ExecuteLD( *msg ); + + CleanupStack::Pop( note ); + CleanupStack::PopAndDestroy( msg ); + } - if ( err && self->Removable() ) - { - self->DataPluginsLoadCompletedL( err ); - } - else - { - self->DataPluginsLoadCompletedL( KErrNone ); - } - - CleanupStack::PopAndDestroy( &list ); - - return KErrNone; +//------------------------------------------------------------------------------ +// CXnPluginData::ShowOutOfMemErrorL() +// +//------------------------------------------------------------------------------ +// +void CXnPluginData::ShowOutOfMemError() + { + TRAP_IGNORE( ViewManager().OomSysHandler().HandlePotentialOomL() ); } // End of file