photosgallery/slideshow/engine/coresrc/shwplaybackfactory.cpp
changeset 0 4e91876724a2
child 18 bcb43dc84c44
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/slideshow/engine/coresrc/shwplaybackfactory.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2007-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:    The playback factory, configures the playback for the slideshow
+ *
+*/
+
+
+
+//  CLASS HEADER
+#include "shwplaybackfactory.h"
+
+//  EXTERNAL INCLUDES
+#include <mglxvisuallist.h>
+#include <ecom/implementationinformation.h>
+#include <ecom/ecom.h>
+
+//  INTERNAL INCLUDES
+#include <glxlog.h>
+#include <glxtracer.h>
+
+#include "shwtimercontrol.h"
+#include "shwviewcontrol.h"
+#include "shweffectcontrol.h"
+#include "shwdefaulteffectmanager.h"
+#include "shwcrossfadeeffect.h"
+#include "shwzoomandpaneffect.h"
+#include "shwmusiccontrol.h"
+#include "shwmusicobserver.h"
+#include "shwsettingsmodel.h"
+#include "shweffectinfo.h"
+#include "shwcleanupwrapper.h"
+
+using namespace NShwSlideshow;
+
+// -----------------------------------------------------------------------------
+// Local definitions
+// -----------------------------------------------------------------------------
+//
+namespace
+	{
+	// granularity for observer array, typical count
+	const TInt KObserverCount = 8;
+	// granularity for publisher array, typical count
+	const TInt KPublisherCount = 8;
+	}
+
+// -----------------------------------------------------------------------------
+// The implementation class
+// -----------------------------------------------------------------------------
+//
+NONSHARABLE_CLASS( CShwPlaybackFactory::CShwPlaybackFactoryImpl )
+	: public CBase
+	{
+	public:
+
+		/**
+		 * Constructors.
+		 */
+		CShwPlaybackFactoryImpl(MShwMusicObserver& aMusicObserver);
+
+		/**
+		 * Destructors.
+		 */
+		~CShwPlaybackFactoryImpl();
+
+		/**
+		 * 2nd stage constructor.
+		 * @param aHuiEnv the HUI environment
+		 * @param aVisualList the visual list of the show
+		 * @param aMediaList  the media list of the show
+		 * @param aMusicObserver the music control observer
+		 * @param aScreenSize the screen size to use
+		 */
+		void ConstructL(
+			CAlfEnv* aAlfEnv, 
+			MGlxVisualList* aVisualList,
+			MGlxMediaList* aMediaList, 
+			TSize aScreenSize );
+
+	public:
+
+		/// @ref CShwPlaybackFactory::EventObservers
+		RPointerArray< MShwEventObserver > EventObservers();
+		/// @ref CShwPlaybackFactory::EventPublishers
+		RPointerArray< MShwEventPublisher > EventPublishers();
+		/// @ref CShwSlideshowEngine::AvailableEffectsL
+		// @returns ownership of array of effects
+		static void CreateEffectsL( RPointerArray<MShwEffect>& aEffects );
+
+	private:
+
+		/// Own: Effect manager
+		CShwDefaultEffectManager* iEffectManager;
+		/// Own: Timer control
+		CShwTimerControl* iTimerControl;
+		/// Own: Music control
+		CShwMusicControl* iMusicControl;
+		/// Own: Effect control
+		CShwEffectControl* iEffectControl;
+		/// Own: View control
+		CShwViewControl* iViewControl;
+		/// Own: the observers
+		RPointerArray< MShwEventObserver > iObservers;
+		/// Own: the publishers
+		RPointerArray< MShwEventPublisher > iPublishers;
+
+		/// Ref: the visual list
+		MGlxVisualList* iVisualList;
+		/// Ref: the music control observer
+		MShwMusicObserver& iMusicObserver;
+		
+	};
+
+// -----------------------------------------------------------------------------
+// C++ Constructor. Save a few bits of rom with inlining
+// -----------------------------------------------------------------------------
+inline CShwPlaybackFactory::CShwPlaybackFactory() 
+	{
+	// No implementation needed
+	}
+
+// -----------------------------------------------------------------------------
+// NewL. Static construction
+// -----------------------------------------------------------------------------
+CShwPlaybackFactory* CShwPlaybackFactory::NewL(
+	CAlfEnv* aAlfEnv,
+	MGlxVisualList* aVisualList,
+	MGlxMediaList* aMediaList,
+	MShwMusicObserver& aMusicObserver, 
+	TSize aScreenSize )
+	{
+	TRACER("CShwPlaybackFactory::NewL");
+	GLX_LOG_INFO( "CShwPlaybackFactory::NewL" );
+
+	CShwPlaybackFactory* self = new( ELeave ) CShwPlaybackFactory( );
+	CleanupStack::PushL( self );
+
+	// create the implementation, forward the parameters
+	self->iImpl = new( ELeave ) CShwPlaybackFactoryImpl (aMusicObserver);
+	self->iImpl->ConstructL( aAlfEnv, aVisualList, aMediaList, aScreenSize );
+	
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+CShwPlaybackFactory::~CShwPlaybackFactory()
+	{
+	TRACER("CShwPlaybackFactory::~CShwPlaybackFactory");
+	GLX_LOG_INFO("CShwPlaybackFactory::~CShwPlaybackFactory");
+	delete iImpl;
+	}
+
+// -----------------------------------------------------------------------------
+// EventObservers.
+// -----------------------------------------------------------------------------
+RPointerArray< MShwEventObserver > CShwPlaybackFactory::EventObservers()
+	{
+	TRACER("CShwPlaybackFactory::EventObservers");
+	GLX_LOG_INFO("CShwPlaybackFactory::EventObservers");
+	return iImpl->EventObservers();
+	}
+
+// -----------------------------------------------------------------------------
+// EventPublishers.
+// -----------------------------------------------------------------------------
+RPointerArray< MShwEventPublisher > CShwPlaybackFactory::EventPublishers()
+	{
+	TRACER("CShwPlaybackFactory::EventPublishers");
+	GLX_LOG_INFO("CShwPlaybackFactory::EventPublishers");
+	return iImpl->EventPublishers();
+	}
+
+//------------------------------------------------------------------------------
+// AvailableEffectsL
+//------------------------------------------------------------------------------
+void CShwPlaybackFactory::AvailableEffectsL( RArray<TShwEffectInfo>& 
+																aEffectInfos )
+    {
+    TRACER("CShwPlaybackFactory::AvailableEffectsL");
+    GLX_LOG_INFO("CShwPlaybackFactory::AvailableEffectsL");
+    aEffectInfos.Reset();
+    RPointerArray<MShwEffect> effects;
+    // put the array in cleanupstack in case effect construction leaves
+	ShwCleanupResetAndDestroyPushL( effects );
+    CShwPlaybackFactoryImpl::CreateEffectsL( effects );
+    TInt i = effects.Count();
+    while (i-- > 0)
+        {
+        // get the effect info and append it to the given array
+        aEffectInfos.AppendL( effects[i]->EffectInfo() );
+        }
+	// ownership transferred, remove array from stack
+	CleanupStack::PopAndDestroy( &effects );
+    }
+
+//------------------------------------------------------------------------------
+// CShwPlaybackFactoryImpl
+//------------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// C++ Constructor. Save a few bits of rom with inlining
+// -----------------------------------------------------------------------------
+inline CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl(
+												MShwMusicObserver& aMusicObserver)
+						   : iObservers( KObserverCount ), 
+						   	 iPublishers( KPublisherCount ),
+						   	 iMusicObserver (aMusicObserver)
+	{
+	TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl");
+	GLX_LOG_INFO("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CShwPlaybackFactoryImpl");
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor. Save a few bits of rom with inlining
+// -----------------------------------------------------------------------------
+inline CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl()
+	{
+	TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl");
+	GLX_LOG_INFO("CShwPlaybackFactory::CShwPlaybackFactoryImpl::~CShwPlaybackFactoryImpl");
+
+	delete iEffectManager;
+	delete iTimerControl;
+	delete iMusicControl;
+	delete iEffectControl;
+	delete iViewControl;
+
+	iObservers.Close();
+	iPublishers.Close();
+	}
+
+//------------------------------------------------------------------------------
+// CShwPlaybackFactoryImpl::ConstructL
+//------------------------------------------------------------------------------
+void CShwPlaybackFactory::CShwPlaybackFactoryImpl::ConstructL(
+	CAlfEnv* aAlfEnv, 
+	MGlxVisualList* aVisualList, 
+	MGlxMediaList* aMediaList, 
+	TSize aScreenSize )
+	{
+	TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::ConstructL");
+	GLX_LOG_INFO( "CShwPlaybackFactoryImpl::ConstructL" );
+
+	// create the effect manager
+	iEffectManager = CShwDefaultEffectManager::NewL();
+
+	// create array for effects
+    RPointerArray< MShwEffect > effects;
+    // put the array in cleanupstack in case CreateEffectsL leaves
+	ShwCleanupResetAndDestroyPushL( effects );
+	// create the effects
+    CShwPlaybackFactoryImpl::CreateEffectsL( effects );
+    // need to go from last to first as we remove items
+    TInt i = effects.Count();
+    while (i-- > 0)
+        {
+		effects[ i ]->InitializeL( 
+		    aAlfEnv, aVisualList, aMediaList,
+		    aScreenSize );
+		
+		// give the effect to the manager, it takes ownership
+		iEffectManager->AddEffectL( effects[ i ] );
+		// remove the effect from original array to prevent
+		// double delete, effect manager takes care of the effect from now on
+		effects.Remove( i );
+        }
+	// ownership transferred, remove array from stack
+	CleanupStack::Pop( &effects );
+	// need to also close the array in this case, this frees the array memory
+	effects.Close();
+
+	// create the model to retrieve the persisted slideshow settings. 
+	CShwSettingsModel* shwSettingsMdl = CShwSettingsModel::NewL();
+	CleanupStack::PushL( shwSettingsMdl );
+
+	// retrieve and set the persisted effect settings
+	TShwEffectInfo effect;
+	shwSettingsMdl->TransitionTypeL( 
+	    effect.iId.iPluginUid, effect.iId.iIndex );
+	iEffectManager->SetDefaultEffectL( effect );
+
+	// create the timer
+	iTimerControl = CShwTimerControl::NewL();
+	iObservers.AppendL( iTimerControl );
+	iPublishers.AppendL( iTimerControl );
+
+	// create effect control
+	iEffectControl =
+		CShwEffectControl::NewL(
+		    *iEffectManager, *aVisualList, *aMediaList, aScreenSize );
+	iObservers.AppendL( iEffectControl );
+	iPublishers.AppendL( iEffectControl );
+
+	// create view manager, view duration is stored in seconds so need to
+	// multiply with 1000
+	TInt viewDuration = shwSettingsMdl->TransDelayL() * 1000;
+	iViewControl = 
+		CShwViewControl::NewL( 
+		    *aMediaList, KDefaultTransitionDuration, viewDuration );
+	iObservers.AppendL( iViewControl );
+	iPublishers.AppendL( iViewControl );
+
+    // create music control last as it is the least important
+	if (shwSettingsMdl->MusicOnL() )
+		{
+		// retrieve the name of the music file
+		TFileName fileName;
+		shwSettingsMdl->MusicNamePathL( fileName );
+		// instantiate and initialise the music player
+		iMusicControl = CShwMusicControl::NewL(iMusicObserver, fileName );
+		iObservers.AppendL( iMusicControl );
+		iPublishers.AppendL( iMusicControl );
+		}
+	
+	CleanupStack::PopAndDestroy( shwSettingsMdl );
+	GLX_LOG_INFO( "CShwPlaybackFactoryImpl::ConstructL ended" );
+	}
+
+//------------------------------------------------------------------------------
+// CShwPlaybackFactoryImpl::EventObservers
+//------------------------------------------------------------------------------
+RPointerArray<MShwEventObserver> 
+		CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventObservers()
+	{
+	return iObservers;
+	}
+
+//------------------------------------------------------------------------------
+// CShwPlaybackFactoryImpl::EventPublishers
+//------------------------------------------------------------------------------
+RPointerArray<MShwEventPublisher> 
+		CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventPublishers()
+	{
+	TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::EventPublishers");
+	GLX_LOG_INFO( "CShwPlaybackFactoryImpl::EventPublishers" );
+	return iPublishers;
+	}
+
+//------------------------------------------------------------------------------
+// CShwPlaybackFactoryImpl::CreateEffectsL
+//------------------------------------------------------------------------------
+void CShwPlaybackFactory::CShwPlaybackFactoryImpl::CreateEffectsL(
+											RPointerArray<MShwEffect>& aEffects )
+    {
+    TRACER("CShwPlaybackFactory::CShwPlaybackFactoryImpl::CreateEffectsL");
+	GLX_LOG_INFO( "CShwPlaybackFactoryImpl::CreateEffectsL" );
+	aEffects.AppendL( CShwZoomAndPanEffect::NewLC() );
+	CleanupStack::Pop();
+	aEffects.AppendL( CShwCrossFadeEffect::NewLC() );
+	CleanupStack::Pop();
+    }