--- 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 <utf.h>
+#include <aifwdefs.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
// User includes
+#include <xnuiengine.rsg>
#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