--- /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