diff -r c743ef5928ba -r f966699dea19 idlehomescreen/xmluirendering/uiengine/src/xnrootdata.cpp --- a/idlehomescreen/xmluirendering/uiengine/src/xnrootdata.cpp Tue Feb 02 00:04:13 2010 +0200 +++ b/idlehomescreen/xmluirendering/uiengine/src/xnrootdata.cpp Fri Feb 19 22:42:37 2010 +0200 @@ -39,7 +39,7 @@ #include "xnrootdata.h" // Constants -const TInt KScheduleInterval( 1000000 ); +const TInt KScheduleInterval( 2000000 ); // ============================ LOCAL FUNCTIONS ================================ @@ -130,109 +130,96 @@ iParser = CXnODTParser::NewL( iManager, *iEcomHandler ); - iLoadTimer = CPeriodic::NewL( CActive::EPriorityStandard ); - iDestroyTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + iLoadTimer = CPeriodic::NewL( CActive::EPriorityLow ); + iDestroyTimer = CPeriodic::NewL( CActive::EPriorityLow ); } // ----------------------------------------------------------------------------- -// CXnRootData::LoadL() +// CXnRootData::Load() // // ----------------------------------------------------------------------------- // -void CXnRootData::LoadL() +TInt CXnRootData::Load() { if ( Occupied() ) { - return; - } - - // Load application root configuration - TRAPD( error, - - iODT = iManager.Composer().ComposeRootL( *this ); - - if ( iODT ) - { - iManager.Parser().LoadRootL( *this, iApplicationUid ); - } - ); - - if ( !iODT || error || !Occupied() ) - { - // Can't recover - Panic( EXnInvalidConfiguration ); + return KErrInUse; } - RPointerArray< CXnViewData > failedPlugins; - CleanupClosePushL( failedPlugins ); - - TBool succeed( EFalse ); - - for ( TInt i = 0; i < iPluginsData.Count(); i++ ) - { - CXnViewData* plugin( - static_cast< CXnViewData* >( iPluginsData[ i ] ) ); + TInt err( KErrNone ); - if ( plugin->Initial() ) - { - plugin->LoadL(); + // Load application root configuration + TRAP( err, iODT = iManager.Composer().ComposeRootL( *this ) ); - if ( plugin->Occupied() ) - { - succeed = ETrue; - } - else - { - // Failed to load - failedPlugins.AppendL( plugin ); - } - - break; - } - } - - for ( TInt i = 0; !succeed && i < iPluginsData.Count(); i++ ) - { - CXnViewData* plugin( - static_cast< CXnViewData* >( iPluginsData[ i ] ) ); - - if ( failedPlugins.Find( plugin ) == KErrNotFound ) - { - plugin->SetInitial(); - - plugin->LoadL(); - - if ( plugin->Occupied() ) - { - succeed = ETrue; - } - else - { - // Failed to load - failedPlugins.AppendL( plugin ); - } - } - } - - if ( !succeed ) + if ( !iODT ) { // Can't recover Panic( EXnInvalidConfiguration ); } - - for ( TInt i = failedPlugins.Count() - 1; i >= 0; i-- ) - { - CXnPluginData* toDestroy( failedPlugins[i] ); - - TInt index( iPluginsData.Find( toDestroy ) ); - - iPluginsData.Remove( index ); - - delete toDestroy; - toDestroy = NULL; + + if ( !err ) + { + TRAP( err, iManager.Parser().LoadRootL( *this, iApplicationUid ) ); } - CleanupStack::PopAndDestroy( &failedPlugins ); + if ( !err ) + { + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnViewData* plugin( + static_cast< CXnViewData* >( iPluginsData[ i ] ) ); + + if ( plugin->Initial() ) + { + err = plugin->Load(); + + if ( plugin->Occupied() ) + { + // Initial view is succesfully composed. Some plugins + // may have failed but it doesn't matter as those are removed + return KErrNone; + } + + // Initial view failed, remove it + iPluginsData.Remove( i ); + + delete plugin; + plugin = NULL; + break; + } + } + + // Initial view loading failed, fallback to load any of the views + while( iPluginsData.Count() ) + { + CXnViewData* plugin( + static_cast< CXnViewData* >( iPluginsData[ 0 ] ) ); + + // Ignore error + plugin->Load(); + + if ( plugin->Occupied() ) + { + // Return error because of fallback condition + return KXnErrPluginFailure; + } + + // View failed, remove it + iPluginsData.Remove( 0 ); + + delete plugin; + plugin = NULL; + } + } + else if ( err == KErrNoMemory ) + { + ShowOutOfMemError(); + } + + // Configuration loading failed totally + Panic( EXnInvalidConfiguration ); + + return err; } // ----------------------------------------------------------------------------- @@ -542,7 +529,10 @@ if ( !self->AllViewsLoaded() && toLoad ) { - toLoad->LoadL(); + if ( toLoad->Load() == KErrNoMemory ) + { + self->ShowOutOfMemError(); + } } if ( self->AllViewsLoaded() )