diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/xmluirendering/uiengine/src/xnviewdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/uiengine/src/xnviewdata.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,621 @@ +/* +* 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 view data info +* +*/ + +// System includes +#include + +// User includes +#include +#include +#include "xnappuiadapter.h" +#include "xncomposer.h" +#include "xnodtparser.h" +#include "xnviewmanager.h" +#include "xnviewdata.h" +#include "xnpublisherdata.h" +#include "xncontroladapter.h" +#include "xndomnode.h" +#include "xnnode.h" +#include "xnoomsyshandler.h" +#include "ainativeuiplugins.h" +#include "xnpanic.h" + + +#include "debug.h" + +// Constants +_LIT8( KNs, "namespace" ); + +// ============================ LOCAL FUNCTIONS ================================ + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CXnViewData::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnViewData* CXnViewData::NewL( CXnPluginData& aParent ) + { + CXnViewData* self = CXnViewData::NewLC( aParent ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CXnViewData* CXnViewData::NewLC( CXnPluginData& aParent ) + { + CXnViewData* self = new ( ELeave ) CXnViewData( aParent ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::CXnViewData() +// C++ default constructor +// ----------------------------------------------------------------------------- +// +CXnViewData::CXnViewData( CXnPluginData& aParent ) + : CXnPluginData( aParent ) + { + // By default view data is removable + iFlags.Set( EIsRemovable ); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::~CXnViewData() +// C++ default destructor. +// ----------------------------------------------------------------------------- +// +CXnViewData::~CXnViewData() + { + Destroy(); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::ConstructL() +// 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CXnViewData::ConstructL() + { + CXnPluginData::ConstructL(); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::SetActive() +// +// ----------------------------------------------------------------------------- +// +TInt CXnViewData::SetActive( TBool aActive ) + { + TBool active( Active() ); + + TInt err( KErrNone ); + + if ( !Occupied() ) + { + err = KErrGeneral; + } + else if ( active == aActive ) + { + err = KErrNone; + } + else + { + if ( aActive ) + { + if ( iFlags.IsSet( EIsInitial ) ) + { + // Load device status plugin here because it is always needed + THsPublisherInfo devstat( KDeviceStatusPluginUid, + KDeviceStatusPluginName, KNs ); + + TAiFwPublisherInfo publisher( devstat, + TAiFwCallback(), EAiFwSystemStartup ); + + CXnAppUiAdapter* appui = + static_cast< CXnAppUiAdapter* >( iAvkonAppUi ); + + appui->LoadPublisher( publisher ); + } + + iFlags.Set( EIsActive ); + iFlags.Clear( EIsInitial ); + + LoadPublishers( EAiFwPageStartup ); + + err = iLoadError; + + iLoadError = KErrNone; + } + else + { + DestroyPublishers( EAiFwPageShutdown ); + + iFlags.Clear( EIsActive ); + } + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::Load() + +// ----------------------------------------------------------------------------- +// +TInt CXnViewData::Load() + { + TInt err( KErrNone ); + + if ( Occupied() ) + { + err = KErrInUse; + } + else if ( !CXnOomSysHandler::HeapAvailable( VIEW_MIN_MEM ) ) + { + err = KErrNoMemory; + } + else + { + TRAP( err, err = iManager.Composer().ComposeViewL( *this ) ); + + if ( err == KErrNone ) + { + TRAP( err, iManager.Parser().LoadViewL( *this ) ); + } + + if ( err == KErrNone ) + { + // Load view's initial widgets + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + if ( iPluginsData[i]->PluginId() != KNullDesC8 ) + { + TInt err2( iPluginsData[i]->Load() ); + + if ( err2 == KXnErrWidgetPluginFailure ) + { + err = err2; + } + else if ( err2 == KErrNoMemory ) + { + err = err2; + break; + } + } + } + + // Succesfully enough composed, publishers + // will be loaded when view is activated + } + } + + iLoadError = err; + + return iLoadError; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::Destroy() + +// ----------------------------------------------------------------------------- +// +void CXnViewData::Destroy() + { + if ( Occupied() ) + { + // View is deleted, pretend plugin is removed from UI + DestroyPublishers( EAiFwPluginShutdown ); + + iManager.Parser().DestroyView( *this ); + } + + delete iBgImage; + iBgImage = NULL; + + delete iBgImagePath; + iBgImagePath = NULL; + + iLoadError = KErrNone; + + Flush(); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::Plugin() +// Finds plugin or view data based on node +// ----------------------------------------------------------------------------- +// +CXnPluginData* CXnViewData::Plugin( CXnNode* aNode ) + { + if ( !aNode ) + { + return NULL; + } + + CXnDomNode* view( Node() ); + + if ( aNode->ViewNodeImpl() ) + { + // Reached view, return self + if ( view && view->LayoutNode() == aNode ) + { + return this; + } + } + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnDomNode* plugin( iPluginsData[i]->Owner() ); + + if ( plugin && plugin->LayoutNode() == aNode ) + { + return iPluginsData[i]; + } + } + + // Not found, try parent + CXnNode* parent( aNode->Parent() ); + + return Plugin( parent ); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::Plugin() +// Finds plugin or view data based on namespace +// ----------------------------------------------------------------------------- +// +CXnPluginData* CXnViewData::Plugin( const TDesC8& aNamespace ) + { + if ( aNamespace == KNullDesC8 ) + { + // No namespace, return self for global access + return this; + } + + CXnDomNode* view( Node() ); + + if ( view && view->LayoutNode()->Namespace() == aNamespace ) + { + return this; + } + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnDomNode* widget( iPluginsData[i]->Node() ); + + if ( widget && widget->LayoutNode()->Namespace() == aNamespace ) + { + return iPluginsData[i]; + } + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::ViewNode() +// Returns this view data's view node +// ----------------------------------------------------------------------------- +// +CXnNode* CXnViewData::ViewNode() const + { + return iNode->LayoutNode(); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::SetWallpaperImage +// Store background image. Ownership is transferred. +// ----------------------------------------------------------------------------- +// +void CXnViewData::SetWallpaperImage( CFbsBitmap* aBitmap ) + { + delete iBgImage; + iBgImage = aBitmap; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::WallpaperImage +// Get wallpaper image. +// ----------------------------------------------------------------------------- +// +CFbsBitmap* CXnViewData::WallpaperImage() const + { + return iBgImage; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::SetWallpaperImagePathL +// +// ----------------------------------------------------------------------------- +// +void CXnViewData::SetWallpaperImagePathL( const TDesC& aFileName ) + { + if( !iBgImagePath || iBgImagePath->Des() != aFileName ) + { + delete iBgImagePath; + iBgImagePath = NULL; + iBgImagePath = aFileName.AllocL(); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::WallpaperImagePath +// +// ----------------------------------------------------------------------------- +// +const TDesC& CXnViewData::WallpaperImagePath() const + { + if( iBgImagePath ) + { + return *iBgImagePath; + } + return KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CXnViewData::ResourcesL() +// Gets this view data's resources +// ----------------------------------------------------------------------------- +// +void CXnViewData::ResourcesL( CArrayPtrSeg< CXnResource >& aList ) const + { + // Get my resources + CXnPluginData::ResourcesL( aList ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And resources which my plugin holds + iPluginsData[i]->ResourcesL( aList ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::ControlsL() +// Gets this view data's controls +// ----------------------------------------------------------------------------- +// +void CXnViewData::ControlsL( RPointerArray< CXnControlAdapter >& aList ) const + { + // Get my controls + CXnPluginData::ControlsL( aList ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And controls which my plugin holds + iPluginsData[i]->ControlsL( aList ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::PluginNodesL() +// Gets this view data's appearance nodes +// ----------------------------------------------------------------------------- +// +void CXnViewData::AppearanceNodesL( RPointerArray< CXnNode >& aList ) const + { + // Get my appearance nodes + CXnPluginData::AppearanceNodesL( aList ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And appearance nodes which my plugin holds + iPluginsData[i]->AppearanceNodesL( aList ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::PopupNodesL() +// Gets this view data's popup nodes +// ----------------------------------------------------------------------------- +// +void CXnViewData::PopupNodesL( RPointerArray< CXnNode >& aList ) const + { + // Get my Popup nodes + CXnPluginData::PopupNodesL( aList ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And Popup nodes which my plugin holds + iPluginsData[i]->PopupNodesL( aList ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::InitialFocusNodesL() +// Gets this view data's initial focus nodes +// ----------------------------------------------------------------------------- +// +void CXnViewData::InitialFocusNodesL( RPointerArray< CXnNode >& aList ) const + { + // Offer widgets initial focus nodes by default first + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And appearance nodes which my plugin holds + iPluginsData[i]->InitialFocusNodesL( aList ); + } + + // Get my initial focus nodes + CXnPluginData::InitialFocusNodesL( aList ); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::ContentSourceNodesL() +// Gets this view data's content source nodes +// ----------------------------------------------------------------------------- +// +void CXnViewData::ContentSourceNodesL( RPointerArray< CXnNode >& aList ) const + { + // Get my data publisher nodes + CXnPluginData::ContentSourceNodesL( aList ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And publisher nodes which my plugin holds + iPluginsData[i]->ContentSourceNodesL( aList ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::PluginNodesL() +// Gets this view data's plugin nodes +// ----------------------------------------------------------------------------- +// +void CXnViewData::PluginNodesL( RPointerArray< CXnNode >& aList ) const + { + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + // And controls which my plugin holds + aList.AppendL( iPluginsData[i]->Owner()->LayoutNode() ); + } + } + +// ----------------------------------------------------------------------------- +// CXnViewData::LoadPublishers +// Loads data plugins associated to the plugin +// ----------------------------------------------------------------------------- +// +void CXnViewData::LoadPublishers( TInt aReason ) + { + __PRINTS( "*** CXnViewData::LoadPublishers" ); + + if( !Active() || !Occupied() ) + { + __PRINTS( "*** CXnViewData::LoadPublishers - done, !Active() || !Occupied()" ); + + return; + } + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnPluginData* plugin( iPluginsData[i] ); + + if ( plugin->Occupied() ) + { + plugin->LoadPublishers( aReason ); + } + } + + CXnPluginData::LoadPublishers( aReason ); + + __PRINTS( "*** CXnViewData::LoadPublishers - done" ); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::NotifyPublisherReadyL +// Notifies a publisher is ready +// ----------------------------------------------------------------------------- +// +void CXnViewData::NotifyPublisherReadyL() + { + if ( !Active() ) + { + return; + } + + TBool allready( ETrue ); + + RPointerArray< CXnPublisherData > list; + CleanupClosePushL( list ); + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnPluginData* plugin( iPluginsData[i] ); + + if ( plugin->Occupied() ) + { + plugin->PublishersL( list ); + } + } + + CXnPluginData::PublishersL( list ); + + for ( TInt i = 0; i < list.Count(); i++ ) + { + CXnPublisherData* publisher( list[i] ); + + if ( publisher->IsLoading() ) + { + allready = EFalse; + break; + } + } + + if ( allready && Active() ) + { + TInt result( KErrNone ); + + for ( TInt i = 0; i < list.Count(); i++ ) + { + CXnPublisherData* publisher( list[i] ); + + if ( publisher->IsFailed() ) + { + CXnPluginData* plugin( publisher->Owner() ); + + if ( plugin != this && plugin->Removable() ) + { + iManager.UnloadWidgetFromPluginL( *plugin, ETrue ); + + result = KXnErrWidgetPluginFailure; + } + } + } + + TRAP_IGNORE( iManager.PublishersReadyL( *this, result ) ); + } + + CleanupStack::PopAndDestroy( &list ); + } + +// ----------------------------------------------------------------------------- +// CXnViewData::DestroyPublishers +// Destroys data plugins associated to the plugin +// ----------------------------------------------------------------------------- +// +void CXnViewData::DestroyPublishers( TInt aReason ) + { + __PRINTS( "*** CXnViewData::DestroyPublishers" ); + + if ( !Occupied() ) + { + __PRINTS( "*** CXnViewData::DestroyPublishers - done, !Occupied()" ); + + return; + } + + for ( TInt i = 0; i < iPluginsData.Count(); i++ ) + { + CXnPluginData* plugin( iPluginsData[i] ); + + if ( plugin->Occupied() ) + { + plugin->DestroyPublishers( aReason ); + } + } + + CXnPluginData::DestroyPublishers( aReason ); + + __PRINTS( "*** CXnViewData::DestroyPublishers - done" ); + } + +// End of file