idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp
changeset 0 f72a12da539e
child 2 08c6ee43b396
--- /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 <utf.h>
+
+// 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