idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp
branchRCL_3
changeset 9 f966699dea19
parent 2 08c6ee43b396
child 15 ff572dfe6d86
--- 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