idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
child 88 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,637 @@
+/*
+* 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 <aifwdefs.h>
+#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 "xnpublisherdata.h"
+#include "xnviewmanager.h"
+#include "xnoomsyshandler.h"
+#include "xnpanic.h"
+
+#include "debug.h"
+
+// Constants
+_LIT8( KLockingStatusLocked, "locked" );
+
+// ============================ 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 );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::CXnPluginData()
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CXnPluginData::CXnPluginData( CXnViewManager& aManager )     
+    : iParent( NULL ), iManager( aManager )
+    {
+    // This constructor overload is used by CXnRootData
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::~CXnPluginData()
+// C++ default destructor.
+// -----------------------------------------------------------------------------
+//
+CXnPluginData::~CXnPluginData()
+    {
+    Flush();
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::ConstructL()
+// 2nd phase constructor
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::ConstructL()
+    {    
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::Load()
+//
+// -----------------------------------------------------------------------------
+//
+TInt CXnPluginData::Load()
+    {        
+    if ( Occupied() )
+        {
+        return KErrInUse;
+        }
+   
+    if ( !CXnOomSysHandler::HeapAvailable( WIDGET_MIN_MEM ) )
+        {                
+        return KErrNoMemory;
+        }
+
+    iFlags.Clear( EIsEmpty );
+              
+    TInt err( KErrNone );
+    
+    TRAP( err, err = iManager.Composer().ComposeWidgetL( *this ) );
+    
+    if ( err == KErrNone )
+        {
+        TRAP( err, iManager.Parser().LoadWidgetL( *this ) );       
+        }
+    
+    if ( err == KErrNone )
+        {                     
+        // Succesfully composed, try schedule publishers' loading
+        LoadPublishers( EAiFwPluginStartup );                  
+        }    
+    else if ( err == KXnErrWidgetPluginFailure )
+        {
+        // Widget's configuration is broken, remove it
+        TRAP_IGNORE( iManager.UnloadWidgetFromPluginL( *this, ETrue ) );                        
+        }      
+        
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::Destroy()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::Destroy()
+    {       
+    if ( Occupied() )
+        {
+        DestroyPublishers( EAiFwPluginShutdown );
+        
+        TRAP_IGNORE( iManager.Parser().DestroyWidgetL( *this ) );                                       
+        }
+    
+    Flush();
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::LoadPublishers()
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::LoadPublishers( TInt aReason )
+    {           
+    __PRINTS( "*** CXnPluginData::LoadPublishers" );
+
+    if ( !Active() || !Occupied() )
+        {
+        __PRINTS( "*** CXnPluginData::LoadPublishers - done, !Active() || !Occupied()" );
+        
+        return;
+        }
+    
+    TInt count( iPublishers.Count() );
+    
+    if ( count == 0 )
+        {
+        TRAP_IGNORE( NotifyPublisherReadyL() );
+        }
+    else
+        {
+        for ( TInt i = 0; i < count; i++ )
+            {
+            iPublishers[i]->Load( aReason );        
+            }    
+        }
+    
+    __PRINTS( "*** CXnPluginData::LoadPublishers - done" );
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::NotifyPublisherReadyL()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::NotifyPublisherReadyL()          
+    {       
+    if ( iParent )
+        {
+        // Forward to parent
+        iParent->NotifyPublisherReadyL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::DestroyPublishers
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::DestroyPublishers( TInt aReason )
+    {    
+    __PRINTS( "*** CXnPluginData::DestroyPublishers" );
+    
+    if ( !Occupied() )
+        {
+        __PRINTS( "*** CXnPluginData::DestroyPublishers - done, !Occupied()" );
+        
+        return;
+        }    
+    
+    for ( TInt i = 0; i < iPublishers.Count(); i++ )
+        {
+        iPublishers[i]->Destroy( aReason );        
+        }
+                     
+    __PRINTS( "*** CXnPluginData::DestroyPublishers - done" );
+    }
+
+// -----------------------------------------------------------------------------
+// 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::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 )
+    {        
+    if ( !aNode )
+        {
+        return;
+        }
+    
+    for ( TInt i = 0; i < iPublishers.Count(); i++ )
+        {        
+        if ( *iPublishers[i] == *aNode )
+            {
+            // Duplicate entries not allowed
+            return;
+            }
+        }
+                 
+    CXnPublisherData* publisher = 
+        CXnPublisherData::NewLC( *this, *aNode );       
+    
+    iPublishers.AppendL( publisher );    
+    CleanupStack::Pop( publisher );   
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::ContentSourceNodesL()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::ContentSourceNodesL( RPointerArray< CXnNode >& aList ) const
+    {
+    for ( TInt i = 0; i < iPublishers.Count(); i++ )
+        {
+        aList.AppendL( iPublishers[i]->ContentSource() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnPluginData::Publishers()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::PublishersL( RPointerArray< CXnPublisherData >& aList ) const
+    {
+    for ( TInt i = 0; i < iPublishers.Count(); i++ )
+        {
+        aList.AppendL( iPublishers[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 );    
+           
+    iNode = NULL;
+    
+    delete iConfigurationId;
+    iConfigurationId = NULL;
+
+    delete iPluginId;
+    iPluginId = NULL;
+
+    delete iPluginUid;
+    iPluginUid = NULL;
+
+    delete iPluginName;
+    iPluginName = NULL;
+
+    delete iPluginType;
+    iPluginType = NULL;
+
+    delete iPublisherName;
+    iPublisherName = NULL;
+
+    if ( iResources )
+        {
+        iResources->ResetAndDestroy();
+        delete iResources;
+        iResources = NULL;
+        }
+        
+    iPublishers.ResetAndDestroy();
+    iControls.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 );    
+    }
+    
+// -----------------------------------------------------------------------------
+// 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::PopupNodesL()
+//
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::PopupNodesL( RPointerArray< CXnNode >& aList ) const
+    {
+    for ( TInt i = 0; i < iPopupNodes.Count(); i++ )
+        {
+        aList.AppendL( iPopupNodes[i] );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CXnViewData::SetLockingStatus
+// 
+// -----------------------------------------------------------------------------
+//
+void CXnPluginData::SetLockingStatus( const TDesC8& aStatus )
+    {
+    if ( aStatus.CompareF( KLockingStatusLocked ) == 0 )
+        {
+        iFlags.Clear( EIsRemovable );
+        }
+    else
+        {
+        iFlags.Set( EIsRemovable );
+        }
+    }
+
+// End of file