--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/widgetmodel/alfwidgetmodel/src/alfwidgetenvextension.cpp Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2007 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: Extensions can be added to AlfEnv through this class.
+ Currently resourcepool,widgetfactory can be added as extensions to AlfEnv.
+*
+*/
+
+
+#include <alf/alfenv.h>
+#include <alf/alfenvobject.h>
+#include <alf/alfresourcepool.h>
+
+#include <osn/osnnew.h>
+#include <alf/alfwidgetexception.h>
+#include <alf/alfwidgetenvextension.h>
+
+#include <alf/alfwidgetfactoryloader.h>
+#include <alf/ialfwidgetfactory.h>
+namespace Alf
+ {
+ const int KAlfExtensionResourcePoolUid( 89 ); // Bogus id for resource
+ // pool extension
+
+ const int KAlfExtensionWidgetFactoryUid( 106 ); // Bogus id for widget
+ // factory extension
+
+ // Env extension for the resource pool
+ class AlfExtensionResourcePoolContainer : public MAlfEnvObject
+ {
+ public:
+
+ AlfExtensionResourcePoolContainer( ResourcePool* aResourcePool) :
+ mResourcePool(aResourcePool )
+ {
+ }
+
+ virtual void Release()
+ {
+ delete this;
+ }
+
+ ~AlfExtensionResourcePoolContainer()
+ {
+ delete mResourcePool;
+ }
+ // Owned
+ ResourcePool* mResourcePool;
+ };
+
+
+ // Env extension for the widget factory
+ class AlfExtensionWidgetFactory : public MAlfEnvObject
+ {
+ public:
+
+ AlfExtensionWidgetFactory(
+ AlfWidgetFactoryLoader* amWidgetFactoryLoader,
+ IAlfWidgetFactory* aWidgetFactory) :
+ mWidgetFactoryLoader( amWidgetFactoryLoader ),
+ mWidgetFactory( aWidgetFactory )
+ {
+ }
+
+ virtual void Release()
+ {
+ delete this;
+ }
+
+ ~AlfExtensionWidgetFactory()
+ {
+ delete mWidgetFactoryLoader;
+ }
+ // Owned
+ AlfWidgetFactoryLoader* mWidgetFactoryLoader;
+ // Not owned
+ IAlfWidgetFactory* mWidgetFactory;
+ };
+
+// ---------------------------------------------------------------------------
+// Initializes environment with resource pool and factory extensions
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void AlfWidgetEnvExtension::initializeEnvironment(CAlfEnv& aEnv)
+ {
+ AlfExtensionResourcePoolContainer* poolContainer =
+ static_cast<AlfExtensionResourcePoolContainer*>(
+ aEnv.Extension( KAlfExtensionResourcePoolUid));
+ if ( poolContainer == NULL)
+ {
+ // Initialize the env with resource pool extension
+ initializeEnvironmentForResourcePool(aEnv);
+ }
+ AlfExtensionWidgetFactory* widgetFactoryExtension =
+ static_cast<AlfExtensionWidgetFactory*>(
+ aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+ if ( widgetFactoryExtension == NULL)
+ {
+ // Initialize the env with widget factory extension
+ initializeEnvironmentForFactory(aEnv);
+ }
+ }
+// ---------------------------------------------------------------------------
+// Initializes environment with Theme Manager extension
+// ---------------------------------------------------------------------------
+//
+void AlfWidgetEnvExtension::initializeEnvironmentForTheme(CAlfEnv& /*aEnv*/ )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Initializes environment with resource pool extension
+// ---------------------------------------------------------------------------
+//
+void AlfWidgetEnvExtension::initializeEnvironmentForResourcePool(CAlfEnv& aEnv)
+ {
+ auto_ptr<ResourcePool> pool(new(EMM) ResourcePool(
+ aEnv.TextureManager(), NULL));
+ auto_ptr<AlfExtensionResourcePoolContainer> poolContainer(
+ new(EMM) AlfExtensionResourcePoolContainer( pool.release()));
+ int err = aEnv.AddExtension( KAlfExtensionResourcePoolUid,
+ (MAlfEnvObject*)(poolContainer.get()));
+ if ( err != KErrNone)
+ {
+ ALF_THROW(AlfWidgetException, ECommonError, "Failed to add AlfEnv extension");
+ }
+ else
+ {
+ poolContainer.release();
+ }
+ }
+// ---------------------------------------------------------------------------
+// Returns the reference for Resource Pool extension object.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT ResourcePool& AlfWidgetEnvExtension::resourcePool( CAlfEnv& aEnv)
+ {
+ Alf::AlfExtensionResourcePoolContainer* poolContainer =
+ static_cast<Alf::AlfExtensionResourcePoolContainer*>(aEnv.Extension( KAlfExtensionResourcePoolUid));
+ if ( poolContainer == NULL)
+ {
+ initializeEnvironment(aEnv);
+ }
+ //re-fetch the pool
+ poolContainer =
+ static_cast<Alf::AlfExtensionResourcePoolContainer*>(aEnv.Extension( KAlfExtensionResourcePoolUid));
+ return *(poolContainer->mResourcePool);
+}
+
+// ---------------------------------------------------------------------------
+// Initializes environment with factory extension
+// ---------------------------------------------------------------------------
+//
+void AlfWidgetEnvExtension::initializeEnvironmentForFactory(CAlfEnv& aEnv)
+ {
+ auto_ptr<AlfWidgetFactoryLoader> widgetFactoryLoader(
+ new (EMM) AlfWidgetFactoryLoader() );
+
+ IAlfWidgetFactory* widgetFactory = NULL;
+ widgetFactory = widgetFactoryLoader->loadWidgetFactory(aEnv);
+ if(!widgetFactory)
+ {
+ ALF_THROW(AlfWidgetException, ECommonError, "Failed to create widget factory");
+ }
+ auto_ptr<AlfExtensionWidgetFactory> widgetFactoryExtension(
+ new(EMM) AlfExtensionWidgetFactory( widgetFactoryLoader.release(),
+ widgetFactory));
+ int err = aEnv.AddExtension( KAlfExtensionWidgetFactoryUid,
+ (MAlfEnvObject*)(widgetFactoryExtension.get()));
+ if ( err != 0)
+ {
+ ALF_THROW(AlfWidgetException, ECommonError, "Failed to add AlfEnv extension");
+ }
+ else
+ {
+ widgetFactoryExtension.release();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the reference for Theme Manager extension object.
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT AlfThemeManagerUtil& AlfWidgetEnvExtension::themeManagerUtil( CAlfEnv& /*aEnv*/)
+ {
+ // Depricated
+ ALF_THROW(AlfWidgetException, EInvalidArgument, "Depricated Module");
+ }
+
+
+// ---------------------------------------------------------------------------
+//Access to the widget factory
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT IAlfWidgetFactory& AlfWidgetEnvExtension::widgetFactory(
+ CAlfEnv& aEnv)
+ {
+ AlfExtensionWidgetFactory* widgetFactoryExtension =
+ static_cast<AlfExtensionWidgetFactory*>(
+ aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+ if ( widgetFactoryExtension == NULL)
+ {
+ initializeEnvironmentForFactory(aEnv);
+ }
+ //re-fetch the widget factory extension
+ widgetFactoryExtension =
+ static_cast<AlfExtensionWidgetFactory*>(
+ aEnv.Extension( KAlfExtensionWidgetFactoryUid));
+ return *(widgetFactoryExtension->mWidgetFactory);
+ }
+
+ } // Alf