Revision: 200947
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:53:38 +0200
changeset 0 d54f32e146dd
child 1 b7335e5e9083
Revision: 200947 Kit: 200951
group/bld.inf
hapticsservices_plat/group/bld.inf
hapticsservices_plat/tacticon_api/group/bld.inf
hapticsservices_plat/tacticon_api/inc/tacticon.h
hapticsservices_plat/tacticon_api/inc/tacticon.hrh
hapticsservices_plat/tacticon_api/tacticon_api.metaxml
hapticsservices_plat/tactile_feedback_core_api/group/bld.inf
hapticsservices_plat/tactile_feedback_core_api/inc/tactilefeedback.h
hapticsservices_plat/tactile_feedback_core_api/tactile_feedback_core_api.metaxml
hapticsservices_plat/tactile_feedback_server_api/group/bld.inf
hapticsservices_plat/tactile_feedback_server_api/inc/tactilefeedbackserver.h
hapticsservices_plat/tactile_feedback_server_api/inc/touchfeedbackadaptation.h
hapticsservices_plat/tactile_feedback_server_api/tactile_feedback_server_api.metaxml
hapticsservices_plat/tactile_feedback_server_api/tsrc/conf/tctestdomtactilefeedbackserver.cfg
hapticsservices_plat/tactile_feedback_server_api/tsrc/conf/ui_testdomtactilefeedbackserver.cfg
hapticsservices_plat/tactile_feedback_server_api/tsrc/group/bld.inf
hapticsservices_plat/tactile_feedback_server_api/tsrc/group/testdomtactilefeedbackserver.mmp
hapticsservices_plat/tactile_feedback_server_api/tsrc/group/testdomtactilefeedbackserver.pkg
hapticsservices_plat/tactile_feedback_server_api/tsrc/inc/testdomtactilefeedbackserver.h
hapticsservices_plat/tactile_feedback_server_api/tsrc/inc/testtactilefeedbackserver.h
hapticsservices_plat/tactile_feedback_server_api/tsrc/init/testdomtactilefeedbackserver.ini
hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testdomtactilefeedbackserver.cpp
hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testdomtactilefeedbackserverblocks.cpp
hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testtactilefeedbackserver.cpp
hapticsservices_pub/group/bld.inf
hapticsservices_pub/tactile_feedback_client_api/group/bld.inf
hapticsservices_pub/tactile_feedback_client_api/inc/touchfeedback.h
hapticsservices_pub/tactile_feedback_client_api/inc/touchfeedbackspec.h
hapticsservices_pub/tactile_feedback_client_api/inc/touchlogicalfeedback.h
hapticsservices_pub/tactile_feedback_client_api/tactile_feedback_client_api.metaxml
hapticsservices_pub/tactile_feedback_client_api/tsrc/conf/tctestsdktfc.cfg
hapticsservices_pub/tactile_feedback_client_api/tsrc/conf/ui_testsdktfc.cfg
hapticsservices_pub/tactile_feedback_client_api/tsrc/group/bld.inf
hapticsservices_pub/tactile_feedback_client_api/tsrc/group/testsdktfc.mmp
hapticsservices_pub/tactile_feedback_client_api/tsrc/group/testsdktfc.pkg
hapticsservices_pub/tactile_feedback_client_api/tsrc/inc/testsdktfc.h
hapticsservices_pub/tactile_feedback_client_api/tsrc/init/testsdktfc.ini
hapticsservices_pub/tactile_feedback_client_api/tsrc/src/testsdktfc.cpp
hapticsservices_pub/tactile_feedback_client_api/tsrc/src/testsdktfcblocks.cpp
layers.sysdef.xml
package_definition.xml
sysdef_1_4_0.dtd
tacticonserver/cenrep/2001FE4D.txt
tacticonserver/cenrep/keys_tacticonserver_obsolete.xls
tacticonserver/client/bwins/tacticonu.def
tacticonserver/client/eabi/tacticonu.def
tacticonserver/client/group/bld.inf
tacticonserver/client/group/tacticon.mmp
tacticonserver/client/src/tacticon.cpp
tacticonserver/client/traces/OstTraceDefinitions.h
tacticonserver/client/traces/fixed_id.definitions
tacticonserver/client/traces/tacticonTraces.h
tacticonserver/client/traces/tracebuilder.cache
tacticonserver/conf/tacticonserver.confml
tacticonserver/conf/tacticonserver_2001FE4D.crml
tacticonserver/group/bld.inf
tacticonserver/inc/tacticondefs.h
tacticonserver/inc/tacticondomaincrkeys.h
tacticonserver/inc/tacticonprivatecrkeys.h
tacticonserver/inc/tacticontrace.h
tacticonserver/rom/tacticonserver.iby
tacticonserver/server/data/Tacticons.ivt
tacticonserver/server/group/bld.inf
tacticonserver/server/group/tacticonserver.mmp
tacticonserver/server/inc/tacticonserver.h
tacticonserver/server/inc/tacticonsession.h
tacticonserver/server/inc/tacticonshutdown.h
tacticonserver/server/src/tacticonserver.cpp
tacticonserver/server/src/tacticonsession.cpp
tacticonserver/server/src/tacticonshutdown.cpp
tacticonserver/server/tacticonpluginfw/bwins/tacticonpluginfwu.def
tacticonserver/server/tacticonpluginfw/eabi/tacticonpluginfwu.def
tacticonserver/server/tacticonpluginfw/group/bld.inf
tacticonserver/server/tacticonpluginfw/group/tacticonpluginfw.mmp
tacticonserver/server/tacticonpluginfw/inc/tacticonplayer.h
tacticonserver/server/tacticonpluginfw/inc/tacticonpluginfwuids.hrh
tacticonserver/server/tacticonpluginfw/src/tacticonplayer.cpp
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/cenrep/2001FE52.txt
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/cenrep/keys_tacticonhapticsplugin_obsolete.xls
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/conf/tacticonhapticsplugin.confml
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/conf/tacticonhapticsplugin_2001FE52.crml
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/data/2001FE52.rss
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/group/bld.inf
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/group/tacticonhapticsplugin.mmp
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/inc/tacticonhapticsplayer.h
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/inc/tacticonhapticsplayerprivatecrkeys.h
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/rom/tacticonhapticsplugin.iby
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/src/tacticonhapticsplayer.cpp
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/OstTraceDefinitions.h
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/fixed_id.definitions
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/tacticonhapticsplayerTraces.h
tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/tracebuilder.cache
tacticonserver/server/traces/OstTraceDefinitions.h
tacticonserver/server/traces/fixed_id.definitions
tacticonserver/server/traces/tacticonserverTraces.h
tacticonserver/server/traces/tracebuilder.cache
tacticonserver/tacticonactionplugin/data/tacticon.rul
tacticonserver/tacticonactionplugin/data/tacticonactionplugin.rss
tacticonserver/tacticonactionplugin/group/bld.inf
tacticonserver/tacticonactionplugin/group/tacticonactionplugin.mmp
tacticonserver/tacticonactionplugin/inc/tacticonactionplugin.h
tacticonserver/tacticonactionplugin/inc/tacticonactionpluginconst.hrh
tacticonserver/tacticonactionplugin/rom/tacticonactionplugin.iby
tacticonserver/tacticonactionplugin/src/main.cpp
tacticonserver/tacticonactionplugin/src/tacticonactionplugin.cpp
tactilefeedback/group/bld.inf
tactilefeedback/inc/tactilefeedbacktrace.h
tactilefeedback/rom/tactilefeedback.iby
tactilefeedback/tactileactionplugin/data/tactile.rul
tactilefeedback/tactileactionplugin/data/tactileactionplugin.rss
tactilefeedback/tactileactionplugin/group/bld.inf
tactilefeedback/tactileactionplugin/group/tactileactionplugin.mmp
tactilefeedback/tactileactionplugin/inc/tactileactionplugin.h
tactilefeedback/tactileactionplugin/inc/tactileactionpluginconst.hrh
tactilefeedback/tactileactionplugin/rom/tactileactionplugin.iby
tactilefeedback/tactileactionplugin/src/main.cpp
tactilefeedback/tactileactionplugin/src/tactileactionplugin.cpp
tactilefeedback/tactilearearegistry/bwins/tactilearearegistryu.def
tactilefeedback/tactilearearegistry/eabi/tactilearearegistryu.def
tactilefeedback/tactilearearegistry/group/bld.inf
tactilefeedback/tactilearearegistry/group/tactilearearegistry.mmp
tactilefeedback/tactilearearegistry/inc/tactilearearegistry.h
tactilefeedback/tactilearearegistry/inc/tactileinternaldatatypes.h
tactilefeedback/tactilearearegistry/src/tactilearearegistry.cpp
tactilefeedback/tactilearearegistry/traces/OstTraceDefinitions.h
tactilefeedback/tactilearearegistry/traces/fixed_id.definitions
tactilefeedback/tactilearearegistry/traces/tactilearearegistryTraces.h
tactilefeedback/tactilearearegistry/traces/tracebuilder.cache
tactilefeedback/tactileclickplugin/bwins/tactileclickpluginu.def
tactilefeedback/tactileclickplugin/eabi/tactileclickpluginu.def
tactilefeedback/tactileclickplugin/group/bld.inf
tactilefeedback/tactileclickplugin/group/tactileclickplugin.mmp
tactilefeedback/tactileclickplugin/inc/tactileclickplugin.h
tactilefeedback/tactileclickplugin/rom/tactileclickplugin.iby
tactilefeedback/tactileclickplugin/src/tactileclickplugin.cpp
tactilefeedback/tactileclickplugin/src/tactilefeedbackserver.cpp
tactilefeedback/tactileclickplugin/traces/OstTraceDefinitions.h
tactilefeedback/tactileclickplugin/traces/fixed_id.definitions
tactilefeedback/tactileclickplugin/traces/tactileclickpluginTraces.h
tactilefeedback/tactileclickplugin/traces/tracebuilder.cache
tactilefeedback/tactilefeedbackclient/bwins/touchfeedbacku.def
tactilefeedback/tactilefeedbackclient/cenrep/2000B494.txt
tactilefeedback/tactilefeedbackclient/conf/tactilefeedback.confml
tactilefeedback/tactilefeedbackclient/conf/tactilefeedback_2000B494.crml
tactilefeedback/tactilefeedbackclient/eabi/touchfeedbacku.def
tactilefeedback/tactilefeedbackclient/group/bld.inf
tactilefeedback/tactilefeedbackclient/group/touchfeedback.mmp
tactilefeedback/tactilefeedbackclient/inc/touchfeedbackclient.h
tactilefeedback/tactilefeedbackclient/inc/touchfeedbackclientpanic.h
tactilefeedback/tactilefeedbackclient/inc/touchfeedbackimpl.h
tactilefeedback/tactilefeedbackclient/inc/touchfeedbackregistry.h
tactilefeedback/tactilefeedbackclient/src/touchfeedback.cpp
tactilefeedback/tactilefeedbackclient/src/touchfeedbackadaptation.cpp
tactilefeedback/tactilefeedbackclient/src/touchfeedbackclient.cpp
tactilefeedback/tactilefeedbackclient/src/touchfeedbackclientpanic.cpp
tactilefeedback/tactilefeedbackclient/src/touchfeedbackimpl.cpp
tactilefeedback/tactilefeedbackclient/src/touchfeedbackregistry.cpp
tactilefeedback/tactilefeedbackclient/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackclient/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackclient/traces/touchfeedbackclientTraces.h
tactilefeedback/tactilefeedbackclient/traces/tracebuilder.cache
tactilefeedback/tactilefeedbackresolver/bwins/tactilefeedbackresolveru.def
tactilefeedback/tactilefeedbackresolver/data/tactilefeedbackeffects.ivt
tactilefeedback/tactilefeedbackresolver/data/ui-pen_down04.wav
tactilefeedback/tactilefeedbackresolver/eabi/tactilefeedbackresolveru.def
tactilefeedback/tactilefeedbackresolver/group/bld.inf
tactilefeedback/tactilefeedbackresolver/group/tactilefeedbackresolver.mmp
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackdefs.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackdomaincrkeys.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackinternalpskeys.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackprivatecrkeys.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackresolver.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbacksession.h
tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbacksrv.h
tactilefeedback/tactilefeedbackresolver/inc/tactileplayer.h
tactilefeedback/tactilefeedbackresolver/inc/tactilepropertyobserver.h
tactilefeedback/tactilefeedbackresolver/inc/tactilepropertywatcher.h
tactilefeedback/tactilefeedbackresolver/plugins/group/bld.inf
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/data/20021339.rss
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/group/bld.inf
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/group/tactileaudioplugin.mmp
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/inc/tactileaudioplayer.h
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/rom/tactileaudioplugin.iby
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/src/tactileaudioplayer.cpp
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/tactileaudioplayerTraces.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/data/2001CB98.rss
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/group/bld.inf
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/group/tactilehapticsplugin.mmp
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/inc/tactilehapticsplayer.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/rom/tactilehapticsplugin.iby
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/src/tactilehapticsplayer.cpp
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/tactilehapticsplayerTraces.h
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/data/2001CB9C.rss
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/group/bld.inf
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/group/tactiletoneplugin.mmp
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/inc/tactiletoneplayer.h
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/rom/tactiletoneplugin.iby
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/src/tactiletoneplayer.cpp
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/tactiletoneplayerTraces.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/data/2001CB9A.rss
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/group/bld.inf
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/group/tactilevibraplugin.mmp
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/inc/tactilevibraplayer.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/rom/tactilevibraplugin.iby
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/src/tactilevibraplayer.cpp
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/tactilevibraplayerTraces.h
tactilefeedback/tactilefeedbackresolver/rom/tactilefeedbackresolver.iby
tactilefeedback/tactilefeedbackresolver/src/tactilefeedback.cpp
tactilefeedback/tactilefeedbackresolver/src/tactilefeedbackresolver.cpp
tactilefeedback/tactilefeedbackresolver/src/tactilefeedbacksession.cpp
tactilefeedback/tactilefeedbackresolver/src/tactilefeedbacksrv.cpp
tactilefeedback/tactilefeedbackresolver/src/tactileplayer.cpp
tactilefeedback/tactilefeedbackresolver/src/tactilepropertywatcher.cpp
tactilefeedback/tactilefeedbackresolver/traces/OstTraceDefinitions.h
tactilefeedback/tactilefeedbackresolver/traces/fixed_id.definitions
tactilefeedback/tactilefeedbackresolver/traces/tactilefeedbackresolverTraces.h
tactilefeedback/tactilefeedbackresolver/traces/tracebuilder.cache
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2009 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:  Haptics Services bld.inf file.
+*
+*/
+
+#include "../hapticsservices_plat/group/bld.inf"
+#include "../hapticsservices_pub/group/bld.inf"
+#include "../tacticonserver/group/bld.inf"
+#include "../tactilefeedback/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2009 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:  Includes all the platform API specific bld.inf files, which
+*               export files.
+*
+*/
+
+#include "../tacticon_api/group/bld.inf"
+#include "../tactile_feedback_core_api/group/bld.inf"
+#include "../tactile_feedback_server_api/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tacticon_api/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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: File that exports the files belonging to Tacticon API.
+* Part of:     Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../inc/tacticon.h           MW_LAYER_PLATFORM_EXPORT_PATH(tacticon.h)
+../inc/tacticon.hrh         MW_LAYER_PLATFORM_EXPORT_PATH(tacticon.hrh)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tacticon_api/inc/tacticon.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,104 @@
+/*
+* Copyright (c) 2009 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: Client interface for using Tacticon server.
+* Part of:     Tacticon Server
+*/
+
+#ifndef R_TACTICON_H
+#define R_TACTICON_H
+
+// INCLUDES
+#include <e32base.h>
+#include <tacticon.hrh>
+
+/**
+*  Client interface to tacticon server.
+*  @lib tacticon.lib
+*  @since S60 5.2
+*/
+class RTacticon : public RSessionBase
+    {
+public:
+
+    /**
+     * C++ default constructor.
+     * @since S60 5.2   
+     */
+    IMPORT_C RTacticon();
+    
+    /**
+     * Creates connection to tacticon server.
+     * @since S60 5.2
+     * @return KErrNone if successful, or one of standard Symbian OS
+     *         error codes if creating connection fails.
+     */
+    IMPORT_C TInt Connect();
+    
+    /**
+     * Closes connection to tacticon server.
+     * @since S60 5.2
+     */
+    IMPORT_C void Close();
+    
+public:
+    /**
+     * Plays tacticon according to a given tacticon type.
+     *
+     * @since S60 5.2
+     * @param aTacticonType - Logical tacticon type.       
+     */
+    IMPORT_C void PlayTacticon( TTacticonType aTacticonType );
+    
+    
+    /**
+     * Stops playing current tacticon
+     *
+     * @since S60 5.2
+     */    
+    IMPORT_C void StopTacticon();       
+    
+    /**
+     * Sets tacticon playback enabled/disabled.
+     * Client must have Write Device Data capability to use this function.
+     * 
+     * @since S60 5.2
+     * @param aEnabled - ETrue sets tacticon playback enabled.
+     *                 - EFalse sets tacticon playback disabled.
+     * @return KErrNone if succesful, or one of standard Symbian OS
+     *         error codes.
+     *         KErrPermissionDenied if client does not have required 
+     *         capability.
+     */        
+    IMPORT_C TInt EnableTacticons( TBool aEnabled );
+    
+    /**
+     * Returns boolean value whether tacticons are enabled or disabled.
+     * 
+     * @since S60 5.2
+     * @return ETrue if tacticons are enabled, EFalse if disabled.  
+     */            
+    IMPORT_C TBool TacticonsEnabled();
+
+private:
+    /*
+     * @return Version of Tacticon Server.
+     */
+    TVersion Version() const;   
+
+    };
+    
+#endif // R_TACTICON_H
+
+//End of File
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tacticon_api/inc/tacticon.hrh	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 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: Logical tacticon type enumeration. 
+* Part of:     Tacticon Server
+*/
+
+#ifndef TACTICON_HRH
+#define TACTICON_HRH
+    
+/**  
+ *  Tacticon types.
+ */    
+enum TTacticonType
+    {
+    ENoTacticon = 0,
+    EPositiveTacticon,
+    ENegativeTacticon,
+    ENeutralTacticon     
+    };
+
+#endif // TACTICON_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tacticon_api/tacticon_api.metaxml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="af93e1836559daaea3540a5a6010167d" dataversion="1.0">
+  <name>Tacticon API</name>
+  <description>Provides an interface for producing tacticons.</description>
+  <type>c++</type>
+  <subsystem>tacticonserver</subsystem>
+  <libs>
+    <lib name="tacticon.lib" />
+  </libs>
+  <release category="domain"/>
+  <attributes>
+     <!-- This indicates wether the api provedes separate html documentation -->
+     <!-- or is the additional documentation generated from headers. -->
+     <!-- If you are unsuere then the value is "no" -->
+     <htmldocprovided>no</htmldocprovided>
+     <adaptation>no</adaptation>
+  </attributes>
+</api>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_core_api/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2009 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:  File that exports the files belonging to 
+*               Tactile Feedback Core API
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../inc/tactilefeedback.h   MW_LAYER_PLATFORM_EXPORT_PATH(tactilefeedback.h)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_core_api/inc/tactilefeedback.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,205 @@
+/*
+* 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:  Client interface to tactile feedback server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef R_TACTILEFEEDBACK_H
+#define R_TACTILEFEEDBACK_H
+
+#include <e32base.h>
+
+#include <touchlogicalfeedback.h>
+
+class CThreadPlayer;
+
+/**
+ *  Client interface to tactile feedback server.
+ *
+ *  @lib tactilefeedbackresolver.lib
+ *  @since S60 5.2
+  */
+class RTactileFeedback : public RSessionBase
+    {
+public:
+
+    /**
+     * C++ default constructor.
+     * @since S60 5.2
+     */
+    IMPORT_C RTactileFeedback();
+    
+    /**
+     * Creates connection to tactile feedback server.
+     * @since S60 5.2
+     * @return KErrNone if successful, or one of standard Symbian OS
+     *         error codes if creating connection fails.
+     */
+    IMPORT_C TInt Connect();
+    
+    /**
+     * Closes connection to tactile feedback server.
+     * @since S60 5.2 
+     */
+    IMPORT_C void Close();
+    
+public:
+    /**
+     * Produces immediately physical feedback according to given
+     * logical feedback type.
+     *
+     * @since S60 5.2
+     * @param aFeedbackType - Logical feedback type.
+     * @param aPlayVibra    - ETrue to play vibra feedback, EFalse if vibra
+     *                        feedback is disabled.
+     * @param aPlayAudio    - ETrue to play audio feedback, EFalse if audio
+     *                        feedback is disabled.        
+     */
+    IMPORT_C void PlayFeedback( TTouchLogicalFeedback aFeedbackType,
+                                TBool aPlayVibra,
+                                TBool aPlayAudio );
+
+    /**
+     * Starts playing continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aType         - Type of continuous feedback to be played.
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range for intensity is 0-100%.
+     */    
+    IMPORT_C void StartFeedback( TTouchContinuousFeedback aType,
+                                 TInt aIntensity );
+                        
+    /**
+     * Modifies the intensity of ongoing continuous feedback.
+     * @since S60 5.2
+     * @param aIntensity    - New intensity for continuous feedback. Value
+     *                        range for intensity is 0-100%. 
+     */    
+    IMPORT_C void ModifyFeedback( TInt aIntensity );
+    
+    /**
+     * Stops the ongoing continuous feedback.
+     *
+     * @since S60 5.2
+     */    
+    IMPORT_C void StopFeedback();
+    
+    /**
+     * Enables or disables audio or/and vibra feedback in whole device.
+     *
+     * @since S60 5.2
+     * @param aFeedbackType  - Feedback types to be enabled/disabled 
+     *                         defined as a bitmask combination of 
+     *                         enumeration items from TTouchFeedbackType.
+     * @return KErrNone, or one of standard Symbian OS error codes if
+     *         enabling/disabling fails.
+     *         KErrPermissionDenied - ECapabilityWriteDeviceData required
+     *                                for using this function.
+     */    
+    IMPORT_C TInt SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType ); 
+    
+    /**
+     * Used to check enabled feedback types for the device.
+     * @since S60 5.2
+     * @param aFeedbackEnabled - Enabled feedback types are returned to this
+     *                           parameter as a bitmask.
+     */    
+    IMPORT_C void FeedbackEnabledForDevice( TTouchFeedbackType& aFeedbackEnabled );
+
+
+public:
+     /**
+     * Produces immediate physical feedback according to given
+     * logical feedback type and given level. 
+     *
+     * Maximum feedback level depends on used player and it is defined in 
+     * Central Repository settings (KTactileFeedbackVibraLevels & 
+     * KTactileFeedbackAudioLevels). 
+     *
+     * UID for tactile feedback settings is: 
+     * KCRUidTactileFeedback = 0x2000B494;
+     *
+     * @since S60 5.2
+     * @param aLevel        - Level value defines the strength of playing 
+     *                        effect. Maximum level value is player dependent.
+     * @param aFeedbackType - Logical feedback type.
+     * @param aType         - Type of feedback to be previewed. 
+     *                        Feedback type in preview mode must be either 
+     *                        audio or haptics, not both.
+     */
+    IMPORT_C void PlayPreviewFeedback( TInt aLevel,
+                                       TTouchLogicalFeedback aFeedback,
+                                       TTouchFeedbackType aType );
+    /**
+     * Starts playing continuous feedback of given type on given level.
+     *
+     * Maximum feedback level depends on used player and it is defined in 
+     * Central Repository settings (KTactileFeedbackVibraLevels & 
+     * KTactileFeedbackAudioLevels). 
+     *
+     * UID for tactile feedback settings is: 
+     * KCRUidTactileFeedback = 0x2000B494;
+     *
+     * @since S60 5.2
+     * @param aLevel        - Level value defines the strength of playing 
+     *                        effect. Maximum level value is player dependent.     
+     * @param aFeedback     - Type of continuous feedback to be played.
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range for intensity is 0-100% from basic
+     *                        strength (see aLevel).
+     * @param aType         - Type of feedback to be previewed.
+     *                        Feedback type in preview mode must be either 
+     *                        audio or haptics, not both.
+     */    
+    IMPORT_C void StartPreviewFeedback( TInt aLevel,
+                                        TTouchContinuousFeedback aFeedback,
+                                        TInt aIntensity,
+                                        TTouchFeedbackType aType );
+    /**
+     * Modifies the intensity of ongoing preview of continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aIntensity    - New intensity for continuous feedback. Value
+     *                        range for intensity is 0-100% from basic
+     *                        strength. 
+     */                                        
+    IMPORT_C void ModifyPreviewFeedback( TInt aIntensity );
+
+    /**
+     * Stops the ongoing preview of continuous feedback.
+     *
+     * @since S60 5.2
+     */      
+    IMPORT_C void StopPreviewFeedback();
+        
+
+private:
+    /**
+     * Returns the version of Tactile Feedback Server.
+     */
+    TVersion Version() const;    
+    
+private:
+    /**
+     * Instance of a class, which creates a new thread for the 
+     * tactile feedback server 
+     * Own.
+     */
+    CThreadPlayer* iThread;    
+    };
+
+#endif // R_TACTILEFEEDBACK_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_core_api/tactile_feedback_core_api.metaxml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="f182a0f8d9e27e4c07f7029454975436" dataversion="1.0">
+  <name>Tactile Feedback Core API</name>
+  <description>Provides client interface to Tactile Feedback server.</description>
+  <type>c++</type>
+  <subsystem>tactilefeedback</subsystem>
+  <libs>
+    <lib name="tactilefeedbackresolver.lib" />
+  </libs>
+  <release category="domain"/>
+  <attributes>
+     <!-- This indicates wether the api provedes separate html documentation -->
+     <!-- or is the additional documentation generated from headers. -->
+     <!-- If you are unsuere then the value is "no" -->
+     <htmldocprovided>no</htmldocprovided>
+     <adaptation>no</adaptation>
+  </attributes>
+</api>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:  File that exports the files belonging to 
+*               Tactile Feedback Server API
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../inc/tactilefeedbackserver.h   MW_LAYER_PLATFORM_EXPORT_PATH(tactilefeedbackserver.h)
+../inc/touchfeedbackadaptation.h MW_LAYER_PLATFORM_EXPORT_PATH(touchfeedbackadaptation.h)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/inc/tactilefeedbackserver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* 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:  Direct feedback interface for usage from Anim Dll plugins.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef M_TACTILEFEEDBACKSERVER_H
+#define M_TACTILEFEEDBACKSERVER_H
+
+
+#include <e32std.h>
+#include <touchlogicalfeedback.h>
+
+/**
+ *  Direct feedback interface for Anim Dll plugins.
+ *
+ *  This interface can be used for triggering feedback from Anim Dll plugins,
+ *  or from any other DLLs which run in window server's process.
+ *
+ *  Usage example:
+ *
+ *    MTactileFeedbackServer* feedback = MTactileFeedbackServer::Instance();
+ *    if ( feedback ) 
+ *        {
+ *        feedback->InstantFeedback( ETouchFeedbackBasic );
+ *        }
+ *
+ *  @lib tactileclickplugin.lib
+ *  @since S60 v5.0
+ */
+class MTactileFeedbackServer
+    {
+public:
+
+    /**
+     * Can be used for acquiring a pointer to touch feedback instance.
+     *
+     * Pointer is retrieved from thread local storage, and thus it is best
+     * to store the returned pointer as member variable in case it shall
+     * be needed frequently.
+     *
+     * NULL is returned in case there is no instance. In that case 
+     * feedback playing is not possible.
+     *
+     * @since S60 5.0
+     * @return Pointer to tactile feedback instance that can be used for direct
+     *         feedback playing.
+     */
+    IMPORT_C static MTactileFeedbackServer* Instance();
+
+
+    /**
+     * Gives instant feedback.
+     *
+     * Notice that the feedback might not be actually played, if 
+     * for example user has disabled the feedback from the settings.
+     *
+     * @since S60 5.0
+     * @param aType - The logical feedback type to play.
+     */
+    virtual void InstantFeedback( TTouchLogicalFeedback aType ) = 0;
+    };
+
+
+#endif // M_TACTILEFEEDBACKSERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/inc/touchfeedbackadaptation.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,147 @@
+/*
+* 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:  Tactile Feedback Client Connection point to application 
+*                framework.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef C_TOUCHFEEDBACKADAPTATION_H
+#define C_TOUCHFEEDBACKADAPTATION_H
+
+
+
+#include <e32std.h>
+#include <e32base.h>
+#include <coecobs.h>
+#include <coemain.h>
+
+
+
+class CTouchFeedbackImpl;
+class CTouchFeedbackClient;
+class MTouchFeedback;
+
+
+/**
+ *  The class for instantiating and accessing Tactile Feedback Client API.
+ *
+ *  Instance of this class should be created at construction phase
+ *  of every new application. This interface is ment to be used only
+ *  by the AppUI class for contructing and destroying the Client API, and
+ *  for informing the client about layout changes.
+ *
+ *  @lib touchfeedback.lib
+ *  @since S60 v5.0
+ */
+class CTouchFeedbackAdaptation : 
+        public CBase, public MObjectProvider, public MCoeControlStateObserver
+    {
+
+
+public:
+
+    /**
+     * Instantiation method.
+     *
+     * One should not attempt to build more than one instance in each
+     * application process.
+     *
+     * @return New CTouchFeedbackAdaptation instance.
+     */
+    IMPORT_C static CTouchFeedbackAdaptation* NewL();
+
+    virtual ~CTouchFeedbackAdaptation();
+    
+    /**
+     * Used by MTouchFeedback::Instance
+     *
+     * @see MTouchFeedback.
+     */
+    static MTouchFeedback* GetInstance();
+
+    /**
+     * Used by MTouchFeedback::CreateInstanceL
+     *
+     * @see MTouchFeedback.
+     */
+    static MTouchFeedback* CreateInstanceL();
+    
+    /**
+     * Used by MTouchFeedback::DestroyInstance
+     *
+     * @see MTouchFeedback.
+     */
+    static void DestroyInstance();
+    
+    /**
+     * Deprecated. This is still in place for keeping the .def -file
+     * unchanged.
+     */
+    IMPORT_C void ControlVisibilityChanged( const CCoeControl* aControl );
+
+    /**
+     * This should be called by the application framework for informing
+     * that current layout has been changed. This way Tactile FW can
+     * disable all feedback areas in those layouts, where pen usage
+     * is not enabled (direct feedback is on UI controls' responsibility).
+     */
+    IMPORT_C void LayoutChanged();
+  
+public: // From MObjectProvider
+    
+    /**
+     * We have to implement this because it is pure virtual in
+     * MObjectProvider, but we always return TTypeUid::Null.
+     *
+     * @param aId - Encapsulates the Uid that identifies the type of 
+     *              object required. Ignored in this class.
+     */
+    TTypeUid::Ptr MopSupplyObject( TTypeUid aId );
+  
+public: // From MCoeControlStateObserver
+    
+    /**
+     * This is implemented for getting notificatons when given control's 
+     * state (i.e. visiblity or dimming status) has been changed. 
+     * This way Tactile FW knows to disable or enable
+     * the feedback for that control again.
+     *
+     * @param aControl - Pointer to the control, which visiblity 
+     *                   or dimming status has changed.
+     * @param aState   - Can be used for knowing if it was dimming or
+     *                   visibility status that changed.
+     */
+    TInt HandleControlStateChange( CCoeControl* aControl, TCoeState aState );
+  
+private:
+
+    CTouchFeedbackAdaptation();
+
+    void ConstructL();
+
+
+private: // data
+
+    /**
+     * The actual feedback instance.
+     * Own.  
+     */
+    CTouchFeedbackImpl* iTouchFeedback;    
+    };
+
+
+#endif //  C_TOUCHFEEDBACKADAPTATION_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tactile_feedback_server_api.metaxml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="f6aad1a936be79a3cc0d6716d0325565" dataversion="1.0">
+  <name>Tactile Feedback Server API</name>
+  <description>Provides Tactile Feedback -functionality for Anim Dll plugins.</description>
+  <type>c++</type>
+  <subsystem>tactilefeedback</subsystem>
+  <libs>
+    <lib name="tactileclickplugin.lib" />
+  </libs>
+  <release category="domain"/>
+  <attributes>
+     <!-- This indicates wether the api provedes separate html documentation -->
+     <!-- or is the additional documentation generated from headers. -->
+     <!-- If you are unsuere then the value is "no" -->
+     <htmldocprovided>no</htmldocprovided>
+     <adaptation>no</adaptation>
+  </attributes>
+</api>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/conf/tctestdomtactilefeedbackserver.cfg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,6 @@
+[Test]
+title TestTactileFdbkServerInstanceL
+run testscripter c:\testframework\ui_testdomtactilefeedbackserver.cfg 1
+[Endtest] 
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/conf/ui_testdomtactilefeedbackserver.cfg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,10 @@
+[Test]
+title TestTactileFdbkServerInstanceL
+bringtoforeground
+create testdomtactilefeedbackserver test
+test TestTactileFdbkServerInstanceL
+delete test
+sendtobackground
+[Endtest] 
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2002 - 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:  ?Description
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+
+PRJ_EXPORTS
+
+
+PRJ_TESTMMPFILES
+testdomtactilefeedbackserver.mmp
+
+PRJ_MMPFILES
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/group/testdomtactilefeedbackserver.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2002 - 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:  ?Description
+*
+*/
+
+
+#include <data_caging_paths.hrh> 
+#ifdef SBSV2
+    #include <platform_paths.hrh>
+#else // SBSV2 not defined
+    #include <platform_paths.hrh>
+#endif // SBSV2
+
+TARGET          testdomtactilefeedbackserver.dll
+TARGETTYPE      dll
+UID             0x1000008D 0x2001CB80
+
+CAPABILITY      ALL -TCB
+
+DEFFILE         testdomtactilefeedbackserver.def
+
+#ifdef SBSV2
+USERINCLUDE     ../inc 
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../src
+
+#else // SBSV2 not defined
+USERINCLUDE     ../inc 
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../src
+#endif // SBSV2
+
+SOURCE          testdomtactilefeedbackserver.cpp
+SOURCE          testdomtactilefeedbackserverblocks.cpp 
+SOURCE          testtactilefeedbackserver.cpp
+
+LIBRARY         euser.lib
+LIBRARY         stiftestinterface.lib
+LIBRARY         stiftestengine.lib
+LIBRARY         tactileclickplugin.lib
+
+LANG            SC
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/group/testdomtactilefeedbackserver.pkg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,41 @@
+;
+; Copyright (c) 2009 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:
+;
+; Languages
+&EN
+
+; Header
+#{"testdomtactilefeedbackserver"}, (0x2001CB80), 1, 0, 0, TYPE=SA
+
+; Localised Vendor name
+%{"Nokia"}
+
+; Unique Vendor name
+:"Nokia"
+
+
+;Copying ordinary file (not language dependent) to fixed drive drive.
+
+"..\init\testdomtactilefeedbackserver.ini"-"c:\Testframework\testdomtactilefeedbackserver.ini", FF   ; FF stands for Normal file
+"..\conf\tctestdomtactilefeedbackserver.cfg"-"c:\Testframework\tctestdomtactilefeedbackserver.cfg", FF   ; FF stands for Normal file
+"..\conf\ui_testdomtactilefeedbackserver.cfg"-"c:\Testframework\ui_testdomtactilefeedbackserver.cfg", FF   ; FF stands for Normal file
+; ?adds your cfg file if need
+
+"\epoc32\RELEASE\ARMV5\urel\testdomtactilefeedbackserver.dll"-"c:\sys\bin\testdomtactilefeedbackserver.dll", FF
+
+
+; Trim For Mms
+; ------------
+; to be added later
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/inc/testdomtactilefeedbackserver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2002 - 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:  Test tactilefeedbackserver.h
+*
+*/
+
+
+
+#ifndef C_TESTDOMTACTILEFEEDBACKSERVER_H
+#define C_TESTDOMTACTILEFEEDBACKSERVER_H
+
+//  INCLUDES
+#include <stiflogger.h>
+#include <testscripterinternal.h>
+#include <stiftestmodule.h>
+#include <testclassassert.h>
+
+// MACROS
+#define TEST_CLASS_VERSION_MAJOR 0
+#define TEST_CLASS_VERSION_MINOR 0
+#define TEST_CLASS_VERSION_BUILD 0
+
+// Logging path
+_LIT( KtestdomtactilefeedbackserverLogPath, "\\logs\\testframework\\testdomtactilefeedbackserver\\" ); 
+// Log file
+_LIT( KtestdomtactilefeedbackserverLogFile, "testdomtactilefeedbackserver.txt" ); 
+_LIT( KtestdomtactilefeedbackserverLogFileWithTitle, "testdomtactilefeedbackserver_[%S].txt" );
+
+/**
+*  Ctestdomtactilefeedbackserver test class for STIF Test Framework TestScripter.
+*  @since S60 5.0
+*/
+NONSHARABLE_CLASS( Ctestdomtactilefeedbackserver ) : public CScriptBase
+    {
+public:  // Constructors and destructor
+
+    /**
+    * Two-phased constructor.
+    */
+    static Ctestdomtactilefeedbackserver* NewL( CTestModuleIf& aTestModuleIf );
+
+    /**
+    * Destructor.
+    */
+    virtual ~Ctestdomtactilefeedbackserver();
+
+public: // Functions from base classes
+
+    /**
+    * From CScriptBase Runs a script line.
+    * @since S60 5.0
+    * @param aItem Script line containing method name and parameters
+    * @return Symbian OS error code
+    */
+    virtual TInt RunMethodL( CStifItemParser& aItem );
+
+private:
+
+    /**
+    * C++ default constructor.
+    */
+    Ctestdomtactilefeedbackserver( CTestModuleIf& aTestModuleIf );
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    */
+    void ConstructL();
+    
+private:
+    /**
+     * TestTactileFdbkServerInstanceL test function for testing 
+     * the Instance function
+     * @since S60 5.0
+     * @param aItem never used
+     * @return Symbian OS error code.
+     */
+    virtual TInt TestTactileFdbkServerInstanceL( CStifItemParser& aItem );
+    
+    /**
+     * Method used to log version of test class
+     */
+    void SendTestClassVersion();
+    
+    /*
+     * Turn off ScreenSaver
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    void TurnOffScreenSaver();
+
+    /**
+     * Restore ScreenSaver
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    void RestoreScreenSaver();
+
+private:    // Data
+
+    /**
+     * ScreenSaver Property
+     */
+    TInt iOldScreenSaverProperty;
+
+    };
+
+#endif      // C_TESTDOMTACTILEFEEDBACKSERVER_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/inc/testtactilefeedbackserver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2002 - 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:  Test tactilefeedbackserver.h
+*
+*/
+
+#ifndef C_TESTTACTILEFEEDBACKSERVER_H
+#define C_TESTTACTILEFEEDBACKSERVER_H
+
+//INCLUDE
+#include <tactilefeedbackserver.h>
+#include <e32base.h>
+
+/*
+ * This class inherit from MTactileFeedbackServer for testing function
+ */
+class CTestMTactileFeedbackServer:public CBase, public MTactileFeedbackServer
+    {
+public:
+    /*
+     * Constructor
+     */
+    CTestMTactileFeedbackServer();
+    
+    /*
+     * Destructor
+     */
+    ~CTestMTactileFeedbackServer();
+    
+    /*
+     * This function is a implement of pure implement function
+     */
+    void InstantFeedback( TTouchLogicalFeedback aType );
+    };
+
+#endif /*C_TESTTACTILEFEEDBACKSERVER_H*/
+
+//Endfile
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/init/testdomtactilefeedbackserver.ini	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,181 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+#     + 'Summary': Summary of the tested test cases.
+#     + 'Environment': Hardware and software info.
+#     + 'TestCases': Test case report.
+#     + 'FullReport': Set of all above ones.
+#     + Example 'TestReportMode= Summary TestCases'
+#
+#     - CreateTestReport setting controls report creation mode
+#     + YES, Test report will created.
+#     + NO, No Test report.
+#
+#     - File path indicates the base path of the test report.
+#     - File name indicates the name of the test report.
+#
+#     - File format indicates the type of the test report.
+#     + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+#     + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+#     - File output indicates output source of the test report.
+#     + FILE, Test report logging to file.
+#     + RDEBUG, Test report logging to using rdebug.
+#
+#     - File Creation Mode indicates test report overwriting if file exist.
+#     + OVERWRITE, Overwrites if the Test report file exist.
+#     + APPEND, Continue logging after the old Test report information if 
+#           report exist.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport    # Possible values are: 
+                              # 'Summary', 'Environment', 'TestCases' or 'FullReport'
+
+CreateTestReport= YES         # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT         # Possible values: TXT or HTML
+TestReportOutput= FILE        # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= OVERWRITE    # Possible values: OVERWRITE or APPEND
+UITestingSupport= Yes
+SeparateProcesses= YES
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= testdomtactilefeedbackservertestdomtactilefeedbackservertestdomtactilefeedbackserver
+# Modules might have initialisation file, specified as
+# IniFile= YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= NormalCases.txt
+# TestCaseFile= SmokeCases.txt
+# TestCaseFile= ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags 
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+
+[New_Module]
+ModuleName= testcombiner
+TestCaseFile= c:\testframework\tctestdomtactilefeedbackserver.cfg
+[End_Module]
+
+#[New_Module]
+#ModuleName= testscripter
+#TestCaseFile= c:\testframework\ui_testdomtactilefeedbackserver.cfg
+#[End_Module]
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+#Load testmoduletestdomtactilefeedbackserver, optionally with initialization file and/or test case files
+#[New_Module]
+#ModuleName= testmodulexxx
+
+#TestModuletestdomtactilefeedbackserver used initialization file
+#IniFile= init.txt
+
+#TestModuletestdomtactilefeedbackserver used configuration file(s)
+#TestCaseFile= testcases1.cfg
+#TestCaseFile= testcases2.cfg
+#TestCaseFile= manualtestcases.cfg
+
+#[End_Module]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#	
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+#       is/are not created by user they will make by software.
+#     + YES, Create log directory/directories if not allready exist.
+#     + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+#     + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined 
+#       Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+#       will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+#     + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+#     + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+#     + FILE, Logging to file(s).
+#     + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+#     + OVERWRITE, Overwrites if file(s) exist.
+#     + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+#     + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+#     + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+#     + YES, Time stamp added to each line in log file(s). Time stamp is 
+#       for example'12.Nov.2003 115958 LOGGING INFO'
+#     + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+#     + YES, Each logging event includes line break and next log event is in own line.
+#     + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+#     + YES, Event ranking number added to each line in log file(s). Ranking number 
+#       depends on environment's tics, for example(includes time stamp also)
+#       '012   12.Nov.2003 115958    LOGGING INFO'
+#     + NO, No event ranking.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' 
+
+CreateLogDirectories= YES    # Possible values: YES or NO
+
+EmulatorBasePath= C:\LOGS\TestFramework\
+EmulatorFormat= HTML         # Possible values: TXT or HTML
+EmulatorOutput= FILE         # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= D:\LOGS\TestFramework\
+#HardwareFormat= HTML        # Possible values: TXT or HTML
+#HardwareOutput= FILE        # Possible values: FILE or RDEBUG
+
+FileCreationMode= OVERWRITE  # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES      # Possible values: YES or NO
+#WithTimeStamp= YES          # Possible values: YES or NO
+#WithLineBreak= YES          # Possible values: YES or NO
+#WithEventRanking= YES       # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testdomtactilefeedbackserver.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2002 - 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:  Test tactilefeedbackserver.h
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <stiftestinterface.h>
+#include <settingserverclient.h>
+#include <screensaverinternalpskeys.h>
+#include <e32property.h>
+
+#include "testdomtactilefeedbackserver.h"
+
+// CONSTANTS
+_LIT( KModuleName, "testdomtactilefeedbackserver.dll" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::Ctestdomtactilefeedbackserver
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+Ctestdomtactilefeedbackserver::Ctestdomtactilefeedbackserver( CTestModuleIf& aTestModuleIf ):
+    CScriptBase( aTestModuleIf )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::~Ctestdomtactilefeedbackserver
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+Ctestdomtactilefeedbackserver::~Ctestdomtactilefeedbackserver()
+    {
+    // Delete logger
+    delete iLog; 
+
+    }
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void Ctestdomtactilefeedbackserver::ConstructL()
+    {
+    //Read logger settings to check whether test case name is to be
+    //appended to log file name.
+    RSettingServer settingServer;
+    CleanupClosePushL( settingServer );
+    TInt ret = settingServer.Connect();
+    if ( ret != KErrNone )
+        {
+        User::Leave(ret);
+        }
+    // Struct to StifLogger settigs.
+    TLoggerSettings loggerSettings; 
+    // Parse StifLogger defaults from STIF initialization file.
+    ret = settingServer.GetLoggerSettings( loggerSettings );
+    if ( ret != KErrNone )
+        {
+        User::Leave( ret );
+        } 
+    // Close Setting server session
+    settingServer.Close();
+    CleanupStack::PopAndDestroy( &settingServer );
+
+    TFileName logFileName;
+    
+    if ( loggerSettings.iAddTestCaseTitle )
+        {
+        TName title;
+        TestModuleIf().GetTestCaseTitleL( title );
+        logFileName.Format( KtestdomtactilefeedbackserverLogFileWithTitle, &title );
+        }
+    else
+        {
+        logFileName.Copy( KtestdomtactilefeedbackserverLogFile );
+        }
+
+    iLog = CStifLogger::NewL( KtestdomtactilefeedbackserverLogPath, 
+                          logFileName,
+                          CStifLogger::ETxt,
+                          CStifLogger::EFile,
+                          EFalse );
+    
+    SendTestClassVersion();
+    
+    TurnOffScreenSaver();
+    }
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+Ctestdomtactilefeedbackserver* Ctestdomtactilefeedbackserver::NewL( CTestModuleIf& aTestModuleIf )
+    {
+    Ctestdomtactilefeedbackserver* self = new( ELeave ) Ctestdomtactilefeedbackserver( aTestModuleIf );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+
+    }
+
+//-----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::SendTestClassVersion
+// Method used to send version of test class
+//-----------------------------------------------------------------------------
+//
+void Ctestdomtactilefeedbackserver::SendTestClassVersion()
+    {
+    TVersion moduleVersion;
+    moduleVersion.iMajor = TEST_CLASS_VERSION_MAJOR;
+    moduleVersion.iMinor = TEST_CLASS_VERSION_MINOR;
+    moduleVersion.iBuild = TEST_CLASS_VERSION_BUILD;
+
+    TFileName moduleName;
+    moduleName = KModuleName;
+
+    TBool newVersionOfMethod = ETrue;
+    TestModuleIf().SendTestModuleVersion( moduleVersion, moduleName, 
+        newVersionOfMethod );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CScriptBase* LibEntryL( 
+    CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+    {
+    return ( CScriptBase* ) Ctestdomtactilefeedbackserver::NewL( aTestModuleIf );
+    }
+
+// -----------------------------------------------------------------------------
+// Turn off ScreenSaver
+// -----------------------------------------------------------------------------
+//
+void Ctestdomtactilefeedbackserver::TurnOffScreenSaver()
+    {
+    TInt err1 = RProperty::Get( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        iOldScreenSaverProperty );
+    TInt err2 = RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        KScreenSaverAllowScreenSaver );    
+    RDebug::Printf( "screensaver property=%d err1=%d err2=%d\n", 
+        iOldScreenSaverProperty, err1, err2 );
+    }
+
+// -----------------------------------------------------------------------------
+// Restore ScreenSaver
+// -----------------------------------------------------------------------------
+//
+void Ctestdomtactilefeedbackserver::RestoreScreenSaver()
+    {
+    RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        iOldScreenSaverProperty );
+    User::ResetInactivityTime();
+    }
+
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testdomtactilefeedbackserverblocks.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2002 - 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:  Test tactilefeedbackserver.h
+*
+*/
+
+
+
+// [INCLUDE FILES]
+#include <e32svr.h>
+#include <stifparser.h>
+#include <stiftestinterface.h>
+#include <tactilefeedbackserver.h>
+
+#include "testdomtactilefeedbackserver.h"
+#include "testtactilefeedbackserver.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt Ctestdomtactilefeedbackserver::RunMethodL( CStifItemParser& aItem ) 
+    {
+
+    static TStifFunctionInfo const KFunctions[] =
+        {  
+        // First string is the function name used in TestScripter script file.
+        // Second is the actual implementation member function. 
+        ENTRY( "TestTactileFdbkServerInstanceL", 
+            Ctestdomtactilefeedbackserver::TestTactileFdbkServerInstanceL ),
+
+        // [test cases entries]
+
+        };
+
+    const TInt count = sizeof( KFunctions ) / sizeof( TStifFunctionInfo );
+
+    return RunInternalL( KFunctions, count, aItem );
+
+    }
+
+// -----------------------------------------------------------------------------
+// Ctestdomtactilefeedbackserver::TestTactileFdbkServerInstanceL
+// -----------------------------------------------------------------------------
+//
+TInt Ctestdomtactilefeedbackserver::TestTactileFdbkServerInstanceL( CStifItemParser& /*aItem*/ )
+    {
+    CTestMTactileFeedbackServer* FbServer = new( ELeave ) CTestMTactileFeedbackServer;
+    CleanupStack::PushL( FbServer );
+    MTactileFeedbackServer* server = FbServer->Instance();
+    STIF_ASSERT_NULL( server );
+    CleanupStack::PopAndDestroy( FbServer );
+    return KErrNone;
+    }
+
+//  [End of File]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_plat/tactile_feedback_server_api/tsrc/src/testtactilefeedbackserver.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2002 - 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:  Test tactilefeedbackserver.h
+*
+*/
+
+
+//INCLUDE
+#include "testtactilefeedbackserver.h"
+
+// -----------------------------------------------------------------------------
+// CTestMTactileFeedbackServer::CTestMTactileFeedbackServer
+// -----------------------------------------------------------------------------
+//
+CTestMTactileFeedbackServer::CTestMTactileFeedbackServer()
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CTestMTactileFeedbackServer::~CTestMTactileFeedbackServer
+// -----------------------------------------------------------------------------
+//
+CTestMTactileFeedbackServer::~CTestMTactileFeedbackServer()
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CTestMTactileFeedbackServer::InstantFeedback
+// -----------------------------------------------------------------------------
+//
+void CTestMTactileFeedbackServer::InstantFeedback( TTouchLogicalFeedback /*aType*/ )
+    {
+    
+    }
+
+//End file
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,21 @@
+/*
+* Copyright (c) 2009 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:  Includes all the public API specific bld.inf files, which
+*               export files.
+*
+*/
+
+
+
+#include "../tactile_feedback_client_api/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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:  File that exports the files belonging to 
+*               Tactile Feedback Client API
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+../inc/touchfeedback.h            MW_LAYER_PUBLIC_EXPORT_PATH(touchfeedback.h)
+../inc/touchlogicalfeedback.h     MW_LAYER_PUBLIC_EXPORT_PATH(touchlogicalfeedback.h)
+../inc/touchfeedbackspec.h        MW_LAYER_PUBLIC_EXPORT_PATH(touchfeedbackspec.h)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/inc/touchfeedback.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,703 @@
+/*
+* 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:  Interface for using area registry and direct feedback from
+*                applications and UI controls.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef M_TOUCHFEEDBACK_H
+#define M_TOUCHFEEDBACK_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <coemain.h>
+
+#include <touchlogicalfeedback.h>
+#include <touchfeedbackspec.h>
+
+class CCoeControl;
+
+/**
+ *  This is the Tactile Feedback interface for UI Controls.
+ *
+ *  Provides an interface to add, modify and remove feedback areas
+ *  in the registry. There is also an option to trigger direct feedback, 
+ *  hence bypassing the registry.
+ *
+ *  Feedback areas must always be related to some UI Control (derived
+ *  from CCoeControl). Areas are distinguished from each other based on
+ *  control's address and an index number (so that it is possible
+ *  to register and maintain multiple areas for same control).
+ *
+ *  Clients must add, maintain and remove their feedback areas using this
+ *  API according to the state changes of the application / control, and
+ *  according to for e.g. device wide layout changes.
+ *
+ *  There are two cases when tactile framework automatically updates the
+ *  feedback areas for control: Feedback is always disabled when control
+ *  becomes dimmed and re-enabled when control becomes undimmed again.
+ *  If control becomes invisible, then feedback areas are (temporarily)
+ *  removed, and they will be automatically added again when control
+ *  becomes visible again.
+ *
+ *  This class is not intended for derivation outside the library.
+ *
+ *  @lib touchfeedback.lib
+ *  @since S60 v5.0
+ */
+class MTouchFeedback
+    {
+public:
+
+    /**
+     * Used for acquiring a pointer to touch feedback instance.
+     *
+     * Pointer is retrieved from thread local storage, and thus it is best
+     * to store the returned pointer as member variable in case it will
+     * be needed frequently.
+     *
+     * NULL is returned in case there is no instance. In that case 
+     * CreateInstanceL -function can be used for creating a new instance.
+     *
+     * @since S60 5.0
+     * @return Pointer to touch feedback instance created for this
+     *         application process.
+     */
+    IMPORT_C static MTouchFeedback* Instance();
+
+    /**
+     * Creates a new touch feedback instance. The usage of
+     * this function should only be necessary from processes which
+     * are not GUI applications, but which still have user interface
+     * (or want to play direct feedback).
+     *
+     * DestroyInstance -function must be called for deleting the instance
+     * when it is no longer needed.
+     *
+     * @since S60 5.0
+     * @return Pointer to new touch feedback instance.
+     */
+    IMPORT_C static MTouchFeedback* CreateInstanceL();
+
+    /**
+     * Destroys the touch feedback instance and clears pointer in 
+     * thread local storage.
+     *
+     * This function must only be used in case touch feedback has been
+     * created with CreateInstanceL -function. I.e. normal GUI applications
+     * should never call this function.
+     *
+     * @since S60 5.0
+     */
+    IMPORT_C static void DestroyInstance();
+
+    /**
+     * This function can be used to check, whether touch feedback is
+     * supported at all in the device.
+     *
+     * All the API functions can be called safely even if touch feedback
+     * is not enabled (for e.g. in devices without touch screen). But in
+     * some situations registry updates can require complex calculations, 
+     * which can be skipped if touch feedback is not enabled at all.
+     *
+     * Notice that the settings related to touch feedback have no effect
+     * on the behavior of this function. I.e. even if user turns touch
+     * feedback OFF from settings, this function still returns 
+     * ETrue. The reason for this is that registry updates must be done
+     * anyway even if the feedback is not on for the moment, because 
+     * user can turn it on at anytime, and it is not possible to force
+     * an update for all applications in that case.
+     *
+     * @since S60 5.0
+     * @return ETrue if touch feedback is supported in this device.
+     */
+    virtual TBool TouchFeedbackSupported() = 0;
+
+    /**
+     * Used for disabling or enabling feedback in the application.
+     *
+     * Tactile feedback is enabled by default, and thus standard 
+     * S60 components (such as CBA, lists and options menu) automatically 
+     * give feedback even if the application itself would make no effort 
+     * for producing feedback.
+     * 
+     * For some applications (such as games) feedback might not be
+     * wanted at all. In addition some applications may need to disable
+     * feedback in some specific situations. For example: A camera 
+     * application may need to disable feedback during video recording,
+     * because otherwise feedbacks may cause disturbing sounds that 
+     * will be recorded into the video clip.
+     *
+     * Notice that this function only affects direct feedback and 
+     * area registry based feedback for this application. I.e. if this 
+     * application is taken to background, other applications can still 
+     * produce feedback.
+     *
+     * Also notice that enabling feedback doesn't still mean that feedback
+     * would necessarily be generated, because user may have disabled the
+     * feedback for whole device from the settings.
+     *
+     * @since S60 5.0
+     * @param aEnabled - Give ETrue as parameter for enabling feedback, and
+     *                   EFalse for disabling feedback.
+     */
+    virtual void SetFeedbackEnabledForThisApp( TBool aEnabled ) = 0;
+
+    /**
+     * Used to check whether feedback is enabled for this application.
+     *
+     * Notice that this function only returns what was given as parameter
+     * to SetFeedbackEnabledForThisApp -function. I.e. this function
+     * can return ETrue even if  feedback would be currently disabled
+     * from settings.
+     *
+     * If only vibra or audio feedback is enabled, this function still
+     * returns ETrue.
+     *
+     * @since S60 5.0
+     * @return ETrue if feedback is enabled for this application.
+     */
+    virtual TBool FeedbackEnabledForThisApp() = 0;
+
+    /**
+     * Sets or updates rectangular feedback area to registry.
+     *
+     * If this is new area (i.e. there is not yet area with given control
+     * address and area index in the registry), then this area will be 
+     * added as the top priority area for its window, i.e. this
+     * area will be hit test first when pointer event arrives. 
+     *
+     * Notice however, that this area will remain as top priority area only
+     * until the next new area is added to the registry, or until 
+     * MoveFeedbackAreaToFirstPriority -function is called. I.e. new areas
+     * are always put on top priority, but they will only remain on top
+     * until they will be overridden by next area.
+     *
+     * The control that is given as parameter should usually be the one
+     * that is responsible of handling the pointer events on the 
+     * corresponding feedback area.
+     *
+     * The area can later be identified by passing control pointer and
+     * index as parameters to the other functions (for modifying or 
+     * removing the feedback area). In case control only
+     * registers one area, then index 0 can always be used. Usually most
+     * sensible approach is to use indexes 1, 2, 3 etc. for additional 
+     * feedback areas, but in practice any desired index values can be
+     * used.
+     *
+     * Notice that if given control is dimmed, then feedback type will
+     * be set to "None". If given control is not visible, then feedback
+     * area will not be added to registry at all (for now). However, 
+     * registry is automatically updated when control's dimming or 
+     * visibility changes, so one can call this function also for
+     * dimmed and invisible control.
+     *
+     * When the control given as parameter to this function is destroyed,
+     * then the RemoveFeedbackForControl -function must be called while
+     * giving the same control as parameter again. This is necessary
+     * for removing all the feedback areas, and also for resetting the
+     * state information stored by the API implementation.
+     *
+     * @since S60 5.0
+     * @param aControl      - The control handling pointer events on this
+                              feedback area.
+     * @param aIndex        - The index number of the area to be added.
+     * @param aRect         - The feedback area rectangle.
+     * @param aFeedbackType - The logical feedback type given
+     * @param aEventType    - The pointer event type that triggers the 
+     *                        feedback (currently only ETouchEventStylusDown
+     *                        is supported).
+     * @return KErrNone, or one of standard Symbian OS error codes
+     *         if setting of area to registry failed. 
+     *         Some specific error codes:
+     *         KErrArgument - A NULL pointer was given as first parameter, or
+     *                        the given control does not have any window
+     *                        associated to it.
+     *         KErrNotSupported - Unsupported logical feedback type or
+     *                            event type was given as parameter.
+     */
+    virtual TInt SetFeedbackArea( const CCoeControl* aControl, 
+                                  TUint32 aIndex,
+                                  TRect aRect, 
+                                  TTouchLogicalFeedback aFeedbackType, 
+                                  TTouchEventType aEventType ) = 0;
+    
+    /**
+     * Removes feedback area from the registry.
+     *
+     * This function is designed to be used in case feedback areas
+     * need to be removed elsewhere than in control's destructor. In 
+     * control's destructor RemoveFeedbackForControl -function must be 
+     * used instead.
+     *
+     * @since S60 5.0
+     * @param aControl - The control, who has registered the area.
+     * @param aIndex   - The index of the area to be removed.
+     */
+    virtual void RemoveFeedbackArea( const CCoeControl* aControl, 
+                                     TUint32 aIndex ) = 0;
+    
+    /**
+     * Removes all feedback areas of specified control from registry.
+     *
+     * This function also clears all related data that has been cached
+     * by the API implementation, and thus it must always be called from 
+     * control's destructor in case control has used any of the following 
+     * functions:
+     *   - SetFeedbackArea
+     *   - EnableFeedbackForControl 
+     *
+     * Especially notice that it is not enough to remove all feedback areas 
+     * individually by using RemoveFeedbackArea -function.
+     *
+     * The difference between this function and EnableFeedbackForControl
+     * -function is that this function really removes all areas related
+     * to this control from registry, whereas EnableFeedbackForControl
+     * (when EFalse if given as parameter) only temporarily disables 
+     * those areas.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control, whose area registry 
+     *                   entries and cached information will be removed.
+     */
+    virtual void RemoveFeedbackForControl( const CCoeControl* aControl ) = 0;
+
+    /**
+     * Changes feedback area in the registry.
+     *
+     * The area must have been originally added to the registry with 
+     * SetFeedbackArea -function, or otherwise this function will
+     * do nothing.
+     *
+     * This function is intended to be used especially in 
+     * portrait / landscape changes.
+     *
+     * If given CCoeControl pointer is NULL, then this function call
+     * does nothing.
+     *
+     * @since S60 5.0
+     * @param aControl - The control, who has registered the area.
+     * @param aIndex   - The index number of the area, that will be changed.
+     * @param aNewRect - New area rectangle for given feedback area.
+     */
+    virtual void ChangeFeedbackArea( const CCoeControl* aControl, 
+                                     TUint32 aIndex, 
+                                     TRect aNewRect ) = 0;
+
+    /**
+     * Changes feedback type in the registry.
+     *
+     * Feedback can be temporarily disabled by giving ETouchFeedbackNone
+     * as parameter (although using EnableFeedbackForControl function with
+     * parameter EFalse is usually better for this functionality).
+     *
+     * The area must have been originally added to the registry with 
+     * SetFeedbackArea -function, or otherwise this function will
+     * do nothing.
+     *
+     * If given control pointer is NULL, then this function call
+     * is ignored.
+     *
+     * This function only changes feedback type for down event.
+     * To change feedback types for all the events in the feedback area use
+     * function SetFeedbackArea with CFeedbackSpec container class 
+     * definion instead.
+     *
+     * @since S60 5.0
+     * @param aControl - The control, who has registered the area.
+     * @param aIndex   - The index number of the area, that will be changed.
+     * @param aNewType - New feedback type for the area.
+     */
+    virtual void ChangeFeedbackType( const CCoeControl* aControl, 
+                                     TUint32 aIndex, 
+                                     TTouchLogicalFeedback aNewType ) = 0;
+
+    
+    /**
+     * Makes the given feedback area the first priority area in the window
+     * where it is located.
+     *
+     * In practice this means that this will be the first area that is 
+     * hit tested when a pointer event arrives.
+     *
+     * Notice however, that this area will only keep its top priority status
+     * until the next area is added to the registry, or until 
+     * this function is called again for some other area. I.e. there is no 
+     * way for giving any area a permanent status as top priority area
+     * (Registry works as a stack, and new items are added on top).
+     *
+     * If given control pointer is NULL, this function call does nothing.
+     *
+     * @since S60 5.0
+     * @param aControl - The control, who has registered the area.
+     * @param aIndex   - The index number of the area, which 
+     *                   will be prioritized.
+     */
+    virtual void MoveFeedbackAreaToFirstPriority( const CCoeControl* aControl, 
+                                                  TUint32 aIndex ) = 0;
+
+    /**
+     * This function forces all registry changes made on client side to be
+     * sent to server side immediately.
+     *
+     * This operation causes always immediate and synchronous client-server 
+     * transaction, and can possibly also cause flushing of window server
+     * client side buffer. Hence this function should only be used in case 
+     * there is a synchronization problem so that feedback triggered from 
+     * area registry does not correspond to the areas defined by application.
+     *
+     * This function is only likely to help in such situation, where this
+     * application's active objects are running all the time for several seconds,
+     * because in that case updates won't be transferred to server immediately.
+     *
+     * Calling this function has no effect in case there are no pending 
+     * area registry updates.
+     *
+     * @since S60 5.0
+     */
+    virtual void FlushRegistryUpdates( ) = 0;
+    
+    /**
+     * Gives direct feedback.
+     *
+     * Notice that the feedback might not be actually played, if 
+     * for example user has disabled the feedback from the settings.
+     *
+     * This function always causes a synchronous client-server transaction, 
+     * and potentially flushing of window server client-side buffer.
+     *
+     * @since S60 5.0
+     * @param aType - The logical feedback type to play.
+     */
+    virtual void InstantFeedback( TTouchLogicalFeedback aType ) = 0;
+
+    /**
+     * Gives direct feedback if given control has not disabled it.
+     *
+     * This function only gives feedback, if EnableFeedbackForControl
+     * function has NOT been called on given control with second
+     * parameter EFalse.
+     * 
+     * This overload is recommended when
+     * feedback is triggered from UI controls, because then the owner
+     * of the control can decide whether both area registry based and
+     * direct feedback should be enabled or not.
+     *
+     * If feedback is enabled for the given control, then this function 
+     * causes a synchronous client-server transaction, 
+     * and potentially flushing of window server client-side buffer.
+     *
+     * @since S60 5.0
+     * @param aControl - The control, who wishes to play feedback.
+     * @param aType    - The logical feedback type to play.
+     */
+    virtual void InstantFeedback( const CCoeControl* aControl,
+                                  TTouchLogicalFeedback aType ) = 0;
+                                  
+    
+    /**
+     * Can be used for querying, whether given control has any feedback
+     * areas registered.
+     *
+     * It does not matter whether the areas are disabled or enabled for
+     * the moment.
+     *
+     * Notice that one should not usually call this function, as it
+     * is always allowed to call for example RemoveFeedbackArea
+     * -function without checking if the area really exists (this
+     * is done internally in the API implementation anyway).
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control, whose feedback is
+     *                   queried.
+     * @return ETrue if the given control has at least one feedback
+     *         area defined. EFalse otherwise.
+     */
+    virtual TBool ControlHasFeedback( const CCoeControl* aControl ) = 0;
+    
+    /**
+     * Can be used for querying, whether given control has a feedback
+     * area defined with given index number.
+     *
+     * It does not matter whether the areas are disabled or enabled for
+     * the moment.
+     *
+     * Notice that one should not usually call this function, as it
+     * is always allowed to call for example RemoveFeedbackArea
+     * -function without checking if the area really exists (this
+     * is done internally in the API implementation anyway).
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control, whose feedback is
+     *                   queried.
+     * @param aIndex   - The index number of the area which is queried.
+     * @return ETrue if the given control has a feedback area defined
+     *         with given index number. EFalse otherwise.
+     */
+    virtual TBool ControlHasFeedback( const CCoeControl* aControl, 
+                                      TUint32 aIndex ) = 0;
+            
+    /**
+     * This function enables or disables all feedback areas registered for 
+     * the given control. Disabling also affects to the overloaded version
+     * of InstantFeedback -function, so that feedback is not played if
+     * the control given as parameter has its feedback disabled.
+     *
+     * This function can be used for temporarily disabling
+     * the feedback for some given control. Calling with second parameter 
+     * ETrue re-enables feedback areas, but it still does not
+     * guarantee any feedback (control can be dimmed, invisible, of may not
+     * even have any feedback areas registered).
+     *
+     * This function affects both vibra- and audio feedback.
+     *
+     * Any control that uses this function must call RemoveFeedbackForControl
+     * -function in its destructor.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to control, whose feedback will be 
+     *                   enabled or disabled according to second parameter.
+     * @param aEnable  - Use EFalse for temporary disabling the feedback for
+     *                   this control, and ETrue for restoring the situation
+     *                   to normal.
+     */
+    virtual void EnableFeedbackForControl( const CCoeControl* aControl,
+                                           TBool aEnable ) = 0;       
+                                           
+    /**
+     * This function can be used for separately enabling or disabling audio-
+     * and vibra feedback for the given control.
+     *
+     * Otherwise the function behaves in the same way as the overload with
+     * only one TBool parameter.
+     *
+     * Any control that uses this function must call RemoveFeedbackForControl
+     * -function in its destructor.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to control, whose audio- and vibra 
+     *                   feedback will be enabled or disabled according 
+     *                   to given parameters.
+     * @param aEnableVibra  - Use EFalse for temporary disabling the vibra 
+     *                        feedback for this control, and ETrue for 
+     *                        restoring the situation to normal.
+     * @param aEnableAudio  - Use EFalse for temporary disabling the audio 
+     *                        feedback for this control, and ETrue for 
+     *                        restoring the situation to normal.
+     */
+    virtual void EnableFeedbackForControl( const CCoeControl* aControl,
+                                           TBool aEnableVibra,
+                                           TBool aEnableAudio ) = 0; 
+                                           
+    /**
+     * Used for disabling/enabling audio/vibra feedback in
+     * the application.
+     *
+     * This is identical with the overload which has only one parameter, 
+     * with the exception that one can disable audio and vibra feedback 
+     * separately with this version.
+     *
+     * @since S60 5.0
+     * @param aVibraEnabled - Give ETrue as parameter for enabling vibra 
+     *                        feedback, and EFalse for disabling vibra 
+     *                        feedback for this application.
+     * @param aAudioEnabled - Give ETrue as parameter for enabling audio 
+     *                        feedback, and EFalse for disabling audio
+     *                        feedback for this application.
+     */
+    virtual void SetFeedbackEnabledForThisApp( TBool aVibraEnabled,
+                                               TBool aAudioEnabled ) = 0;
+
+
+    /**
+     * Used to check whether audio or vibra feedback is enabled for this application.
+     *
+     * Notice that this function only returns what was given as parameter
+     * to SetFeedbackEnabledForThisApp -function. I.e. this function
+     * can return ETrue even if  feedback would be currently disabled
+     * from settings.
+     *
+     * @since S60 5.2
+     * @param aFeedbackType - Feedback type.
+     * @return ETrue if asked feedback type is enabled for this application.
+     */
+    virtual TBool FeedbackEnabledForThisApp( TTouchFeedbackType aFeedbackType ) = 0;
+    
+    /**
+     * Starts continuous feedback if given control has not disabled it.
+     *
+     * Only one continuous feedback per control can be played simultaneously.
+     * Started feedback will be stopped automatically if application loses 
+     * key focus or application crashes or some other control starts
+     * continuous feedback.     
+     * 
+     * If StartFeedback is called again for the same control, then feedback
+     * type and intensity are modified accordingly. This may cause a break
+     * in the feedback effect in case feedback type changes.          
+     *
+     * EnableFeedbackForControl also affects to this function so that
+     * feedback is not given if EnableFeedbackForControl
+     * function has been called with second and third parameter EFalse.
+     * 
+     * @since S60 5.2
+     * @param aControl      - The control, who wishes to play feedback.
+     * @param aType         - The continuous feedback type to play.
+     * @param aPointerEvent - Pointer event which triggered this feedback
+     *                        (give NULL as parameter if no related pointer
+     *                         event available)     
+     * @param aIntensity    - Feedback intensity to begin with. range 0-100%. 
+     *                        Use 50% if no reason to use other value.     
+     * @param aTimeout      - Timeout value to automatically stop continuous 
+     *                        feedback if there's no new Start call within the
+     *                        timeout. Use value 0 if timeout is not used.
+     */
+    virtual void StartFeedback( const CCoeControl* aControl,
+                                TTouchContinuousFeedback aType,
+                                const TPointerEvent* aPointerEvent,
+                                TInt aIntensity,
+                                TTimeIntervalMicroSeconds32 aTimeout ) = 0;
+
+                                
+    /**
+     * This function modifies intensity of continuous feedback on the fly.
+     *
+     * @since S60 5.2
+     * @param aControl      - The control which continuous feedback is modified.
+     * @param aIntensity    - New intensity value. range 0-100%
+     */
+    virtual void ModifyFeedback( const CCoeControl* aControl,
+                                 TInt aIntensity ) = 0;
+
+                                 
+    /**
+     * This function stops continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aControl - The control which continuous feedback is stopped.
+     */
+    virtual void StopFeedback( const CCoeControl* aControl ) = 0;
+
+
+    /**
+     * This function enables or disables audio or/and vibra feedback in
+     * whole device.
+     * 
+     * Tactile feedback is enabled by default, and thus standard 
+     * S60 components (such as CBA, lists and options menu) automatically 
+     * give feedback even if the application itself would make no effort 
+     * for producing feedback.
+     *
+     * Requires WriteDeviceData capability
+     *
+     * @since S60 5.2
+     * @param aFeedbackType - Feedback types to be enabled/disabled defined as
+     *                        a bitmask combination of enumeration items from
+     *                        TTouchFeedbackType
+     * @return KErrNone, or one of standard Symbian OS error codes
+     *         if user has not WriteDeviceData capability. 
+     */
+    virtual TInt SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType ) = 0;
+
+
+    /**
+     * Used to check enabled feedback types for the device.
+     *
+     * Notice that this function only returns what was given as parameter
+     * to SetFeedbackEnabledForDevice -function. I.e. this function
+     * can return ETrue even if  feedback would be currently disabled
+     * from settings.
+     *
+     * @since S60 5.2
+     * @return Enabled/disabled feedback types as bitmask combination.
+     */
+    virtual TTouchFeedbackType FeedbackEnabledForDevice() = 0;
+
+
+    /**
+     * Gives direct feedback if given control has not disabled it.
+     *
+     * This overload is recommended when triggered feedback is related
+     * to pointer event. System uses aPointerEvent to avoiding
+     * two (or more) direct feedbacks for the same pointer event.
+     *
+     * @since S60 5.2
+     * @param aControl      - The control, who wishes to play feedback.
+     * @param aType         - The logical feedback type to play.
+     * @param aPointerEvent - pointer event which triggered this feedback.
+     */
+    virtual void InstantFeedback( const CCoeControl* aControl,
+                                  TTouchLogicalFeedback aType,
+                                  const TPointerEvent& aPointerEvent ) = 0;
+
+
+    /**
+     * Sets or updates rectangular feedback area to registry.
+     *
+     * This overload allows user to set more than one touch event types to
+     * one feedback area. Otherwise the function behaves in the same way
+     * as the overload with separated feedback type and event type parameters.
+     *
+     * @since S60 5.2
+     * @param aControl        - The control handling pointer events on this
+     *                          feedback area.
+     * @param aIndex          - The index number of the area to be added.
+     * @param aRect           - The feedback area rectangle.
+     * @param aFeedbackSpec   - The specification how this feedback area 
+     *                          triggers feedback for different touch events.     
+     * @return KErrNone, or one of standard Symbian OS error codes
+     *         if setting of area to registry failed. 
+     *         Some specific error codes:
+     *         KErrArgument - A NULL pointer was given as first parameter, or
+     *                        the given control does not have any window
+     *                        associated to it.
+     *         KErrNotSupported - Unsupported predefined feedback profile
+     *                            was given as parameter.
+     */
+    virtual TInt SetFeedbackArea( const CCoeControl* aControl, 
+                                  TUint32 aIndex,
+                                  TRect aRect, 
+                                  CFeedbackSpec* aFeedbackSpec ) = 0;
+
+    /**
+     * Gives direct feedback if given control has not disabled it.
+     *
+     * This overload is recommended when triggered feedback is related
+     * to pointer event. System uses aPointerEvent to avoiding
+     * two (or more) direct feedbacks for the same pointer event. Using this 
+     * overload it is also possible to disable unwanted feedback (vibra/audio)
+     * by giving only wanted feedback type as parameter.
+     *
+     * @since S60 5.2
+     * @param aControl      - The control, who wishes to play feedback.
+     * @param aType         - The logical feedback type to play.
+     * @param aFeedbackType - Feedback types to be played as a bitmask 
+     *                        combination of enumeration items from
+     *                        TTouchFeedbackType
+     * @param aPointerEvent - Pointer event, which triggered this feedback.
+     */
+    virtual void InstantFeedback( const CCoeControl* aControl,
+                                  TTouchLogicalFeedback aType,
+                                  TTouchFeedbackType aFeedbackType,
+                                  const TPointerEvent& aPointerEvent ) = 0;
+
+
+
+    };
+
+
+
+#endif //  M_TOUCHFEEDBACK_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/inc/touchfeedbackspec.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,111 @@
+/*
+* 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:  Container for composit feedback types.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef C_FEEDBACKSPEC_H
+#define C_FEEDBACKSPEC_H
+
+#include <e32base.h>
+#include <touchlogicalfeedback.h>
+
+
+//  Container for one event/feedback type pair 
+struct TTactileFbItem
+    {
+    TTouchEventType       iEventType;
+    TTouchLogicalFeedback iFeedback;
+    TTouchFeedbackType    iFeedbackType;
+    };
+
+/**
+ *  Contains feedback types used for setting feedback area
+ *
+ *  This class acts as container for event/feedback type pairs. These pairs
+ *  define what kind of feedback is producent when area is touched.
+ *
+ *  @lib touchfeedback.lib
+ *  @since S60 5.2
+ */
+class CFeedbackSpec: public CBase
+    {
+public:
+    /**
+     * Instantiation method.
+     *
+     * @since S60 5.2
+     * @return New CFeedbackSpec instance.
+     */
+    IMPORT_C static CFeedbackSpec* New();
+
+    /**
+     * Destructor.
+     *
+     * @since S60 5.2
+     */
+    virtual ~CFeedbackSpec();
+    
+    /**
+     * Adds event/feedback type pair to feedback spec
+     *
+     * @since S60 5.2
+     * @param aEventType - Touch event type.
+     * @param aFeedback  - Logical feedback type.
+     * @return KErrNone, or one of standard Symbian OS error codes.
+     */
+    IMPORT_C TInt AddFeedback( TTouchEventType aEventType, 
+                               TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * Gets defined event/feedback type pairs
+     *
+     * @since S60 5.2
+     * @param aArray - Event/feedback type pairs is returned here.
+     */
+    IMPORT_C void GetFeedbackSpec( RArray<TTactileFbItem>& aArray );
+    
+    /**
+     * Adds event/feedback type pair to feedback spec.
+     * Using this overload it is possible to define only one feedback type
+     * (vibra/audio) for event.
+     *
+     * @since S60 5.2
+     * @param aEventType - Touch event type.
+     * @param aFeedback  - Logical feedback type.
+     * @param aFeedbackType - Bitmask to define feedback type (vibra/audio).
+     * @return KErrNone, or one of standard Symbian OS error codes.
+     */
+    IMPORT_C TInt AddFeedback( TTouchEventType aEventType, 
+                               TTouchLogicalFeedback aFeedback,
+                               TTouchFeedbackType aFeedbackType );    
+
+
+private:
+    /**
+     * Constructor.
+     */
+    CFeedbackSpec();
+
+private: // data
+
+    /**
+     * Array for event type/feedback type pairs
+     * Own.
+     */
+    RArray<TTactileFbItem> iFbArray;  
+    };
+  
+#endif //  C_FEEDBACKSPEC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/inc/touchlogicalfeedback.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,116 @@
+/*
+* Copyright (c) 2009 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:  Logical feedback type enumeration. 
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TOUCHLOGICALFEEDBACK_H
+#define TOUCHLOGICALFEEDBACK_H
+
+#include <e32std.h>
+
+/**  
+ *  Pointer event types, that can be used when registering
+ *  areas to registry. 
+ */
+enum TTouchEventType
+    {
+    ETouchEventStylusDown,
+    ETouchEventStylusUp,
+    ETouchEventStylusPressDown,
+    ETouchEventStylusPressUp
+    };
+    
+/**  
+ *  Logical feedback types, that can be used when producing direct
+ *  feedback, or when registering areas to area registry.
+ *
+ *  Notice, that client application cannot decide the actual physical
+ *  feedback that shall be generated. It depends on device configuration,
+ *  and current settings. In current devices the user changeable settings
+ *  includes vibra and sound feedbacks.
+ *
+ *  Instructions for using these feedback types:
+ *
+ *  ETouchFeedbackNone      - Use for disabling feedback for some areas of
+ *                            window when using area registry.
+ *
+ *  ETouchFeedbackBasic     - Use as default feedback for pen down events.
+ *                            For example, pressing a button or tab.
+ *
+ *  ETouchFeedbackSensitive - Sensitive feedback for those situations,
+ *                            where the triggering action is not very 
+ *                            important (e.g. change focus in list), or when
+ *                            there can be a large amount of feedbacks in
+ *                            a short time (e.g. text selection which gives
+ *                            feedback on every new selected character).
+ *                            Also used for scrolling and dragging.
+ *
+ *  Different UI components have specific feedback types, which should be 
+ *  used to maintain similar feedback behaviour in components of same type.
+ *
+ */
+enum TTouchLogicalFeedback
+    {
+    ETouchFeedbackNone = 0,
+    ETouchFeedbackBasic,
+    ETouchFeedbackSensitive,
+    // New types for S60 5.2:
+    ETouchFeedbackBasicButton = 0x100,    
+    ETouchFeedbackSensitiveButton,
+    ETouchFeedbackList,
+    ETouchFeedbackSensitiveList,
+    ETouchFeedbackBoundaryList,    
+    ETouchFeedbackSlider,
+    ETouchFeedbackEdit,
+    ETouchFeedbackLineSelection,
+    ETouchFeedbackBlankSelection,
+    ETouchFeedbackTextSelection,
+    ETouchFeedbackEmptyLineSelection,
+    ETouchFeedbackTab,
+    ETouchFeedbackPopUp,
+    ETouchFeedbackIncreasingPopUp,
+    ETouchFeedbackDecreasingPopUp,
+    ETouchFeedbackFlick,
+    ETouchFeedbackCheckbox,
+    ETouchFeedbackSensitiveInput,
+    ETouchFeedbackCharacterInputButton,
+    ETouchFeedbackMultiTouchRecognized
+    };
+    
+/**  
+ *  Logical feedback types for producing continuous feedback.
+ *
+ */
+enum TTouchContinuousFeedback
+    {
+    ETouchContinuousSmooth = 0x300, // For generic continuous feedback for custom controls
+    ETouchContinuousSlider,
+    ETouchContinuousInput,
+    ETouchContinuousFlick
+    };
+    
+/**  
+ *  Physical feedback types as bitmask.
+ *
+ */  
+enum TTouchFeedbackType
+    {
+    ETouchFeedbackAudio = 0x01,
+    ETouchFeedbackVibra = 0x02
+    };
+
+#endif // TOUCHLOGICALFEEDBACK_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tactile_feedback_client_api.metaxml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<api id="7a713853e06f376f69d4bcf955ec3e1b" dataversion="1.0">
+  <name>Tactile Feedback Client API</name>
+  <description>Provides applications and UI controls a centralized way for producing tactile feedback for different touch events.</description>
+  <type>c++</type>
+  <subsystem>tactilefeedback</subsystem>
+  <libs>
+    <lib name="touchfeedback.lib" />
+  </libs>
+  <release category="sdk" sinceversion="5.0"/>
+  <attributes>
+     <!-- This indicates wether the api provedes separate html documentation -->
+     <!-- or is the additional documentation generated from headers. -->
+     <!-- If you are unsuere then the value is "no" -->
+     <htmldocprovided>no</htmldocprovided>
+     <adaptation>no</adaptation>
+  </attributes>
+</api>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/conf/tctestsdktfc.cfg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,13 @@
+
+
+[Test]
+title TestTFBInstance
+run testscripter c:\testframework\ui_testsdktfc.cfg 1
+[Endtest] 
+
+
+
+[Test]
+title TestTFBDestroyInstance
+run testscripter c:\testframework\ui_testsdktfc.cfg 2
+[Endtest]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/conf/ui_testsdktfc.cfg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,19 @@
+
+
+[Test]
+title TestTFBInstance
+create testsdktfc test
+test TestTFBCreateInstanceL 
+test TestTFBInstance 
+delete test
+[Endtest] 
+
+
+
+[Test]
+title TestTFBDestroyInstance
+create testsdktfc test
+test TestTFBCreateInstanceL 
+test TestTFBDestroyInstance 
+delete test
+[Endtest] 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2002 - 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:  ?Description
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+
+PRJ_EXPORTS
+
+
+PRJ_TESTMMPFILES
+testsdktfc.mmp
+
+PRJ_MMPFILES
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/group/testsdktfc.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,54 @@
+/*TYPE TESTCLASS*//*
+* Copyright (c) 2002 - 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:  tactile_feedback_client_api
+*
+*/
+
+
+#include <data_caging_paths.hrh> 
+#include <platform_paths.hrh>
+
+TARGET          testsdktfc.dll
+TARGETTYPE      dll
+UID             0x1000008D 0x2001CB80
+
+CAPABILITY      ALL -TCB
+
+DEFFILE         testsdktfc.def
+
+#ifdef SBSV2
+    USERINCLUDE     ../inc 
+
+    MW_LAYER_SYSTEMINCLUDE
+
+    SOURCEPATH      ../src
+#else // SBSV2 not defined
+USERINCLUDE     ../inc 
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../src
+#endif // SBSV2
+
+SOURCE          testsdktfc.cpp
+SOURCE          testsdktfcblocks.cpp
+
+LIBRARY         euser.lib
+LIBRARY         stiftestinterface.lib
+LIBRARY         stiftestengine.lib
+LIBRARY         touchfeedback.lib
+
+LANG            SC
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/group/testsdktfc.pkg	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,41 @@
+;
+; Copyright (c) 2009 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:
+;
+
+
+; Languages
+&EN
+
+; Provide value for uid
+#{"testsdktfc"},(0x2001CB80),1,1,0,TYPE=SA
+
+; Localised Vendor name
+%{"Nokia"}
+
+; Unique Vendor name
+:"Nokia"
+
+"..\init\testsdktfc.ini"-"c:\Testframework\testsdktfc.ini", FF   ; FF stands for Normal file
+"..\conf\tctestsdktfc.cfg"-"c:\Testframework\tctestsdktfc.cfg", FF   ; FF stands for Normal file
+"..\conf\ui_testsdktfc.cfg"-"c:\Testframework\ui_testsdktfc.cfg", FF   ; FF stands for Normal file
+; ?adds your cfg file if need
+
+"\epoc32\RELEASE\ARMV5\urel\testsdktfc.dll"-"c:\sys\bin\testsdktfc.dll", FF
+
+  
+; Trim For Mms
+; ------------
+; to be added later
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/inc/testsdktfc.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,140 @@
+/*
+* Copyright (c) 2002 - 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:  tactile_feedback_client_api
+*
+*/
+
+
+
+#ifndef C_TESTSDKTFC_H
+#define C_TESTSDKTFC_H
+
+//  INCLUDES
+#include <stiflogger.h>
+#include <testscripterinternal.h>
+#include <stiftestmodule.h>
+#include <testclassassert.h>
+
+// MACROS
+#define TEST_CLASS_VERSION_MAJOR 0
+#define TEST_CLASS_VERSION_MINOR 0
+#define TEST_CLASS_VERSION_BUILD 0
+
+// Logging path
+_LIT( KtestsdktfcLogPath, "\\logs\\testframework\\testsdktfc\\" ); 
+// Log file
+_LIT( KtestsdktfcLogFile, "testsdktfc.txt" ); 
+_LIT( KtestsdktfcLogFileWithTitle, "testsdktfc_[%S].txt" );
+
+/**
+*  CTestSDKTFC test class for STIF Test Framework TestScripter.
+*  @since S60 5.0
+*/
+NONSHARABLE_CLASS(CTestSDKTFC) : public CScriptBase
+    {
+public:  // Constructors and destructor
+
+    /**
+    * Two-phased constructor.
+    */
+    static CTestSDKTFC* NewL( CTestModuleIf& aTestModuleIf );
+
+    /**
+    * Destructor.
+    */
+    virtual ~CTestSDKTFC();
+
+public: // Functions from base classes
+
+    /**
+    * From CScriptBase Runs a script line.
+    * @since S60 5.0
+    * @param aItem Script line containing method name and parameters
+    * @return Symbian OS error code
+    */
+    virtual TInt RunMethodL( CStifItemParser& aItem );
+
+private:
+
+    /**
+    * C++ default constructor.
+    */
+    CTestSDKTFC( CTestModuleIf& aTestModuleIf );
+
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    */
+    void ConstructL();
+
+    /**
+    * Frees all resources allocated from test methods.
+    * @since S60 5.0
+    */
+    void Delete();
+
+    
+    /**
+     * Method used to log version of test class
+     */
+    void SendTestClassVersion();
+    
+        /**
+     * Turn off ScreenSaver
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    void TurnOffScreenSaver();
+
+    /**
+     * Restore ScreenSaver
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    void RestoreScreenSaver();
+
+    //[TestMethods]
+private:// for test the touchfeedback.h
+    /**
+     * TestTFCInstance test method for test the Instance method.
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    virtual TInt TestTFBInstance( CStifItemParser& aItem );
+    /**
+     * TestTFCCreateInstanceL test method for test the CreateInstanceL method.
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    virtual TInt TestTFBCreateInstanceL( CStifItemParser& aItem );
+    /**
+     * TestTFBDestroyInstance test method for test the DestroyInstance method.
+     * @since S60 5.0
+     * @return Symbian OS error code.
+     */
+    virtual TInt TestTFBDestroyInstance( CStifItemParser& aItem );
+    
+private:// for test the 
+    
+private:    // Data
+
+    /**
+     * ScreenSaver Property
+     */
+    TInt iOldScreenSaverProperty;
+
+    };
+
+#endif      // C_TESTSDKTFC_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/init/testsdktfc.ini	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,181 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+#     + 'Summary': Summary of the tested test cases.
+#     + 'Environment': Hardware and software info.
+#     + 'TestCases': Test case report.
+#     + 'FullReport': Set of all above ones.
+#     + Example 'TestReportMode= Summary TestCases'
+#
+#     - CreateTestReport setting controls report creation mode
+#     + YES, Test report will created.
+#     + NO, No Test report.
+#
+#     - File path indicates the base path of the test report.
+#     - File name indicates the name of the test report.
+#
+#     - File format indicates the type of the test report.
+#     + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+#     + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+#     - File output indicates output source of the test report.
+#     + FILE, Test report logging to file.
+#     + RDEBUG, Test report logging to using rdebug.
+#
+#     - File Creation Mode indicates test report overwriting if file exist.
+#     + OVERWRITE, Overwrites if the Test report file exist.
+#     + APPEND, Continue logging after the old Test report information if 
+#           report exist.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport    # Possible values are: 
+                              # 'Summary', 'Environment', 'TestCases' or 'FullReport'
+
+CreateTestReport= YES         # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT         # Possible values: TXT or HTML
+TestReportOutput= FILE        # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= OVERWRITE    # Possible values: OVERWRITE or APPEND
+UITestingSupport= Yes
+SeparateProcesses= YES
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= testsdktfctestsdktfctestsdktfc
+# Modules might have initialisation file, specified as
+# IniFile= YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= NormalCases.txt
+# TestCaseFile= SmokeCases.txt
+# TestCaseFile= ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags 
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+
+[New_Module]
+ModuleName= testcombiner
+TestCaseFile= c:\testframework\tctestsdktfc.cfg
+[End_Module]
+
+#[New_Module]
+#ModuleName= testscripter
+#TestCaseFile= c:\testframework\ui_testsdktfc.cfg
+#[End_Module]
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+#Load testmoduletestsdktfc, optionally with initialization file and/or test case files
+#[New_Module]
+#ModuleName= testmodulexxx
+
+#TestModuletestsdktfc used initialization file
+#IniFile= init.txt
+
+#TestModuletestsdktfc used configuration file(s)
+#TestCaseFile= testcases1.cfg
+#TestCaseFile= testcases2.cfg
+#TestCaseFile= manualtestcases.cfg
+
+#[End_Module]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#	
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+#       is/are not created by user they will make by software.
+#     + YES, Create log directory/directories if not allready exist.
+#     + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+#     + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined 
+#       Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+#       will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+#     + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+#     + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+#     + FILE, Logging to file(s).
+#     + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+#     + OVERWRITE, Overwrites if file(s) exist.
+#     + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+#     + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+#     + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+#     + YES, Time stamp added to each line in log file(s). Time stamp is 
+#       for example'12.Nov.2003 115958 LOGGING INFO'
+#     + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+#     + YES, Each logging event includes line break and next log event is in own line.
+#     + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+#     + YES, Event ranking number added to each line in log file(s). Ranking number 
+#       depends on environment's tics, for example(includes time stamp also)
+#       '012   12.Nov.2003 115958    LOGGING INFO'
+#     + NO, No event ranking.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' 
+
+CreateLogDirectories= YES    # Possible values: YES or NO
+
+EmulatorBasePath= C:\LOGS\TestFramework\
+EmulatorFormat= HTML         # Possible values: TXT or HTML
+EmulatorOutput= FILE         # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= D:\LOGS\TestFramework\
+#HardwareFormat= HTML        # Possible values: TXT or HTML
+#HardwareOutput= FILE        # Possible values: FILE or RDEBUG
+
+FileCreationMode= OVERWRITE  # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES      # Possible values: YES or NO
+#WithTimeStamp= YES          # Possible values: YES or NO
+#WithLineBreak= YES          # Possible values: YES or NO
+#WithEventRanking= YES       # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/src/testsdktfc.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,180 @@
+/*
+* Copyright (c) 2002 - 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:  tactile_feedback_client_api
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <stiftestinterface.h>
+#include <settingserverclient.h>
+#include <screensaverinternalpskeys.h>
+#include <e32property.h>
+
+#include "testsdktfc.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::CTestSDKTFC
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CTestSDKTFC::CTestSDKTFC( CTestModuleIf& aTestModuleIf ):
+    CScriptBase( aTestModuleIf )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CTestSDKTFC::ConstructL()
+    {
+    //Read logger settings to check whether test case name is to be
+    //appended to log file name.
+    RSettingServer settingServer;
+    TInt ret = settingServer.Connect();
+    if(ret != KErrNone)
+        {
+        User::Leave(ret);
+        }
+    // Struct to StifLogger settigs.
+    TLoggerSettings loggerSettings; 
+    // Parse StifLogger defaults from STIF initialization file.
+    ret = settingServer.GetLoggerSettings(loggerSettings);
+    if(ret != KErrNone)
+        {
+        User::Leave(ret);
+        } 
+    // Close Setting server session
+    settingServer.Close();
+
+    TFileName logFileName;
+    
+    if(loggerSettings.iAddTestCaseTitle)
+        {
+        TName title;
+        TestModuleIf().GetTestCaseTitleL(title);
+        logFileName.Format(KtestsdktfcLogFileWithTitle, &title);
+        }
+    else
+        {
+        logFileName.Copy(KtestsdktfcLogFile);
+        }
+
+    iLog = CStifLogger::NewL( KtestsdktfcLogPath, 
+                          logFileName,
+                          CStifLogger::ETxt,
+                          CStifLogger::EFile,
+                          EFalse );
+    
+    SendTestClassVersion();
+    
+    TurnOffScreenSaver();
+    }
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTestSDKTFC* CTestSDKTFC::NewL( CTestModuleIf& aTestModuleIf )
+    {
+    CTestSDKTFC* self = new( ELeave ) CTestSDKTFC( aTestModuleIf );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+
+    }
+
+// Destructor
+CTestSDKTFC::~CTestSDKTFC()
+    { 
+
+    // Delete resources allocated from test methods
+    Delete();
+
+    // Delete logger
+    delete iLog; 
+
+    }
+
+//-----------------------------------------------------------------------------
+// CTestSDKTFC::SendTestClassVersion
+// Method used to send version of test class
+//-----------------------------------------------------------------------------
+//
+void CTestSDKTFC::SendTestClassVersion()
+    {
+    TVersion moduleVersion;
+    moduleVersion.iMajor = TEST_CLASS_VERSION_MAJOR;
+    moduleVersion.iMinor = TEST_CLASS_VERSION_MINOR;
+    moduleVersion.iBuild = TEST_CLASS_VERSION_BUILD;
+
+    TFileName moduleName;
+    moduleName = _L( "testsdktfc.dll" );
+
+    TBool newVersionOfMethod = ETrue;
+    TestModuleIf().SendTestModuleVersion( moduleVersion, moduleName, 
+        newVersionOfMethod );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CScriptBase* LibEntryL( 
+    CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+    {
+    return ( CScriptBase* ) CTestSDKTFC::NewL( aTestModuleIf );
+    }
+
+// -----------------------------------------------------------------------------
+// Turn off ScreenSaver
+// -----------------------------------------------------------------------------
+//
+void CTestSDKTFC::TurnOffScreenSaver()
+    {
+    //TInt Get(TUid aCategory, TUint aKey, TInt &aValue);
+    TInt err1 = RProperty::Get( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        iOldScreenSaverProperty );
+    TInt err2 = RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        KScreenSaverAllowScreenSaver );    
+    RDebug::Printf( "screensaver property=%d err1=%d err2=%d\n", 
+        iOldScreenSaverProperty, err1, err2 );
+    }
+
+// -----------------------------------------------------------------------------
+// Restore ScreenSaver
+// -----------------------------------------------------------------------------
+//
+void CTestSDKTFC::RestoreScreenSaver()
+    {
+    RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, 
+        iOldScreenSaverProperty );
+    User::ResetInactivityTime();
+    }
+
+
+//  End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hapticsservices_pub/tactile_feedback_client_api/tsrc/src/testsdktfcblocks.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2002 - 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:  tactile_feedback_client_api
+*
+*/
+
+
+
+// [INCLUDE FILES]
+#include <e32svr.h>
+#include <stifparser.h>
+#include <stiftestinterface.h>
+#include <touchfeedback.h>
+
+#include "testsdktfc.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::Delete
+// Delete here all resources allocated and opened from test methods. 
+// Called from destructor. 
+// -----------------------------------------------------------------------------
+//
+void CTestSDKTFC::Delete() 
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CTestSDKTFC::RunMethodL( 
+    CStifItemParser& aItem ) 
+    {
+
+    static TStifFunctionInfo const KFunctions[] =
+        {  
+        // First string is the function name used in TestScripter script file.
+        // Second is the actual implementation member function. 
+
+        ENTRY( "TestTFBInstance", CTestSDKTFC::TestTFBInstance ),
+        ENTRY( "TestTFBCreateInstanceL", CTestSDKTFC::TestTFBCreateInstanceL ),
+        ENTRY( "TestTFBDestroyInstance", CTestSDKTFC::TestTFBDestroyInstance ),
+
+        // [test cases entries]
+
+        };
+
+    const TInt count = sizeof( KFunctions ) / sizeof( TStifFunctionInfo );
+
+    return RunInternalL( KFunctions, count, aItem );
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::TestTFCInstance
+// Instance test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTestSDKTFC::TestTFBInstance( CStifItemParser& /*aItem*/ )
+    {
+    // Print to UI 
+        _LIT( Ktestsdktfc, "testsdktfc" );
+        _LIT( KTestTFBInstance, "In TestTFBInstance" );
+        TestModuleIf().Printf( 0, Ktestsdktfc, KTestTFBInstance );
+        // Print to log file
+        iLog->Log( KTestTFBInstance );
+    
+        MTouchFeedback* ptr = MTouchFeedback::Instance( );
+        
+        STIF_ASSERT_NOT_NULL( ptr );
+        
+        return KErrNone;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::TestTFCInstance
+// Instance test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTestSDKTFC::TestTFBCreateInstanceL( CStifItemParser& /*aItem*/ )
+    {
+    // Print to UI 
+        _LIT( Ktestsdktfc, "testsdktfc" );
+        _LIT( KTestTFBCreateInstanceL, "In TestTFBCreateInstanceL" );
+        TestModuleIf().Printf( 0, Ktestsdktfc, KTestTFBCreateInstanceL );
+        // Print to log file
+        iLog->Log( KTestTFBCreateInstanceL );
+   
+        MTouchFeedback* mtfb = MTouchFeedback::CreateInstanceL( );
+        //ptr->CreateInstanceL();
+        
+        STIF_ASSERT_NOT_NULL( mtfb );
+        
+        return KErrNone;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CTestSDKTFC::TestTFCInstance
+// Instance test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTestSDKTFC::TestTFBDestroyInstance( CStifItemParser& /*aItem*/ )
+    {
+    // Print to UI 
+        _LIT( Ktestsdktfc, "testsdktfc" );
+        _LIT( KTestTFBDestroyInstance, "In TestTFBDestroyInstance" );
+        TestModuleIf().Printf( 0, Ktestsdktfc, KTestTFBDestroyInstance );
+        // Print to log file
+        iLog->Log( KTestTFBDestroyInstance );
+   
+       
+         TInt err = KErrNone;
+         TRAP ( err, MTouchFeedback::DestroyInstance());
+        
+        
+        return err;
+    
+    }
+//  [End of File]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layers.sysdef.xml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+  <!ENTITY layer_real_source_path "sf/mw/hapticsservices" >
+]>
+
+<SystemDefinition name="hapticsservices" schema="1.4.0">
+  <systemModel>
+    <layer name="mw_layer">
+      <module name="hapticsservices">
+        <unit unitID="abs.hapticsservices" mrp="" bldFile="&layer_real_source_path;/group" name="hapticsservices" />
+        <unit unitID="abs.tactilefeedbackresolver" mrp="" bldFile="&layer_real_source_path;/tactilefeedback/tactilefeedbackresolver/plugins/group" filter="dfs_build" name="tactilefeedbackresolver" />
+        <unit unitID="abs.tacticonhapticsplugin" mrp="" bldFile="&layer_real_source_path;/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/group" filter="dfs_build" name="tacticonhapticsplugin" />
+      </module>
+    </layer>
+
+  </systemModel>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package_definition.xml	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0">
+  <package id="hapticsservices" name="Haptics Services" levels="fw api">
+    <collection id="tactilefeedback" name="Tactile Feedback" level="fw">
+      <component id="tactilearearegistry" filter="s60" name="Tactile Area Registry" introduced="^1">
+        <unit bldFile="tactilefeedback/tactilearearegistry/group"/>
+      </component>
+      <component id="tactilefeedbackclient" filter="s60" name="Tactile Feedback Client" introduced="^1">
+        <unit bldFile="tactilefeedback/tactilefeedbackclient/group"/>
+      </component>
+      <component id="tactilefeedback_build" filter="s60" name="Tactile Feedback Build" introduced="^1">
+		<!-- consider moving IBY to one fo the above components -->
+        <unit bldFile="tactilefeedback/group"/>
+      </component>
+    </collection>
+    <collection id="hapticsservices_info" name="Haptics Services Info" level="api">
+      <component id="hapticsservices_pub" filter="s60" name="Haptics Services Public Interfaces" class="api" introduced="^1">
+        <unit bldFile="hapticsservices_pub/group"/>
+      </component>
+      <component id="hapticsservices_plat" filter="s60" name="Haptics Services Platform Interfaces" class="api" introduced="^1">
+        <unit bldFile="hapticsservices_plat/group"/>
+      </component>
+    </collection>
+  </package>
+</SystemDefinition>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysdef_1_4_0.dtd	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+  name CDATA #REQUIRED
+  schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+  name CDATA #REQUIRED
+  levels CDATA #IMPLIED
+  span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+  name CDATA #REQUIRED
+  level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+  unitID ID #REQUIRED
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  bldFile CDATA #REQUIRED
+  priority CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+  name CDATA #REQUIRED
+  mrp CDATA #REQUIRED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+  name CDATA #REQUIRED
+  version CDATA #REQUIRED
+  late (Y|N) #IMPLIED
+  filter CDATA #IMPLIED
+  contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+  name ID #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+  name ID #REQUIRED
+  abldTarget CDATA #REQUIRED
+  description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+  name ID #REQUIRED
+  abldOption CDATA #REQUIRED
+  description CDATA #REQUIRED
+  enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+  name ID #REQUIRED
+  description CDATA #REQUIRED
+  filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+  command CDATA #REQUIRED
+  targetList IDREFS #IMPLIED
+  unitParallel (Y | N | y | n) #REQUIRED
+  targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+  name CDATA #REQUIRED
+  cwd CDATA #REQUIRED
+  command CDATA #REQUIRED>  
Binary file tacticonserver/cenrep/2001FE4D.txt has changed
Binary file tacticonserver/cenrep/keys_tacticonserver_obsolete.xls has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/bwins/tacticonu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,9 @@
+EXPORTS
+	??0RTacticon@@QAE@XZ @ 1 NONAME ; RTacticon::RTacticon(void)
+	?Close@RTacticon@@QAEXXZ @ 2 NONAME ; void RTacticon::Close(void)
+	?Connect@RTacticon@@QAEHXZ @ 3 NONAME ; int RTacticon::Connect(void)
+	?PlayTacticon@RTacticon@@QAEXW4TTacticonType@@@Z @ 4 NONAME ; void RTacticon::PlayTacticon(enum TTacticonType)
+	?StopTacticon@RTacticon@@QAEXXZ @ 5 NONAME ; void RTacticon::StopTacticon(void)
+	?EnableTacticons@RTacticon@@QAEHH@Z @ 6 NONAME ; int RTacticon::EnableTacticons(int)
+	?TacticonsEnabled@RTacticon@@QAEHXZ @ 7 NONAME ; int RTacticon::TacticonsEnabled(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/eabi/tacticonu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,10 @@
+EXPORTS
+	_ZN9RTacticon12PlayTacticonE13TTacticonType @ 1 NONAME
+	_ZN9RTacticon12StopTacticonEv @ 2 NONAME
+	_ZN9RTacticon5CloseEv @ 3 NONAME
+	_ZN9RTacticon7ConnectEv @ 4 NONAME
+	_ZN9RTacticonC1Ev @ 5 NONAME
+	_ZN9RTacticonC2Ev @ 6 NONAME
+	_ZN9RTacticon15EnableTacticonsEi @ 7 NONAME
+	_ZN9RTacticon16TacticonsEnabledEv @ 8 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2009 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: Build information file for Tacticon Client API
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+tacticon.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/group/tacticon.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 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: Project definition file for project tacticon client
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET          tacticon.dll
+TARGETTYPE      dll
+UID             0x1000008d 0x2001FE4E
+
+CAPABILITY      CAP_CLIENT_DLL
+VENDORID        VID_DEFAULT
+
+SOURCEPATH      ../src
+SOURCE          tacticon.cpp
+
+USERINCLUDE     ../inc
+USERINCLUDE     ../../inc
+USERINCLUDE     ../traces
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY         euser.lib
+LIBRARY         featmgr.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/src/tacticon.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2009 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: Client interface to tacticon server
+* Part of    : Tacticon Server
+*/
+
+#include <tacticon.h>
+#include <featmgr.h>
+#include "tacticontrace.h"
+#include "tacticondefs.h"
+#include "osttracedefinitions.h" 
+#ifdef OST_TRACE_COMPILER_IN_USE 
+#include "tacticonTraces.h"
+#endif
+
+//------------------------------------------------------------
+// Starts the server
+//------------------------------------------------------------
+//
+TInt StartServer()
+    {
+    TRACE("Tacticon client StartServer() - Begin");
+    TInt res = KErrNone;
+
+    // DLL launch
+    RProcess server;
+    res = server.Create( KTacticonServerName, KNullDesC );
+
+    // Loading failed.
+    if ( res != KErrNone )
+        {
+        return res;
+        }
+    
+    TRequestStatus status;
+    server.Rendezvous( status );
+
+    if ( status != KRequestPending )
+        {
+        TRACE( "Tacticon server StartServer() - Rendezvous failed" );
+        server.Kill( 0 );       // abort startup
+        server.Close();
+        return KErrGeneral;
+        }
+    else
+        {
+        TRACE( "Tacticon server StartServer() - Resume" );
+        server.Resume();    // Logon OK - start the server.
+        }
+        
+    User::WaitForRequest( status );
+    server.Close();
+    
+    TRACE("Tacticon client StartServer() - End");
+    return status.Int();
+    }
+
+// ---------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------
+//
+EXPORT_C RTacticon::RTacticon()
+    {
+    }
+
+// ---------------------------------------------------------
+// Creates connection to tacticon server
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RTacticon::Connect()
+    { 
+    TRACE("RTacticon::Connect() - Begin");
+    // Check if Tacticon feature is supported or not
+    TRAPD( ret, FeatureManager::InitializeLibL() );
+    if ( KErrNone == ret )
+        {
+        TBool supported = 
+            FeatureManager::FeatureSupported( KFeatureIdFfTacticons );
+        FeatureManager::UnInitializeLib();    
+    
+        ret = KErrNotSupported;
+        if ( supported )          
+            {
+            TRACE("RTacticon::Connect() - CreateSession");
+            ret = CreateSession( KTacticonServerName, Version() );
+            if ( ret != KErrNone )
+                {
+                ret = StartServer();
+                if ( ret == KErrNone )
+                    {
+                    TRACE2("RTacticon::Connect() - StartServer(%d)", ret);
+                    ret = CreateSession( KTacticonServerName, Version() );
+                    }
+               }
+            }
+        else
+            {
+            TRACE("RTacticon::Connect() - Feature not supported");
+            }
+        }
+    else
+        {
+        TRACE2("RTacticon::Connect() - FeatureManager init leaves (%d)", ret );
+        }    
+    TRACE2("RTacticon::Connect() - End(%d)", ret);
+    return ret;    
+    }
+    
+// ---------------------------------------------------------
+// Closes connection to tacticon server
+// ---------------------------------------------------------
+//      
+EXPORT_C void RTacticon::Close()
+    {   
+    if ( iHandle )
+        {
+        RSessionBase::Close();
+        }
+    }
+        
+// --------------------------------------------------------------------------
+// Plays tacticon
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTacticon::PlayTacticon( TTacticonType aTacticonType )
+    {
+    if ( iHandle )
+        {
+        TRACE("RTacticon::PlayTacticon - Begin");
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_PLAY_TACTICON_1,
+                   "e_TACTICON_CLIENT_PLAY_TACTICON 1" );
+        SendReceive( EPlayTacticon, TIpcArgs( aTacticonType ) );   
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_PLAY_TACTICON_0,
+                   "e_TACTICON_CLIENT_PLAY_TACTICON 0" );
+        TRACE("RTacticon::PlayTacticon - End");
+        }
+    }
+    
+// --------------------------------------------------------------------------
+// Stops playing current tacticon
+//
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTacticon::StopTacticon()
+    {
+    if ( iHandle )
+        {
+        TRACE("RTacticon::StopTacticon() - Begin");
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_STOP_TACTICON_1,
+                   "e_TACTICON_CLIENT_STOP_TACTICON 1" );
+        SendReceive( EStopTacticon, TIpcArgs() );   
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_STOP_TACTICON_0,
+                   "e_TACTICON_CLIENT_STOP_TACTICON 0" );
+        TRACE("RTacticon::StopTacticon() - End");
+        }
+    }   
+
+// --------------------------------------------------------------------------
+// Enable/disable tacticon playback.
+//
+// --------------------------------------------------------------------------
+//     
+EXPORT_C TInt RTacticon::EnableTacticons( TBool aEnabled )
+    {
+    TInt ret( KErrSessionClosed );
+    if ( iHandle )
+        {
+        TRACE("RTacticon::EnableTacticons() - Begin");
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_ENABLE_TACTICON_1,
+                   "e_TACTICON_CLIENT_ENABLE_TACTICON 1" );
+
+        ret = SendReceive( EEnableTacticons, TIpcArgs( aEnabled ) );
+
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_CLIENT_ENABLE_TACTICON_0,
+                   "e_TACTICON_CLIENT_ENABLE_TACTICON 0" );
+        TRACE("RTacticon::EnableTacticons() - End");
+        }
+    return ret;
+    }      
+
+// --------------------------------------------------------------------------
+// Returns boolean value whether tacticons are enabled or disabled.
+//
+// --------------------------------------------------------------------------
+//     
+EXPORT_C TBool RTacticon::TacticonsEnabled()
+    {
+    TBool enabled( EFalse );
+    if ( iHandle )
+        {
+        TRACE("RTacticon::TacticonsEnabled() - Begin");
+        TPckg<TBool> enabledBuf( enabled );
+        SendReceive( ETacticonsEnabled, TIpcArgs( &enabledBuf ) );
+
+        TRACE("RTacticon::TacticonsEnabled() - End");
+        }
+    return enabled;
+    }   
+
+// ---------------------------------------------------------
+// Returns tacticon server version
+// ---------------------------------------------------------
+//      
+TVersion RTacticon::Version() const
+    {
+    return TVersion( KTacticonServerMajor, 
+                     KTacticonServerMinor,
+                     KTacticonServerBuild );
+    }
+
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,8 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTICON_PERFORMANCE=0x40
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_ENABLE_TACTICON_0=0x6
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_ENABLE_TACTICON_1=0x5
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_PLAY_TACTICON_0=0x2
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_PLAY_TACTICON_1=0x1
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_STOP_TACTICON_0=0x4
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_CLIENT_STOP_TACTICON_1=0x3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/traces/tacticonTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,20 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTICONTRACES_H__
+#define __TACTICONTRACES_H__
+
+#define KOstTraceComponentID 0x2001fe4e
+
+#define TACTICON_CLIENT_PLAY_TACTICON_1 0x400001
+#define TACTICON_CLIENT_PLAY_TACTICON_0 0x400002
+#define TACTICON_CLIENT_STOP_TACTICON_1 0x400003
+#define TACTICON_CLIENT_STOP_TACTICON_0 0x400004
+#define TACTICON_CLIENT_ENABLE_TACTICON_1 0x400005
+#define TACTICON_CLIENT_ENABLE_TACTICON_0 0x400006
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/client/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,74 @@
+<model>
+  <id>537001550</id>
+  <name>tacticon</name>
+  <group>
+    <id>64</id>
+    <name>TACTICON_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTICON_CLIENT_PLAY_TACTICON 1</text>
+      <id>1</id>
+      <name>TACTICON_CLIENT_PLAY_TACTICON_1</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>137</line>
+        <class>RTacticon</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_CLIENT_PLAY_TACTICON 0</text>
+      <id>2</id>
+      <name>TACTICON_CLIENT_PLAY_TACTICON_0</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>140</line>
+        <class>RTacticon</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_CLIENT_STOP_TACTICON 1</text>
+      <id>3</id>
+      <name>TACTICON_CLIENT_STOP_TACTICON_1</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>156</line>
+        <class>RTacticon</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_CLIENT_STOP_TACTICON 0</text>
+      <id>4</id>
+      <name>TACTICON_CLIENT_STOP_TACTICON_0</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>161</line>
+        <class>RTacticon</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_CLIENT_ENABLE_TACTICON 1</text>
+      <id>5</id>
+      <name>TACTICON_CLIENT_ENABLE_TACTICON_1</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>178</line>
+        <class>RTacticon</class>
+        <function>EnableTacticons</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_CLIENT_ENABLE_TACTICON 0</text>
+      <id>6</id>
+      <name>TACTICON_CLIENT_ENABLE_TACTICON_0</name>
+      <location>
+        <file>../src/tacticon.cpp</file>
+        <line>183</line>
+        <class>RTacticon</class>
+        <function>EnableTacticons</function>
+      </location>
+    </trace>
+  </group>
+</model>
Binary file tacticonserver/conf/tacticonserver.confml has changed
Binary file tacticonserver/conf/tacticonserver_2001FE4D.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 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: Master bld.inf for Tacticon client and server.
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_EXPORTS
+../rom/tacticonserver.iby               CORE_IBY_EXPORT_PATH(mw, tacticonserver.iby)
+../inc/tacticondomaincrkeys.h           MW_LAYER_PLATFORM_EXPORT_PATH(tacticondomaincrkeys.h)
+
+// Generic configuration interface for component cenrep settings  
+../conf/tacticonserver.confml           APP_LAYER_CONFML(tacticonserver.confml)
+../conf/tacticonserver_2001FE4D.crml    APP_LAYER_CRML(tacticonserver_2001FE4D.crml)
+
+#include "../server/group/bld.inf"
+#include "../client/group/bld.inf"
+#include "../tacticonactionplugin/group/bld.inf"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/inc/tacticondefs.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2009 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: Tacticon server definitions.
+* Part of    : Tacticon Server
+*/
+
+#ifndef TACTICONDEFS_H
+#define TACTICONDEFS_H
+
+_LIT( KTacticonServerName, "TacticonServer" );
+
+const TInt KTacticonServerMinor = 0;
+const TInt KTacticonServerMajor = 1;
+const TInt KTacticonServerBuild = 0;
+
+const TInt KTacticonShutdownDelay = 2000000; // 2s
+
+enum TTacticonCommands // Server commands.
+    {
+    EPlayTacticon,
+    EStopTacticon,
+    EEnableTacticons,
+    ETacticonsEnabled
+    };
+
+#endif // TACTICONDEFS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/inc/tacticondomaincrkeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2009 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: Domain level Central Repository keys for Tacticon settings.
+* Part of    : Tacticon Server
+*/
+
+#ifndef TACTICONDOMAINCRKEYS_H
+#define TACTICONDOMAINCRKEYS_H
+
+#include <e32std.h>
+
+const TUid KCRUidTacticon = {0x2001FE4D};
+
+/**
+* Base strength of tacticons
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 50
+**/
+const TUint32 KTacticonStrength                    = 0x00000001;
+
+/**
+* Full path of the IVT file, which is used to play tacticons. 
+*
+* Possible values are:
+* Valid path to IVT file. 
+*
+* Default value: "Z:\\system\\sounds\\digital\\tacticons.ivt"
+**/
+const TUint32 KTacticonIVTFile                     = 0x00000002;
+
+
+#endif  // TACTICONDOMAINCRKEYS_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/inc/tacticonprivatecrkeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,75 @@
+/*
+* Copyright (c) 2009 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: Private Central Repository keys for Tacticon setttings.
+* Part of    : Tacticon Server
+*/
+
+
+#ifndef TACTICONPRIVATECRKEYS_H
+#define TACTICONPRIVATECRKEYS_H
+
+#include "tacticondomaincrkeys.h"
+
+/**
+* Implementation UID of the plugin, which is used to play tacticons.
+*
+* Possible values are:
+* Implementation UID of the plugin.
+*
+* Default value: 537001553 (0x2001FE51)
+**/
+const TUint32 KTacticonPlugin                      = 0x00000003;
+
+/**
+* Boolean value to define is tacticons disabled during a phone call or not.
+*
+* Possible values are:
+* 0, 1
+*
+* Default value: 0
+**/
+const TUint32 KTacticonDuringCall                  = 0x00000004;
+
+/**
+* Bitmask to define which tacticons are enabled:
+* Bit 1: Call connected tacticon
+*
+* Possible values are:
+* 0-1
+*
+* Default value: 1
+**/
+const TUint32 KTacticonSet                         = 0x00000005;
+
+/**
+* Defines bit 1 in KTacticonSet. 
+* If this bit is 1, tacticon is played when call is connected
+* If this bit is 0, tacticon is not played when call is connected.
+* By default this is 1.
+*/
+const TInt KTacticonSetCallConnected = 0x01;  // 2^0
+
+/**
+* Actuator type used for playing tacticons
+*
+* Possible values are defined in hwrmlogicalactuators.h
+*
+* Default value: 1 (EHWRMLogicalActuatorAny)
+**/
+const TUint32 KActuatorType                    = 0x00000006;
+
+
+#endif  // TACTICONPRIVATECRKEYS_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/inc/tacticontrace.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2009 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: File with debuf trace definitions.
+* Part of    : Tacticon Server
+*/
+
+#ifndef TACTICONTRACE_H
+#define TACTICONTRACE_H
+
+#ifdef _DEBUG
+
+#include <e32debug.h>
+
+#define TRACE( x )            RDebug::Print( _L( x  ) )
+#define TRACE2( x, y )        RDebug::Print( _L( x ), ( y ) )
+#define TRACE3( x, y, z )     RDebug::Print( _L( x ), ( y ), ( z ) )
+#define TRACE4( x, y, z, zz ) RDebug::Print( _L( x ), ( y ), ( z ), ( zz ) )
+
+#else // _DEBUG
+
+#define TRACE( x ) 
+#define TRACE2( x, y ) 
+#define TRACE3( x, y, z ) 
+#define TRACE4( x, y, z, zz ) 
+
+#endif // _DEBUG
+   
+#endif // TACTICONTRACE_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/rom/tacticonserver.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 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: IBY file for Tacticon server.
+* Part of    : Tacticon Server
+*/
+
+#ifndef TACTICONSERVER_IBY
+#define TACTICONSERVER_IBY
+
+#include <bldvariant.hrh>
+#include <data_caging_paths_for_iby.hrh>
+
+
+// =============================================================================
+// Tacticon Client
+// =============================================================================
+file=ABI_DIR\BUILD_DIR\tacticon.dll                SHARED_LIB_DIR\tacticon.dll
+
+
+#ifdef FF_TACTICONS
+
+// =============================================================================
+// Tacticon Server
+// =============================================================================
+// if feature not included remove all server-related stuff..
+file=ABI_DIR\BUILD_DIR\tacticonserver.exe          PROGRAMS_DIR\tacticonserver.exe
+file=ABI_DIR\BUILD_DIR\tacticonpluginfw.dll        PROGRAMS_DIR\tacticonpluginfw.dll
+
+data=DATAZ_\System\Sounds\Digital\tacticons.ivt    System\Sounds\Digital\tacticons.ivt
+
+#endif // FF_TACTICONS
+
+#endif // TACTICONSERVER_IBY
Binary file tacticonserver/server/data/Tacticons.ivt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2009 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: Build information file for Tacticon server
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../data/tacticons.ivt         /epoc32/data/z/system/Sounds/Digital/tacticons.ivt
+../data/tacticons.ivt         /epoc32/release/winscw/udeb/Z/System/Sounds/Digital/tacticons.ivt
+
+PRJ_MMPFILES
+../tacticonpluginfw/group/tacticonpluginfw.mmp
+tacticonserver.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/group/tacticonserver.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2009 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: Project definition file for tacticon server.
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGETTYPE      exe
+TARGET          tacticonserver.exe
+UID             0 0x2001FE4D
+
+CAPABILITY      CAP_SERVER
+VENDORID        VID_DEFAULT
+
+SOURCEPATH      ../src
+SOURCE          tacticonserver.cpp
+SOURCE          tacticonsession.cpp
+SOURCE          tacticonshutdown.cpp
+
+USERINCLUDE     ../inc
+USERINCLUDE     ../../inc
+USERINCLUDE     ../tacticonpluginfw/inc
+USERINCLUDE     ../traces
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY         euser.lib
+LIBRARY         ecom.lib
+LIBRARY         centralrepository.lib
+LIBRARY         tacticonpluginfw.lib
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/inc/tacticonserver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,177 @@
+/*
+* Copyright (c) 2009 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: Tacticon server implementation.
+* Part of    : Tacticon Server
+*/
+
+#ifndef C_TACTICONSERVER_H
+#define C_TACTICONSERVER_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+#include <tacticon.hrh>
+
+#include "tacticonplayer.h"
+#include "tacticonprivatecrkeys.h"
+#include "tacticondefs.h"
+
+class CRepository;
+class CTacticonShutdown;
+
+/** Total number of ranges */
+const TUint KTacticonRangeCount = 1;
+
+/** Definition of the ranges of IPC numbers */
+const TInt KTacticonRanges[KTacticonRangeCount] = 
+    {
+    0,
+    }; 
+
+/** Policy to implement for each of the above ranges */       
+const TUint8 KTacticonElementsIndex[KTacticonRangeCount] = 
+    {
+    0,
+    };
+
+const CPolicyServer::TPolicyElement KTacticonPolicyElements[] = 
+    {
+    _INIT_SECURITY_POLICY_C2(ECapability_None,
+                               ECapability_None),
+                               CPolicyServer::EFailClient
+    };
+
+/** Package all the above together into a policy */
+const CPolicyServer::TPolicy KTacticonPolicy =
+    {
+    CPolicyServer::EAlwaysPass,     // all attempts should pass
+    KTacticonRangeCount,     // number of ranges
+    KTacticonRanges,         // ranges array
+    KTacticonElementsIndex,  // elements<->ranges index
+    KTacticonPolicyElements, // array of elements
+    };
+    
+/**
+*  A server class to initialize server. 
+*  @lib tacticonserver.lib
+*  @since S60 5.2
+*/
+class CTacticonServer : public CPolicyServer
+    {
+public:
+    /**
+    * 2-phased constructor.
+    */
+    static CTacticonServer* NewLC();
+    
+    /**
+    * C++ destructor.
+    */ 
+    virtual ~CTacticonServer();
+    
+   
+public:
+    /**
+    * From CServer2, creates a new session.
+    * @since S60 5.2
+    * @param aVersion, Tacticon server version
+    * @param aMessage, a message from client     
+    */
+    CSession2* NewSessionL( const TVersion& aVersion,
+                            const RMessage2& aMessage ) const;
+                            
+public:
+    /**
+     * Increase session count.
+     * @since S60 5.2
+     */
+    void AddSession();
+    
+    /**
+     * Decrease session count, close server if count is zero.
+     * @since S60 5.2
+     */
+    void RemoveSession();  
+    
+public:
+    /**
+     * Plays tacticon according to aTacticonType
+     * @since S60 5.2
+     * @param aTacticonType, Tacticon type to be played
+     */
+    void PlayTacticon( TTacticonType aTacticonType ); 
+    
+    /**
+     * Stops playing tacticon
+     * @since S60 5.2
+     */    
+    void StopTacticon();                             
+
+    /**
+     * Sets tacticons enabled/disabled.
+     * @since S60 5.2
+     */    
+    void EnableTacticons( TBool aEnabled );
+    
+    /**
+     * Returns boolean value whether tacticons are enabled or disabled.
+     * @since S60 5.2
+     */        
+    TBool TacticonsEnabled();
+
+private:    
+    /**
+    * C++ constructor.
+    */
+    CTacticonServer();
+    
+    /**
+    * 2nd phase constructor.
+    */
+    void ConstructL();
+
+private:
+    /**
+     * Counter of opened client sessions.
+     */
+    TInt iSessionCount;
+
+    /**
+     * Player plugin. 
+     * Own.
+     */
+    CTacticonPlayer* iPlayer;  
+    
+     /**
+     * Access to settings.
+     * Own.
+     */    
+    CRepository* iRepository;
+  
+    /**
+     * Timer for server shutdown
+     * Own.
+     */
+    CTacticonShutdown* iShutdown; 
+    
+    /**
+     * 
+     */    
+    TBool   iTacticonsEnabled;
+
+    };
+
+
+#endif // C_TACTICONSERVER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/inc/tacticonsession.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2009 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: Tacticon server session implementation.
+* Part of    : Tacticon Server
+*/
+
+#ifndef C_TACTICONSESSION_H
+#define C_TACTICONSESSION_H
+
+// INCLUDES
+#include <e32base.h>
+
+//  FORWARD DECLARATIONS
+class CTacticonServer;
+
+/**
+*  A session class of Tacticon server.
+*
+*  @since S60 5.2
+*/
+
+class CTacticonSession : public CSession2
+    {
+public:
+    /**
+    * C++ constructor.
+    */
+    CTacticonSession();
+    
+    /**
+     * Passes the request forward to DispatchMessageL. 
+     * @param aMessage, a message from client.
+     */
+    void ServiceL( const RMessage2& aMessage );
+    
+    /**
+     * Handles the request from client. 
+     * @param aMessage, a message from client.
+     */
+    void DispatchMessageL( const RMessage2& aMessage );
+    
+    /**
+     * Adds session to server's counter. 
+     */
+    void CreateL(); 
+
+private:
+    /**
+     * Sets tacticons enabled/disabled.
+     */    
+    void EnableTacticonsL( const RMessage2& aMessage );
+        
+    /**
+     * Returns boolean value whether tacticons are enabled or disabled.
+     */           
+    void TacticonsEnabledL( const RMessage2& aMessage );
+
+private:
+
+    /**
+    * C++ destructor.
+    */
+    virtual ~CTacticonSession(); 
+
+    /*
+    * Reference to Tacticon Server. Ownership is not transferred.
+    */
+    CTacticonServer& Server();      
+
+    };
+
+#endif // C_TACTICONSESSION_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/inc/tacticonshutdown.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* Copyright (c) 2009 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: Tacticon server shutdown timer.
+* Part of    : Tacticon Server
+*/
+
+#ifndef C_TACTICONSHUTDOWN_H
+#define C_TACTICONSHUTDOWN_H
+
+#include <e32base.h>
+
+/**
+ *  Tacticon server shutdown timer.
+ */
+class CTacticonShutdown : public CTimer
+    {
+public:
+    
+    /**
+     * Two phased constructor.
+     *
+     * @return Created instance of the shutdown timer.
+     */ 
+    static CTacticonShutdown* NewL();
+
+    /**
+     * Destructor.
+     */ 
+    virtual ~CTacticonShutdown();
+    
+    /**
+     * Starts the timer.
+     */ 
+    void Start();
+
+private:
+
+    /**
+     * C++ constructor.
+     */ 
+    CTacticonShutdown();
+    
+    /**
+     * Second phase construction.
+     */ 
+    void ConstructL();
+    
+    /**
+     * From base class CActive.
+     * @see CActive.
+     * 
+     * Executed when the timer expires; Shuts down
+     * the server by closing the active scheduler.
+     */ 
+    void RunL();
+    };
+
+#endif // C_TACTICONSHUTDOWN_H
+            
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/src/tacticonserver.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 2009 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: Tacticon server implementation.
+* Part of    : Tacticon Server
+*/
+
+#include <e32debug.h>
+#include <w32std.h>
+#include <centralrepository.h>
+#include <featmgr.h>
+#include "tacticonserver.h"
+#include "tacticonsession.h"
+#include "tacticondefs.h"
+#include "tacticonshutdown.h"
+#include "tacticontrace.h"
+#include "osttracedefinitions.h" 
+#ifdef OST_TRACE_COMPILER_IN_USE 
+#include "tacticonservertraces.h"
+#endif
+
+// --------------------------------------------------------------------------
+// RunServerL
+// Initialize and run the server.
+// --------------------------------------------------------------------------
+//
+static void RunServerL()
+    {
+    TRACE( "Tacticon server RunServer() - Begin" );
+    User::LeaveIfError( RThread().RenameMe( KTacticonServerName ) );
+
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+    CleanupStack::PushL( scheduler );
+    CActiveScheduler::Install( scheduler );
+
+    CTacticonServer* server = CTacticonServer::NewLC();
+
+    RProcess::Rendezvous( KErrNone );
+
+    CActiveScheduler::Start();
+    
+    // Cleanup server and scheduler 
+    CleanupStack::PopAndDestroy(server); 
+    CleanupStack::PopAndDestroy(scheduler); 
+    TRACE("Tacticon server RunServer() - End");
+    }
+
+// --------------------------------------------------------------------------
+// E32Main
+// Server process entry-point.
+// --------------------------------------------------------------------------
+//
+TInt E32Main()
+    {
+    __UHEAP_MARK;   
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    TInt ret( KErrNoMemory );
+    if( cleanup )
+        {
+        TRAP( ret, RunServerL() );
+        delete cleanup;
+        }
+    __UHEAP_MARKEND;    
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::NewL
+// 2-phased constructor.
+// --------------------------------------------------------------------------
+//
+CTacticonServer* CTacticonServer::NewLC()
+    {
+    TRACE( "CTacticonServer::NewLC - Begin" );
+    CTacticonServer* self = new (ELeave) CTacticonServer();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    TRACE("CTacticonServer::NewLC - End");
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::CTacticonServer()
+// C++ constructor.
+// --------------------------------------------------------------------------
+//
+CTacticonServer::CTacticonServer() 
+    : CPolicyServer( EPriorityNormal, 
+                     KTacticonPolicy, 
+                     ESharableSessions ), 
+      iTacticonsEnabled( ETrue )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::ConstructL
+// 2nd phase constructor.
+// --------------------------------------------------------------------------
+//
+void CTacticonServer::ConstructL()
+    {
+    TRACE( "CTacticonServer::ConstructL - Begin" );
+    StartL( KTacticonServerName);
+    TRACE( "CTacticonServer::ConstructL - Server started" );
+    iRepository = CRepository::NewL( KCRUidTacticon ); 
+    
+    TInt pluginUid(0);
+    User::LeaveIfError( iRepository->Get( KTacticonPlugin, pluginUid ) );
+    TRACE2( "CTacticonServer::ConstructL - got pluginUid: %d", pluginUid );
+    
+    TRACE("CTacticonServer::ConstructL - creating player");
+    // The server is instantiated during boot time. To enable phone to boot up
+    // even if player instatiation fails, trap its possible failure.
+    TRAPD(err, iPlayer = CTacticonPlayer::NewL( TUid::Uid(pluginUid), *iRepository ) );
+    if ( err )
+        {
+        TRACE2( "CTacticonServer::ConstructL - Creating Player failed with code %d", err );
+        iPlayer = NULL; // to ensure that player pointer is not broken
+        }        
+        
+    TRACE( "CTacticonServer::ConstructL - Creating shutdown instance" );
+    iShutdown = CTacticonShutdown::NewL();
+    TRACE( "CTacticonServer::ConstructL - End" );
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::CTacticonServer()
+// C++ destructor.
+// --------------------------------------------------------------------------
+//
+CTacticonServer::~CTacticonServer()
+    {
+    delete iPlayer;
+    delete iRepository; 
+    delete iShutdown;
+    REComSession::FinalClose();
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::NewSessionL
+// from CServer2, creates a new session.
+// --------------------------------------------------------------------------
+//
+CSession2* CTacticonServer::NewSessionL( const TVersion& aVersion, 
+                                             const RMessage2& /*aMessage*/ ) const
+    {
+    TRACE("CTacticonServer::NewSessionL - Begin");
+    TVersion version( KTacticonServerMajor, 
+                      KTacticonServerMinor, KTacticonServerBuild );
+                      
+    TBool supported = User::QueryVersionSupported( version, aVersion );
+                                                                                                                                                                                                                                                                                                                            
+    if( !supported )
+        {
+        TRACE("CTacticonServer::NewSessionL - Version not supported");
+        User::Leave( KErrNotSupported );
+        }
+        
+    CTacticonSession* session = new (ELeave) CTacticonSession(); 
+    TRACE("CTacticonServer::NewSessionL - End");
+    return session;
+    }
+    
+// --------------------------------------------------------------------------
+// CTacticonServer::AddSession
+// --------------------------------------------------------------------------
+//  
+void CTacticonServer::AddSession()  
+    {
+    TRACE("CTacticonServer::AddSession - Begin");
+    iSessionCount++;
+    iShutdown->Cancel();
+    TRACE("CTacticonServer::AddSession - End");
+    }
+    
+// --------------------------------------------------------------------------
+// CTacticonServer::RemoveSession
+// --------------------------------------------------------------------------
+//    
+void CTacticonServer::RemoveSession()
+    {
+    TRACE( "CTacticonServer::RemoveSession - Begin" );
+    iSessionCount--;
+    
+    // Start the shutdown timer there are no more sessions
+    if ( !iSessionCount && !iShutdown->IsActive() )
+        {
+        iShutdown->Start();
+        }       
+    TRACE( "CTacticonServer::RemoveSession - End" );
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::PlayTacticon
+// --------------------------------------------------------------------------
+//     
+void CTacticonServer::PlayTacticon( TTacticonType aTacticonType )
+    {
+    if ( iPlayer && iTacticonsEnabled )
+        {
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_SERVER_PLAY_TACTICON_1,
+                   "e_TACTICON_SERVER_PLAY_TACTICON 1" );
+
+        iPlayer->PlayTacticon( aTacticonType );
+
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_SERVER_PLAY_TACTICON_0,
+                   "e_TACTICON_SERVER_PLAY_TACTICON 0" );
+        }
+    else
+        {
+        TRACE("CTacticonServer::PlayTacticon - Player not available");
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonServer::StopTacticon
+// --------------------------------------------------------------------------
+// 
+void CTacticonServer::StopTacticon()
+    {
+    if ( iPlayer )
+        {
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_SERVER_STOP_TACTICON_1,
+                   "e_TACTICON_SERVER_STOP_TACTICON 1" );
+
+        iPlayer->StopTacticon();
+
+        OstTrace0( TACTICON_PERFORMANCE, TACTICON_SERVER_STOP_TACTICON_0,
+                   "e_TACTICON_SERVER_STOP_TACTICON 0" );
+        }
+    }
+ 
+// --------------------------------------------------------------------------
+// CTacticonServer::EnableTacticons
+// --------------------------------------------------------------------------
+//     
+void CTacticonServer::EnableTacticons( TBool aEnabled )
+    {
+    iTacticonsEnabled = aEnabled;
+    }
+    
+// --------------------------------------------------------------------------
+// CTacticonServer::EnableTacticons
+// --------------------------------------------------------------------------
+//    
+TBool CTacticonServer::TacticonsEnabled()
+    {
+    return iTacticonsEnabled;
+    }
+
+// End of file 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/src/tacticonsession.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,139 @@
+/*
+* Copyright (c) 2009 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: Tacticon server session implementation.
+* Part of    : Tacticon Server
+*/
+
+#include "tacticonsession.h"
+#include "tacticonserver.h"
+#include "tacticondefs.h"
+#include "tacticontrace.h"
+
+// --------------------------------------------------------------------------
+// CTacticonSession::CTacticonSession
+// C++ constructor.
+// --------------------------------------------------------------------------
+//
+CTacticonSession::CTacticonSession() 
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonSession::CTacticonSession
+// C++ destructor.
+// --------------------------------------------------------------------------
+//
+CTacticonSession::~CTacticonSession()
+    {
+    Server().RemoveSession();
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonSession::ServiceL
+// From CSession2, passes the request forward to DispatchMessageL.
+// --------------------------------------------------------------------------
+//
+void CTacticonSession::ServiceL( const RMessage2& aMessage )
+    {
+    TRACE( "CTacticonSession::ServiceL - Begin" );
+    TRAPD( err,DispatchMessageL( aMessage ) );
+    aMessage.Complete( err );
+        
+    TRACE( "CTacticonSession::ServiceL - End" );
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonSession::DispatchMessageL
+// Handles the request from client.
+// --------------------------------------------------------------------------
+//
+void CTacticonSession::DispatchMessageL( const RMessage2& aMessage )
+    {
+    TRACE( "CTacticonSession::DispatchMessageL - Begin" );
+    switch( aMessage.Function() )
+        {
+        case EPlayTacticon:
+            Server().PlayTacticon( ( TTacticonType )aMessage.Int0() );
+            break;
+        case EStopTacticon:            
+            Server().StopTacticon();
+            break;        
+        case EEnableTacticons:
+            EnableTacticonsL( aMessage );
+            break;
+        case ETacticonsEnabled:
+            TacticonsEnabledL( aMessage );
+            break;
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+    TRACE( "CTacticonSession::DispatchMessageL - End" );
+    }
+
+// --------------------------------------------------------------------------
+// CTacticonSession::EnableTacticonsL
+// Set tacticons enabled/disabled.
+// ECapabilityWriteDeviceData capability is needed to use this function.
+// --------------------------------------------------------------------------
+//    
+void CTacticonSession::EnableTacticonsL( const RMessage2& aMessage )
+    {
+    if ( aMessage.HasCapability( ECapabilityWriteDeviceData ) )
+        {
+        Server().EnableTacticons( aMessage.Int0() );
+        }
+    else
+        {
+        User::Leave( KErrPermissionDenied );
+        }
+    }
+    
+// --------------------------------------------------------------------------
+// CTacticonSession::TacticonsEnabled
+// Returns boolean value whether tacticons are enabled or disabled.
+// --------------------------------------------------------------------------
+//    
+void CTacticonSession::TacticonsEnabledL( const RMessage2& aMessage )
+    {
+    TBool enabled = Server().TacticonsEnabled();
+    TPckg<TBool> enabledBuf( enabled );    
+    aMessage.WriteL( 0, enabledBuf );
+    }
+        
+// --------------------------------------------------------------------------
+// CTacticonSession::CreateL
+// From CSession2, used to increase server's session count.
+// --------------------------------------------------------------------------
+//
+void CTacticonSession::CreateL()
+    {
+    TRACE( "CTacticonSession::CreateL - Begin" );
+    Server().AddSession();
+    TRACE( "CTacticonSession::CreateL - End" );
+    }    
+    
+// --------------------------------------------------------------------------
+// CTacticonSession::Server
+// Reference to server.
+// --------------------------------------------------------------------------
+//
+CTacticonServer& CTacticonSession::Server()
+    {   
+    return *static_cast<CTacticonServer*>
+           ( const_cast<CServer2*>( CSession2::Server() ) );
+    }    
+        
+
+// End of file 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/src/tacticonshutdown.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2009 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: Tacticon server shutdown timer.
+* Part of    : Tacticon Server
+*/
+
+#include "tacticonshutdown.h"
+#include "tacticondefs.h"
+
+// ---------------------------------------------------------------------------
+// Two phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonShutdown* CTacticonShutdown::NewL()
+    {
+    CTacticonShutdown* self = new ( ELeave ) CTacticonShutdown();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonShutdown::~CTacticonShutdown()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Activates this timer.
+// ---------------------------------------------------------------------------
+//
+void CTacticonShutdown::Start()
+    {
+    After( KTacticonShutdownDelay );
+    }
+
+// ---------------------------------------------------------------------------
+// Constructor of the shutdown timer.
+// ---------------------------------------------------------------------------
+//
+CTacticonShutdown::CTacticonShutdown()
+    : CTimer( EPriorityStandard )
+    {
+    // add this active object to the active scheduler
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// Second phase construction.
+// ---------------------------------------------------------------------------
+//
+void CTacticonShutdown::ConstructL()
+    {
+    CTimer::ConstructL();
+    }
+
+// ---------------------------------------------------------------------------
+// Shuts down tacticon server by stopping the active scheduler.
+// ---------------------------------------------------------------------------
+//
+void CTacticonShutdown::RunL()
+    {
+    CActiveScheduler::Stop();
+    }
+
+//  End of File  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/bwins/tacticonpluginfwu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,5 @@
+EXPORTS
+	??1CTacticonPlayer@@UAE@XZ @ 1 NONAME ; CTacticonPlayer::~CTacticonPlayer(void)
+	?ListImplementationsL@CTacticonPlayer@@SAXAAV?$RPointerArray@VCImplementationInformation@@@@@Z @ 2 NONAME ; void CTacticonPlayer::ListImplementationsL(class RPointerArray<class CImplementationInformation> &)
+	?NewL@CTacticonPlayer@@SAPAV1@VTUid@@AAVCRepository@@@Z @ 3 NONAME ; class CTacticonPlayer * CTacticonPlayer::NewL(class TUid, class CRepository &)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/eabi/tacticonpluginfwu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,9 @@
+EXPORTS
+	_ZN15CTacticonPlayer20ListImplementationsLER13RPointerArrayI26CImplementationInformationE @ 1 NONAME
+	_ZN15CTacticonPlayer4NewLE4TUidR11CRepository @ 2 NONAME
+	_ZN15CTacticonPlayerD0Ev @ 3 NONAME
+	_ZN15CTacticonPlayerD1Ev @ 4 NONAME
+	_ZN15CTacticonPlayerD2Ev @ 5 NONAME
+	_ZTI15CTacticonPlayer @ 6 NONAME ; #<TI>#
+	_ZTV15CTacticonPlayer @ 7 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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: Build information file for Tacticon plugin FW.
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+tacticonpluginfw.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/group/tacticonpluginfw.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2009 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: Project definition file for Tacticon plugin framework
+*              implementation.
+* Part of    : Tacticon Server
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tacticonpluginfw.dll
+TARGETTYPE              DLL
+UID                     0x1000008d 0x2000B4F3
+
+CAPABILITY              CAP_GENERAL_DLL 
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tacticonplayer.cpp
+
+USERINCLUDE             ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+#ifdef RD_SYMBIAN_TRACES
+SYSTEMINCLUDE           /epoc32/include/internal/symbiantraces
+#endif
+
+LIBRARY                 euser.lib
+LIBRARY                 eikcore.lib
+LIBRARY                 ecom.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/inc/tacticonplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2009 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: Tacticon player plugin interface.
+* Part of    : Tacticon Server
+*/
+
+#ifndef C_TACTICONPLAYER_H
+#define C_TACTICONPLAYER_H
+
+#include <e32base.h>
+#include <ecom/ecom.h>
+
+#include <tacticon.hrh>
+
+class CRepository;
+
+/**
+ *  Tacticon player ECom plugin interface.
+ *
+ *  @since S60 5.2
+ */
+class CTacticonPlayer : public CBase
+    {
+public:
+    /**
+     * Instantiates an object of this type.
+     *
+     * @since S60 5.2
+     * @param aImplementationUid - Implementation uid of the plugin
+     *                             to be created.
+     * @param aRepository        - Reference to Central Repository, which is
+     *                             used for reading Tacticon settings. 
+     *                             CR Keys for Tacticons are defined in 
+     *                             tacticondomaincrkeys.h
+     *
+     * @return Instance of tacticon player plugin.
+     */
+    IMPORT_C static CTacticonPlayer* NewL( TUid aImplementationUid, 
+                                           CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    IMPORT_C virtual ~CTacticonPlayer();
+
+    /**
+     * Returns a list of available implementations for this 
+     * interface.
+     *
+     * @since S60 5.2
+     * @param aImplInfoArray - Implementation information array of all
+     *                         available implementations.
+     */ 
+    IMPORT_C static void ListImplementationsL( RImplInfoPtrArray& aImplInfoArray );
+
+public:
+    /**
+    * Plays tacticon according to aTacticonType
+    * @since S60 5.2 
+    * @param aTacticonType, Tacticon type to be played
+    */
+    virtual void PlayTacticon( TTacticonType aTacticonType ) = 0; 
+    
+    /**
+    * Stops playing tacticon
+    * @since S60 5.2 
+    */    
+    virtual void StopTacticon() = 0;
+
+private:
+    
+    // Unique instance identifier key.  
+    TUid iDtor_ID_Key;
+        
+    };
+    
+#endif // C_TACTICONPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/inc/tacticonpluginfwuids.hrh	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,19 @@
+/*
+* Copyright (c) 2009 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: Tacticon player plugin interface UIDs.
+* Part of    : Tacticon Server
+*/
+
+
+#define ETacticonPlayerIFUID 0x2001FE50
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/src/tacticonplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 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: Interface class for tacticon players.
+* Part of    : Tacticon Server
+*/
+
+#include "tacticonplayer.h"
+#include "tacticonpluginfwuids.hrh"
+
+const TUid KTacticonPlayerIFUid   = { ETacticonPlayerIFUID };
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTacticonPlayer* CTacticonPlayer::NewL( TUid aImplementationUid, 
+                                        CRepository& aRepository )
+    {
+    return ( CTacticonPlayer* ) 
+                REComSession::CreateImplementationL( aImplementationUid, 
+                _FOFF(CTacticonPlayer, iDtor_ID_Key ), &aRepository );
+    }
+
+// ---------------------------------------------------------------------------
+// Lists the available plugin implementations for this interface.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CTacticonPlayer::ListImplementationsL( RImplInfoPtrArray& aImplInfoArray )
+    {
+    REComSession::ListImplementationsL( KTacticonPlayerIFUid, 
+                                        aImplInfoArray );
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C CTacticonPlayer::~CTacticonPlayer()
+    {
+    REComSession::DestroyedImplementation( iDtor_ID_Key );
+    }
+
+// End of file.
Binary file tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/cenrep/2001FE52.txt has changed
Binary file tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/cenrep/keys_tacticonhapticsplugin_obsolete.xls has changed
Binary file tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/conf/tacticonhapticsplugin.confml has changed
Binary file tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/conf/tacticonhapticsplugin_2001FE52.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/data/2001FE52.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 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: ECom registration file for Tacticon Haptics player plugin.
+* Part of    : Tacticon Server
+*/
+
+#include <ecom/registryinfo.rh>
+#include "tacticonpluginfwuids.hrh"
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    dll_uid = 0x2001FE52; 
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = ETacticonPlayerIFUID;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2001FE51;
+                    version_no = 1; 
+                    display_name = "Tacticon Haptics Player";
+                    default_data = "";
+                    opaque_data = ""; 
+                    }
+                };
+            }
+        };
+    }
+
+// End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 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: Build information file for tacticon haptics plugin.
+* Part of    : Tacticon Server
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// IBY file
+../rom/tacticonhapticsplugin.iby  CORE_IBY_EXPORT_PATH(mw, tacticonhapticsplugin.iby)
+
+// Generic configuration interface for component cenrep settings  
+../conf/tacticonhapticsplugin.confml           APP_LAYER_CONFML(tacticonhapticsplugin.confml)
+../conf/tacticonhapticsplugin_2001FE52.crml    APP_LAYER_CRML(tacticonhapticsplugin_2001FE52.crml)
+
+PRJ_MMPFILES
+tacticonhapticsplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/group/tacticonhapticsplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2009 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: Haptics tacticon plugin project definition file.
+* Part of:     Tacticon Server
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tacticonhapticsplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x2001FE52
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tacticonhapticsplayer.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../inc
+USERINCLUDE             ../../../../inc
+USERINCLUDE             ../traces
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH              ../data
+START RESOURCE          2001FE52.rss
+TARGETPATH              ECOM_RESOURCE_DIR
+TARGET                  tacticonhapticsplugin.rsc
+END
+
+
+#ifdef RD_SYMBIAN_TRACES
+SYSTEMINCLUDE /epoc32/include/internal/symbiantraces
+#endif
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 efsrv.lib
+LIBRARY                 ecom.lib
+LIBRARY                 hwrmhapticsclient.lib
+LIBRARY                 tacticonpluginfw.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/inc/tacticonhapticsplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2009 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: Class for producing haptics tacticon.
+* Part of:     Tacticon Server
+*/
+
+#ifndef C_TACTICONHAPTICSPLAYER_H
+#define C_TACTICONHAPTICSPLAYER_H
+
+#include <cenrepnotifyhandler.h>
+#include <tacticon.hrh>
+
+#include "tacticonprivatecrkeys.h"
+#include "tacticonplayer.h"
+
+class CHWRMHaptics;
+
+/**
+ *  Ecom plugin for playing haptics tacticons.
+ *
+ *  @lib tactilehapticsplugin.lib
+ *  @since S60 5.2
+  */
+
+NONSHARABLE_CLASS( CTacticonHapticsPlayer ): public CTacticonPlayer,
+                                             public MCenRepNotifyHandlerCallback
+    {
+public:
+    /**
+     * 2-phased constructor.
+     * @return An instance of haptics tacticon player.
+     */
+    static CTacticonHapticsPlayer* NewL( CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CTacticonHapticsPlayer();
+
+ // from base class CTacticonPlayer
+
+    /**
+    * Plays tacticon according to aTacticonType
+    * @since S60 5.2 
+    * @param aTacticonType, Tacticon type to be played
+    */
+    void PlayTacticon( TTacticonType aTacticonType ); 
+    
+    /**
+    * Stops playing tacticon
+    * @since S60 5.2 
+    */    
+    void StopTacticon(); 
+        
+private: // From MCenRepNotifyHandlerCallback.
+
+    void HandleNotifyGeneric( TUint32 aId );
+
+private:
+    /**
+     * Reads IVT data from file to buffer. 
+     */    
+    HBufC8* IVTBufAllocL( const TDesC& aFileName );
+    
+    /**
+     * Change effect file in haptics instance.
+     */        
+    void ChangeIVTFileL( const TDesC& aFileName );
+    
+    /**
+     * Handle Central Repository settings changes.
+     */    
+    void DoHandleNotifyGenericL( TUint32 aId );
+private:
+
+    /**
+     * Constructor.
+     */
+    CTacticonHapticsPlayer( CRepository& aRepository );
+
+    /**
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+    
+
+private: // data
+
+    /**
+     * Access to vibra functionality
+     * Own.  
+     */
+    CHWRMHaptics* iHaptics;
+
+    /**
+     * Handle of effect file, which is loaded to haptics instance. 
+     */
+    TInt iIVTHandle;
+    
+    /**
+     * Haptics strength.
+     */
+    TInt iStrength;
+    
+     /**
+     * Access to settings.
+     * Not own.
+     */    
+    CRepository& iRepository;
+    
+    /**
+     * Utility for listening to changes in configurable parameters.
+     * Own.  
+     */
+    CCenRepNotifyHandler* iCenRepNotifier;    
+    
+    };
+
+
+#endif // C_TACTICONHAPTICSPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/inc/tacticonhapticsplayerprivatecrkeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* Copyright (c) 2009 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: Private Central Repository keys for Tacticon Haptics Player.
+* Part of    : Tacticon Server
+*/
+
+
+#ifndef TACTICONHAPTICSPLAYERPRIVATECRKEYS_H
+#define TACTICONHAPTICSPLAYERPRIVATECRKEYS_H
+
+const TUid KCRUidTacticonHapticsPlayer = {0x2001FE52};
+
+/**
+* Actuator type used for playing tacticons
+*
+* Possible values are defined in hwrmlogicalactuators.h
+*
+* Default value: 1 (EHWRMLogicalActuatorAny)
+**/
+const TUint32 KActuatorType                    = 0x00000001;
+
+
+#endif  // TACTICONHAPTICSPLAYERPRIVATECRKEYS_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/rom/tacticonhapticsplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2009 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: This is the IBY file for Tacticon Haptics plugin.
+* Part of:     Tacticon Server
+*/
+
+#ifndef TACTICONHAPTICSPLUGIN_IBY
+#define TACTICONHAPTICSPLUGIN_IBY
+#include <bldvariant.hrh>
+
+
+
+#ifdef FF_TACTICONS
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(tacticonhapticsplugin.dll,tacticonhapticsplugin.rsc)
+
+#endif // FF_TACTICONS
+
+#endif // TACTICONHAPTICSPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/src/tacticonhapticsplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,291 @@
+/*
+* Copyright (c) 2009 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: Class for producing haptics tacticon.
+* Part of:     Tacticon Server
+*/
+
+#include <f32file.h>
+#include <hwrmhaptics.h>
+#include <centralrepository.h>
+#include <ecom/implementationproxy.h>
+
+#include "tacticonhapticsplayer.h"
+#include "tacticonprivatecrkeys.h"
+#include "tacticontrace.h"
+#include "osttracedefinitions.h" 
+#ifdef OST_TRACE_COMPILER_IN_USE 
+#include "tacticonhapticsplayertraces.h"
+#endif
+
+
+// Tacticons
+_LIT8( KPositiveTacticon,     "PositiveTacticon");
+_LIT8( KNegativeTacticon,     "NegativeTacticon");
+_LIT8( KNeutralTacticon,      "NeutralTacticon" );
+
+
+// max length of tacticon names defined above
+const TInt KTacticonNameMaxLen = 128;
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer::CTacticonHapticsPlayer( CRepository& aRepository ) :
+    iRepository(aRepository)
+    {
+    
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::ConstructL()
+    {
+    TRACE( "CTacticonHapticsPlayer::ConstructL - Begin" );
+    iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+
+    TUint32 suppMask( 0 );
+    User::LeaveIfError( iHaptics->SupportedActuators( suppMask ) );
+
+    CRepository* playerRepository = CRepository::NewL( KCRUidTacticon ); 
+    CleanupStack::PushL( playerRepository );
+    TInt actuatorType( 0 );
+    playerRepository->Get( KActuatorType, actuatorType );
+    CleanupStack::PopAndDestroy( playerRepository );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - ActuatorType: %d", actuatorType );
+    if ( actuatorType & suppMask )
+        {
+        // supported actuator, use this
+        iHaptics->OpenActuatorL( ( THWRMLogicalActuators )actuatorType );    
+        }  
+    else 
+        {
+        TRACE3( "CTacticonHapticsPlayer::ConstructL - ActuatorType is not supported: %d/%d", 
+                actuatorType, 
+                suppMask );
+        // suggested actuator is not supported, use default one
+        iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny );    
+        }  
+        
+    User::LeaveIfError( iHaptics->SetDeviceProperty( 
+                                            CHWRMHaptics::EHWRMHapticsLicensekey,
+                                            KNullDesC8() ) );
+    TInt strength( 0 );
+    User::LeaveIfError( iRepository.Get( KTacticonStrength, strength ) );
+    iStrength = strength * 100; // strength is in percents
+    
+    iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                 iStrength );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - Set strength: %d", iStrength );
+
+    TFileName ivtFile;
+    User::LeaveIfError( iRepository.Get( KTacticonIVTFile, ivtFile ) );
+    TRACE2( "CTacticonHapticsPlayer::ConstructL - Loading IVT file: %S", &ivtFile );
+    
+    HBufC8* ivtBuf = IVTBufAllocL( ivtFile );
+    CleanupStack::PushL( ivtBuf );
+    User::LeaveIfError( iHaptics->LoadEffectData( *ivtBuf, iIVTHandle ) );
+    CleanupStack::PopAndDestroy( ivtBuf );
+    
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, iRepository );
+    iCenRepNotifier->StartListeningL();
+
+    TRACE( "CTacticonHapticsPlayer::ConstructL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer* CTacticonHapticsPlayer::NewL( CRepository& aRepository )
+    {
+    CTacticonHapticsPlayer* self = 
+                        new ( ELeave ) CTacticonHapticsPlayer( aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTacticonHapticsPlayer::~CTacticonHapticsPlayer()
+    {
+    delete iCenRepNotifier;
+    delete iHaptics;
+    }
+
+// ---------------------------------------------------------------------------
+// Load IVT file.
+// ---------------------------------------------------------------------------
+//
+HBufC8* CTacticonHapticsPlayer::IVTBufAllocL( const TDesC& aFileName )
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );  
+    CleanupClosePushL( fs );
+    
+    RFile file;
+    User::LeaveIfError( file.Open( fs, aFileName, EFileRead ) );
+    CleanupClosePushL( file );
+    
+    TInt fileSize( 0 );
+    file.Size( fileSize );
+    
+    HBufC8* ivtFileBuf = HBufC8::NewLC( fileSize );
+    TPtr8 dataBufPtr = ivtFileBuf->Des();
+    
+    User::LeaveIfError( file.Read( dataBufPtr ) );
+
+    CleanupStack::Pop( ivtFileBuf );    
+    CleanupStack::PopAndDestroy( &file );
+    CleanupStack::PopAndDestroy( &fs );
+    return ivtFileBuf;
+    }
+
+// ---------------------------------------------------------------------------
+// Check if there's a change in tacticon settings and set new values if needed.
+// ---------------------------------------------------------------------------
+//  
+void CTacticonHapticsPlayer::DoHandleNotifyGenericL( TUint32 aId )
+    {
+    switch ( aId )
+        {
+        case KTacticonStrength:
+            {
+            // Strength value in settings is multiplied by 100 to scale value 
+            // suitable for haptics.
+            TInt strength(0);
+            iRepository.Get( KTacticonStrength, strength );
+            
+            iStrength = strength * 100;
+            iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                         iStrength );        
+            }
+            break;
+        case KTacticonIVTFile:
+            {
+            TFileName ivtFile;
+            iRepository.Get( KTacticonIVTFile, ivtFile );
+            ChangeIVTFileL( ivtFile );
+            }
+            break;            
+        default:
+            break;
+        } 
+    }
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//    
+void CTacticonHapticsPlayer::HandleNotifyGeneric( TUint32 aId )
+    {
+    TRAP_IGNORE( DoHandleNotifyGenericL( aId ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Load new effect file.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::ChangeIVTFileL( const TDesC& aFileName )
+    {
+    iHaptics->DeleteEffectData( iIVTHandle );
+    
+    HBufC8* ivtBuf = IVTBufAllocL( aFileName );
+   
+    iHaptics->LoadEffectData( *ivtBuf, iIVTHandle );    
+
+    delete ivtBuf;
+    } 
+
+// ---------------------------------------------------------------------------
+// Play tacticon.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::PlayTacticon( TTacticonType aTacticon )
+    {
+    TRACE2( "CTacticonHapticsPlayer::PlayTacticon(%d) - Begin", aTacticon );
+
+    TBuf8<KTacticonNameMaxLen> name;
+    switch( aTacticon )
+        {
+        case EPositiveTacticon:
+            name = KPositiveTacticon;
+            break;
+        case ENegativeTacticon:
+            name = KNegativeTacticon;
+            break;
+        case ENeutralTacticon:
+            name = KNeutralTacticon;
+            break;                      
+        default:
+            return;
+        }
+    TInt effectIndex(0);
+    iHaptics->GetEffectIndexFromName( iIVTHandle, name, effectIndex );
+
+    OstTrace1( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_1,
+               "e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 1 0x%x", aTacticon );
+
+    TInt effectHandle(0);
+    iHaptics->PlayEffect( iIVTHandle, effectIndex, effectHandle );
+
+    OstTrace1( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_0,
+               "e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 0 0x%x", aTacticon );
+
+    TRACE( "CTacticonHapticsPlayer::PlayTacticon(%d) - End" );
+    }     
+    
+// ---------------------------------------------------------------------------
+// Stop playing tacticon.
+// ---------------------------------------------------------------------------
+//
+void CTacticonHapticsPlayer::StopTacticon()
+    {
+    OstTrace0( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_STOP_TACTICON_1,
+               "e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 1" );
+               
+    iHaptics->StopAllPlayingEffects();
+
+    OstTrace0( TACTICON_PERFORMANCE, TACTICON_HAPTICS_PLAYER_STOP_TACTICON_0,
+               "e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 0" );
+    } 
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2001FE51, CTacticonHapticsPlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+    return ImplementationTable;
+    }
+   
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,6 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTICON_PERFORMANCE=0x40
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_0=0x2
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_1=0x1
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_HAPTICS_PLAYER_STOP_TACTICON_0=0x4
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_HAPTICS_PLAYER_STOP_TACTICON_1=0x3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/tacticonhapticsplayerTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTICONHAPTICSPLAYERTRACES_H__
+#define __TACTICONHAPTICSPLAYERTRACES_H__
+
+#define KOstTraceComponentID 0x2001fe52
+
+#define TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_1 0x400001
+#define TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_0 0x400002
+#define TACTICON_HAPTICS_PLAYER_STOP_TACTICON_1 0x400003
+#define TACTICON_HAPTICS_PLAYER_STOP_TACTICON_0 0x400004
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/tacticonpluginfw/tacticonhapticsplugin/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,62 @@
+<model>
+  <id>537001554</id>
+  <name>tacticonhapticsplugin</name>
+  <group>
+    <id>64</id>
+    <name>TACTICON_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 1 0x%x</text>
+      <id>1</id>
+      <name>TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_1</name>
+      <parameter>
+        <type>hex32</type>
+        <id>1</id>
+        <name>aTacticon</name>
+      </parameter>
+      <location>
+        <file>../src/tacticonhapticsplayer.cpp</file>
+        <line>243</line>
+        <class>CTacticonHapticsPlayer</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_HAPTICS_PLAYER_PLAY_TACTICON 0 0x%x</text>
+      <id>2</id>
+      <name>TACTICON_HAPTICS_PLAYER_PLAY_TACTICON_0</name>
+      <parameter>
+        <type>hex32</type>
+        <id>1</id>
+        <name>aTacticon</name>
+      </parameter>
+      <location>
+        <file>../src/tacticonhapticsplayer.cpp</file>
+        <line>249</line>
+        <class>CTacticonHapticsPlayer</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 1</text>
+      <id>3</id>
+      <name>TACTICON_HAPTICS_PLAYER_STOP_TACTICON_1</name>
+      <location>
+        <file>../src/tacticonhapticsplayer.cpp</file>
+        <line>261</line>
+        <class>CTacticonHapticsPlayer</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_HAPTICS_PLAYER_STOP_TACTICON 0</text>
+      <id>4</id>
+      <name>TACTICON_HAPTICS_PLAYER_STOP_TACTICON_0</name>
+      <location>
+        <file>../src/tacticonhapticsplayer.cpp</file>
+        <line>266</line>
+        <class>CTacticonHapticsPlayer</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+  </group>
+</model>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,6 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTICON_PERFORMANCE=0x40
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_SERVER_PLAY_TACTICON_0=0x2
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_SERVER_PLAY_TACTICON_1=0x1
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_SERVER_STOP_TACTICON_0=0x4
+[TRACE]TACTICON_PERFORMANCE[0x40]_TACTICON_SERVER_STOP_TACTICON_1=0x3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/traces/tacticonserverTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,18 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTICONSERVERTRACES_H__
+#define __TACTICONSERVERTRACES_H__
+
+#define KOstTraceComponentID 0x2001fe4d
+
+#define TACTICON_SERVER_PLAY_TACTICON_1 0x400001
+#define TACTICON_SERVER_PLAY_TACTICON_0 0x400002
+#define TACTICON_SERVER_STOP_TACTICON_1 0x400003
+#define TACTICON_SERVER_STOP_TACTICON_0 0x400004
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/server/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,52 @@
+<model>
+  <id>537001549</id>
+  <name>tacticonserver</name>
+  <group>
+    <id>64</id>
+    <name>TACTICON_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTICON_SERVER_PLAY_TACTICON 1</text>
+      <id>1</id>
+      <name>TACTICON_SERVER_PLAY_TACTICON_1</name>
+      <location>
+        <file>../src/tacticonserver.cpp</file>
+        <line>213</line>
+        <class>CTacticonServer</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_SERVER_PLAY_TACTICON 0</text>
+      <id>2</id>
+      <name>TACTICON_SERVER_PLAY_TACTICON_0</name>
+      <location>
+        <file>../src/tacticonserver.cpp</file>
+        <line>218</line>
+        <class>CTacticonServer</class>
+        <function>PlayTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_SERVER_STOP_TACTICON 1</text>
+      <id>3</id>
+      <name>TACTICON_SERVER_STOP_TACTICON_1</name>
+      <location>
+        <file>../src/tacticonserver.cpp</file>
+        <line>235</line>
+        <class>CTacticonServer</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTICON_SERVER_STOP_TACTICON 0</text>
+      <id>4</id>
+      <name>TACTICON_SERVER_STOP_TACTICON_0</name>
+      <location>
+        <file>../src/tacticonserver.cpp</file>
+        <line>240</line>
+        <class>CTacticonServer</class>
+        <function>StopTacticon</function>
+      </location>
+    </trace>
+  </group>
+</model>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/data/tacticon.rul	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,59 @@
+<script xmlns="http://www.nokia.com/ns/cep/script/1.0/"
+xmlns:cep="http://www.nokia.com/ns/cep/1.0/">
+    <if>
+        <equals>
+            <contextRef source='Sensor' type='Event.Proximity'/>
+            <string>Discernible</string>
+        </equals>
+        <actions>
+            <!-- Proximity notify  -->
+            <Tacticon Mode='PROXIMITY_ON'/>	
+        </actions>
+    </if>
+    <elseIf>
+        <equals>
+            <contextRef source='Sensor' type='Event.Proximity'/>
+            <string>Indiscernible</string>
+        </equals>
+        <actions>
+            <!-- Proximity notify  -->
+            <Tacticon Mode='PROXIMITY_OFF'/>	
+        </actions>
+    </elseIf>
+    <elseIf>
+        <equals>
+            <contextRef source='Call' type='State'/>
+            <string>Dialling</string>
+        </equals>
+        <actions>
+            <!-- Disable Tacticons -->
+            <Tacticon Mode='CALL_DIALLING'/>	
+        </actions>
+    </elseIf>
+    <elseIf>
+        <equals>
+            <contextRef source='Call' type='State'/>
+            <string>Connected</string>
+        </equals>
+        <actions>
+            <!-- Disable Tacticons -->
+            <Tacticon Mode='CALL_CONNECTED'/>	
+        </actions>
+    </elseIf>
+    <elseIf>
+        <or>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>None</string>
+            </equals>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>Disconnecting</string>
+            </equals>
+        </or>
+        <actions>
+            <!-- Enable Tacticons -->
+            <Tacticon Mode='CALL_DISCONNECTED'/>	
+        </actions>
+    </elseIf>
+</script>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/data/tacticonactionplugin.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2009 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:  Registery info for Tacticon action plugin.
+* Part of:      Tacticon Server.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+#include <cfactionpluginconst.hrh>
+
+#include "tacticonactionpluginconst.hrh"
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    // UID for the DLL
+    dll_uid = KTacticonActionPluginDllUid;
+    // Declare array of interface info
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            // UID of interface that is implemented            
+            interface_uid = KActionPluginInterfaceUid;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = KTacticonActionPluginImplementationUid;
+                    version_no         = 1;
+                    display_name       = "";
+                    default_data       = "";
+                    opaque_data        = "";
+                    }
+                };
+            }
+        };
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2009 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:  Build file for the TacticonActionPlugIn
+* Part of:      Tacticon Server.
+*
+*/
+
+#include <platform_paths.hrh>
+
+#ifdef RD_CONTEXT_FRAMEWORK
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../rom/tacticonactionplugin.iby  CORE_IBY_EXPORT_PATH(mw, tacticonactionplugin.iby)
+
+../data/tacticon.rul\
+    /epoc32/RELEASE/winscw/UDEB/Z/private/10282BC4/Rules/tacticon.rul
+
+../data/tacticon.rul\
+    /epoc32/data/Z/private/10282BC4/Rules/tacticon.rul
+
+#ifndef TOOLS
+
+PRJ_MMPFILES
+tacticonactionplugin.mmp
+
+#endif // TOOLS
+
+#endif // RD_CONTEXT_FRAMEWORK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/group/tacticonactionplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2009 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:  Project definition file for the TacticonActionPlugIn
+* Part of:      Tacticon Server.
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include "../inc/tacticonactionpluginconst.hrh"
+
+TARGET          tacticonactionplugin.dll
+TARGETTYPE      PLUGIN
+UID             0x10009D8D KTacticonActionPluginDllUid
+CAPABILITY      CAP_ECOM_PLUGIN
+
+SOURCEPATH      ../src
+SOURCE          main.cpp
+SOURCE          tacticonactionplugin.cpp
+
+USERINCLUDE     .
+USERINCLUDE     ../inc
+USERINCLUDE     ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../data
+START RESOURCE  tacticonactionplugin.rss
+TARGET          tacticonactionplugin.rsc
+TARGETPATH      /resource/plugins
+END
+
+LIBRARY         euser.lib
+LIBRARY         ecom.lib
+LIBRARY         bafl.lib
+LIBRARY         cfactivatorengine.lib
+LIBRARY         cfservices.lib
+LIBRARY         centralrepository.lib
+LIBRARY         tacticon.lib
+
+#ifdef LOGGING_MODE_FILE
+LIBRARY         flogger.lib
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/inc/tacticonactionplugin.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,117 @@
+/*
+* Copyright (c) 2009 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:  A plug-in for disabling/enabling tacticons.
+* Part of:      Tacticon Server.
+*
+*/
+
+
+#ifndef C_TACTICONACTIONPLUGIN_H
+#define C_TACTICONACTIONPLUGIN_H
+
+// INCLUDES
+#include <cfactionplugin.h> 
+#include <e32base.h>
+#include <tacticon.h>
+
+/**
+* Class CTacticonActionPlugIn.
+*
+* Disable/enable/play tacticons when needed.
+* Triggered when the conditions from the rule file are valid.
+*/
+class CTacticonActionPlugIn : public CCFActionPlugIn
+    {
+public:
+
+    /**
+     * Two phased constructor.
+     * @since S60 5.2     
+     */
+    static CTacticonActionPlugIn* NewL();
+
+    /**
+     * Two phased constructor.
+     * @since S60 5.2     
+     */
+    static CTacticonActionPlugIn* NewLC();
+
+    /**
+     * Destructor.
+     * @since S60 5.2
+     */
+    virtual ~CTacticonActionPlugIn();
+
+public: // From CCFActionPlugIn
+    /**
+     * @see CCFActionPlugIn
+     */
+    void InitializeL();
+
+    /**
+     * @see CCFActionPlugIn
+     */
+    TExecutionTime ExecuteL(
+        CCFActionIndication* aActionIndication );
+                
+    /**
+     * @see CCFActionPlugIn
+     */
+    void GetActionsL( CDesCArray& aActionList ) const;
+    
+    /**
+     * @see CCFActionPlugIn
+     */
+    const TSecurityPolicy& SecurityPolicy() const;
+   
+protected:
+
+    /**
+     * C++ constructor
+     */
+    CTacticonActionPlugIn();
+    
+private: // data
+    /**
+     * Tacticon server interface.
+     * Own.    
+     */    
+    RTacticon iTacticon;
+
+    /**
+     * Boolean value, which determines if tacticons are enabled 
+     * during voice call.
+     */
+    TBool iEnabledDuringCall;
+    
+    /**
+     * Tacticon settings bitmap, which determines Tacticon playback 
+     * when voice call is connected/disconnected.
+     */
+    TInt iTacticonCallSettings;
+    
+    /**
+     * Flag for proximity detection.
+     */
+    TBool iProximityDiscernible;
+    
+    /**
+     * Flag for playing 'call connected' tacticon only when call
+     * was initiated by this device.
+     */
+    TBool iCallInitiated;
+    
+    };
+
+#endif // C_TACTICONACTIONPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/inc/tacticonactionpluginconst.hrh	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2009 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:  Contains plugin's UID from mmp- and rss-files.
+* Part of:      Tacticon Server.
+*
+*/
+
+
+
+#ifndef TACTICONACTIONPLUGINCONST_HRH
+#define TACTICONACTIONPLUGINCONST_HRH
+
+// UIDs for Tacticon Action Plugin DLL and ECom implementation
+#define KTacticonActionPluginDllUid 0x20022D86
+#define KTacticonActionPluginImplementationUid 0x20022D87
+
+#endif // TACTICONACTIONPLUGINCONST_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/rom/tacticonactionplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2009 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:  This is the IBY file for Tacticon Action Plugin 
+*               component.
+* Part of:      Tacticon Server.
+*
+*/
+
+#ifndef TACTICONACTIONPLUGIN_IBY
+#define TACTICONACTIONPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+// =============================================================================
+// Tacticon Action Plugin
+// =============================================================================
+ECOM_PLUGIN( tacticonactionplugin.dll, tacticonactionplugin.rsc )
+data=\epoc32\data\Z\private\10282BC4\Rules\tacticon.rul    private\10282BC4\Rules\tacticon.rul
+
+#endif // TACTICONACTIONPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/src/main.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2009 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:  A plug-in for disabling/enabling tacticons.
+* Part of:      Tacticon Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "tacticonactionplugin.h"
+#include "tacticonactionpluginconst.hrh"
+
+// -----------------------------------------------------------------------------
+// Provides a key value pair table, which is used to identify the correct 
+// construction function for the requested interface.
+// -----------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 
+        KTacticonActionPluginImplementationUid, 
+        CTacticonActionPlugIn::NewL )
+    };
+
+// -----------------------------------------------------------------------------
+// Returns an instance of the proxy table.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
+    TInt& aTableCount )
+    {
+    aTableCount 
+        = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+    return ImplementationTable;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tacticonserver/tacticonactionplugin/src/tacticonactionplugin.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2009 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:  A plug-in for disabling/enabling tacticons.
+* Part of:      Tacticon Server.
+*
+*/
+
+// INCLUDE FILES
+#include <badesca.h>
+#include <cfactionindication.h>
+#include <e32property.h>
+#include <centralrepository.h>
+
+#include "tacticonactionplugin.h"
+#include "tacticonprivatecrkeys.h"
+#include "tacticontrace.h"
+
+// CONSTANTS
+
+// Constants for tactile feedback actions
+
+_LIT( KTacticonAction,    "Tacticon" );
+_LIT( KTacticonMode,      "Mode" );
+
+_LIT( KTacticonCallDialling,     "CALL_DIALLING" );
+_LIT( KTacticonCallConnected,    "CALL_CONNECTED" );
+_LIT( KTacticonCallDisconnected, "CALL_DISCONNECTED" );
+_LIT( KProximityOn,              "PROXIMITY_ON" );
+_LIT( KProximityOff,             "PROXIMITY_OFF" );
+
+// Security policy
+_LIT_SECURITY_POLICY_PASS( KSecurityPolicy );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTacticonActionPlugIn::CTacticonActionPlugIn
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CTacticonActionPlugIn::CTacticonActionPlugIn( ) 
+ : CCFActionPlugIn(),
+    iProximityDiscernible(ETrue), iCallInitiated( EFalse )                                  
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CTacticonActionPlugIn::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTacticonActionPlugIn* CTacticonActionPlugIn::NewL( )
+    {
+    CTacticonActionPlugIn* self = CTacticonActionPlugIn::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+  
+// -----------------------------------------------------------------------------
+// CTacticonActionPlugIn::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTacticonActionPlugIn* CTacticonActionPlugIn::NewLC( )
+    {
+    CTacticonActionPlugIn* self = new( ELeave ) CTacticonActionPlugIn();
+    CleanupStack::PushL( self );
+    return self;
+    }
+  
+
+// -----------------------------------------------------------------------------
+// CTacticonActionPlugIn::~CTacticonActionPlugIn
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CTacticonActionPlugIn::~CTacticonActionPlugIn()
+    {
+    iTacticon.Close();
+    }
+
+//-----------------------------------------------------------------------------
+// CTacticonActionPlugIn::InitializeL
+// Initializes the plugin, called by the CF framework.
+//-----------------------------------------------------------------------------
+//
+void CTacticonActionPlugIn::InitializeL()
+    {
+    TRACE("CTacticonActionPlugIn::InitializeL(): start");
+    User::LeaveIfError( iTacticon.Connect() );
+    
+    CRepository* repository = CRepository::NewL( KCRUidTacticon );
+    CleanupStack::PushL( repository );
+
+    User::LeaveIfError( repository->Get( KTacticonDuringCall, 
+                                         iEnabledDuringCall ) );
+
+    User::LeaveIfError( repository->Get( KTacticonSet, 
+                                         iTacticonCallSettings ) );
+    CleanupStack::PopAndDestroy( repository );
+    TRACE("CTacticonActionPlugIn::InitializeL(): end");
+    }
+
+//-----------------------------------------------------------------------------
+// CTacticonActionPlugIn::ExecuteL
+// Executes an action.
+//-----------------------------------------------------------------------------
+//
+CCFActionPlugIn::TExecutionTime CTacticonActionPlugIn::ExecuteL(
+    CCFActionIndication* aActionIndication )
+    {
+    TRACE("CTacticonActionPlugIn::ExecuteL(): start");
+    
+    // get action parameters
+    const RKeyValueArray& parameters = aActionIndication->Parameters();
+    
+    for( TInt i = 0; i < parameters.Count(); i++ )
+        {
+        // get received parameter and its value
+        TPtrC param( parameters[i]->Key() );
+        TPtrC value( parameters[i]->Value() );
+        // check command
+        if ( param == KTacticonMode )
+            {
+            if ( value == KProximityOn )
+                {
+                TRACE("CTacticonActionPlugIn::ExecuteL(): Proximity ON");
+                iProximityDiscernible = ETrue;
+                }
+            else if ( value == KProximityOff )
+                {
+                TRACE("CTacticonActionPlugIn::ExecuteL(): Proximity OFF");
+                iProximityDiscernible = EFalse;
+                }
+            else if ( value == KTacticonCallDialling )
+                {
+                iCallInitiated = ETrue;
+                }
+            else if ( value == KTacticonCallConnected )
+                {
+                TRACE("CTacticonActionPlugIn::ExecuteL(): Call Connected");
+                if ( iCallInitiated && 
+                     !iProximityDiscernible &&
+                   ( iTacticonCallSettings & KTacticonSetCallConnected ) )
+                    {
+                    iTacticon.PlayTacticon( ENeutralTacticon );
+                    }                
+                if ( !iEnabledDuringCall )
+                    {
+                    iTacticon.EnableTacticons( EFalse );
+                    }
+                }
+            else if ( value == KTacticonCallDisconnected )
+                {
+                TRACE("CTacticonActionPlugIn::ExecuteL(): Call Disconnected");
+                iTacticon.EnableTacticons( ETrue );
+                iCallInitiated = EFalse;
+                }                
+            }            
+        }
+    TRACE("CTacticonActionPlugIn::ExecuteL(): end");
+    
+    // not async operation --> return always ENone
+    return CCFActionPlugIn::ENone;
+    }
+
+//-----------------------------------------------------------------------------
+// CTacticonActionPlugIn::GetActionsL
+// Returns all the actions the plugin can perform.
+//-----------------------------------------------------------------------------
+//
+void CTacticonActionPlugIn::GetActionsL( CDesCArray& aActionList ) const
+    {
+    TRACE("CTacticonActionPlugIn::GetActionsL(): start");
+
+    aActionList.AppendL( KTacticonAction );
+
+    TRACE("CTacticonActionPlugIn::GetActionsL(): end");
+    }
+
+//-----------------------------------------------------------------------------
+// CTacticonActionPlugIn::SecurityPolicy
+// Returns the capabilities required by the plugin.
+//-----------------------------------------------------------------------------
+//
+const TSecurityPolicy& CTacticonActionPlugIn::SecurityPolicy() const
+    {
+    TRACE("CTacticonActionPlugIn::SecurityPolicy()");
+
+    return KSecurityPolicy;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:  Master bld.inf -file for whole Tactile Feedback subsystem.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_EXPORTS
+../rom/tactilefeedback.iby  CORE_IBY_EXPORT_PATH(mw, tactilefeedback.iby)
+
+#ifndef TOOLS
+
+#include "../TactileAreaRegistry/group/bld.inf"
+#include "../TactileFeedbackResolver/group/bld.inf"
+#include "../TactileClickPlugin/group/bld.inf"
+#include "../TactileFeedbackClient/group/bld.inf"
+#include "../TactileActionPlugin/group/bld.inf"
+
+#endif // TOOLS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/inc/tactilefeedbacktrace.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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:  Master trace -file for whole Tactile Feedback subsystem.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef TACTILEFEEDBACKTRACE_H
+#define TACTILEFEEDBACKTRACE_H
+
+#include <bldvariant.hrh>
+
+
+#ifndef _DEBUG
+
+  #define TRACE( x )
+  #define TRACE2( x, y )
+  #define TRACE3( x, y, z )
+  #define TRACE4( x, y, z, zz )
+  #define TRACE5( x, y, z, zz, zzz )
+  
+#else
+
+#include <e32std.h>
+#include <e32svr.h> // RDebug
+
+#define TRACE( x )            RDebug::Print( _L( x  ) )
+#define TRACE2( x, y )        RDebug::Print( _L( x ), ( y ) )
+#define TRACE3( x, y, z )     RDebug::Print( _L( x ), ( y ), ( z ) )
+#define TRACE4( x, y, z, zz ) RDebug::Print( _L( x ), ( y ), ( z ), ( zz ) )
+#define TRACE5( x, y, z, zz, zzz ) RDebug::Print( _L( x ), ( y ), ( z ), ( zz ), ( zzz ) )
+  
+#endif // _DEBUG
+
+#endif // TACTILEFEEDBACKTRACE_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/rom/tactilefeedback.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* 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:  This is the master IBY file for Tactile Feedback subsystem.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILEFEEDBACK_IBY
+#define TACTILEFEEDBACK_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+// =============================================================================
+// Tactile Feedback subsystem components
+// =============================================================================
+
+
+// Tactile Area Registry
+file=ABI_DIR\BUILD_DIR\tactilearearegistry.dll SHARED_LIB_DIR\tactilearearegistry.dll
+
+// Tactile Feedback Client
+file=ABI_DIR\BUILD_DIR\touchfeedback.dll SHARED_LIB_DIR\touchfeedback.dll
+
+
+#endif // TACTILEFEEDBACK_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/data/tactile.rul	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,35 @@
+<script xmlns="http://www.nokia.com/ns/cep/script/1.0/"
+xmlns:cep="http://www.nokia.com/ns/cep/1.0/">
+    <if>
+        <or>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>Connected</string>
+            </equals>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>Dialling</string>
+            </equals>
+    	</or>
+        <actions>
+            <!-- Tactile feedback off -->
+            <Tactile Feedback='OFF'/>	
+        </actions>
+    </if>
+    <elseIf>
+        <or>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>None</string>
+            </equals>
+            <equals>
+                <contextRef source='Call' type='State'/>
+                <string>Disconnecting</string>
+            </equals>
+        </or>
+        <actions>
+            <!-- Tactile feedback on -->
+            <Tactile Feedback='ON'/>
+        </actions>
+    </elseIf>
+</script>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/data/tactileactionplugin.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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:  Registery info for Tactile action plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+#include <cfactionpluginconst.hrh>
+
+#include "tactileactionpluginconst.hrh"
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    // UID for the DLL
+    dll_uid = KTactileActionPluginDllUid;
+    // Declare array of interface info
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            // UID of interface that is implemented            
+            interface_uid = KActionPluginInterfaceUid;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = KTactileActionPluginImplementationUid;
+                    version_no         = 1;
+                    display_name       = "";
+                    default_data       = "";
+                    opaque_data        = "";
+                    }
+                };
+            }
+        };
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,41 @@
+/*
+* 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:  Build file for the TactileActionPlugIn
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+#ifdef RD_CONTEXT_FRAMEWORK
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../rom/tactileactionplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactileactionplugin.iby)
+
+../data/tactile.rul\
+    /epoc32/RELEASE/winscw/UDEB/Z/private/10282BC4/Rules/tactile.rul
+
+../data/tactile.rul\
+    /epoc32/data/Z/private/10282BC4/Rules/tactile.rul
+
+#ifndef TOOLS
+
+PRJ_MMPFILES
+tactileactionplugin.mmp
+
+#endif // TOOLS
+
+#endif // RD_CONTEXT_FRAMEWORK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/group/tactileactionplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:  Project definition file for the TactileActionPlugIn
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+#include "../inc/tactileactionpluginconst.hrh"
+
+TARGET          tactileactionplugin.dll
+TARGETTYPE      PLUGIN
+UID             0x10009D8D KTactileActionPluginDllUid
+CAPABILITY      ALL -TCB
+
+SOURCEPATH      ../src
+SOURCE          main.cpp
+SOURCE          tactileactionplugin.cpp
+
+USERINCLUDE     .
+USERINCLUDE     ../inc
+USERINCLUDE     ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH      ../data
+START RESOURCE  tactileactionplugin.rss
+TARGET          tactileactionplugin.rsc
+TARGETPATH      /resource/plugins
+END
+
+LIBRARY         euser.lib
+LIBRARY         ecom.lib
+LIBRARY         bafl.lib
+LIBRARY         cfactivatorengine.lib
+LIBRARY         cfservices.lib
+LIBRARY         centralrepository.lib
+
+#ifdef LOGGING_MODE_FILE
+LIBRARY         flogger.lib
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/inc/tactileactionplugin.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,87 @@
+/*
+* 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:  A plug-in for turning tactile feedback on/off.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEACTIONPLUGIN_H
+#define C_TACTILEACTIONPLUGIN_H
+
+// INCLUDES
+#include <cfactionplugin.h> 
+#include <e32base.h>
+
+/**
+* Class CTactileActionPlugIn.
+*
+* Turns tactile feedback on/off when needed.
+* Triggered when the conditions from the rule file are valid.
+*/
+class CTactileActionPlugIn : public CCFActionPlugIn
+    {
+public:
+
+    /**
+     * Two phased constructor.
+     */
+    static CTactileActionPlugIn* NewL();
+
+    /**
+     * Two phased constructor.
+     */
+    static CTactileActionPlugIn* NewLC();
+
+    /**
+     * Destructor.
+     */
+    ~CTactileActionPlugIn();
+
+public: // From CCFActionPlugIn
+
+    /**
+     * @see CCFActionPlugIn
+     */
+    void InitializeL();
+
+    /**
+     * @see CCFActionPlugIn
+     */
+    TExecutionTime ExecuteL(
+        CCFActionIndication* aActionIndication );
+                
+    /**
+     * @see CCFActionPlugIn
+     */
+    void GetActionsL( CDesCArray& aActionList ) const;
+    
+    /**
+     * @see CCFActionPlugIn
+     */
+    const TSecurityPolicy& SecurityPolicy() const;
+    
+protected:
+
+    /**
+     * C++ constructor
+     */
+    CTactileActionPlugIn();
+    
+private:
+    TInt iFeedbackInCall;
+    
+    };
+
+#endif // C_TACTILEACTIONPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/inc/tactileactionpluginconst.hrh	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* 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:  Contains plugin's UID from mmp- and rss-files.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef TACTILEACTIONPLUGINCONST_HRH
+#define TACTILEACTIONPLUGINCONST_HRH
+
+// UIDs for Tactile Action Plugin DLL and ECom implementation
+#define KTactileActionPluginDllUid 0x2000B495
+#define KTactileActionPluginImplementationUid 0x2000B496
+
+#endif // TACTILEACTIONPLUGINCONST_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/rom/tactileactionplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* 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:  This is the IBY file for Tactile Action Plugin 
+*                component.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILEACTIONPLUGIN_IBY
+#define TACTILEACTIONPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+// =============================================================================
+// Tactile Action Plugin
+// =============================================================================
+ECOM_PLUGIN( tactileactionplugin.dll, tactileactionplugin.rsc )
+data=\epoc32\data\Z\private\10282BC4\Rules\tactile.rul    private\10282BC4\Rules\tactile.rul
+
+#endif // TACTILEACTIONPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/src/main.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* 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:  A plug-in for turning tactile feedback on/off.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <ecom/implementationproxy.h>
+
+#include "tactileactionplugin.h"
+#include "tactileactionpluginconst.hrh"
+
+// -----------------------------------------------------------------------------
+// Provides a key value pair table, which is used to identify the correct 
+// construction function for the requested interface.
+// -----------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 
+        KTactileActionPluginImplementationUid, 
+        CTactileActionPlugIn::NewL )
+    };
+
+// -----------------------------------------------------------------------------
+// Returns an instance of the proxy table.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
+    TInt& aTableCount )
+    {
+    aTableCount 
+        = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+    return ImplementationTable;
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileactionplugin/src/tactileactionplugin.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,213 @@
+/*
+* 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:  A plug-in for turning tactile feedback on/off.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+// INCLUDE FILES
+#include <badesca.h>
+#include <cfactionindication.h>
+#include <e32property.h>
+#include <centralrepository.h>
+
+#include "tactileactionplugin.h"
+#include "tactilefeedbackinternalpskeys.h"
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbacktrace.h"
+
+// CONSTANTS
+
+// Constants for tactile feedback actions
+_LIT( KActionId,         "Tactile" );
+_LIT( KActionIdCommand,  "Feedback" );
+_LIT( KActionCommandOn,  "ON" );
+_LIT( KActionCommandOff, "OFF" );
+
+// Constants used for setting Tactile Feedback while in-call and while
+// no call is in progress. See tactilefeedbackinternalpskeys.h for 
+// documentation.
+const TInt KTactilePSValueWhileInCall = 0x00; // Vibra and audio disabled
+const TInt KTactilePSValueWhileInCallAudioOff = 0x01; // Vibra enabled, audio disabled
+const TInt KTactilePSValueWhileInCallVibraOff = 0x02; // Vibra disabled, audio enabled
+const TInt KTactilePSValueWhileNoCall = 0x03; // Vibra and audio enabled
+
+// Security policy
+_LIT_SECURITY_POLICY_PASS( KSecurityPolicy );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTactileActionPlugIn::CTactileActionPlugIn
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CTactileActionPlugIn::CTactileActionPlugIn( ) 
+ : CCFActionPlugIn()                                  
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CTactileActionPlugIn::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTactileActionPlugIn* CTactileActionPlugIn::NewL( )
+    {
+    CTactileActionPlugIn* self = CTactileActionPlugIn::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+  
+// -----------------------------------------------------------------------------
+// CTactileActionPlugIn::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CTactileActionPlugIn* CTactileActionPlugIn::NewLC( )
+    {
+    CTactileActionPlugIn* self = new( ELeave ) CTactileActionPlugIn();
+    CleanupStack::PushL( self );
+    return self;
+    }
+  
+
+// -----------------------------------------------------------------------------
+// CTactileActionPlugIn::~CTactileActionPlugIn
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CTactileActionPlugIn::~CTactileActionPlugIn()
+    {
+    }
+
+//-----------------------------------------------------------------------------
+// CTactileActionPlugIn::InitializeL
+// Initializes the plugin, called by the CF framework.
+//-----------------------------------------------------------------------------
+//
+void CTactileActionPlugIn::InitializeL()
+    {
+    TRACE("CTactileActionPlugIn::InitializeL(): start");
+    CRepository* repository = CRepository::NewL( KCRUidTactileFeedback );
+    CleanupStack::PushL( repository );
+    
+    TInt tactileSettings(0);
+    repository->Get( KTactileInternalSettings, tactileSettings );
+    
+    // Clean all other settings values, leave only in-call settings.
+    tactileSettings &= ( KTactileInternalSettingsCallDisableVibra | 
+                         KTactileInternalSettingsCallDisableAudio );
+    
+    switch ( tactileSettings )                    
+        {
+        case KTactileInternalSettingsCallDisableVibra:
+            iFeedbackInCall = KTactilePSValueWhileInCallVibraOff;
+            break;
+        case KTactileInternalSettingsCallDisableAudio:
+            iFeedbackInCall = KTactilePSValueWhileInCallAudioOff;
+            break;
+        case ( KTactileInternalSettingsCallDisableVibra | 
+               KTactileInternalSettingsCallDisableAudio ):
+            iFeedbackInCall = KTactilePSValueWhileInCall;
+            break;  
+        default:
+            iFeedbackInCall = KTactilePSValueWhileNoCall;
+            break;
+        }    
+    CleanupStack::PopAndDestroy( repository );
+    TRACE("CTactileActionPlugIn::InitializeL(): end");
+    }
+
+//-----------------------------------------------------------------------------
+// CTactileActionPlugIn::ExecuteL
+// Executes an action.
+//-----------------------------------------------------------------------------
+//
+CCFActionPlugIn::TExecutionTime CTactileActionPlugIn::ExecuteL(
+    CCFActionIndication* aActionIndication )
+    {
+    TRACE("CTactileActionPlugIn::ExecuteL(): start");
+    
+    // get action parameters
+    const RKeyValueArray& parameters = aActionIndication->Parameters();
+    
+    for( TInt i = 0; i < parameters.Count(); i++ )
+        {
+        // get received parameter and its value
+        TPtrC param( parameters[i]->Key() );
+        TPtrC value( parameters[i]->Value() );
+
+        // check command
+        if ( param == KActionIdCommand )
+            {
+            TInt err = KErrNone;
+            
+            if ( value == KActionCommandOn )
+                {
+                // Turn tactile feedback on
+                TRACE( "CTactileActionPlugIn::ExecuteL(): Feedback set ON");
+                err = RProperty::Set( KPSUidTactileFeedback, 
+                                      KTactileFeedbackEnabled, 
+                                      KTactilePSValueWhileNoCall );
+                }
+            else if ( value == KActionCommandOff )
+                {
+                // Turn tactile feedback off
+                TRACE("CTactileActionPlugIn::ExecuteL(): Feedback set OFF");
+                err = RProperty::Set( KPSUidTactileFeedback, 
+                                      KTactileFeedbackEnabled, 
+                                      iFeedbackInCall );
+                }
+            
+            TRACE2("CTactileActionPlugIn::ExecuteL(): Set returned %d", err);
+            
+            User::LeaveIfError( err );
+            }
+        }
+        
+    TRACE("CTactileActionPlugIn::ExecuteL(): end");
+    
+    // not async operation --> return always ENone
+    return CCFActionPlugIn::ENone;
+    }
+
+//-----------------------------------------------------------------------------
+// CTactileActionPlugIn::GetActionsL
+// Returns all the actions the plugin can perform.
+//-----------------------------------------------------------------------------
+//
+void CTactileActionPlugIn::GetActionsL( CDesCArray& aActionList ) const
+    {
+    TRACE("CTactileActionPlugIn::GetActionsL(): start");
+
+    aActionList.AppendL( KActionId );
+
+    TRACE("CTactileActionPlugIn::GetActionsL(): end");
+    }
+
+//-----------------------------------------------------------------------------
+// CTactileActionPlugIn::SecurityPolicy
+// Returns the capabilities required by the plugin.
+//-----------------------------------------------------------------------------
+//
+const TSecurityPolicy& CTactileActionPlugIn::SecurityPolicy() const
+    {
+    TRACE("CTactileActionPlugIn::SecurityPolicy()");
+
+    return KSecurityPolicy;
+    }
+    
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/bwins/tactilearearegistryu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,8 @@
+EXPORTS
+	?HandleConnectL@CTactileAreaRegistry@@QAEXABUTTactileFeedbackConnectData@@@Z @ 1 NONAME ; void CTactileAreaRegistry::HandleConnectL(struct TTactileFeedbackConnectData const &)
+	?HandleDisconnect@CTactileAreaRegistry@@QAEXABUTTactileFeedbackDisconnectData@@@Z @ 2 NONAME ; void CTactileAreaRegistry::HandleDisconnect(struct TTactileFeedbackDisconnectData const &)
+	?HandleWindowGroupClosed@CTactileAreaRegistry@@QAEXH@Z @ 3 NONAME ; void CTactileAreaRegistry::HandleWindowGroupClosed(int)
+	?HandleWindowGroupCreated@CTactileAreaRegistry@@QAEXHI@Z @ 4 NONAME ; void CTactileAreaRegistry::HandleWindowGroupCreated(int, unsigned int)
+	?HitTestPointerEvent@CTactileAreaRegistry@@QAE?AW4TTouchLogicalFeedback@@ABUTPointerEvent@@HK@Z @ 5 NONAME ; enum TTouchLogicalFeedback CTactileAreaRegistry::HitTestPointerEvent(struct TPointerEvent const &, int, unsigned long)
+	?NewL@CTactileAreaRegistry@@SAPAV1@XZ @ 6 NONAME ; class CTactileAreaRegistry * CTactileAreaRegistry::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/eabi/tactilearearegistryu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,10 @@
+EXPORTS
+	_ZN20CTactileAreaRegistry14HandleConnectLERK27TTactileFeedbackConnectData @ 1 NONAME
+	_ZN20CTactileAreaRegistry16HandleDisconnectERK30TTactileFeedbackDisconnectData @ 2 NONAME
+	_ZN20CTactileAreaRegistry19HitTestPointerEventERK13TPointerEventim @ 3 NONAME
+	_ZN20CTactileAreaRegistry23HandleWindowGroupClosedEi @ 4 NONAME
+	_ZN20CTactileAreaRegistry24HandleWindowGroupCreatedEij @ 5 NONAME
+	_ZN20CTactileAreaRegistry4NewLEv @ 6 NONAME
+	_ZTI20CTactileAreaRegistry @ 7 NONAME ; #<TI>#
+	_ZTV20CTactileAreaRegistry @ 8 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* 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:  Area registry management and hit testing for pointer events.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../inc/tactilearearegistry.h      |../../inc/tactilearearegistry.h
+../inc/tactileinternaldatatypes.h |../../inc/tactileinternaldatatypes.h
+
+PRJ_MMPFILES
+../group/tactilearearegistry.mmp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/group/tactilearearegistry.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,44 @@
+/*
+* 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:  Area registry management and hit testing for pointer events.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactilearearegistry.dll
+TARGETTYPE              DLL
+UID                     0x1000008d 0x2000B492
+
+CAPABILITY              CAP_GENERAL_DLL
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactilearearegistry.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE           ../../inc
+
+LIBRARY                 euser.lib
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/inc/tactilearearegistry.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,308 @@
+/*
+* 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:  The class to be used from server side for accessing registry.
+*                Hit testing is done using this API.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+
+#ifndef C_TACTILEAREAREGISTRY_H
+#define C_TACTILEAREAREGISTRY_H
+
+
+#include <e32base.h>
+#include <w32std.h>
+
+#include <touchlogicalfeedback.h>
+#include "tactileinternaldatatypes.h"
+
+
+/**
+ *  Access to area registry from server side.
+ *
+ *  This class defines the interface that is used from server side for
+ *  managing area registry (e.g. handling connect and disconnect requests)
+ *  
+ *  The main purpose of this class is to do hit testing of pointer events,
+ *  for knowing if feedback should be triggered based on the pointer event.
+ *
+ *  This class also implements bookkeeping of created window groups and
+ *  corresponding window server connection handles. This information is
+ *  used for finding correct application's registry entries when a pointer
+ *  event arrives (application usually has only one window group, but some
+ *  pop-up controls create additional ones).
+ *
+ *  @lib tactilearearegistry.lib
+ *  @since S60 v5.0
+  */
+class CTactileAreaRegistry: public CBase
+    {
+public:
+
+    IMPORT_C static CTactileAreaRegistry* NewL();
+
+    virtual ~CTactileAreaRegistry();
+
+    /**
+     * Handles connection requests from client application. This has to be 
+     * called for every application that connects to the click plugin.
+     *
+     * Area registry immediately tries to connect to the chunk created
+     * by client application. This function leaves with Standard 
+     * Symbian OS error codes in case connection fails.
+     *
+     * @param aData - The data sent by client application.
+     */
+    IMPORT_C void HandleConnectL( const TTactileFeedbackConnectData& aData );
+
+
+    /**
+     * Handles disconnect request from client application. This has to be 
+     * called for every application that disconnects from the click plugin.
+     *
+     * @param aData - The data sent by client application.
+     */
+    IMPORT_C void HandleDisconnect( 
+        const TTactileFeedbackDisconnectData& aData );
+        
+        
+    /**
+     * Records information about a newly created window group.
+     *
+     * This function has to be called when click plugin receives a 
+     * notification about created window group.
+     *
+     * @param aIdentifier       - Identifier of the created window group.
+     * @param aConnectionHandle - Connection handle of the window server
+     *                            client, who created the window group.
+     */
+    IMPORT_C void HandleWindowGroupCreated( 
+        TInt aIdentifier, TUint aConnectionHandle );
+        
+        
+    /**
+     * Clears stored information about a window group that is closed.
+     *
+     * This function has to be called when click plugin receives a
+     * notification about closed window group. 
+     *
+     * @param aIdentifier - Window group identifier of the window group
+     *                      that was closed.
+     */
+    IMPORT_C void HandleWindowGroupClosed( TInt aIdentifier );    
+
+    /**
+     * Does hit testing of given pointer event against area registry content.
+     *
+     * Hit testing is done in three phases:
+     *
+     * 1. First this function uses window group identifier for finding the 
+     *    application, which shall receive the pointer event (registry
+     *    contents has to be grouped by applicaitons because window 
+     *    identifiers are only unique inside one application)
+     *
+     * 2. Window handle is used for finding those registry entries, which 
+     *    are registered to the same window where pointer event hit now 
+     *    (coordinates are window -relative).
+     *
+     * 3. Window's registry entries are hit tested one by one against the
+     *    given pointer event, and in case a match is found, then 
+     *    corresponding registry entries feedback type is returned.
+     *
+     * @param aPointerEvent - The pointer event.
+     * @param aWgIdentifier - Identifier of the window group, where pointer
+     *                        event hit.
+     * @param aWindowHandle - Handle number of the window, where pointer
+     *                        event hit.
+     * @return The logical feedback type that was triggered by the pointer
+     *         event, or ETouchFeedbackNone in case pointer event did not
+     *         hit any feedback area.
+     */
+    IMPORT_C TTouchLogicalFeedback HitTestPointerEvent( 
+        const TPointerEvent& aPointerEvent,
+        TInt aWgIdentifier,
+        TUint32 aWindowHandle );
+
+
+private:
+
+    CTactileAreaRegistry();
+    
+    /**
+     * This function is used for hit testing one chunk.
+     *
+     * It is assumed that the given chunk is the chunk of that application,
+     * where pointer event shall be delivered.
+     *
+     * @param aPointerEvent - The pointer event.
+     * @param aWgIdentifier - Identifier of the window group, where pointer
+     *                        event hit.
+     * @param aWindowHandle - Handle number of the window, where pointer
+     *                        event hit.
+     * @return The logical feedback type that was triggered by the pointer
+     *         event, or ETouchFeedbackNone in case pointer event did not
+     *         hit any feedback area.
+     */
+    TTouchLogicalFeedback HitTestChunk( 
+        RChunk&              aChunk, 
+        const TPointerEvent& aPointerEvent,
+        TInt                 aWgIdentifier, 
+        TUint32              aWindowHandle );
+
+    /**
+     * This function checks whether given pointer event and area registry 
+     * entry match, and sets feedback type accordingly in case they match.
+     *
+     * It is assumed that pointer event shall hit that window, where given
+     * area is registered (as coordinates are window-relative).
+     *
+     * Notice that feedback is actually returned in reference parameter
+     * aFeedback, and the main return value of the function tells whether
+     * hit testing should be continued on next possible area or not.
+     * This is because feedback can be "None" even if pointer event
+     * hit the feedback area (because "None" is a valid type for feedback
+     * areas)
+     *
+     * @param aPointerEvent - The pointer event.
+     * @param aEntry        - Area registry entry, representing feedback area
+     *                        in same window where pointer event hit.
+     * @param aWgIdentifier - Identifier of the window group, where pointer
+     *                        event hit.
+     * @param aWindowHandle - Handle number of the window, where pointer
+     *                        event hit.
+     * @return ETrue if the given pointer event matched given area registry
+     *         entry, and hit testing should not be continued anymore. 
+     *         EFalse indicates that hit testing should be continued with
+     *         next possibly matching feedback area.
+     */
+    TBool HitTestRegistryEntry( 
+        const TPointerEvent&           aPointerEvent, 
+        const TFeedbackChunkAreaEntry& aEntry,
+        TInt                           aWgIdentifier, 
+        TUint32                        aWindowHandle,
+        TTouchLogicalFeedback&         aFeedback );
+
+    /**
+     * Finds the correct shared memory chunk based on window group id.
+     *
+     * This is used for performing first phase of hit testing.
+     *
+     * @param aWgIdentifier - Identifier of the window group, which chunk
+     *                        is searched.
+     * @return Valid index to member variable iChunkArray, or KErrNotFound
+     *         in case given window group was not found.
+     */
+    TInt ChunkIndexByWindowGroupId( TInt aWgIdentifier ) const;
+    
+    /**
+     * Finds window server client's connection handle based on given
+     * window group identifier.
+     *
+     * This is used for finding correct shared memory chunk based on window
+     * group identifier.
+     *
+     * @param aWgIdentifier - The window group identifier.
+     * @return Connection handle of the client, who has created the given
+     *         window group. Zero is returned if no client is found.
+     */
+    TUint ConnectionHandleByWgId( TInt aWgIdentifier ) const;
+    
+
+private: // data types
+
+    /**
+     * Items of this type are stored into member variable iChunkArray.
+     * There is one item in the array for each connecting application.
+     *
+     * Stored window group id is the identifier of the main window group
+     * of connecting application. Stored connection handle is the
+     * window server connection handle of the application.
+     */
+    struct TTactileAreaChunk
+        {
+        TInt    iWindowGroupId;
+        TUint   iConnectionHandle;
+        RChunk  iChunk;
+        };
+        
+    /**
+     * This type of items are used in member variable iWgArray, which
+     * is used for mapping window groups and client applications together.
+     */
+    struct TTactileWgroupItem
+        {
+        TInt iWindowGroupId;
+        TUint iConnectionHandle;
+        };    
+        
+    
+    /**
+     * This auxiliary class is used for storing information about pen down
+     * event, so that we can know if pen up event happened in same feedback
+     * area as corresponding pen down event. This information is necessary
+     * in case we want to play feedback both on down- and up events, but only
+     * when those happen within same feedback area 
+     * (to distinguish cancel -case)
+     */
+    class TTactilePenDownEvent
+        {
+    public:
+        TTactilePenDownEvent();
+        TTactilePenDownEvent( TInt aWindowGroupId, 
+                              TUint32 aWindowHandle, 
+                              TRect aFeedbackArea );
+        void Reset();    
+    public:
+        TInt iWindowGroupId;
+        TUint32 iWindowHandle;
+        TRect iFeedbackArea;
+        };
+
+
+private: // data
+
+    /**
+     * Array of chunk handles and identifying window group identifiers.
+     * Each entry in the array represents one application and its 
+     * registered feedback areas.
+     */
+    RArray<TTactileAreaChunk> iChunkArray;
+    
+    /** 
+     * Here we store the information about created window groups.
+     * For each group we also store the connection handle, so that we can
+     * know into which application newly created window groups belong.  
+     */
+    RArray<TTactileWgroupItem> iWgArray;
+
+    /**
+     * Handle to the global semaphore, which is used for mutual exclusion
+     * when accessing shared memory chunks.
+     */
+    RSemaphore iTactileSemaphore;
+    
+    
+    /**
+     * Information about last received pen down event. This can be used
+     * for determining whether pen up event should produde feedback or not.
+     */
+    TTactilePenDownEvent iLastPenDown;
+
+    };
+
+
+#endif // C_TACTILEAREAREGISTRY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/inc/tactileinternaldatatypes.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* 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:  Opcodes and data types used in communication between client 
+*                process and window server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef T_TACTILEINTERNALDATATYPES_H
+#define T_TACTILEINTERNALDATATYPES_H
+
+
+
+#include <e32std.h>
+#include <touchlogicalfeedback.h>
+
+
+/**
+ *  These are used as opcodes (function number) in IPC communication 
+ *  between Tactile Feedback Client and the server hosting
+ *  Tactile Area Registry (currently window server)
+ */
+enum TTactileFeedbackOpCodes
+    {
+    ETactileOpCodeConnect = 200,
+    ETactileOpCodeDisconnect = 201,
+    ETactileOpCodeImmediateFeedback = 202
+    };
+
+/**
+ *  This is the data package that must be delivered with opcode 
+ *  ETouchOpCodeConnect.
+ */
+struct TTactileFeedbackConnectData
+    {
+    TInt   iWindowGroupId;
+    TKName iChunkName;
+    };
+
+/**
+ *  This is the data package that must be delivered with opcode 
+ *  ETouchOpCodeDisconnect.
+ */
+struct TTactileFeedbackDisconnectData
+    {
+    TInt   iWindowGroupId;
+    };
+
+/**
+ *  This is the data package that must be delivered with opcode 
+ *  ETactileOpCodeImmediateFeedback.
+ */
+struct TTactileFeedbackImmediateData
+    {
+    TTouchLogicalFeedback iFeedbackType;
+    TBool iPlayVibra;
+    TBool iPlayAudio;
+    };
+
+    
+/**
+ *  This struct represents one area registry entry in shared memory chunk.
+ * 
+ *  Top two bits of iFeedbackType field are used for coding vibra-
+ *  and audio feedback status together with feedback type:
+ *
+ *  0x80000000 --> 1 If vibra feedback is enabled for this area
+ *  0x40000000 --> 1 If audio feedback is enabled for this area
+ *  
+ */    
+struct TFeedbackChunkAreaEntry
+    {
+    TRect iRect;
+    TTouchLogicalFeedback iFeedbackType;
+    TTouchEventType iEventType;  
+    };
+
+const TInt KTactileVibraBitDown = 0x80000000;
+const TInt KTactileAudioBitDown = 0x40000000;    
+const TInt KTactileVibraBitUp   = 0x20000000;
+const TInt KTactileAudioBitUp   = 0x10000000;
+
+_LIT( KTouchFeedbackSemaphore, "SemaphoreTouchFeedback");    
+    
+
+#endif // T_TACTILEINTERNALDATATYPES_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/src/tactilearearegistry.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,483 @@
+/*
+* Copyright (c) 2007-2009 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 class to be used from server side for accessing registry.
+*                Hit testing is done using this API.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <tactilefeedbacktrace.h>
+#include "tactilearearegistry.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactilearearegistryTraces.h"
+#endif
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CTactileAreaRegistry::TTactilePenDownEvent::TTactilePenDownEvent(): 
+        iWindowGroupId( -1 ), iWindowHandle( 0 )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//    
+CTactileAreaRegistry::TTactilePenDownEvent::TTactilePenDownEvent( 
+    TInt aWindowGroupId, 
+    TUint32 aWindowHandle, 
+    TRect aFeedbackArea ): 
+        iWindowGroupId( aWindowGroupId ), 
+        iWindowHandle( aWindowHandle ),
+        iFeedbackArea( aFeedbackArea )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CTactileAreaRegistry::TTactilePenDownEvent::Reset()
+    {
+    iWindowGroupId = -1 ;
+    iWindowHandle = 0;
+    }
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileAreaRegistry::CTactileAreaRegistry()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTactileAreaRegistry* CTactileAreaRegistry::NewL()
+    {
+    CTactileAreaRegistry* self = new ( ELeave ) CTactileAreaRegistry;
+    
+    // We don't need ConstructL in this class for the moment, so we
+    // can just return the created instance right away.
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileAreaRegistry::~CTactileAreaRegistry()
+    {
+    iChunkArray.Close();
+    iWgArray.Close();
+    iTactileSemaphore.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// #1 Find the shared chunk created by client
+// #2 Open handle to the found chunk
+// #3 Store window group id and connection handle with the chunk, 
+//    and add chunk to array
+// #4 Open global semaphore in case it is not yet open
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTactileAreaRegistry::HandleConnectL( 
+    const TTactileFeedbackConnectData& aData )
+    {
+    TRACE3("CTactileAreaRegistry::HandleConnectL - wgId = %d, Chunk = %S", 
+        aData.iWindowGroupId,
+        &aData.iChunkName );
+    
+    // #1
+    TFindChunk findChunk( aData.iChunkName );
+    
+    TFullName chunkFullName;
+    
+    TInt err = findChunk.Next( chunkFullName );
+    
+    User::LeaveIfError( err );
+       
+    // #2
+    TTactileAreaChunk newChunk;
+
+    err = newChunk.iChunk.OpenGlobal( chunkFullName, ETrue );
+
+    User::LeaveIfError( err );
+    
+    CleanupClosePushL( newChunk.iChunk );
+    
+    // #3      
+    newChunk.iWindowGroupId = aData.iWindowGroupId;
+    
+    newChunk.iConnectionHandle = 
+        ConnectionHandleByWgId( aData.iWindowGroupId );
+    
+    iChunkArray.AppendL( newChunk );
+    
+    CleanupStack::Pop(); // newChunk.iChunk  
+        
+    // #4 Open global semaphore in case it is not yet open
+    if ( !iTactileSemaphore.Handle() )
+        {
+        err = iTactileSemaphore.OpenGlobal( KTouchFeedbackSemaphore );
+        User::LeaveIfError( err );
+        }   
+    }
+   
+    
+// ---------------------------------------------------------------------------
+// We handle diconnect by finding client's chunk, closing it and then
+// removing the entry from chunk array.
+//
+// #1 Find the correct entry
+// #2 Close chunk
+// #3 Remove entry from chunk array
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTactileAreaRegistry::HandleDisconnect( 
+    const TTactileFeedbackDisconnectData& aData )
+    {
+    // #1
+    for ( TInt i=0; i < iChunkArray.Count(); i++ )
+        {
+        if ( iChunkArray[i].iWindowGroupId == aData.iWindowGroupId )
+            {
+            // #2
+            iChunkArray[i].iChunk.Close();
+            
+            // #3
+            iChunkArray.Remove( i );            
+            break;
+            }
+        }  
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Here we just store information (e.g. connection handle) about the
+// newly created window group.
+//
+// Notice that we ignore possible error on purpose when adding new item to
+// the array. Firstly a failure should be almost impossible, and secondly 
+// it would only cause feedback to be disabled for the newly created 
+// window group.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTactileAreaRegistry::HandleWindowGroupCreated( 
+    TInt aIdentifier, TUint aConnectionHandle )
+    {
+    TTactileWgroupItem newItem;
+    
+    newItem.iWindowGroupId    = aIdentifier;
+    newItem.iConnectionHandle = aConnectionHandle;
+    
+    iWgArray.Append( newItem );
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// When window group is closed, we remove all information about it from
+// the array (we don't destroy chunks because it has been done based
+// on the disconnect request already).
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTactileAreaRegistry::HandleWindowGroupClosed(
+    TInt aIdentifier )
+    {
+    // Loop down so that deleting of items won't mix up the array
+    for ( TInt i = iWgArray.Count()-1; i >= 0; i-- ) 
+        {
+        if ( iWgArray[i].iWindowGroupId == aIdentifier )
+            {
+            iWgArray.Remove( i );
+            }
+        }
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// This is the implementation of hit testing.
+//
+// It is assumed that this function is not called unless there is at least
+// one connected application, and unless iTactileSemaphore has been opened 
+// succesfully.
+//
+// #1 Check that we have valid handle to global semaphore.
+// #2 Find correct chunk based on window group id.
+// #3 Do actual hit testing in a separate function.
+// #4 Return feedback type based on hit testing results.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TTouchLogicalFeedback CTactileAreaRegistry::HitTestPointerEvent( 
+    const TPointerEvent& aPointerEvent,
+    TInt aWgIdentifier,
+    TUint32 aWindowHandle )
+    {
+    TTouchLogicalFeedback feedback(ETouchFeedbackNone);
+    
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_REGISTRY_HIT_TEST_1, "e_TACTILE_REGISTRY_HIT_TEST 1");
+
+    // #1
+    if ( iTactileSemaphore.Handle() && 
+         ( aPointerEvent.iType == TPointerEvent::EButton1Down || 
+           aPointerEvent.iType == TPointerEvent::EButton1Up ) )
+        {
+        // We keep performance trace here instead of beginning of function
+        // so that drag events won't confuse performance measurements.    
+        
+        // #2
+        TInt chunkIndex = ChunkIndexByWindowGroupId( aWgIdentifier );
+        
+        // #3 If we found the window group where pointer event is going to land,
+        // then search for correct window (and area) in its shared chunk.
+        if ( chunkIndex >= 0 && chunkIndex < iChunkArray.Count() )   
+            {
+            feedback = HitTestChunk( 
+                iChunkArray[chunkIndex].iChunk, 
+                aPointerEvent,
+                aWgIdentifier,
+                aWindowHandle );
+            }
+         }
+    
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_REGISTRY_HIT_TEST_0, "e_TACTILE_REGISTRY_HIT_TEST 0");
+    
+    // #4
+    return feedback;
+    }
+      
+// ---------------------------------------------------------------------------
+// In this function we do hit testing for one chunk.
+//
+// There is currently support for feedback on both
+// pen down and up -events.
+//
+// #1 Reset last pen down information in case this was a pen down -event.
+// #2 Call wait on global semaphore for mutual exlusion of shared memory.
+// #3 Start from the beginning of chunk, and read number of windows first.
+// #4 Go through all windows in a loop
+// ---------------------------------------------------------------------------
+//
+TTouchLogicalFeedback CTactileAreaRegistry::HitTestChunk( 
+    RChunk& aChunk, 
+    const TPointerEvent& aPointerEvent,
+    TInt aWgIdentifier, 
+    TUint32 aWindowHandle )
+    {
+    // #1
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+        {
+        iLastPenDown.Reset();
+        }
+    
+    TTouchLogicalFeedback feedback = ETouchFeedbackNone;
+    
+    // #2 Protect shared memory chunks so that nobody can modify
+    // them in the middle of hit testing.
+    iTactileSemaphore.Wait();
+
+    // #3
+    TInt* base = (TInt*) aChunk.Base();  
+    
+    TInt windowCount = *base;
+    base++;
+    
+    TBool windowFound(EFalse);
+    
+    // #4 Iterate though windows
+    for ( TInt i=0; i < windowCount && !windowFound; i++ )
+        {
+        // Read handle identifier of this window
+        TInt wsHandle = *base;
+        base++;
+        // Read number of areas registered to this window
+        TInt areaCount = *base;
+        base++;
+        // Read offset to the area data of this window
+        TInt offset = *base;
+        base++; 
+       
+        // Check if this window is the one where pointer event hit.
+        if ( wsHandle == static_cast<TInt>( aWindowHandle ) ) 
+            {
+            // Set pointer to the first area belonging to this window.
+            TFeedbackChunkAreaEntry* entryPtr = 
+                reinterpret_cast<TFeedbackChunkAreaEntry*>( aChunk.Base() + offset );
+
+            TBool matchFound = EFalse;
+            
+            // Go through all areas and test each one against the pointer
+            // event as long as a match is found.
+            for ( TInt j = 0; j < areaCount && !matchFound; j++ )
+                {
+                matchFound = HitTestRegistryEntry( aPointerEvent,
+                                                   *entryPtr,
+                                                   aWgIdentifier,
+                                                   aWindowHandle,
+                                                   feedback );
+                            
+                entryPtr++;
+                }
+                
+            // No need to continue in the loop, 
+            // because window found already
+            windowFound = ETrue;
+            }   
+        }
+        
+    // Release the semaphore so that applications can do updates to
+    // registry again.   
+    iTactileSemaphore.Signal();  
+    
+    return feedback;  
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Here we analyse the pointer event type against feedback area entry, that
+// is located in same window where the pointer event hit.
+//
+// This functionality is encapsulated into separate function mainly
+// because this is the only part of the implementation that needs
+// to be modified in case we'll have different kinds of down- and up event
+// combinations (there could be different types for e.g. in situations were
+// up event is / is not required to match down event for it to trigger 
+// feedback).
+//
+// Here we also record details of pen down events (that trigger feedback), so
+// that we can check on pen up event in case it matches the same feedback 
+// area where down -event landed.
+//
+// #1 First see if pointer event even hit the area
+//
+// #2 Currently pen down event always generates feedback
+// 
+// #3 We trigger feedback on pen up event only if it matches the same
+//    feedback area, where corresponding down event hit.
+//    
+// ---------------------------------------------------------------------------
+//
+TBool CTactileAreaRegistry::HitTestRegistryEntry( 
+    const TPointerEvent&           aPointerEvent, 
+    const TFeedbackChunkAreaEntry& aEntry,
+    TInt                           aWgIdentifier, 
+    TUint32                        aWindowHandle,
+    TTouchLogicalFeedback&         aFeedback )
+    {
+    TBool matchFound = EFalse;
+    
+    // #1
+    if ( aEntry.iRect.Contains( aPointerEvent.iPosition) )
+        {
+        TInt enablers     = aEntry.iFeedbackType & ( KTactileVibraBitDown | 
+                                                     KTactileAudioBitDown | 
+                                                     KTactileVibraBitUp   | 
+                                                     KTactileAudioBitUp );
+        TInt feedbackDown = aEntry.iFeedbackType & 0x3FF;         // the first 10 bits
+        TInt feedbackUp   = aEntry.iFeedbackType & (0x3FF << 10); // next 10 bits
+        feedbackUp   = feedbackUp >> 10;
+        // #2 Pointer down on the area always triggers feedback     
+        if ( ( aPointerEvent.iType == TPointerEvent::EButton1Down ))
+            {
+            matchFound = ETrue;
+            aFeedback = static_cast<TTouchLogicalFeedback>( feedbackDown );
+            iLastPenDown = 
+                TTactilePenDownEvent(
+                    aWgIdentifier, aWindowHandle, aEntry.iRect );
+            }
+        // #3    
+        else if ( ( aPointerEvent.iType == TPointerEvent::EButton1Up ))
+            {
+            if ( iLastPenDown.iWindowGroupId == aWgIdentifier &&
+                 iLastPenDown.iWindowHandle == aWindowHandle && 
+                 iLastPenDown.iFeedbackArea == aEntry.iRect )
+                {
+                matchFound = ETrue;
+                aFeedback = static_cast<TTouchLogicalFeedback>( feedbackUp );
+
+                // Can only match agains same pen down event once
+                iLastPenDown.Reset();            
+                }
+            }
+        if ( matchFound )
+            {
+            aFeedback = static_cast<TTouchLogicalFeedback>(aFeedback | enablers);
+            }
+        }
+    return matchFound;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Find the chunk of that application, where pointer event hit.
+//
+// #1 First determine the window server client connection handle (we use
+//    this to indentify chunk instead of window group id, because this way
+//    resolving works the same way also for additional window groups)
+//
+// #2 Go though the chunk array for finding out the correct one.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileAreaRegistry::ChunkIndexByWindowGroupId( TInt aWgIdentifier ) const
+    {
+    TInt chunkIndex = KErrNotFound;
+    
+    // #1
+    TUint connectionHandle = ConnectionHandleByWgId( aWgIdentifier );
+
+    // #2 Iterate though chunks to find the correct one
+    for ( TInt chunk = 0; chunk < iChunkArray.Count() && chunkIndex == KErrNotFound; chunk++ ) 
+        {
+        if ( iChunkArray[chunk].iConnectionHandle == connectionHandle )
+            {
+            chunkIndex = chunk;
+            }
+        }
+            
+    return chunkIndex;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Here we scan through the window group array, and return the corresponding
+// connection handle in case a match is found.
+// ---------------------------------------------------------------------------
+//
+TUint CTactileAreaRegistry::ConnectionHandleByWgId( TInt aWgIdentifier ) const
+    {
+    TUint connectionHandle = 0;
+    
+    for ( TInt i=0; i < iWgArray.Count() && !connectionHandle; i++ )
+        {
+        if ( iWgArray[i].iWindowGroupId == aWgIdentifier )
+            {
+            connectionHandle = iWgArray[i].iConnectionHandle;
+            }
+        }
+        
+    return connectionHandle;
+    }
+   
+    
+    
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_REGISTRY_HIT_TEST_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_REGISTRY_HIT_TEST_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/traces/tactilearearegistryTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILEAREAREGISTRYTRACES_H__
+#define __TACTILEAREAREGISTRYTRACES_H__
+
+#define KOstTraceComponentID 0x2000b492
+
+#define TACTILE_REGISTRY_HIT_TEST_1 0x400001
+#define TACTILE_REGISTRY_HIT_TEST_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilearearegistry/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+<model>
+  <id>536917138</id>
+  <name>tactilearearegistry</name>
+  <group>
+    <id>64</id>
+    <name>TACTILE_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTILE_REGISTRY_HIT_TEST 1</text>
+      <id>1</id>
+      <name>TACTILE_REGISTRY_HIT_TEST_1</name>
+      <location>
+        <file>../src/tactilearearegistry.cpp</file>
+        <line>238</line>
+        <class>CTactileAreaRegistry</class>
+        <function>HitTestPointerEvent</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_REGISTRY_HIT_TEST 0</text>
+      <id>2</id>
+      <name>TACTILE_REGISTRY_HIT_TEST_0</name>
+      <location>
+        <file>../src/tactilearearegistry.cpp</file>
+        <line>263</line>
+        <class>CTactileAreaRegistry</class>
+        <function>HitTestPointerEvent</function>
+      </location>
+    </trace>
+  </group>
+</model>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/bwins/tactileclickpluginu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+EXPORTS
+	?CreateClickMakerL@@YAPAVCClickMaker@@XZ @ 1 NONAME ; class CClickMaker * CreateClickMakerL(void)
+	?Instance@MTactileFeedbackServer@@SAPAV1@XZ @ 2 NONAME ; class MTactileFeedbackServer * MTactileFeedbackServer::Instance(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/eabi/tactileclickpluginu.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+EXPORTS
+	_Z17CreateClickMakerLv @ 1 NONAME
+	_ZN22MTactileFeedbackServer8InstanceEv @ 2 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* 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:  Build information file for the click maker plugin, 
+*                which handles key events at window server process.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../rom/tactileclickplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactileclickplugin.iby)
+
+#ifndef TOOLS
+
+PRJ_MMPFILES
+tactileclickplugin.mmp
+
+#endif // TOOLS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/group/tactileclickplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,46 @@
+/*
+* 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:  Project definition file for the click maker plugin, which
+*                handles key events at window server process.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactileclickplugin.dll
+TARGETTYPE              DLL
+UID                     0x10004F63 0x2000B493
+
+CAPABILITY              ALL -TCB
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactileclickplugin.cpp
+SOURCE                  tactilefeedbackserver.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE           ../../inc
+
+LIBRARY                 euser.lib
+LIBRARY                 tactilearearegistry.lib
+LIBRARY                 tactilefeedbackresolver.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/inc/tactileclickplugin.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,224 @@
+/*
+* Copyright (c) 2007-2009 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 click maker plugin, which
+*                handles key events at window server process.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILECLICKPLUGIN_H
+#define C_TACTILECLICKPLUGIN_H
+
+
+
+#include <w32click.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <graphics/pointereventdata.h> 
+#endif //SYMBIAN_ENABLE_SPLIT_HEADERS
+
+#include <tactilefeedback.h>
+
+#include "tactilefeedbackserver.h"
+
+class RTactileFeedback;
+class CTactileAreaRegistry;
+
+
+/**
+ *  The click maker plugin for triggering tactile feedback.
+ *
+ *  Tactile feedback is generated on each pointer down event, in case the
+ *  pointer event hit some area on screen where feedback is enabled.
+ *  Feedback triggering has tight latency requirements, and thus this
+ *  click maker plugin's purpose is to enable feedback triggering from
+ *  window server process (instead of application process when the pointer
+ *  event arrives there).
+ *
+ *  Feedback areas are kept in the Area Registry, and this plug-ins task is
+ *  to pass incoming pointer events to the Area registry so that hit tests
+ *  can be done to see if any feedback area was hit or not.
+ *
+ *  The implementation of this plugin relies to the fact that OtherEvent
+ *  -function is called with the pointer event + window identifier and
+ *  window group identifier as additional parameters (these are Symbian
+ *  changes compared to the documented behaviour).
+ *
+ *  This plug-in is also responsible of providing 
+ *  Tactile Feedback AnimDll API for AnimDll plug-ins. That API is 
+ *  designed for supporting direct feedback triggering from AnimDll plug-ins,
+ *  and it needs to be implemented by this plug-in because this is the only 
+ *  component in Tactile Feedback subsystem that is guaranteed to run
+ *  in the window server's process (other components have been designed in
+ *  such way that they can be moved elsewhere in case necessary).
+ *
+ *  @lib N/A
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTactileClickPlugin ): 
+    public CClickMaker,
+    public MTactileFeedbackServer
+    {
+public:
+
+    static CTactileClickPlugin* NewL();
+
+    virtual ~CTactileClickPlugin();
+
+// from base class CClickMaker
+
+    /**
+     * From CClickMaker.
+     * This function is called by the window server whenever there is a 
+     * key event, to generate the sound.
+     *
+     * The key events are not used by this plugin actually, because this
+     * plug-in's purpose is to handle only pointer events.
+     *
+     * @since S60 v5.0
+     * @param aType  - The type of the key event.
+     * @param aEvent - The key event details. 
+     */
+    void KeyEvent( TEventCode aType,const TKeyEvent& aEvent );
+
+    /**
+     * From CClickMaker.
+     * This function is called by the window server whenever there is a 
+     * pointer event, to generate the sound.
+     *
+     * Not used by this plug-in because there is not enough information in
+     * the pointer event for resolving the actual area and window where
+     * pointer event was hit. Intead pointer events are handled in 
+     * OtherEvent -function.
+     *
+     * @since S60 v5.0
+     * @param aEvent - The pointer event details.
+     */
+    void PointerEvent( const TPointerEvent& aEvent );
+
+    /**
+     * From CClickMaker.
+
+     * This function is a "future expansion" of the original click maker API,
+     * and it has been taken into use by this plugin for getting more 
+     * information about the pointer event than what is possible to pass as
+     * parameter to PointerEvent -function.
+     *
+     * @since S60 v5.0
+     * @param aType  - The type of the event.
+     * @param aParam - Pointer to data package containing the pointer event,
+     *                 window identifier where pointer event hit, and window
+     *                 group identifier of the window group where the window
+     *                 belongs to.
+     */
+    void OtherEvent( TInt aType, TAny* aParam=NULL );
+
+    /**
+     * From CClickMaker.
+     * Implemented to enable this plug-in to communicate with the window
+     * server client.
+     *
+     * Area registry management communication (such as creating or closing
+     * an application) is communicated through this function.
+     *
+     * In practice communication is done between this plug-in, and 
+     * Tactile Feedback Client API implementation.
+     *
+     * @since S60 v5.0
+     * @param aOpcode - Opcode of the command sent by Client API
+     * @param aArgs   - Pointer to the data sent by client.
+     */
+    TInt CommandReplyL( TInt aOpcode, TAny* aArgs );
+
+
+// from base class MTactileFeedbackServer
+
+    /**
+     * From MTactileFeedbackServer.
+     * Direct feedback service for Anim Dll plugins.
+     *
+     * @since S60 v5.0
+     * @param aType - Logical feedback type to play.
+     */
+    void InstantFeedback( TTouchLogicalFeedback aType );
+
+private:
+
+    CTactileClickPlugin();
+
+    void ConstructL();
+    
+    /**
+     * Handles data parsing when new client connects to this plugin.
+     *
+     * Actual functionality is implemented in Tactile Area Registry.
+     *
+     * @param aArgs - Pointer to the data sent by client.
+     */
+    void HandleConnectL( TAny* aArgs );
+
+    /**
+     * Handles data parsing when client disconnects itself. In practice
+     * this happens when application is closed.
+     *
+     * Actual functionality is implemented in Tactile Area Registry.
+     *
+     * @param aArgs - Pointer to the data sent by client.
+     */
+    void HandleDisconnect( TAny* aArgs );
+
+    /**
+     * Handles direct feedback request from Tactile Client API.
+     *
+     * In practice this function only parses the data so that the
+     * logical feedback type is known. After that feedback type is passed
+     * to Tactile Feedback Resolver, which will then play direct feedback
+     * (or block the request if feedback is not enabled on the moment).
+     *
+     * @param aArgs - Pointer to the data sent by client.
+     * @return KErrNone if operation succeeded, otherwise one of standand
+     *         Symbian OS error codes.
+     */
+    TInt HandleImmediateFeedback( TAny* aArgs );
+
+
+private: // data
+
+    /**
+     * Access to tactile feedback server, which actually produces 
+     * the feedback.
+     * Own.  
+     */
+    RTactileFeedback iFeedback;
+
+    /**
+     * Access to tactile area registry, which stores feedback areas and is
+     * used for hit testing the incoming pointer events against registry 
+     * content.
+     * Own.  
+     */
+    CTactileAreaRegistry* iAreaRegistry;
+    
+    /**
+     * Flag to indicate whether resolver construction has been attempted
+     * already. We store this information to avoid unnecessary overhead at
+     * boot when something is missing and it just is not possible to 
+     * construct resolver.  
+     */
+    TBool iResolverConstructionAttempted;
+    };
+
+
+#endif // C_TACTILECLICKPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/rom/tactileclickplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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:  This is the IBY file for Tactile Click Plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILECLICKPLUGIN_IBY
+#define TACTILECLICKPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+// =============================================================================
+// Tactile Click Plugin
+// =============================================================================
+file=ABI_DIR\BUILD_DIR\tactileclickplugin.dll SHARED_LIB_DIR\tactileclickplugin.dll
+
+#endif // TACTILECLICKPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/src/tactileclickplugin.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,375 @@
+/*
+* Copyright (c) 2007-2009 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 click maker plugin, which
+*               handles key events at window server process.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32std.h>
+#include <tactilearearegistry.h>
+#include <tactilefeedbacktrace.h>
+
+#include "tactileclickplugin.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactileclickpluginTraces.h"
+#endif
+
+// ======== MEMBER FUNCTIONS ========
+
+CTactileClickPlugin::CTactileClickPlugin()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::ConstructL()
+    {
+    TRACE( "CTactileClickPlugin::ConstructL - Begin" );
+    
+    // Notice that we intentionally don't connect to feedback server here. 
+    // This is  because some players may try to connect to such servers, 
+    // which don't exist yet when click plugin is loaded.
+    iAreaRegistry = CTactileAreaRegistry::NewL();
+    
+    // We need to store ourselves to thead local storage, so that
+    // Anim Dll plugins can access the feedback functionality
+    Dll::SetTls( this );
+
+    TRACE( "CTactileClickPlugin::ConstructL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// We really have to trap ConstructL, because construction of click maker 
+// plug-in must not fail (otherwise WSERV will panic, resulting in KERN 4 and
+// re-boot of whole device).
+// ---------------------------------------------------------------------------
+//
+CTactileClickPlugin* CTactileClickPlugin::NewL()
+    {
+    CTactileClickPlugin* self = new( ELeave ) CTactileClickPlugin;
+    TRAP_IGNORE( self->ConstructL() );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CTactileClickPlugin::~CTactileClickPlugin()
+    {
+    delete iAreaRegistry;
+    iFeedback.Close();
+    Dll::SetTls( NULL );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CClickMaker.
+// No implementation needed
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::KeyEvent( 
+    TEventCode /*aType*/, const TKeyEvent& /*aEvent*/ )
+    {    
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CClickMaker.
+// No implementation needed
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::PointerEvent( const TPointerEvent& /*aEvent*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// From class CClickMaker.
+//
+// Notice that we really have to check iFeedback handle and iAreaRegistry 
+// pointer here, because click maker construction must not fail 
+// (otherwise WSERV will panic) 
+//
+// We handle three types of events here:
+// 
+// 1. Pointer events coming from window server: For these we do hit testing,
+//    and use RTactileFeedback to play feedback accordingly.
+//
+// 2. Window group open events: These ones we pass to area registry for
+//    bookkeeping.
+//
+// 3. Window group close events: These ones we also pass to area registry, so
+//    that it can update its bookkeeping.
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::OtherEvent( TInt aType, TAny* aParam )
+    {
+    // 1. Pointer events 
+    if ( aParam && aType == EEventPointer && iFeedback.Handle() && iAreaRegistry )
+        {
+        TPointerEventData* p = static_cast<TPointerEventData*> ( aParam );
+                 
+        // Extract pointer event from the data given by wserv               
+        TPointerEvent pointerEvent = p->iPointerEvent;
+        
+        // Handle button down and button up events.
+        if ( pointerEvent.iType == TPointerEvent::EButton1Down ||
+             pointerEvent.iType == TPointerEvent::EButton1Up )
+            {
+            OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_PEN_EVENT_1, "e_TACTILE_CLICK_PLUGIN_PEN_EVENT 1");
+            
+            // Adjust position so that it is window -relative
+            pointerEvent.iPosition = ( p->iCurrentPos - p->iWindowOrigin );
+            
+            TInt feedback = 
+                iAreaRegistry->HitTestPointerEvent( 
+                    pointerEvent, 
+                    p->iWindowGroupId,
+                    p->iClientHandle );  
+                
+            // There is extra vibra- and audio information in top two bits of
+            // feedback type.    
+            TBool playVibra( EFalse );
+            TBool playAudio( EFalse );
+            
+            if ( pointerEvent.iType == TPointerEvent::EButton1Down )
+                {
+                playVibra  = ( ( feedback & KTactileVibraBitDown ) != 0);
+                playAudio  = ( ( feedback & KTactileAudioBitDown ) != 0);
+                }
+            else
+                {
+                playVibra  = ( ( feedback & KTactileVibraBitUp ) != 0);
+                playAudio  = ( ( feedback & KTactileAudioBitUp ) != 0);
+                }
+                        
+            // Clear upper two bytes completely
+            feedback &= 0xffff;
+             
+            if ( feedback != ETouchFeedbackNone )    
+                {
+                iFeedback.PlayFeedback( 
+                            static_cast<TTouchLogicalFeedback>( feedback ),
+                            playVibra, 
+                            playAudio );
+                }
+
+            OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_PEN_EVENT_0, "e_TACTILE_CLICK_PLUGIN_PEN_EVENT 0");
+            }
+        }
+    // 2. Window group open events    
+    else if ( aType == EEventGroupWindowOpen && iAreaRegistry )
+        {
+        TGroupWindowOpenData* data = static_cast<TGroupWindowOpenData*>( aParam );
+        
+        iAreaRegistry->HandleWindowGroupCreated( 
+            data->iIdentifier,
+            data->iClient );
+        }
+    // 3. Window group close events.    
+    else if ( aType == EEventGroupWindowClose && iAreaRegistry )
+        {
+        TInt identifier = reinterpret_cast<TInt>( aParam ); 
+        
+        iAreaRegistry->HandleWindowGroupClosed( 
+            identifier );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CClickMaker.
+// This is run when client calls RSoundPlugin::CommandReply -function.
+//
+// Handling of individual commands has been moved to dedicated functions,
+// because data handling requires some effort and relively complex code.
+// This is due to the mistake in CClickMaker API design, as the data is
+// not delivered in the same format as it was passed to RSoundPlugin on
+// client side (client gives data in descriptor, but here the descriptor
+// needs to be re-built from TAny* pointer, and in addition the lenght
+// of data needs to be known based on command id).
+//
+// Leaving here causes RSoundPlugin::CommandReply to return with an error
+// code on client side. It is thus important that we leave in case 
+// command ETactileOpCodeConnect fails, because that way client knows
+// that feedback won't work and does not attempt to do updates in vain.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileClickPlugin::CommandReplyL( TInt aOpcode, TAny* aArgs )
+    {
+    TRACE2( "CTactileClickPlugin::OtherEvent - Begin, opCode = %d", aOpcode );
+    
+    TInt errCode = KErrNone;
+    
+    switch ( aOpcode )
+        {
+        case ETactileOpCodeConnect:
+            HandleConnectL( aArgs );
+            break;
+        case ETactileOpCodeDisconnect:
+            HandleDisconnect( aArgs );
+            break;
+        case ETactileOpCodeImmediateFeedback:
+            errCode = HandleImmediateFeedback( aArgs );
+            break;
+        default:
+            break;
+        }
+       
+    TRACE( "CTactileClickPlugin::OtherEvent - End" );    
+    
+    return errCode;    
+    };
+
+// ---------------------------------------------------------------------------
+// From class MTactileFeedbackServer
+//
+// This function handles instant feedback requests originating inside
+// window server (i.e. From Anim Dll plugins).
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::InstantFeedback( TTouchLogicalFeedback aType )
+    {
+    TRACE( "CTactileClickPlugin::InstantFeedback - Begin" );    
+    
+    if ( iFeedback.Handle() )
+        {
+        OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_1, "e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API 1");
+        
+        iFeedback.PlayFeedback( aType, ETrue, ETrue );
+        
+        OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_0, "e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API 0");
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handling of connection requests from clients.
+//
+// #1 Try to connect to Tactile Feedback server in case it is not yet created,
+//    and creation has already been attempted (this is an optimization in case
+//    there is something wrong in the device so that construction cannot 
+//    succeed).
+// 
+// #2 Convert the data and pass connect .command to Area Registry
+//
+// #3 In case area registry or server connection does not exist, then leave 
+//    so that client knows that feedback is not in use.
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::HandleConnectL( TAny* aArgs )
+    {
+    // #1 Try to connct to RTactileFeedback first (if not yet connected)
+    if ( !iFeedback.Handle() )
+        {
+        // Try to connect to Tactile Feedback server now when first client 
+        // has connected.
+        User::LeaveIfError( iFeedback.Connect() );
+        }
+    
+    // #2
+    if ( aArgs && iAreaRegistry && iFeedback.Handle() )
+        {
+        TInt* tmpInt = reinterpret_cast<TInt*>( aArgs );
+
+        TInt dataSize = sizeof( TTactileFeedbackConnectData );
+        
+        TPtrC8 tmpConnectData( reinterpret_cast<TUint8*>( tmpInt ), dataSize );
+        
+        TTactileFeedbackConnectData clientData;
+        
+        TPckg<TTactileFeedbackConnectData> dataBuf (clientData);
+        
+        dataBuf.Copy( tmpConnectData );
+        
+        iAreaRegistry->HandleConnectL( clientData );
+        }
+    else
+        {
+        // #3 Fail connection if everything is not in place. This way client
+        // will not waste effort doing updates in vain.
+        User::Leave( KErrGeneral );
+        }
+    }
+        
+// ---------------------------------------------------------------------------
+// Handle disconnection requests from clients.
+//
+// Here we just convert the data and pass command to Area Registry
+// ---------------------------------------------------------------------------
+//
+void CTactileClickPlugin::HandleDisconnect( TAny* aArgs )
+    {  
+    if ( aArgs && iAreaRegistry )
+        {
+        TInt* tmpInt = reinterpret_cast<TInt*>( aArgs );
+
+        TInt dataSize = sizeof( TTactileFeedbackDisconnectData );
+        
+        TPtrC8 tmpDisconnectData( reinterpret_cast<TUint8*>( tmpInt ), dataSize );
+        
+        TTactileFeedbackDisconnectData clientData;
+        
+        TPckg<TTactileFeedbackDisconnectData> dataBuf (clientData);
+        
+        dataBuf.Copy( tmpDisconnectData );
+        
+        iAreaRegistry->HandleDisconnect( clientData );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handling of immediate feedback, that originates from client application
+// (See InstantFeedback function for handling of feedback that originates
+//  from inside window server)
+//
+// We don't need to do any state checks (call in progress) etc. here, 
+// because Feedback Server will do that anyway. Notice that we rely
+// on the client API so that it does not send direct feedback in case client
+// application has disabled feedback from itself.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileClickPlugin::HandleImmediateFeedback( TAny* aArgs )
+    {
+    if ( aArgs && iFeedback.Handle() )
+        {
+        TTactileFeedbackImmediateData* data = 
+            reinterpret_cast<TTactileFeedbackImmediateData*>( aArgs );
+        
+        OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_1, "e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API 1");
+        
+       iFeedback.PlayFeedback( data->iFeedbackType, 
+                                      data->iPlayVibra, 
+                                      data->iPlayAudio );  
+
+        OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_0, "e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API 0");
+        }
+    
+    return KErrNone;
+    }
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Function with this signature needs to be the first exported function
+// in click maker plugin DLLs.
+//
+// Constructs and returns an instance to tactile click maker plugin.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CClickMaker* CreateClickMakerL()
+    {
+    TRACE( "CreateClickMakerL" );    
+    return CTactileClickPlugin::NewL();
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/src/tactilefeedbackserver.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:  Implementation of the method for accessing 
+*                MTactileFeedbackServer -instance
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <tactilefeedbacktrace.h>
+#include "tactileclickplugin.h"
+
+#include "tactilefeedbackserver.h"
+
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Here we really need to do the casting to CTactileClickPlugin, and NOT
+// to MTactileFeedbackServer. It seems to be that static_cast does not work
+// in case we try to cast a pointer to some base class, which is not the 
+// first one in the inheritance list.
+// ---------------------------------------------------------------------------
+EXPORT_C MTactileFeedbackServer* MTactileFeedbackServer::Instance()
+    {
+    TRACE("MTactileFeedbackServer::Instance");
+    
+    CTactileClickPlugin* clickPlugin = NULL;
+    
+    TAny* tmpPtr = Dll::Tls();
+    
+    if ( tmpPtr )
+        {
+        clickPlugin = static_cast<CTactileClickPlugin*>( tmpPtr );
+        }
+    
+    return clickPlugin;
+    }
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,8 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_0=0x6
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_1=0x5
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_0=0x4
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_1=0x3
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_PEN_EVENT_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLICK_PLUGIN_PEN_EVENT_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/traces/tactileclickpluginTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,20 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILECLICKPLUGINTRACES_H__
+#define __TACTILECLICKPLUGINTRACES_H__
+
+#define KOstTraceComponentID 0x2000b493
+
+#define TACTILE_CLICK_PLUGIN_PEN_EVENT_1 0x400001
+#define TACTILE_CLICK_PLUGIN_PEN_EVENT_0 0x400002
+#define TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_1 0x400003
+#define TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_0 0x400004
+#define TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_1 0x400005
+#define TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_0 0x400006
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactileclickplugin/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,74 @@
+<model>
+  <id>536917139</id>
+  <name>tactileclickplugin</name>
+  <group>
+    <id>64</id>
+    <name>TACTILE_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_PEN_EVENT 1</text>
+      <id>1</id>
+      <name>TACTILE_CLICK_PLUGIN_PEN_EVENT_1</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>134</line>
+        <class>CTactileClickPlugin</class>
+        <function>OtherEvent</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_PEN_EVENT 0</text>
+      <id>2</id>
+      <name>TACTILE_CLICK_PLUGIN_PEN_EVENT_0</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>161</line>
+        <class>CTactileClickPlugin</class>
+        <function>OtherEvent</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API 1</text>
+      <id>3</id>
+      <name>TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_1</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>242</line>
+        <class>CTactileClickPlugin</class>
+        <function>InstantFeedback</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API 0</text>
+      <id>4</id>
+      <name>TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_SERVER_API_0</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>246</line>
+        <class>CTactileClickPlugin</class>
+        <function>InstantFeedback</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API 1</text>
+      <id>5</id>
+      <name>TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_1</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>343</line>
+        <class>CTactileClickPlugin</class>
+        <function>HandleImmediateFeedback</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API 0</text>
+      <id>6</id>
+      <name>TACTILE_CLICK_PLUGIN_INSTANT_FEEDBACK_CLIENT_API_0</name>
+      <location>
+        <file>../src/tactileclickplugin.cpp</file>
+        <line>349</line>
+        <class>CTactileClickPlugin</class>
+        <function>HandleImmediateFeedback</function>
+      </location>
+    </trace>
+  </group>
+</model>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/bwins/touchfeedbacku.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,12 @@
+EXPORTS
+	?CreateInstanceL@MTouchFeedback@@SAPAV1@XZ @ 1 NONAME ; class MTouchFeedback * MTouchFeedback::CreateInstanceL(void)
+	?DestroyInstance@MTouchFeedback@@SAXXZ @ 2 NONAME ; void MTouchFeedback::DestroyInstance(void)
+	?Instance@MTouchFeedback@@SAPAV1@XZ @ 3 NONAME ; class MTouchFeedback * MTouchFeedback::Instance(void)
+	?NewL@CTouchFeedbackAdaptation@@SAPAV1@XZ @ 4 NONAME ; class CTouchFeedbackAdaptation * CTouchFeedbackAdaptation::NewL(void)
+	?ControlVisibilityChanged@CTouchFeedbackAdaptation@@QAEXPBVCCoeControl@@@Z @ 5 NONAME ; void CTouchFeedbackAdaptation::ControlVisibilityChanged(class CCoeControl const *)
+	?LayoutChanged@CTouchFeedbackAdaptation@@QAEXXZ @ 6 NONAME ; void CTouchFeedbackAdaptation::LayoutChanged(void)
+	?AddFeedback@CFeedbackSpec@@QAEHW4TTouchEventType@@W4TTouchLogicalFeedback@@@Z @ 7 NONAME ; int CFeedbackSpec::AddFeedback(enum TTouchEventType, enum TTouchLogicalFeedback)
+	?GetFeedbackSpec@CFeedbackSpec@@QAEXAAV?$RArray@UTTactileFbItem@@@@@Z @ 8 NONAME ; void CFeedbackSpec::GetFeedbackSpec(class RArray<struct TTactileFbItem> &)
+	?New@CFeedbackSpec@@SAPAV1@XZ @ 9 NONAME ; class CFeedbackSpec * CFeedbackSpec::New(void)
+	?AddFeedback@CFeedbackSpec@@QAEHW4TTouchEventType@@W4TTouchLogicalFeedback@@W4TTouchFeedbackType@@@Z @ 10 NONAME ; int CFeedbackSpec::AddFeedback(enum TTouchEventType, enum TTouchLogicalFeedback, enum TTouchFeedbackType)
+
Binary file tactilefeedback/tactilefeedbackclient/cenrep/2000B494.txt has changed
Binary file tactilefeedback/tactilefeedbackclient/conf/tactilefeedback.confml has changed
Binary file tactilefeedback/tactilefeedbackclient/conf/tactilefeedback_2000B494.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/eabi/touchfeedbacku.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,15 @@
+EXPORTS
+	_ZN14MTouchFeedback15CreateInstanceLEv @ 1 NONAME
+	_ZN14MTouchFeedback15DestroyInstanceEv @ 2 NONAME
+	_ZN14MTouchFeedback8InstanceEv @ 3 NONAME
+	_ZN24CTouchFeedbackAdaptation4NewLEv @ 4 NONAME
+	_ZTI24CTouchFeedbackAdaptation @ 5 NONAME ; #<TI>#
+	_ZTV24CTouchFeedbackAdaptation @ 6 NONAME ; #<VT>#
+	_ZN24CTouchFeedbackAdaptation24ControlVisibilityChangedEPK11CCoeControl @ 7 NONAME
+	_ZN24CTouchFeedbackAdaptation13LayoutChangedEv @ 8 NONAME
+	_ZN13CFeedbackSpec11AddFeedbackE15TTouchEventType21TTouchLogicalFeedback @ 9 NONAME
+	_ZN13CFeedbackSpec3NewEv @ 10 NONAME
+	_ZTI13CFeedbackSpec @ 11 NONAME ; #<TI>#
+	_ZTV13CFeedbackSpec @ 12 NONAME ; #<VT>#
+	_ZN13CFeedbackSpec11AddFeedbackE15TTouchEventType21TTouchLogicalFeedback18TTouchFeedbackType @ 13 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:  Build information file for Tactile Feedback Client API
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// Generic configuration interface for component cenrep settings  
+../conf/tactilefeedback.confml                  APP_LAYER_CONFML(tactilefeedback.confml)
+../conf/tactilefeedback_2000B494.crml           APP_LAYER_CRML(tactilefeedback_2000B494.crml)
+
+
+PRJ_MMPFILES
+touchfeedback.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/group/touchfeedback.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* 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:  Project definition file for Touch Feedback Client API 
+*                implementation.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  touchfeedback.dll
+TARGETTYPE              DLL
+UID                     0x1000008d 0x2000B491
+
+CAPABILITY              CAP_GENERAL_DLL 
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  touchfeedbackadaptation.cpp
+SOURCE                  touchfeedback.cpp
+SOURCE                  touchfeedbackimpl.cpp
+SOURCE                  touchfeedbackregistry.cpp
+SOURCE                  touchfeedbackclient.cpp
+SOURCE                  touchfeedbackclientpanic.cpp
+
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SYSTEMINCLUDE           ../../inc
+
+LIBRARY                 euser.lib
+LIBRARY                 eikcore.lib
+LIBRARY                 cone.lib
+LIBRARY                 avkon.lib
+LIBRARY                 ws32.lib      // RSoundPlugin
+LIBRARY                 featmgr.lib   // Feature Manager
+LIBRARY                 tactilefeedbackresolver.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/inc/touchfeedbackclient.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,283 @@
+/*
+* 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:  Communication from Client API to Tactile Area Registry.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef C_TOUCHFEEDBACKCLIENT_H
+#define C_TOUCHFEEDBACKCLIENT_H
+
+#include <e32std.h>
+#include <w32std.h>
+#include <e32base.h>
+#include <coemain.h>
+#include <tactilefeedback.h>
+
+#include "touchlogicalfeedback.h"
+
+class CTouchFeedbackImpl;
+
+/**
+ *  The class for sharing area registry with the window server.
+ *
+ *  @lib touchfeedback.lib
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTouchFeedbackClient ): 
+        public CBase
+    {
+public:
+    /**
+     * Instantiation method.
+     *
+     * @since S60 5.0
+     * @return New CTouchFeedbackClient instance.
+     */
+    static CTouchFeedbackClient* NewL( CTouchFeedbackImpl& aFeedback );
+
+    /**
+     * Destructor.
+     * @since S60 5.0
+     */
+    virtual ~CTouchFeedbackClient();
+        
+    /**
+     * Should be called whenever registry has changed.
+     *
+     * Causes starting of a CIdle object, so that registry updates are
+     * flushed to server side as soon as possible.
+     * @since S60 5.0     
+     */
+    void RegistryChanged( );
+
+    /**
+     * Use to produce direct feedback immediately.
+     *
+     * @since S60 5.0     
+     * @param aType    - The logical feedback type.
+     * @param aVibraOn - If ETrue then vibra feedback shall be played
+     *                   (if enabled in device).
+     * @param aAudioOn - If ETrue then audio feedback shall be played
+     *                   (if enabled in device).
+     */
+    void ImmediateFeedback( TTouchLogicalFeedback aType, 
+                            TBool aVibraOn, 
+                            TBool aAudioOn );
+
+    /**
+     * Use to flush registry updates immediately.
+     * @since S60 5.0     
+     */
+    void FlushUpdates();
+    
+    /**
+     * Starts continuous feedback or just restarts the timeout timer if 
+     * feedback is already started. This function can also be used to
+     * modify the intensity of ongoing continuous feedback if timeout 
+     * and repeated start calls are used. 
+     *
+     * @since S60 5.2     
+     * @param aClientHandle - Handle of a client. Handle is stored to 
+     *                        prevent other clients to stop or modify 
+     *                        playing feedback.
+     * @param aType         - Type of continuous feedback.
+     *                   
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range is 0-100%.
+     * @param aTimeout      - Timeout value, which is used to automatically 
+     *                        stop continuous feedback if there's no new 
+     *                        start call within the timeout time. 
+     */    
+    void StartFeedback( TUint32 aClientHandle,
+                        TTouchContinuousFeedback aType,
+                        TInt aIntensity,
+                        TTimeIntervalMicroSeconds32 aTimeout );
+                        
+    /**
+     * Modifies the intensity of continuous feedback.
+     *
+     * @since S60 5.2     
+     * @param aClientHandle - Handle of a client to check if caller started
+     *                        the playing continuous feedback. 
+     * @param aIntensity    - New intensity of continuous feedback. Value
+     *                        range is 0-100%.
+     */                            
+    void ModifyFeedback( TUint32 aClientHandle,
+                         TInt aIntensity );
+    
+    /**
+     * Stops the continuous feedback.
+     *
+     * @since S60 5.2     
+     * @param aClientHandle - Handle of a client to check if caller started
+     *                        the playing continuous feedback. 
+     */                                
+    void StopFeedback( TUint32 aClientHandle );  
+
+    /**
+     * Enables or disables audio or/and vibra feedback in whole device.
+     * @param aFeedbackType  - Feedback types to be enabled/disabled 
+     *                         defined as a bitmask combination of 
+     *                         enumeration items from TTouchFeedbackType.
+     *
+     * @since S60 5.2     
+     * @return KErrNone, or one of standard Symbian OS error codes if
+     *         enabling/disabling fails.
+     *         KErrPermissionDenied - ECapabilityWriteDeviceData required
+     *                                for using this function.
+     */    
+    TInt SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType );  
+
+    /**
+     * Used to check enabled feedback types for the device.
+     *
+     * @since S60 5.2
+     * @return TTouchFeedbackType containing enabled feedback types 
+     *         as a bitmask.
+     */    
+    TTouchFeedbackType FeedbackEnabledForDevice();
+
+private:
+
+    /**
+     * Start timeout timer for continuous feedback.
+     */
+    void StartFeedbackTimer( TTimeIntervalMicroSeconds32 aTimeout );
+    
+    /**
+     * Stops continuous feedback and clears timeout timer and client handle.
+     * Called by timeout callback function.
+     */    
+    void StopFeedbackByTimeout();
+    
+    /**
+     * Timeout callback function.
+     */
+     static TInt StopFeedbackCallback( TAny* aThis );
+    
+private:
+
+    /**
+     * Default constructor.
+     */
+    CTouchFeedbackClient( CTouchFeedbackImpl& aFeedback );
+
+    /**
+     * 2nd phase constructor.
+     */    
+    void ConstructL();
+
+    /**
+     * Callback for CIdle. When this function is called, it is time to update
+     * local registry content to shared memory chunk.
+     *
+     * Depending of whether feedback is actually enabled or disabled for
+     * this application, either UpdateRegistryToChunkL or ClearWholeChunkL
+     * -function shall be called.
+     *
+     * @param aPtr - Pointer to this class instance.
+     */
+    static TInt IdleCallbackL( TAny* aPtr );
+
+    /**
+     * Updates whole area registry content to shared chunk. Called from
+     * IdleCallbackL when feedback is enabled for this application.
+     */
+    void UpdateRegistryToChunkL();
+
+    /**
+     * Clears whole shared chunk so that there are no feedback areas at
+     * all. Called from IdleCallbackL when feedback is disabled for this
+     * application.
+     */
+    void ClearWholeChunkL();
+
+    /**
+     * This is a cleanup operation that releases a semaphore in case
+     * a leave occurs while we have called Wait on the semaphore. 
+     * Failing to release the semaphore (by calling "Signal" -function
+     * on it) would lead to deadlock in the system.
+     * @param aPtr - Pointer to RSemaphore.
+     */
+    static void CleanupSemaphore( TAny* aPtr );
+
+private: // data
+
+    /**
+     * Connection to window server click maker plugin.
+     */
+    RSoundPlugIn iClickPlugin;
+    
+    /**
+     * Area registry in shared chunk between this process and
+     * window server process.
+     */
+    RChunk iChunk;
+    
+    /**
+     * Mutual exlusion with window server and other clients.
+     */
+    RSemaphore iSemaphore;
+    
+    /**
+     * For knowing if we'll need to disconnect when this application
+     * is closed.
+     */    
+    TBool iConnected;
+    
+    /**
+     * For doing registry update as soon as possible, but not
+     * immediately.
+     * Own.  
+     */
+    CIdle* iIdle;
+    
+    /**
+     * Access to local area registry
+     * Not own.  
+     */
+    CTouchFeedbackImpl& iFeedback;
+    
+    /**
+     * Client interface to tactile feedback server.
+     * Own.
+     */
+    RTactileFeedback iFbClient;
+    
+    /**
+     * Timer for continuous feedback timeout.
+     * Own.
+     */
+    CPeriodic* iFeedbackTimer;
+    
+    /**
+     * Client handle for checking continuous is not modified or stopped by
+     * other clients that the one, which started it.
+     */
+    TUint32    iClientHandle;
+    
+    /**
+     * Previous intensity value of an ongoing continuous feedback to prevent
+     * unnecessary modify calls if there's no change in intensity. Also
+     * new start call for ongoing feedback modifies the intensity if value
+     * was changed.
+     */
+    TInt       iPreviousIntensity;
+    };
+
+
+#endif //  C_TOUCHFEEDBACKCLIENT_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/inc/touchfeedbackclientpanic.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:  Panic codes for Tactile Feedback Client.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef T_TOUCHFEEDBACKCLIENTPANIC_H
+#define T_TOUCHFEEDBACKCLIENTPANIC_H
+
+#include <e32def.h>
+
+
+// DATA TYPES
+enum TTouchFeedbackClientPanic
+    {
+    // Invalid array index passed to some internal function
+    ETouchClientPanicArrayAccess = 0
+    };
+
+// FUNCTION PROTOTYPES
+GLDEF_C void Panic( TTouchFeedbackClientPanic aPanic );
+
+
+#endif // T_TOUCHFEEDBACKCLIENTPANIC_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/inc/touchfeedbackimpl.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,514 @@
+/*
+* 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:  This class implements Tactile Feedback Client API
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef C_TOUCHFEEDBACKIMPL_H
+#define C_TOUCHFEEDBACKIMPL_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <coemain.h>
+
+#include "touchlogicalfeedback.h"
+#include "touchfeedback.h"
+
+
+class CTouchFeedbackRegistry;
+class CTouchFeedbackClient;
+
+
+/**
+ * This structure stores one index / area id pair.
+ * This kind of entries are stored for each control, which have
+ * feedback areas defined.
+ */
+struct TAreaIndexEntry
+    {
+    TUint32 iIndex;
+    TInt iAreaId;
+    };
+
+/**
+ * This structure stores one control's information on client-side.
+ * This information includes control's visibility, dimming and feedback
+ * disabled information, as well as array of the feedback area
+ * identifiers.
+ *
+ * Notice that the client handle is stored for two reasons: Firstly
+ * it is an optimization to store it as this way we can avoid unnecessary
+ * client-server transaction (window server client-side API does not 
+ * cache the handle). Secondly some times control's window may have been
+ * deleted before control removes it's feedback areas. In these situations
+ * we even wouldn't be able to use the control for getting the handle 
+ * anymore.
+ */
+struct TControlCacheEntry
+    {
+    const CCoeControl* iControl;
+    TUint32 iClientHandle;
+    TBool iVibraDisabled;
+    TBool iAudioDisabled;
+    TBool iVisible;
+    TBool iDimmed;
+    RArray<TAreaIndexEntry> iAreaArray;
+    };
+
+/**
+ *  This class implements the Client API that is provided for UI Controls
+ *  and applications.
+ *
+ *  The implemented interface is defined by MTouchFeedback -class.
+ *
+ *  This class' main task is to have a bookkeeping of all the controls
+ *  that have feedback areas defined. Services such as automatic disabling
+ *  of the feedback areas of dimmed or invisible controls are implemented
+ *  here.
+ *
+ *  @lib touchfeedback.lib
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTouchFeedbackImpl ): 
+    public CBase,
+    public MTouchFeedback
+    {
+public:
+    /**
+     * Instantiation method.
+     *
+     * @since S60 5.0
+     * @return New CTouchFeedbackImpl instance.
+     */
+    static CTouchFeedbackImpl* New();
+
+    /**
+     * Destructor.
+     * @since S60 5.0
+     */
+    virtual ~CTouchFeedbackImpl();
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TBool TouchFeedbackSupported();
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void SetFeedbackEnabledForThisApp( TBool aEnabled );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    TBool FeedbackEnabledForThisApp(); 
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TInt SetFeedbackArea( const CCoeControl* aControl, 
+                          TUint32 aIndex,
+                          TRect aRect, 
+                          TTouchLogicalFeedback aFeedbackType, 
+                          TTouchEventType aEventType );
+
+    
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void RemoveFeedbackArea( const CCoeControl* aControl, TUint32 aIndex );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void RemoveFeedbackForControl( const CCoeControl* aControl );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void ChangeFeedbackArea( const CCoeControl* aControl, 
+                             TUint32 aIndex, 
+                             TRect aNewRect );
+     
+    /**
+     * @see MTouchFeedback.
+     */
+    void ChangeFeedbackType( const CCoeControl* aControl, 
+                             TUint32 aIndex, 
+                             TTouchLogicalFeedback aNewType );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void MoveFeedbackAreaToFirstPriority( const CCoeControl* aControl, 
+                                          TUint32 aIndex );
+         
+    /**
+     * @see MTouchFeedback.
+     */
+    void FlushRegistryUpdates( );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void InstantFeedback( TTouchLogicalFeedback aType );
+        
+    /**
+     * @see MTouchFeedback.
+     */
+    void InstantFeedback( const CCoeControl* aControl,
+                          TTouchLogicalFeedback aType ); 
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TBool ControlHasFeedback( const CCoeControl* aControl );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    TBool ControlHasFeedback( const CCoeControl* aControl, TUint32 aIndex );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void EnableFeedbackForControl( 
+        const CCoeControl* aControl, TBool aEnable );       
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void EnableFeedbackForControl( const CCoeControl* aControl,
+                                   TBool aEnableVibra,
+                                   TBool aEnableAudio );       
+
+    /**
+     * @see MTouchFeedback.
+     */
+    virtual void SetFeedbackEnabledForThisApp( TBool aVibraEnabled,
+                                               TBool aAudioEnabled );
+       
+public:    
+    /**
+     * This function provides a way for getting the registry content.
+     *
+     * Used by CTouchFeedbackClient for listing all the registry
+     * areas, so that they can be put to shared memory.
+     *
+     * @since S60 5.0
+     */
+    RPointerArray<CTouchFeedbackRegistry>* RegistryArray();
+    
+    /**
+     * This function can be used for getting the number of areas in the
+     * registry.
+     *
+     * @since S60 5.0
+     * @param aAreaCount - The total number of areas in the registry.
+     * @param aWindowCount - Number of different windows is returned here.
+     */
+    void GetAreaCount( TInt& aAreaCount, TInt& aWindowCount );
+    
+    /**
+     * This should be called  for informing
+     * that given control's state (i.e. visiblity or dimming status)
+     * has been changed. This way Tactile FW knows to disable or enable
+     * the feedback for that control again.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control, which visiblity 
+     *                   or dimming status has changed.
+     */
+    void ControlVisibilityChanged( const CCoeControl* aControl );
+  
+    /**
+     * This should be called when the layout is changed.
+     *
+     * @since S60 5.0     
+     * The motivation is to disable this application's feedback areas
+     * for this application in case pen usage is not supported in current 
+     * layout.
+     */
+    void LayoutChanged();
+
+public: // new API functions since 5.2, defined in MTouchFeedback
+    /**
+     * @see MTouchFeedback.
+     */
+    TBool FeedbackEnabledForThisApp( TTouchFeedbackType aFeedbackType );
+    
+    /**
+     * @see MTouchFeedback.
+     */
+    void StartFeedback( const CCoeControl* aControl,
+                        TTouchContinuousFeedback aType,
+                        const TPointerEvent* aPointerEvent,
+                        TInt aIntensity,
+                        TTimeIntervalMicroSeconds32 aTimeout );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void ModifyFeedback( const CCoeControl* aControl,
+                         TInt aIntensity );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void StopFeedback( const CCoeControl* aControl );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TInt SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TTouchFeedbackType FeedbackEnabledForDevice();
+
+    /**
+     * @see MTouchFeedback.
+     */
+    void InstantFeedback( const CCoeControl* aControl,
+                          TTouchLogicalFeedback aType,
+                          const TPointerEvent& aPointerEvent );
+
+    /**
+     * @see MTouchFeedback.
+     */
+    TInt SetFeedbackArea( const CCoeControl* aControl, 
+                          TUint32 aIndex,
+                          TRect aRect, 
+                          CFeedbackSpec* aFeedbackSpec );
+
+    /**
+     * @see MTouchFeedback.
+     */                          
+    void InstantFeedback( const CCoeControl* aControl,
+                          TTouchLogicalFeedback aType,
+                          TTouchFeedbackType aFeedbackType,
+                          const TPointerEvent& aPointerEvent );
+      
+private:
+    /**
+     * Constructor.
+     */
+    CTouchFeedbackImpl();
+
+    /**
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+    
+    /**
+     * Actual functionality of setting a feedback area.
+     *
+     * The API function SetFeedbackArea does the basic parameter checks and
+     * runs this function under trap harness so that we can leave here.
+     *
+     * @see MTouchFeedback.
+     */
+    void DoSetFeedbackAreaL( const CCoeControl* aControl, 
+                             TUint32 aIndex,
+                             TRect aRect, 
+                             CFeedbackSpec* aSpec, 
+                             TUint32 aClientHandle );
+    
+    
+    /**
+     * Finds window from the registry if it exists.
+     *
+     * Returns an index to iResolverArray, or KErrNotFound if
+     * there is no entry for the window yet.
+     *
+     * @since S60 5.0
+     * @param aWindowHandle - The window id to find from the array
+     * @return KErrNotFound if an area with given ID is not found from the registry.
+     */
+    TInt FindWindowFromRegistry( TUint aWindowHandle );
+    
+    /**
+     * Generates a unique identifier inside this application process.
+     *
+     * This is the id that is used to distinguish the area registry
+     * entries from each other.
+     *
+     * @since S60 5.0
+     * @return Unique identifier.
+     */
+    TUint GenerateUniqueIdL();
+    
+    /**
+     * Can be used to check whether feedback area with given id exists or not.
+     *
+     * This is as helper function when generating unique identifiers for
+     * new feedback areas.
+     *
+     * @since S60 5.0
+     * @return ETrue if feedback area with given identifier exists already.
+     *         EFalse otherwise.
+     */
+    TBool FeedbackAreaExists( TUint aAreaId );
+    
+    /**
+     * Returns the client handle of the window, where given control
+     * is located. Client handle is either directly casted from first
+     * window-owning control's address, or then asked from window 
+     * server.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control.
+     * @return Client handle of the window where given control is.
+     */
+    TUint32 ClientHandle( const CCoeControl* aControl );
+        
+    /**
+     * Finds given control from the cache.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control, which is searched
+     * @return The position in cache array, where searhed entry is found,
+     *         or KErrNotFound if it is not found.
+     */
+    TInt FindControlFromCache( const CCoeControl* aControl );
+    
+        
+    /**
+     * Finds specific feedback area from control cache.
+     *
+     * @since S60 5.0
+     * @param aControl - Pointer to the control.
+     * @param aIndex   - Area index (given by client)
+     * @param aCacheIndex  - If control is found, then index to control cache is
+     *                       returned here.
+     * @param aAreaIndex   - If area is found, then index to area array in
+     *                       corresponding control cache entry is returned
+     *                       here.
+     */
+    void FindAreaFromCache( const CCoeControl* aControl, 
+                            TUint32 aIndex, 
+                            TInt& aCacheIndex, 
+                            TInt& aAreaIndex );    
+          
+                            
+    /**
+     * Removes control with given index number from the control cache.
+     *
+     * @since S60 5.0
+     * @param aControlIndex - Index number of the control in the control
+     *                        array.
+     */
+    void RemoveControlFromCache( TInt aControlIndex );       
+    
+    /**
+     * Can be used for querying, whether control's areas should be active
+     * according to it's recorced dimming-, visibility-, and feedback
+     * disabling status.
+     *
+     * @since S60 5.0
+     * @param aControlIndex - Index number of the control in the control
+     *                        array.
+     * @return ETrue if control's areas should be active, EFalse otherwise.
+     */
+    TBool ControlsAreasActive( TInt aControlIndex );  
+    
+    /**
+     * Can be used for disabling or enabling control's feedback areas
+     * in the registry.
+     *
+     * This function only modifies the registry, and not the control cache.
+     *
+     * @since S60 5.0
+     * @param aControlIndex - Index number of the control in the control
+     *                        array.
+     * @param aEnableVibra   - New disable / enable status for vibra
+     * @param aEnableAudio   - New disable / enable status for audio
+     * @param aVisible       - Visibility status of the control. If
+     *                         control is invisible, it's feedback areas
+     *                         will be temporarily removed from the 
+     *                         registry.
+     */
+    void DoEnableControlsAreasInRegistry( 
+        TInt aControlIndex,
+        TBool aEnableVibra, 
+        TBool aEnableAudio,
+        TBool aVisible );               
+    
+private: // data
+
+    /**
+     * Array of area registries. There is one entry for each window.
+     * Own.
+     */
+    RPointerArray<CTouchFeedbackRegistry> iRegistryArray;
+
+    /**
+     * The id what was given to the area that was last added to the array.
+     */
+    TUint iCurrentId;
+    
+    /**
+     * We maintain a bookkeeping to know in case the currently used 
+     * feedback area id has already reached its maximum value at 
+     * least once. This way we save some time for e.g. during boot-up
+     * when plenty of areas are added to the registry.
+     */
+    TBool iCurrentIdCounterRotated;
+    
+    /**
+     * Pointer to client, used to inform it about registry changes.
+     * Own.
+     */
+    CTouchFeedbackClient* iClient;
+    
+    /**
+     * Array of controls and their feedback area ids. This way users of the
+     * API don't have to store the ids themselves.
+     */    
+    RArray<TControlCacheEntry> iControlCache;
+
+    /**
+     * Used to store the status of audio feedback for this application.
+     */
+    TBool iAudioEnabledForThisApp;
+    
+    /**
+     * Used to store the status of vibra feedback for this application.
+     */
+    TBool iVibraEnabledForThisApp;
+    
+    /**
+     * For bookkeeping about feedback areas. We need this information for
+     * recognizing the situation when we cannot add another area to the
+     * registry anymore (for e.g. due to Id generation problem).
+     */    
+    TInt iNbOfFeedbackAreas;
+    
+    /**
+     * For bookkeeping wheater pen is enabled in current layout or not. This
+     * way we can optimize layout change handling so that we only react
+     * to changes from non-pen enabled to pen enabled layout and vice versa,
+     * but do nothing when layout changes without effect to pen support.
+     */    
+    TBool iPenEnabled;
+    };
+
+
+
+#endif //  C_TOUCHFEEDBACKIMPL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/inc/touchfeedbackregistry.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,210 @@
+/*
+* 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:  Area registry for one window.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TOUCHFEEDBACKREGISTRY_H
+#define C_TOUCHFEEDBACKREGISTRY_H
+
+
+
+#include <e32std.h>
+#include <e32base.h>
+#include <coemain.h>
+
+#include "touchlogicalfeedback.h"
+
+
+/**
+ *  Area registry entry
+ *
+ *  There is one entry like this for each area that has been
+ *  added to the registry.
+ */
+struct TFeedbackEntry
+    {
+    TUint  iId;
+    TRect iRect;
+    TTouchLogicalFeedback iFeedbackTypeDown;
+    TTouchFeedbackType iFeedbackDown;
+    TTouchLogicalFeedback iFeedbackTypeUp;
+    TTouchFeedbackType iFeedbackUp;
+    TTouchEventType iEventType;
+    TBool iVibraEnabled;
+    TBool iAudioEnabled;
+    TBool iVisible;
+    };
+
+/**
+ *  Registry entry for one window.
+ *
+ *  This class maintains area registry for one window. It offers
+ *  services for adding, removing and mofidying areas in the
+ *  registry, as well as resolving whether a pointer event
+ *  hit any area on the registry or not.
+ *
+ *  @lib N/A (no exported functions)
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTouchFeedbackRegistry ): 
+        public CBase
+    {
+
+
+public:
+
+    /**
+     * Instantiation mehtod
+     *
+     * @since S60 5.0
+     * @param aWindowHandle - The Id of the window, where this registry is
+     *                        associated.
+     */
+    static CTouchFeedbackRegistry* NewL( TUint aWindowHandle );
+
+
+    virtual ~CTouchFeedbackRegistry();
+
+    /**
+     * Adds feedback area to registry.
+     *
+     * @param aRect         - The feedback area rectangle
+     * @param aFeedbackType - The logical feedback type given
+     * @param aEventType    - The pointer event type that triggers
+     *                        the feedback
+     * @param aId           - The unique identifier for this registry area
+     * @param aVibraEnabled - If ETrue is given, then vibra feedback is
+     *                        enabled for the added area.
+     * @param aAudioEnabled - If ETrue is given, then audio feedback is
+     *                        enabled for the added area.
+     * @param aVisible      - If EFalse is given, then the whole area will
+     *                        not be put to the registry. The information is
+     *                        still stored on client-side so that area can
+     *                        be added in case control becomes visible.
+     */
+    void AddFeedbackAreaL( 
+        TRect aRect, 
+        TTouchLogicalFeedback aFeedbackTypeDown, 
+        TTouchFeedbackType aFeedbackDown,
+        TTouchLogicalFeedback aFeedbackTypeUp, 
+        TTouchFeedbackType aFeedbackUp,
+        TTouchEventType aEventType,
+        TUint aId,
+        TBool aVibraEnabled,
+        TBool aAudioEnabled,
+        TBool aVisible );
+    
+    /**
+     * Removes feedback area from the registry.
+     *
+     * @param aId - Identifier of the feedback area to be removed.
+     */
+    void RemoveFeedbackArea( TUint aId );
+
+    /**
+     * Changes feedback area in the registry.
+     *
+     * @param aId      - Identifier of the feedback area to be changed.
+     * @param aNewRect - New feedback area rectangle.
+     * @return ETrue the given area was found, and if it's feedback type
+     *                   really changed.
+     *               (in practice this means that changes need to be
+     *                updated to server).
+     *         EFalse otherwise.
+     */
+    TBool ChangeFeedbackArea( 
+        TUint aId, 
+        TRect aNewRect );
+    
+    /**
+     * Changes feedback type for given area in the registry.
+     *
+     * @param aId              - Identifier of the feedback area to be changed.
+     * @param aNewFeedbackTypeDown - New logical feedback type for down event.
+     * @param aNewFeedbackTypeUp   - New logical feedback type for up event.
+     * @return ETrue the given area was found, and if it really changed.
+     *               (in practice this means that changes need to be
+     *                updated to server).
+     *         EFalse otherwise.
+     */
+    TBool ChangeFeedbackType( 
+        TUint aId, 
+        TTouchLogicalFeedback aNewFeedbackTypeDown,
+        TTouchLogicalFeedback aNewFeedbackTypeUp );
+      
+    /**
+     * Makes the given feedback area a first priority area in this window
+     * @param aId      - The identifier of the area, which shall be prioritized.
+     * @return KErrNotFound if an area with given ID is not found from the registry.
+     */
+    TInt MoveFeedbackAreaToFirstPriority( TUint aId ); 
+    
+    /**
+     * Enables or disables given feedback area. This does not change area's
+     * actual feedback type.
+     * @param aId      - The identifier of the area, which feedback shall be 
+     *                   enabled / disabled.
+     * @param aVibraEnabled - Give ETrue to enable vibra feedback, and 
+     *                   EFalse to disable vibra feedback for this area.
+     * @param aAudioEnabled - Give ETrue to enable audio feedback, and 
+     *                        EFalse to disable audio feedback for this area.
+     * @param aVisible      - Visibility status of the control, who owns 
+     *                        the area.
+     * @return ETrue if registry actually changed due to this function call.
+     */
+    TBool SetFeedbackEnabled( TUint aId, 
+                              TBool aVibraEnabled, 
+                              TBool aAudioEnabled,
+                              TBool aVisible ); 
+        
+    /**
+     * Returns the window handle, where this registry is associated.
+     *
+     * @return Window handle of associated window.
+     */
+    TUint WindowHandle() const;
+        
+    /**
+     * Returns count of areas in this registry
+     */
+    TInt AreaCount();  
+    
+    RArray<TFeedbackEntry>* WindowRegistry();  
+
+    
+private:
+
+
+    CTouchFeedbackRegistry( TUint aWindowHandle );
+
+
+private: // data
+
+    /**
+     * Handle number of the window, to which this registry is related.
+     */
+    TUint iWindowHandle;
+    
+    /**
+     * Array of area registry items in this window
+     */
+    RArray<TFeedbackEntry> iAreaArray;
+    };
+
+
+
+#endif //  C_TOUCHFEEDBACKREGISTRY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedback.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,52 @@
+/*
+* 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:  Tactile Feedback client Instance Factory.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <eikenv.h>
+#include <touchfeedbackadaptation.h>
+
+#include "touchfeedback.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MTouchFeedback* MTouchFeedback::Instance()
+    {
+    return CTouchFeedbackAdaptation::GetInstance();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MTouchFeedback* MTouchFeedback::CreateInstanceL()
+    {
+    return CTouchFeedbackAdaptation::CreateInstanceL();
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void MTouchFeedback::DestroyInstance()
+    {
+    CTouchFeedbackAdaptation::DestroyInstance();
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackadaptation.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,198 @@
+/*
+* 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:  This class is an adaptation class that is instantiated
+*                by the application framework, and that instantiates the
+*                actual Tactile Feedback Client implementation.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32std.h>
+#include <eikenv.h>
+#include <coecntrl.h>
+
+#include <tactilefeedbacktrace.h>
+#include <touchfeedbackadaptation.h>
+
+#include "touchfeedbackclient.h"
+#include "touchfeedbackimpl.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackAdaptation::CTouchFeedbackAdaptation()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackAdaptation::ConstructL()
+    {
+    TRACE("CTouchFeedbackAdaptation::ConstructL - Begin");
+
+    iTouchFeedback = CTouchFeedbackImpl::New();    
+
+    TRACE("CTouchFeedbackAdaptation::ConstructL - End");
+    }
+
+
+// ---------------------------------------------------------------------------
+// We store ourselves to the thread local storage here. The instance is 
+// accessible to clients via Instance -function.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTouchFeedbackAdaptation* CTouchFeedbackAdaptation::NewL()
+    {
+    CTouchFeedbackAdaptation* self = new( ELeave ) CTouchFeedbackAdaptation;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    // Store ourselves to thread local storage
+    User::LeaveIfError( Dll::SetTls( self ) );        
+
+    CleanupStack::Pop( self );    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackAdaptation::~CTouchFeedbackAdaptation()
+    {
+    delete iTouchFeedback;
+    Dll::SetTls( NULL );
+    }
+
+// ---------------------------------------------------------------------------
+// Retrieve instance from thread local storage
+// ---------------------------------------------------------------------------
+//
+MTouchFeedback* CTouchFeedbackAdaptation::GetInstance()
+    {
+    TAny* selfPtr = Dll::Tls();
+
+    CTouchFeedbackAdaptation* self = 
+        static_cast<CTouchFeedbackAdaptation*>( selfPtr );
+    
+    if ( self )
+        {
+        return self->iTouchFeedback;
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Create new instance and return it to caller
+//
+// We must have check for the case where client calls this even though
+// instance exists already (in this case we only return the existing 
+// instance).
+// ---------------------------------------------------------------------------
+//
+MTouchFeedback* CTouchFeedbackAdaptation::CreateInstanceL()
+    {   
+    // Use current instance if it exists
+    MTouchFeedback* feedback = GetInstance();
+
+    // If current instance does not exist, then create a new one
+    if ( !feedback )
+        {
+        CTouchFeedbackAdaptation* tmp = NewL();
+        
+        feedback = tmp->GetInstance();
+        }
+        
+    return feedback;
+    }
+
+// ---------------------------------------------------------------------------
+// Destroy ourselves if we are found at thread local storage (tls)
+//
+// Notice that tls content does not need to be zeroed because that is already
+// done in the destructor.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackAdaptation::DestroyInstance()
+    {
+    TAny* selfPtr = Dll::Tls();
+
+    CTouchFeedbackAdaptation* self = 
+        static_cast<CTouchFeedbackAdaptation*>( selfPtr );
+    
+    if ( self )
+        {
+        delete self;
+        }        
+    }    
+    
+// ---------------------------------------------------------------------------
+// Empty implementation, as this function is no longer in use.
+// (Control visibility changes now handled in HandleControlStateChange)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTouchFeedbackAdaptation::ControlVisibilityChanged( 
+    const CCoeControl* /*aControl*/ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Nothing to do here, just pass the information to implementation.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTouchFeedbackAdaptation::LayoutChanged( )
+    {
+    if ( iTouchFeedback )
+        {
+        iTouchFeedback->LayoutChanged();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// From class MObjectProvider.
+// We have to implement this because it is pure virtual in base class.
+// Return Null as we are not actually part of object provider hierarchy.
+// ---------------------------------------------------------------------------
+TTypeUid::Ptr CTouchFeedbackAdaptation::MopSupplyObject( TTypeUid /*aId*/ )
+    {
+    return TTypeUid::Null();
+    }
+        
+// ---------------------------------------------------------------------------
+// From class MCoeControlStateObserver.
+// Here we just pass the information about control state change ahead to
+// actual feedback implementation.
+// ---------------------------------------------------------------------------
+TInt CTouchFeedbackAdaptation::HandleControlStateChange( 
+    CCoeControl* aControl,
+    TCoeState /*aState*/ )
+    {
+    if ( iTouchFeedback )
+        {
+        iTouchFeedback->ControlVisibilityChanged( aControl );
+        }
+        
+    return KErrNone;
+    }
+    
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackclient.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,665 @@
+/*
+* Copyright (c) 2007-2009 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:  Communication with server side implementation of
+*                Area Registry.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32std.h>
+#include <eikenv.h>
+
+#include <tactileinternaldatatypes.h>
+#include <tactilefeedbacktrace.h>
+
+#include "touchfeedbackclient.h"
+#include "touchfeedbackimpl.h"
+#include "touchfeedbackregistry.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "touchfeedbackclientTraces.h"
+#endif
+
+// Minimun and maximum sized of one shared memory chunk.
+const TInt KTactileChunkInitialSize = 4096; // 4kB
+const TInt KTactileChunkMaxSize     = 262144; // 256kB
+const TUid KTactileClickPluginUid   = { 0x2000B493 };
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackClient::CTouchFeedbackClient( CTouchFeedbackImpl& aFeedback ):
+    iClickPlugin ( CEikonEnv::Static()->WsSession()),
+    iFeedback( aFeedback )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// We do all the initializations in the construction phase. Other option
+// would be to postpone these until the first registry entry has been added.
+//
+// #1 Connect to our ClickPlugin
+// #2 Create a shared chunk, which is used for storing this application
+//    process' area registry, so that it can be accessed by the window
+//    server.
+// #3 Set window count to zero in the new chunk
+// #4 Try to create a global semaphore to have mutual exclusion on chunks
+//    If semaphore already exists, then try to open it.
+// #5 Put our chunk name to package buffer, and send it to click plugin
+//    so that it can open a handle to our chunk and thus access the shared
+//    memory.
+// #6 Create a CIdle object that is used for updating the registry in shared
+//    memory.
+//
+// Notice that we will leave in case anything fails. This has to be handled
+// on higher level, so that whole application launch will not fail in case
+// touch feedback does not work.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::ConstructL()
+    {
+    TRACE("CTouchFeedbackClient::ConstructL - Begin");
+    
+    // #1 Connect to click plugin
+    User::LeaveIfError( iClickPlugin.Construct( KTactileClickPluginUid ) );
+        
+    TBool changable = EFalse;
+    
+    TBool loaded = iClickPlugin.IsLoaded( changable );  
+    
+    if ( !loaded )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    // #2 Create shared chunk 
+    RThread me;
+
+    TTactileFeedbackConnectData data;
+    
+    // Set window group identifier
+    data.iWindowGroupId = CCoeEnv::Static()->RootWin().Identifier();
+           
+    // We use our own thread name as name for the chunk       
+    data.iChunkName.Copy( me.Name().Right( KMaxKernelName ) );
+    
+    // Now create the chunk
+    TInt err = iChunk.CreateGlobal( data.iChunkName, 
+                                    KTactileChunkInitialSize, 
+                                    KTactileChunkMaxSize );     
+        
+    // We have to take into account, that the chunk may already exist.
+    // This may happen in case we have been started (and crashed)
+    // once already.
+    if ( err == KErrAlreadyExists )
+        {
+        User::LeaveIfError( iChunk.OpenGlobal( data.iChunkName, EFalse ) );
+        }
+    
+    // #3 Set window count to zero
+    TInt* chunkPtr = reinterpret_cast<TInt*>( iChunk.Base() );
+    
+    *chunkPtr = 0; // No entries in the chunk in the beginning
+    
+    // #4 Try to create/open global semaphore
+    err = iSemaphore.CreateGlobal( KTouchFeedbackSemaphore, 1 );
+    
+    if ( err == KErrAlreadyExists )
+        {
+        User::LeaveIfError( iSemaphore.OpenGlobal( KTouchFeedbackSemaphore ) );
+        }
+       
+    // #5 Send chunk name to window server
+    TPckgC<TTactileFeedbackConnectData> dataPkg ( data );
+    
+    User::LeaveIfError( iClickPlugin.CommandReply( ETactileOpCodeConnect, 
+                                                   dataPkg ) );
+    iConnected = ETrue;
+    
+    iFeedbackTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+        
+    User::LeaveIfError( iFbClient.Connect() );
+            
+    // #6 We use Standard priority so that we won't disturb the normal 
+    //    functionality of the application, but can get registry updated
+    //    fastly enough in case the application does very plenty of 
+    //    background prosessing with active objects.
+    iIdle = CIdle::NewL( CActive::EPriorityStandard );
+    
+    TRACE("CTouchFeedbackClient::ConstructL - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackClient* CTouchFeedbackClient::NewL( CTouchFeedbackImpl& aFeedback )
+    {
+    CTouchFeedbackClient* self = 
+        new( ELeave ) CTouchFeedbackClient ( aFeedback );
+    CleanupStack::PushL( self );
+    self->ConstructL();    
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackClient::~CTouchFeedbackClient()
+    {
+    iChunk.Close();
+    iSemaphore.Close();
+
+    if ( iFeedbackTimer )
+        {
+        iFeedbackTimer->Cancel();
+        delete iFeedbackTimer;    
+        }
+    
+    iFbClient.Close();
+   
+    if ( iConnected )
+        {
+        TTactileFeedbackDisconnectData data;
+        
+        data.iWindowGroupId = CCoeEnv::Static()->RootWin().Identifier();
+        
+        TPckgC<TTactileFeedbackDisconnectData> dataPkg ( data );
+    
+        iClickPlugin.CommandReply( ETactileOpCodeDisconnect, dataPkg );    
+        }
+    
+    iClickPlugin.Close();  
+    
+    delete iIdle;  
+    }
+   
+    
+// ---------------------------------------------------------------------------
+// In this function we just activate CIdle. The motivation is that this
+// way we avoid updating the registry multiple times. For e.g. Calculator
+// application launch would cause around 20 registry updates in case we would
+// always make changes to shared memory immediately after registry update.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::RegistryChanged( )
+    {
+    if ( iIdle && !iIdle->IsActive() )
+        {
+        iIdle->Start( TCallBack( IdleCallbackL, this ) ); 
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Callback for CIdle.
+//
+// We check the current enabled/disabled status of tactile feedback for
+// this application, and either UpdateRegistryToChunkL for updating whole
+// registry to shared chunk, or ClearWholeChunkL for clearing all feedback
+// areas from the shared chunk.
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackClient::IdleCallbackL( TAny* aPtr )
+    {
+    if ( aPtr )
+        {
+        CTouchFeedbackClient* self =
+            static_cast<CTouchFeedbackClient*> ( aPtr );
+
+        if ( self->iFeedback.FeedbackEnabledForThisApp() )
+            {
+            self->UpdateRegistryToChunkL();
+            }
+        else
+            {
+            self->ClearWholeChunkL();
+            }
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Area registry is written to shared memory in following format
+//
+// + Header (four bytes) = Number of windows as TInt
+// + Window entries 
+// + Area registry entries
+// 
+// Window entries: For each window:
+//   [four bytes] = Window handle 
+//   [four bytes] = Number of registry entries in this window 
+//   [four bytes] = Offset of registry data from beginning of chunk
+// Area registry entries:
+//   - Each entry written as TFeedbackChunkAreaEntry straight into memory
+//
+//
+// Steps taken in this function:
+//
+// #1 Calculate the size needed for area registry data
+// #2 Mutual exclusion with global semaphore
+// #3 Increase Chunk size in case necessary
+// #4 Update Chunk contents. This is now done simply by writing the whole
+//    area registry into the shared memory.
+// #5 Release semaphore
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::UpdateRegistryToChunkL()
+    {
+    TRACE( "CTouchFeedbackClient::UpdateRegistryToChunkL - Begin" );
+    
+    RPointerArray<CTouchFeedbackRegistry>* registry =
+        iFeedback.RegistryArray();
+
+    // Do cleanup so that empty registry instances are not hanging anymore
+    TInt windowIndex = 0;
+    TInt cleanupAreaCount = 0;
+    TInt cleanupWindowCount = 0;
+    // value is returned in parameter variable  
+    iFeedback.GetAreaCount( cleanupAreaCount, cleanupWindowCount );  
+    
+    while ( windowIndex < cleanupWindowCount )
+        {
+        TBool emptyWindow = ( (*registry)[windowIndex]->AreaCount() == 0 ); 
+        if ( emptyWindow )
+            {
+            // Remove empty/possibly destroyed registry instance that possibly 
+            // may refer to destroyed control/window.
+            CTouchFeedbackRegistry* feedbackRegistry = (*registry)[windowIndex];
+            registry->Remove( windowIndex );
+            delete feedbackRegistry;
+            cleanupWindowCount--;
+            }
+        else
+            {
+            windowIndex++; // to next window
+            }
+        }
+        
+    // #1 Calculate the size needed    
+    TInt windowCount(0);
+    TInt areaCount(0);
+    iFeedback.GetAreaCount( areaCount, windowCount );    
+        
+    // Header contains only number of windows in this registry
+    TInt headerSize = sizeof( TInt );     
+        
+    // There is a list of windows in this registry in the beginning, with
+    // data offsets in the chunk    
+    TInt windowItemSize = 
+        sizeof( TInt ) + // Window handle
+        sizeof( TInt ) + // Area count
+        sizeof( TInt );  // Offset to area registry entries
+    
+    // Size of one area registry entry
+    TInt areaItemSize = sizeof( TFeedbackChunkAreaEntry );    
+           
+    TInt sizeNeeded =     
+        headerSize + 
+        windowCount * windowItemSize + 
+        areaCount * areaItemSize;
+        
+    // #2 Mutual exclusion    
+    iSemaphore.Wait();
+
+     // We use cleanup item for making sure that semaphore will not stay
+    // reserved in case there is a leave.
+    CleanupStack::PushL( TCleanupItem( CleanupSemaphore, &iSemaphore ) );
+       
+    // #3 Increase chunk (committed) size in case needed    
+    if ( iChunk.Size() < sizeNeeded )
+        {
+        TInt err = iChunk.Adjust( sizeNeeded );
+        
+        if ( err != KErrNone )
+            {
+            // In case the current registry does not fit to the chunk, then
+            // we'll set window count to zero, in case that is possible
+            // (it is not possible if chunk size is zero).
+            // This means that there won't be any area registry based 
+            // feedback for this application on the moment.
+            if ( iChunk.Size() > 0 )
+                {
+                TInt* chunkPtr = reinterpret_cast<TInt*>( iChunk.Base() );
+                    
+                // Set window count to zero   
+                *chunkPtr = 0;           
+                }
+                
+            // We will leave anyway
+            User::Leave( err );
+            }
+        }
+        
+        
+    // #4 Update chunk contents    
+    TInt* chunkPtr = reinterpret_cast<TInt*>( iChunk.Base() );
+        
+    // Set window count in the beginning of chunk    
+    *chunkPtr = windowCount; 
+    chunkPtr++;
+            
+    TInt areaOffset = headerSize + windowCount * windowItemSize;
+    
+    // This is pointer to the first area registry entry in the chunk
+    TFeedbackChunkAreaEntry* chunkEntryPtr 
+       = reinterpret_cast<TFeedbackChunkAreaEntry*> ( iChunk.Base() + areaOffset );
+    
+    // Check if audio or vibra is disabled for this application.
+    TBool audioEnabled = iFeedback.FeedbackEnabledForThisApp( ETouchFeedbackAudio );
+    TBool vibraEnabled = iFeedback.FeedbackEnabledForThisApp( ETouchFeedbackVibra );
+            
+    // One loop round for each window where we have area registry entries.
+    for ( TInt windowIndex = 0; windowIndex < windowCount; windowIndex++ )
+        {
+        RArray<TFeedbackEntry>* windowRegistry = 
+            (*registry)[windowIndex]->WindowRegistry();
+        
+        // Write handle of this window
+        *chunkPtr = (*registry)[windowIndex]->WindowHandle();
+        chunkPtr++;
+        // Store the address where we shall write count later
+        // (We don't know the amount of areas yet, as we shall
+        // only add areas of visible controls).
+        TInt* countPointer = chunkPtr;
+        chunkPtr++;
+        // Write offset of the area registry entries of this window
+        *chunkPtr = ((TInt)chunkEntryPtr-(TInt)iChunk.Base());
+        chunkPtr++;
+        
+        // Write all areas of visible controls in this window 
+        // to the shared memory. Invisible controls' areas are left out so
+        // that they won't mess up the feedback for overlapping visible
+        // controls.
+        TInt visibleAreaCount = 0;
+        for ( TInt areaIndex = windowRegistry->Count()-1; areaIndex >= 0; areaIndex-- )
+            {
+            TFeedbackEntry entry = (*windowRegistry)[areaIndex];
+            
+            if ( entry.iVisible ) 
+                {
+            chunkEntryPtr->iRect = entry.iRect;
+            
+            TInt feedback = ( entry.iFeedbackTypeUp << 10 );
+            feedback |= entry.iFeedbackTypeDown;            
+
+            // Add audio and vibra information to feedback type
+            if ( entry.iVibraEnabled && vibraEnabled )
+                {
+                //feedback |= KTactileVibraBit;    
+                if ( entry.iFeedbackDown & ETouchFeedbackVibra )
+                    {
+                    feedback |= KTactileVibraBitDown;    
+                    }
+                if ( entry.iFeedbackUp & ETouchFeedbackVibra )
+                    {
+                    feedback |= KTactileVibraBitUp;    
+                    }
+                
+                }
+            if ( entry.iAudioEnabled && audioEnabled )
+                {
+                //feedback |= KTactileAudioBit;
+                if ( entry.iFeedbackDown & ETouchFeedbackAudio )
+                    {
+                    feedback |= KTactileAudioBitDown;    
+                    }
+                if ( entry.iFeedbackUp & ETouchFeedbackAudio )
+                    {
+                    feedback |= KTactileAudioBitUp;    
+                    } 
+                }
+                
+            chunkEntryPtr->iFeedbackType = static_cast<TTouchLogicalFeedback>( feedback );
+            
+            chunkEntryPtr->iEventType    = entry.iEventType;    
+            
+            chunkEntryPtr++;        
+                visibleAreaCount++;      
+                }            
+            }
+        // Now store area count as we know the amount of visible areas
+        // for this window.    
+        *countPointer = visibleAreaCount;     
+        }   
+        
+    // #5 Release semaphore so that other processes can access the chunks again    
+    // This calls "Signal" on the semaphore
+    CleanupStack::PopAndDestroy(&iSemaphore);
+
+    TRACE( "CTouchFeedbackClient::UpdateRegistryToChunkL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// Despite the function name, we don't actually clear whole chunk here
+// as that is not necessary. It is enough to set the window count to zero
+// at beginning of chunk, as then server will consider this chunk empty.
+//
+// #1 Mutual exclusion
+// #2 Make sure chunk is not of zero -size
+// #3 Set window count to zero at beginning of chunk
+// #4 Release mutual exclusion
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::ClearWholeChunkL()
+    {
+    TRACE( "CTouchFeedbackClient::ClearWholeChunkL - Begin" );
+    
+    // #1 Mutual exclusion    
+    iSemaphore.Wait();
+    
+    // We use cleanup item for making sure that semaphore will not stay
+    // reserved in case there is a leave.
+    CleanupStack::PushL( TCleanupItem( CleanupSemaphore, &iSemaphore ) );
+    
+    // We only need four bytes for the data, as we are only going to store
+    // one number to the chunk. But we count the space just in case anyway, 
+    // because at some point chunks initial size may be change so that it is
+    // zero.
+    TInt sizeNeeded = sizeof( TInt );
+        
+    // #2 Increase chunk (committed) size in case needed    
+    if ( iChunk.Size() < sizeNeeded )
+        {
+        User::LeaveIfError( iChunk.Adjust( sizeNeeded ) );
+        }
+  
+      // #3 Update chunk contents    
+    TInt* chunkPtr = reinterpret_cast<TInt*>( iChunk.Base() );
+
+    // Set window count to zero (this is enough for the server to think
+    // that there are no feedback areas at all).
+    *chunkPtr = 0; 
+
+    // #4 Release semaphore
+    CleanupStack::PopAndDestroy(&iSemaphore);         
+    
+    TRACE( "CTouchFeedbackClient::ClearWholeChunkL - End" );
+    }
+
+// ---------------------------------------------------------------------------
+// This is a cleanup function for releasing a semaphore in case there will
+// be a leave after calling RSemaphore::Wait (otherwise there could easily
+// be a deadlock in the system).
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::CleanupSemaphore( TAny* aPtr )
+    {
+    TRACE( "CTouchFeedbackClient::CleanupSemaphore" );
+    
+    if ( aPtr )
+        {
+        RSemaphore* sem = static_cast<RSemaphore*> ( aPtr );
+        
+        sem->Signal();
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// Here we just send the logical feedback type to server.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::ImmediateFeedback( TTouchLogicalFeedback aType,  
+    TBool aVibraOn, TBool aAudioOn  )
+    {
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLIENT_INSTANT_FEEDBACK_1, "e_TACTILE_CLIENT_INSTANT_FEEDBACK 1");
+    
+    if ( aVibraOn || aAudioOn )
+        {
+        iFbClient.PlayFeedback( aType, aVibraOn, aAudioOn );
+        }
+    
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_CLIENT_INSTANT_FEEDBACK_0, "e_TACTILE_CLIENT_INSTANT_FEEDBACK 0");
+    }
+
+// ---------------------------------------------------------------------------
+// Check that we really have something to update, and then do the update.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::FlushUpdates()
+    {
+    if ( iIdle && iIdle->IsActive() )
+        {
+        // Do the updates
+        TRAP_IGNORE( IdleCallbackL( this ) );
+        
+        // Cancel pending update request (no need to keep it active since
+        // registry is now up-to-date).
+        iIdle->Cancel();
+        }
+    }
+    
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::StartFeedback( TUint32 aClientHandle,
+                                          TTouchContinuousFeedback aType,
+                                          TInt aIntensity,
+                                          TTimeIntervalMicroSeconds32 aTimeout )
+    {
+    TRACE("CTouchFeedbackClient::StartFeedback - Begin");
+
+    if ( !iFeedbackTimer->IsActive() )
+        {
+        iPreviousIntensity = aIntensity;
+        iFbClient.StartFeedback( aType, aIntensity );
+        iClientHandle = aClientHandle; // Control, which started the feedback.
+        }
+    if ( aTimeout != TTimeIntervalMicroSeconds32(0) )
+        {
+        StartFeedbackTimer( aTimeout );
+        
+        if ( aIntensity != iPreviousIntensity )
+            {
+            ModifyFeedback( aClientHandle, aIntensity );
+            }
+        }
+    
+    TRACE("CTouchFeedbackClient::StartFeedback - End");
+    }
+    
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::ModifyFeedback( TUint32 aClientHandle, 
+                                           TInt aIntensity )
+    {
+    // Modification is allowed only for the same control, which started 
+    // the feedback.
+    if ( aClientHandle == iClientHandle &&
+         aIntensity != iPreviousIntensity )
+        {
+        iPreviousIntensity = aIntensity;
+        iFbClient.ModifyFeedback( aIntensity );    
+        }    
+    }
+                             
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::StopFeedback( const TUint32 aClientHandle )
+    {
+    TRACE("CTouchFeedbackClient::StopFeedback - Begin");
+    if ( aClientHandle == iClientHandle )
+        {
+        iFbClient.StopFeedback();
+        iFeedbackTimer->Cancel();
+        // Clear also client handle to indicate there's no ongoing feedback.
+        iClientHandle = 0; 
+        }
+    TRACE("CTouchFeedbackClient::StopFeedback - End");
+    }    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackClient::SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType )
+    {
+    return iFbClient.SetFeedbackEnabledForDevice( aFeedbackType );
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+TTouchFeedbackType CTouchFeedbackClient::FeedbackEnabledForDevice()
+    {
+    TTouchFeedbackType feedbackEnabled;
+    iFbClient.FeedbackEnabledForDevice( feedbackEnabled );
+    return feedbackEnabled;
+    }
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::StartFeedbackTimer( TTimeIntervalMicroSeconds32 aTimeout )
+    {
+    iFeedbackTimer->Cancel();
+    TCallBack callback( StopFeedbackCallback, this );
+    iFeedbackTimer->Start( aTimeout, 0, callback );
+    }    
+
+// ----------------------------------------------------------------------------
+// 
+// ----------------------------------------------------------------------------
+//
+void CTouchFeedbackClient::StopFeedbackByTimeout()
+    {
+    iFeedbackTimer->Cancel();
+    iFbClient.StopFeedback();
+    iClientHandle = 0; 
+    }
+
+// ----------------------------------------------------------------------------
+// CAknSlider::StopFeedbackCallback
+// ----------------------------------------------------------------------------
+//
+TInt CTouchFeedbackClient::StopFeedbackCallback( TAny* aThis )
+    {
+    TRACE("CTouchFeedbackClient::StopFeedbackCallback - Begin");
+    static_cast<CTouchFeedbackClient*>( aThis )->StopFeedbackByTimeout();
+    TRACE("CTouchFeedbackClient::StopFeedbackCallback - End");
+    return KErrNone;
+    }    
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackclientpanic.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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:  Panic function for Tactile Feedback Client
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#include <e32base.h>
+
+#include "touchfeedbackclientpanic.h"
+
+
+_LIT( KTouchClientPanic, "Touch FB Client" );
+
+
+void Panic( TTouchFeedbackClientPanic aPanic )
+    {
+    User::Panic( KTouchClientPanic, aPanic );
+    }
+
+// End of File
+
+    
+    
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackimpl.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,1774 @@
+/*
+* Copyright (c) 2007-2009 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:  This is the actual Client API implementation.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <eikenv.h>
+#include <coecntrl.h>
+#include <featmgr.h>
+#include <aknutils.h> 
+#include <tactilefeedbacktrace.h>
+#include <touchfeedbackspec.h>
+
+#include "touchfeedbackimpl.h"
+#include "touchfeedbackclient.h"
+#include "touchfeedbackregistry.h"
+#include "touchfeedbackclientpanic.h"
+
+/**
+ * This is the maximum number that can be used as feedback area identifier.
+ * after this the values starting from 1 are taken into use again when
+ * new areas are added. This also defines the maximum number of feedback
+ * areas that one application can have.
+ */
+const TInt KTouchMaxFeedbackAreaIdentifier = 5000;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Cleanup items for removing latest item from the given array. These are used
+// for cleanup in case something leaves when we are adding new area
+// to the registry.
+// ---------------------------------------------------------------------------
+//
+void CleanupCacheArray( TAny* aPtr )
+    {
+    RArray<TControlCacheEntry>* array = 
+        static_cast<RArray<TControlCacheEntry>*> ( aPtr );
+        
+    TInt index = array->Count() - 1;
+    
+    // If we are removing control from cache, then we have to clean the
+    // associated area array also, or otherwise there will be a memory leak.
+    (*array)[index].iAreaArray.Reset();
+    (*array)[index].iAreaArray.Close();
+    
+    array->Remove( array->Count()-1 );        
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CleanupAreaArray( TAny* aPtr )
+    {
+    RArray<TAreaIndexEntry>* array = 
+        static_cast<RArray<TAreaIndexEntry>*> ( aPtr );
+        
+    array->Remove( array->Count()-1 );    
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackImpl::CTouchFeedbackImpl() :
+    iAudioEnabledForThisApp( ETrue ), 
+    iVibraEnabledForThisApp( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// We check first if Tactile Feedback feature is supported in this device
+// and only construct the iClient -member in case needed. We thus use 
+// the existence of iClient as feature check in other API functions.
+//
+// This also means that iClient member needs to be checked in all the API
+// functions, so that we won't cause a KERN-EXEC 3 by trying to access
+// a NULL pointer in case the feature is disabled.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::ConstructL()
+    { 
+    TRACE("CTouchFeedbackImpl::ConstructL - Begin");
+
+    // Check if the whole Tactile Feedback feature is supported or not
+    
+    // Initialize feature manager, just in case we happen to be the first
+    // one using it in this thread.
+    FeatureManager::InitializeLibL();
+    
+    TBool featureSupported =
+        FeatureManager::FeatureSupported( KFeatureIdTactileFeedback );
+
+    // We don't need feature manager anymore, as it is not possible
+    // to change this feature on/off at run-time
+    FeatureManager::UnInitializeLib();
+    
+    // Only create client in case feature is supported
+    if ( featureSupported )
+        {
+        iClient = CTouchFeedbackClient::NewL( *this );
+        }
+    else
+        {
+        TRACE("Tactile Feedback feature is not supported");
+        }
+    
+    // Check if pen usage is enabled. We use this information later for
+    // disabling area registry -based feedback in case pen usage is not
+    // enabled.    
+    iPenEnabled = AknLayoutUtils::PenEnabled();
+    
+    TRACE3("CTouchFeedbackImpl::ConstructL - End, feature supported = %d, pen Enabled: %d", featureSupported, iPenEnabled);
+    }
+
+// ---------------------------------------------------------------------------
+// We cannot afford to leave here (at least for the moment), because
+// in that case the whole system won't boot up. Constructing of the
+// client (in ConstructL) will fail if click plugin is not configured in
+// WSINI.INI file, and that can happen very easily at least in the beginning
+// when this is a new feature. Thus we TRAP any leaves here.
+//
+// This also means that iClient member needs to be checked in all the API
+// functions. We will also use this for recognizing the situation when
+// touch feedback is not supported (in that case we won't even try to
+// instantiate the client).
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackImpl* CTouchFeedbackImpl::New()
+    {
+    CTouchFeedbackImpl* self = new CTouchFeedbackImpl;
+    if ( self )
+        {
+        TRAP_IGNORE( self->ConstructL() );    
+        }    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackImpl::~CTouchFeedbackImpl()
+    {
+    TRACE("CTouchFeedbackImpl::~CTouchFeedbackImpl");
+
+    delete iClient;
+    
+    TInt i = 0;
+    
+    for ( i=0; i < iRegistryArray.Count(); i++ )
+        {
+        delete iRegistryArray[i];
+        }
+        
+    for ( i=iControlCache.Count()-1; i >= 0; i-- )
+        {
+        RemoveControlFromCache( i );
+        }
+        
+    iRegistryArray.Close();
+    iControlCache.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// We return ETrue if iClient exist, because instantiation of the client is
+// not done in case the feature is not enabled. And on the other hand if 
+// instantiation of client fails, then using of feedback is not possible
+// anyway.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::TouchFeedbackSupported()
+    {
+    if ( iClient )
+        {
+        return ETrue;        
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// Store the current status of feedback for this application, and
+// notify server of the change.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::SetFeedbackEnabledForThisApp( TBool aEnabled )
+    {
+    TRACE2( "CTouchFeedbackImpl::SetFeedbackEnabledForThisApp %d", aEnabled );
+    
+    // Only notify server when enabled value really changes.
+    if ( iClient && 
+       (( aEnabled != iAudioEnabledForThisApp ) || 
+         (aEnabled != iVibraEnabledForThisApp ) ))
+        {
+        iClient->RegistryChanged();        
+        }
+        
+    iAudioEnabledForThisApp = aEnabled;      
+    iVibraEnabledForThisApp = aEnabled;      
+    }
+
+// ---------------------------------------------------------------------------
+// Here we just return the current status.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::FeedbackEnabledForThisApp() 
+    {
+    return iAudioEnabledForThisApp || iVibraEnabledForThisApp;
+    }
+        
+// ---------------------------------------------------------------------------
+// This functions main purpose is to do all possible parameter checks to
+// the arguments before actually setting the area.
+// 
+// #1 Check that feedback is enabled
+// #2 Check that we weren't given a NULL pointer as control.
+// #3 Check that feedback type and pointer event are supported
+// #4 Check that we can generate a client handle from the control
+//    (if not, then there is something wrong with given control)
+// #5 Call overridden method SetFeedbackArea for actually setting the 
+//    feedback area.
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackImpl::SetFeedbackArea( 
+    const CCoeControl* aControl, 
+    TUint32 aIndex, 
+    TRect aRect, 
+    TTouchLogicalFeedback aFeedbackType, 
+    TTouchEventType aEventType )
+    {
+    TRACE("CTouchFeedbackImpl::SetFeedbackArea - Begin");
+    
+    // #1
+    if ( !iClient )
+        {
+        return KErrNone;
+        }
+    
+    // #2
+    if ( !aControl )
+        {
+        TRACE("CTouchFeedbackImpl::SetFeedbackArea - Err: NULL Control");
+        return KErrArgument;
+        }
+        
+    // #3    
+    if ( aFeedbackType > ETouchFeedbackSensitive || 
+        ( aEventType!= ETouchEventStylusDown ) )
+        {
+        TRACE("CTouchFeedbackImpl::SetFeedbackArea - Err: Unsupported params");
+        return KErrNotSupported;
+        }
+      
+    // #4        
+    TUint32 clientHandle = ClientHandle( aControl );
+    
+    if ( !clientHandle )
+        {
+        TRACE("CTouchFeedbackImpl::SetFeedbackArea - Err: Invalid Control");        
+        return KErrArgument;
+        }
+    
+    // #5    
+    TInt err(KErrGeneral);
+    CFeedbackSpec* spec = CFeedbackSpec::New();
+    if (spec)
+        {
+        spec->AddFeedback(aEventType, aFeedbackType);
+        err = SetFeedbackArea(aControl, aIndex, aRect, spec);
+        delete spec;
+        spec = NULL;
+        }
+        
+    TRACE2("CTouchFeedbackImpl::SetFeedbackArea - End, err = %d", err );
+    return err;    
+    }
+      
+// ---------------------------------------------------------------------------
+// Here we remove the given area from registry. 
+//
+// We still keep the control in the registry even if would have no areas,
+// because otherwise we'll lose feedback disabled/enabled information.
+//
+// #1 First check that given area is actually found
+// #2 Find corresponsing registry entry
+// #3 Remove feedback area entry from control cache
+// #4 Finally remove the actual area from registry, and notify server
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::RemoveFeedbackArea( 
+    const CCoeControl* aControl, 
+    TUint32 aIndex )
+    {
+    TRACE3( "CTouchFeedbackImpl::RemoveFeedbackArea: 0x%x, %d", aControl, aIndex );
+
+    if ( iClient )
+        {
+        TInt cacheIndex = KErrNotFound;
+        TInt areaIndex = KErrNotFound;
+        
+        FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+        
+        // #1 Only do something in case the area was found
+        if ( cacheIndex >=0 && areaIndex >= 0 )
+            {
+            // #2
+            TInt registryIndex = FindWindowFromRegistry ( 
+                iControlCache[cacheIndex].iClientHandle );
+
+            TInt areaId = 
+                iControlCache[cacheIndex].iAreaArray[areaIndex].iAreaId;
+            
+            // #3 Remove this feedback area entry
+            iControlCache[cacheIndex].iAreaArray.Remove( areaIndex );
+            
+            iNbOfFeedbackAreas--;
+            
+            // #4 Remove the area from registry
+            if ( registryIndex != KErrNotFound )
+                {
+                iRegistryArray[registryIndex]->RemoveFeedbackArea( areaId );
+                
+                iClient->RegistryChanged();
+                }        
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Here we return all areas related to given control.
+//
+// #1 Only do something in case the control is found from cache
+// #2 Find corresponding registry index.
+// #3 Remove all feedback areas from the registry.
+// #4 Remove the control from cache
+// #5 Notify server, if some areas were really removed.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::RemoveFeedbackForControl( 
+    const CCoeControl* aControl )
+    {
+    TRACE2("CTouchFeedbackImpl::RemoveFeedbackForControl: 0x%x", aControl);
+    
+    if ( iClient )
+        {
+        TInt controlIndex = FindControlFromCache( aControl );
+        
+        // #1
+        if ( controlIndex >= 0 ) // If control was found
+            {
+            TBool changesMade = EFalse;
+
+            TControlCacheEntry& entry( iControlCache[controlIndex] );
+            
+            // #2
+            TInt registryIndex = 
+                FindWindowFromRegistry( entry.iClientHandle );
+            
+            // #3 If registry entry was found, then remove all feedback
+            // areas.
+            if ( registryIndex >= 0) 
+                {
+                for ( TInt i=0; i < entry.iAreaArray.Count(); i++ )
+                    {
+                    iRegistryArray[registryIndex]->
+                            RemoveFeedbackArea( 
+                            entry.iAreaArray[i].iAreaId );
+                            
+                    changesMade = ETrue;   
+                    
+                    iNbOfFeedbackAreas--;     
+                    }
+                }
+            
+            // #4 Anyway remove controls feedback areas from cache
+            RemoveControlFromCache( controlIndex );
+           
+            // #5 Notify server of changes
+            if ( changesMade )
+                {
+                iClient->RegistryChanged();
+                }
+            }        
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// Here we change the rectangle of existing feedback area.
+//
+// #1 Only do something in case the area is really found.
+// #2 Find corresponding registry entry
+// #3 If the entry was found, then change the feedback area
+// #4 Only notify the server when the area really changed
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::ChangeFeedbackArea( const CCoeControl* aControl,
+                                             TUint32 aIndex, 
+                                             TRect aNewRect )
+    {
+    TRACE( "CTouchFeedbackImpl::ChangeFeedbackArea: 0x%x" );
+
+    if ( iClient )
+        {
+        TInt cacheIndex = KErrNotFound;
+        TInt areaIndex  = KErrNotFound;
+
+        FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+        
+        // #1
+        if ( cacheIndex >= 0 && areaIndex >= 0 )
+            {
+            TInt id = 
+                iControlCache[cacheIndex].iAreaArray[areaIndex].iAreaId;
+            
+            // #2 
+            TInt registryIndex = 
+                FindWindowFromRegistry ( 
+                    iControlCache[cacheIndex].iClientHandle );
+
+            // #3
+            if ( registryIndex != KErrNotFound )
+                {
+                TBool changed = 
+                    iRegistryArray[registryIndex]->ChangeFeedbackArea( 
+                        id, 
+                        aNewRect );
+
+                // #4 Only send upates to server when something 
+                //    really changed.
+                if ( changed )
+                    {
+                    iClient->RegistryChanged();                
+                    }
+                }           
+            }        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Here we change the feedback type of existing feedback area.
+//
+// #1 Only do something in case the area is really found.
+// #2 Find corresponding registry entry
+// #3 If the entry was found, then change the feedback area
+// #4 Only notify the server when the feedback type really changed
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::ChangeFeedbackType( const CCoeControl* aControl,
+                                             TUint32 aIndex, 
+                                             TTouchLogicalFeedback aNewType )
+    {
+    TRACE4("CTouchFeedbackImpl::ChangeFeedbackType: 0x%x, %d, %d", aControl, aIndex, aNewType);
+
+    if ( iClient )
+        {
+        TInt cacheIndex = KErrNotFound;
+        TInt areaIndex  = KErrNotFound;
+
+        FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+        
+        // #1
+        if ( cacheIndex >= 0 && areaIndex >= 0 )
+            {
+            TInt id = iControlCache[cacheIndex].iAreaArray[areaIndex].iAreaId;
+            
+            // #2
+            TInt registryIndex = 
+                FindWindowFromRegistry ( 
+                    iControlCache[cacheIndex].iClientHandle );
+
+            // #3
+            if ( registryIndex != KErrNotFound )
+                {
+                TBool changed = 
+                    iRegistryArray[registryIndex]->ChangeFeedbackType( 
+                        id, 
+                        aNewType,
+                        // Feedback type change for up event is not supported 
+                        // by this function.
+                        static_cast<TTouchLogicalFeedback>( 0xFFFFFFFF ) );
+
+                // #4 Only send upates to server when something 
+                //    really changed.
+                if ( changed )
+                    {
+                    iClient->RegistryChanged();                
+                    }
+                }           
+            }        
+        }
+    }    
+   
+// ---------------------------------------------------------------------------
+// Here we change move the given feedback area to first priority, so that
+// it will be the topmost in its window.
+//
+// #1 Only do something in case the area is really found.
+// #2 Find corresponding registry entry
+// #3 If the entry was found, then change the feedback area
+// #4 Only notify the server when the move was successfull
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::MoveFeedbackAreaToFirstPriority( 
+    const CCoeControl* aControl, 
+    TUint32 aIndex )
+    {
+    if ( iClient )
+        {
+        TInt cacheIndex = KErrNotFound;
+        TInt areaIndex  = KErrNotFound;
+
+        FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+        
+        // #1
+        if ( cacheIndex >= 0 && areaIndex >= 0 )
+            {
+            TInt id = iControlCache[cacheIndex].iAreaArray[areaIndex].iAreaId;
+            
+            // #2
+            TInt registryIndex = 
+                FindWindowFromRegistry ( 
+                    iControlCache[cacheIndex].iClientHandle );
+
+            // #3
+            if ( registryIndex != KErrNotFound )
+                {
+                TInt err = 
+                    iRegistryArray[registryIndex]->
+                        MoveFeedbackAreaToFirstPriority( id );
+
+                // #4
+                if ( err == KErrNone )
+                    {
+                    TRACE3("CTouchFeedbackImpl::MoveFeedbackAreaToFirstPriority 0x%x, %d", aControl, aIndex);
+                    iClient->RegistryChanged();
+                    }
+                }  
+            }
+        }
+    }   
+
+// ---------------------------------------------------------------------------
+// Pass request to server in case feedback is enabled for this 
+// application.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::InstantFeedback( TTouchLogicalFeedback aType )
+    {
+    if ( iClient && ( iAudioEnabledForThisApp || iVibraEnabledForThisApp ) )
+        {
+        TRACE2("CTouchFeedbackImpl::InstantFeedback %d", aType);
+        iClient->ImmediateFeedback( 
+            aType, 
+            iVibraEnabledForThisApp, 
+            iAudioEnabledForThisApp );        
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// In this overload we only play direct feedback if the feedback has
+// not been disabled for this control.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::InstantFeedback( 
+    const CCoeControl* aControl,
+    TTouchLogicalFeedback aType )
+    {
+    if ( iClient && ( iAudioEnabledForThisApp || iVibraEnabledForThisApp ) )
+        {
+        
+        // First take application level vibra and audio enablers
+        // as default
+        TBool vibraEnabled = iVibraEnabledForThisApp;
+        TBool audioEnabled = iAudioEnabledForThisApp;
+
+        TInt cacheIndex = FindControlFromCache( aControl );
+        
+        
+        // Check control level disablers for vibra and audio.
+        // (These can only prevent vibra or audio effect playback,
+        //  but not to force it on)
+        if ( cacheIndex >=0 && vibraEnabled ) 
+            {
+            vibraEnabled = !iControlCache[cacheIndex].iVibraDisabled;
+            }
+            
+        if ( cacheIndex >=0 && audioEnabled ) 
+            {
+            audioEnabled = !iControlCache[cacheIndex].iAudioDisabled;
+            }
+            
+        TRACE3("CTouchFeedbackImpl::InstantFeedback 0x%x, %d", aControl, aType);
+        iClient->ImmediateFeedback( aType, vibraEnabled, audioEnabled );   
+        }
+    }    
+
+// ---------------------------------------------------------------------------
+// It is not enough to check that the control exists in the cache, we
+// also need to check that it actually has some areas registered.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::ControlHasFeedback( const CCoeControl* aControl )
+    {
+    TBool hasFeedback = EFalse;
+    
+    if ( iClient )
+        {
+        for ( TInt i=0; i < iControlCache.Count(); i++ )
+            {
+            if ( iControlCache[i].iControl == aControl )
+                {
+                if ( iControlCache[i].iAreaArray.Count() > 0 )
+                    {
+                    hasFeedback =  ETrue;                    
+                    }
+                    
+                // Break out from loop anyway, since we found the
+                // control
+                break;
+                }
+            }        
+        }
+        
+    return hasFeedback;
+    }
+
+// ---------------------------------------------------------------------------
+// Control has feedback if it has a feedback identifier with given index
+// number.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::ControlHasFeedback( 
+    const CCoeControl* aControl, 
+    TUint32 aIndex )
+    {
+    TBool hasArea = EFalse;
+    
+    if ( iClient )
+        {
+        TInt cacheIndex = KErrNotFound;
+        TInt areaIndex  = KErrNotFound;
+        
+        FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+        
+        if ( cacheIndex >= 0 && areaIndex >= 0 )
+            {
+            hasArea = ETrue;
+            }
+        }
+
+    return hasArea;
+    }  
+  
+// ---------------------------------------------------------------------------
+// This overload is only wrapper to the real function
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::EnableFeedbackForControl( 
+    const CCoeControl* aControl, 
+    TBool aEnable )
+    {
+    EnableFeedbackForControl( aControl, aEnable, aEnable );
+    }    
+
+// ---------------------------------------------------------------------------
+// #1 Find control from the cache
+// #2 In case control was found, disable/enable it's registry entries, and
+//    also take into accound it's dimming status
+// #3 If control was not found, then add it to cache
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::EnableFeedbackForControl( 
+    const CCoeControl* aControl,
+    TBool aEnableVibra,
+    TBool aEnableAudio )
+    {
+    TRACE4( "CTouchFeedbackImpl::EnableFeedbackForControl - 0x%x Vibra:%d Audio:=%d", 
+           aControl, aEnableVibra, aEnableAudio );
+
+    if ( aControl )
+        {
+        // #1
+        TInt cacheIndex = FindControlFromCache( aControl );
+
+        if ( cacheIndex >= 0 )
+            {
+            // #2
+            TControlCacheEntry& entry ( iControlCache[cacheIndex] );
+            
+            entry.iVibraDisabled = !aEnableVibra;
+            entry.iAudioDisabled = !aEnableAudio;
+            
+            // Let's update visibility and dimming information also now
+            // that we have the pointer to control (due to broken object
+            // provider chain we might not have the correct information on 
+            // the moment).
+            entry.iDimmed  = aControl->IsDimmed();
+            entry.iVisible = aControl->IsVisible();
+            
+            if ( ControlsAreasActive( cacheIndex ) )
+                {
+                // If control is active (undimmed and visible), then we 
+                // set the areas according to parameters.
+                DoEnableControlsAreasInRegistry( cacheIndex, 
+                                                 aEnableVibra, 
+                                                 aEnableAudio,
+                                                 aControl->IsVisible() );
+                }
+            else
+                {
+                // If control is not active, then we disable all feedback.
+                DoEnableControlsAreasInRegistry( cacheIndex, 
+                                                 EFalse, 
+                                                 EFalse, 
+                                                 aControl->IsVisible() );
+                }
+            }
+        else if ( !aEnableVibra || !aEnableAudio  )
+            {
+            // #3 We have to add control to the cache in case
+            // it is not there yet (and disabling is wanted), because
+            // otherwise it will be impossible to block feedback
+            TUint32 clientHandle = ClientHandle( aControl );
+            
+            // We need to rely elsewhere that client handle exist if control
+            // is found in the cache --> Only make new entry if client
+            // handle can be aquired.
+            if ( clientHandle > 0 )
+                {
+                TControlCacheEntry newCacheEntry;
+                
+                newCacheEntry.iControl        = aControl;
+                newCacheEntry.iClientHandle   = clientHandle;
+                newCacheEntry.iVibraDisabled  = !aEnableVibra;
+                newCacheEntry.iAudioDisabled  = !aEnableAudio;
+                newCacheEntry.iVisible        = aControl->IsVisible();
+                newCacheEntry.iDimmed         = aControl->IsDimmed();
+                        
+                iControlCache.Append( newCacheEntry );                        
+                }
+            }        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Store the current status of audio and vibra feedbacks for this 
+// application, and notify server of the change.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::SetFeedbackEnabledForThisApp( 
+    TBool aVibraEnabled, 
+    TBool aAudioEnabled )
+    {
+    TRACE3( "CTouchFeedbackImpl::SetFeedbackEnabledForThisApp %d %d", aVibraEnabled, aAudioEnabled );
+    
+    // Only notify server when enabled value really changes.
+    if ( iClient && 
+       (( aAudioEnabled != iAudioEnabledForThisApp ) || 
+         (aVibraEnabled != iVibraEnabledForThisApp ) ))
+        {
+        iClient->RegistryChanged();        
+        }
+        
+    iAudioEnabledForThisApp = aAudioEnabled;      
+    iVibraEnabledForThisApp = aVibraEnabled;      
+    }
+
+// ---------------------------------------------------------------------------
+// Simple utility for CTouchFeedbackClient
+// ---------------------------------------------------------------------------
+//
+RPointerArray<CTouchFeedbackRegistry>* CTouchFeedbackImpl::RegistryArray()
+    {
+    return &iRegistryArray;
+    }
+        
+// ---------------------------------------------------------------------------
+// Simple utility for CTouchFeedbackClient
+//
+// We return zero in case pen is not supported in current layout. This way
+// area registry is disabled in non-touch powered layouts, but feedback areas
+// are still kept in memory so that feedback can be enabled again in case 
+// layout changes.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::GetAreaCount( TInt& aAreaCount, TInt& aWindowCount )
+    {
+    aWindowCount = 0;
+    aAreaCount = 0;
+    
+    if ( iPenEnabled )
+        {
+        aWindowCount = iRegistryArray.Count();
+        aAreaCount =  iNbOfFeedbackAreas;            
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// This function is called by the application framework when any control's
+// visibility or dimming status has changed.
+//
+// We need to determine here whether the given control has any feedback,
+// and whether its current state requires a change in feedback
+// areas (for e.g. feedback areas will be disabled for any dimmed control).
+//
+// #1 Find control from cache (we don't need to do anything in case it
+//    is not found.
+// #2 Check if control's feedback areas are now active (based on dimming,
+//    visibility and feedback disabling). Also check control's current 
+//    visibility status as itself, as this determines whether the area will
+//    be put to registry at all.
+// #3 Save control's current dimming and visibility status
+// #4 Check again if control's areas should  be active
+// #5 Disable/Enable areas in case needed
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::ControlVisibilityChanged( 
+    const CCoeControl* aControl )
+    {
+    if ( iClient && aControl )
+        {
+        // #1
+        TInt cacheIndex = FindControlFromCache( aControl );
+        
+        if ( cacheIndex >= 0 )
+            {
+            // #2
+            TBool oldStatus = ControlsAreasActive( cacheIndex );
+            TBool oldVisible = iControlCache[cacheIndex].iVisible;
+            
+            // #3
+            iControlCache[cacheIndex].iVisible = aControl->IsVisible();
+            iControlCache[cacheIndex].iDimmed  = aControl->IsDimmed();
+                
+            
+            // #4
+            TBool newStatus = ControlsAreasActive( cacheIndex );
+            
+            // #5
+            if ( ( oldStatus != newStatus ) || 
+                 ( oldVisible != aControl->IsVisible() ) )
+                {
+                if ( newStatus ) // If control is now active
+                    {
+                    DoEnableControlsAreasInRegistry( 
+                        cacheIndex, 
+                        !iControlCache[cacheIndex].iVibraDisabled,
+                        !iControlCache[cacheIndex].iAudioDisabled,
+                        aControl->IsVisible() );
+                    }
+                else
+                    {
+                    DoEnableControlsAreasInRegistry( cacheIndex, 
+                                                     EFalse, 
+                                                     EFalse,
+                                                     aControl->IsVisible() );
+                    }
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Here we check whether the pen support status has changed, and update
+// registry in case needed.
+//
+// Notice that this has not effect on direct feedback: It is completely on
+// UI control's responsibility to check if pen is supported with direct
+// feedback (direct feedback is not automatically disabled because that
+// would cause problems in compatibility mode).
+//
+// Also notice that we don't actually destroy any feedback areas when pen
+// usage is not supported: We just report zero areas to server side, but
+// still keep everything in memory (see GetAreaCount -function)
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::LayoutChanged()
+    {    
+    if ( iClient )
+        {
+        TBool penEnabledNow = AknLayoutUtils::PenEnabled();
+
+        TRACE2("CTouchFeedbackImpl::LayoutChanged, PenEnabled = %d", penEnabledNow);
+        
+        if ( penEnabledNow != iPenEnabled )
+            {
+            iPenEnabled = penEnabledNow;
+            
+            iClient->RegistryChanged();                    
+            }        
+        }
+    }
+
+// new functions from MTouchFeedback that came in 5.2
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::FeedbackEnabledForThisApp( TTouchFeedbackType aFeedbackType )
+    {
+    TBool feedbackEnabled( ETrue );
+    
+    if ( (aFeedbackType & ETouchFeedbackAudio) && !iAudioEnabledForThisApp )
+        {
+        feedbackEnabled = EFalse;
+        }
+
+    if ( (aFeedbackType & ETouchFeedbackVibra) && !iVibraEnabledForThisApp )
+        {
+        feedbackEnabled = EFalse;
+        }        
+        
+    if ( !aFeedbackType )        
+        {
+        feedbackEnabled = EFalse;
+        }
+   
+    return feedbackEnabled;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::StartFeedback( const CCoeControl* aControl,
+                                        TTouchContinuousFeedback aType,
+                                        const TPointerEvent* /*aPointerEvent*/,
+                                        TInt aIntensity,
+                                        TTimeIntervalMicroSeconds32 aTimeout )
+    {
+    if ( iClient && ( iAudioEnabledForThisApp || iVibraEnabledForThisApp ) )
+        {
+        // First take application level vibra and audio enablers
+        // as default
+        TBool vibraEnabled = iVibraEnabledForThisApp;
+        TBool audioEnabled = iAudioEnabledForThisApp;
+
+        TInt cacheIndex = FindControlFromCache( aControl );
+        
+        
+        // Check control level disablers for vibra and audio.
+        // (These can only prevent vibra or audio effect playback,
+        //  but not to force it on)
+        if ( cacheIndex >=0 && vibraEnabled ) 
+            {
+            vibraEnabled = !iControlCache[cacheIndex].iVibraDisabled;
+            }
+            
+        if ( cacheIndex >=0 && audioEnabled ) 
+            {
+            audioEnabled = !iControlCache[cacheIndex].iAudioDisabled;
+            }
+            
+        if ( vibraEnabled || audioEnabled )
+            {
+            TRACE4("CTouchFeedbackImpl::StartFeedback, type:=%d intensity:%d, timeout:%d", aType, aIntensity, aTimeout);
+            TUint32 clientHandle = ClientHandle( aControl );
+            iClient->StartFeedback( clientHandle, 
+                                    aType, 
+                                    aIntensity, 
+                                    aTimeout );    
+            }
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::ModifyFeedback( const CCoeControl* aControl,
+                                         TInt aIntensity )
+    {
+    if ( iClient )
+        {
+        TRACE2("CTouchFeedbackImpl::ModifyFeedbac, intensity:%d, timeout:%d", aIntensity);
+        TUint32 clientHandle = ClientHandle( aControl );
+        iClient->ModifyFeedback( clientHandle, aIntensity );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//                             
+void CTouchFeedbackImpl::StopFeedback( const CCoeControl* aControl )
+    {
+    if ( iClient )
+        {
+        TUint32 clientHandle = ClientHandle( aControl );
+        iClient->StopFeedback( clientHandle );
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackImpl::SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType )
+    {
+    TInt ret( KErrGeneral );
+    if ( iClient )
+        {
+        ret = iClient->SetFeedbackEnabledForDevice( aFeedbackType );
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TTouchFeedbackType CTouchFeedbackImpl::FeedbackEnabledForDevice()
+    {
+    TTouchFeedbackType enabled( static_cast<TTouchFeedbackType>(0) );
+    if ( iClient )
+        {
+        enabled = iClient->FeedbackEnabledForDevice();
+        }
+    return enabled;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::InstantFeedback( const CCoeControl* aControl,
+                                          TTouchLogicalFeedback aType,
+                                          const TPointerEvent& /*aPointerEvent*/ )
+    {
+    InstantFeedback(aControl, aType);
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackImpl::SetFeedbackArea( const CCoeControl* aControl, 
+                                          TUint32 aIndex,
+                                          TRect aRect, 
+                                          CFeedbackSpec* aFeedbackSpec )
+    {
+    // #1
+    if ( !iClient )
+        {
+        return KErrNone;
+        }
+    
+    // #2
+    if ( !aControl )
+        {
+        TRACE("CTouchFeedbackImpl::SetFeedbackArea(spec) - Err: NULL Control");
+        return KErrArgument;
+        }
+        
+    // #4        
+    TUint32 clientHandle = ClientHandle( aControl );
+    
+    if ( !clientHandle )
+        {
+        TRACE("CTouchFeedbackImpl::SetFeedbackArea(spec) - Err: Invalid Control");        
+        return KErrArgument;
+        }
+    
+    // #5    
+    TRAPD( err, 
+        DoSetFeedbackAreaL( 
+            aControl, 
+            aIndex, 
+            aRect, 
+            aFeedbackSpec, 
+            clientHandle ) );
+
+    if (err)
+        {
+        TRACE2("CTouchFeedbackImpl::SetFeedbackArea(spec) err = %d", err );
+        }
+    
+    return err;    
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CTouchFeedbackImpl::InstantFeedback( const CCoeControl* aControl,
+                                          TTouchLogicalFeedback aType,
+                                          TTouchFeedbackType aFeedbackType,
+                                          const TPointerEvent& /*aPointerEvent*/ )
+    {
+    if ( iClient && ( iAudioEnabledForThisApp || iVibraEnabledForThisApp ) )
+        {
+        // Initialize vibra and audio enablers as given in param.
+        TBool vibraEnabled = aFeedbackType & ETouchFeedbackVibra;
+        TBool audioEnabled = aFeedbackType & ETouchFeedbackAudio;
+
+        // Check application level vibra and audio enablers
+        if ( !iVibraEnabledForThisApp )
+            {
+            vibraEnabled = EFalse;
+            }
+        if ( !iAudioEnabledForThisApp )
+            {
+            audioEnabled = EFalse;
+            }            
+
+        TInt cacheIndex = FindControlFromCache( aControl );
+        
+        
+        // Check control level disablers for vibra and audio.
+        // (These can only prevent vibra or audio effect playback,
+        //  but not to force it on)
+        if ( cacheIndex >=0 && vibraEnabled ) 
+            {
+            vibraEnabled = !iControlCache[cacheIndex].iVibraDisabled;
+            }
+            
+        if ( cacheIndex >=0 && audioEnabled ) 
+            {
+            audioEnabled = !iControlCache[cacheIndex].iAudioDisabled;
+            }
+            
+        TRACE5("CTouchFeedbackImpl::InstantFeedback, 0x%x, type:=%d Vibra:%d Audio:%d", 
+               aControl, aType, vibraEnabled, audioEnabled);
+        iClient->ImmediateFeedback( aType, vibraEnabled, audioEnabled );   
+        }
+    }
+        
+// ---------------------------------------------------------------------------
+// Here we do the actual work for adding new area to the registry
+// (or updating an existing one).
+//
+// #1 Check that control exist in the cache
+//    #2a If it does not exist, then add it
+//    #2b If control exists, but area not, then add new area
+//    #2c If control and area both exist, then use existing id
+// #3 Find corresponding registry entry
+// #4 Create new entry if this was the first area for this window
+// #5 Determine if new area should actually be active, and then
+//    add it to registry
+// #6 Inform server if we added an active area
+//
+// We use specific cleanup items for removing the added area and/or control
+// from the control cache in caes adding of the area to the actual 
+// registry fails. This way actual registry and control cache will remain
+// in sync no matter what happens.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::DoSetFeedbackAreaL( 
+                                const CCoeControl* aControl, 
+                                TUint32 aIndex,
+                                TRect aRect, 
+                                CFeedbackSpec* aFeedbackSpec, 
+                                TUint32 aClientHandle )
+    {
+    TInt id = KErrNotFound;
+    TInt nbOfCleanupItems = 0;
+    TBool newArea = EFalse;
+    
+    // #1
+    TInt cacheIndex = KErrNotFound;
+    TInt areaIndex  = KErrNotFound;
+    FindAreaFromCache( aControl, aIndex, cacheIndex, areaIndex );
+
+    // #2a
+    if ( cacheIndex < 0 )
+        {
+        id = GenerateUniqueIdL();
+        
+        TControlCacheEntry newCacheEntry;
+        
+        newCacheEntry.iControl            = aControl;
+        newCacheEntry.iClientHandle       = aClientHandle;
+        newCacheEntry.iVibraDisabled      = EFalse;
+        newCacheEntry.iAudioDisabled      = EFalse;
+        newCacheEntry.iVisible         = aControl->IsVisible();
+        newCacheEntry.iDimmed          = aControl->IsDimmed();
+        
+        // New entry will be added at the end of array
+        // This assignment will also make it possible to use
+        // "cacheIndex" -variable in the rest of the function
+        // in all cases.
+        cacheIndex = iControlCache.Count();
+        
+        iControlCache.AppendL( newCacheEntry );  
+        
+        // Use cleanup item to remove the control in case something
+        // fails later in this function.
+        CleanupStack::PushL(
+            TCleanupItem( CleanupCacheArray, &iControlCache ) );  
+        nbOfCleanupItems++;    
+        
+        TAreaIndexEntry newAreaEntry;
+        
+        newAreaEntry.iIndex  = aIndex;
+        newAreaEntry.iAreaId = id;
+        
+        iControlCache[cacheIndex].iAreaArray.AppendL( newAreaEntry );
+        
+        // Use cleanup item to remove the area id in case something
+        // fails later in this function.
+        CleanupStack::PushL( 
+            TCleanupItem( CleanupAreaArray, 
+                          &iControlCache[cacheIndex].iAreaArray) );  
+        nbOfCleanupItems++;    
+                 
+        newArea = ETrue;   
+        
+        // Enable control state change reports on the new control
+        CCoeControl* tmp =  const_cast<CCoeControl*>( aControl );
+        tmp->EnableReportControlStateChange( ETrue );
+        }
+    // #2b   
+    else if ( areaIndex < 0 )
+        {
+        id = GenerateUniqueIdL();
+        
+        TAreaIndexEntry newAreaEntry;
+    
+        newAreaEntry.iIndex  = aIndex;
+        newAreaEntry.iAreaId = id;
+
+        iControlCache[cacheIndex].iAreaArray.AppendL( newAreaEntry );
+        
+        CleanupStack::PushL( 
+            TCleanupItem( CleanupAreaArray, 
+                          &iControlCache[cacheIndex].iAreaArray) );  
+        nbOfCleanupItems++;    
+
+        newArea = ETrue;   
+        }
+    // #2c
+    else
+        {
+        id = iControlCache[cacheIndex].iAreaArray[areaIndex].iAreaId;
+        }
+               
+    // #3              
+    TInt registryIndex = FindWindowFromRegistry ( aClientHandle );
+    
+    // #4   
+    if (  registryIndex == KErrNotFound )
+        {
+        // There isn't yet a registry entry for this window
+        // --> Create it
+        CTouchFeedbackRegistry* newRegistry = 
+            CTouchFeedbackRegistry::NewL( aClientHandle );
+            
+        CleanupStack::PushL( newRegistry );
+        
+        registryIndex = iRegistryArray.Count();
+                
+        iRegistryArray.AppendL( newRegistry );
+        
+        CleanupStack::Pop( newRegistry );
+        }
+
+    // #5 Determine what is the vibra and audio status for the new area
+    //    (if control is invisible or dimmed then both will be disabled)    
+    TBool vibraEnabled = EFalse;
+    TBool audioEnabled = EFalse;
+    
+    TBool areaActive = ControlsAreasActive( cacheIndex );
+    
+    if ( areaActive )
+        {
+        vibraEnabled = !iControlCache[cacheIndex].iVibraDisabled;
+        audioEnabled = !iControlCache[cacheIndex].iAudioDisabled;
+        }
+        
+    
+    RArray<TTactileFbItem> feedbackEntries;
+    CleanupClosePushL( feedbackEntries );
+    TTouchEventType eventType(ETouchEventStylusDown);
+    TTouchLogicalFeedback feedbackTypeDown = ETouchFeedbackNone;
+    TTouchLogicalFeedback feedbackTypeUp   = ETouchFeedbackNone;
+    TTouchFeedbackType feedbackDown = ETouchFeedbackVibra;
+    TTouchFeedbackType feedbackUp   = ETouchFeedbackVibra;
+    aFeedbackSpec->GetFeedbackSpec(feedbackEntries);
+    TInt feedbackItems = feedbackEntries.Count();
+    for (TInt i=0;i<feedbackItems;i++)
+        {
+        TTactileFbItem item = feedbackEntries[i];
+        eventType = item.iEventType;
+        
+        if ( item.iEventType == ETouchEventStylusDown )
+            {
+            feedbackTypeDown = item.iFeedback;
+            feedbackDown = item.iFeedbackType;
+            }
+        else if ( item.iEventType == ETouchEventStylusUp )
+            {
+            feedbackTypeUp = item.iFeedback;
+            feedbackUp = item.iFeedbackType;
+            }
+        }
+    if ( feedbackItems > 0 )
+        {
+        iRegistryArray[registryIndex]->AddFeedbackAreaL( 
+            aRect, feedbackTypeDown, feedbackDown, feedbackTypeUp, feedbackUp, 
+            eventType, id, vibraEnabled, audioEnabled, aControl->IsVisible() );
+        }
+    CleanupStack::PopAndDestroy( &feedbackEntries );
+        
+    // We can now remove the cleanup items, because nothing can fail 
+    // anymore.    
+    CleanupStack::Pop( nbOfCleanupItems );    
+    
+    // We can also update the counter now, when we know that the area
+    // was actually added
+    if ( newArea )
+        {
+        iNbOfFeedbackAreas++;
+        }
+
+    // #6 We only need to inform server in case we added an active area
+    // to the registry.
+    if ( areaActive ) 
+        {
+        iClient->RegistryChanged();        
+        }
+    }
+        
+// ---------------------------------------------------------------------------
+// A simple for -loop should be enough here, as we are not likely to have
+// that many windows in one application process.
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackImpl::FindWindowFromRegistry( TUint aWindowHandle )
+    {
+    TInt index = KErrNotFound;
+    
+    for ( TInt i=0; i < iRegistryArray.Count(); i++ )
+        {
+        if ( iRegistryArray[i]->WindowHandle() == aWindowHandle )
+            {
+            index = i;
+            break;
+            }
+        }
+        
+    return index;
+    }
+    
+// ---------------------------------------------------------------------------
+// Just ask client to do updates immediately
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::FlushRegistryUpdates( )
+    {
+    if ( iClient )
+        {
+        TRACE("CTouchFeedbackImpl::FlushRegistryUpdates" ); 
+        iClient->FlushUpdates();
+        }
+    }    
+    
+// ---------------------------------------------------------------------------
+// We use integer numers starting from 1 as area identifiers. 
+//
+// There is a bookkeeping of last used identifier, and we'll start from one
+// again after reaching the maximum value. 
+//
+// There is also a separate bookkeeping to know if our id values have been
+// rotated at least once or not. From that we know if we have to check that
+// the id is not in use already (if we are on the first round, then there 
+// cannot be any area with the new id).
+//
+// Notice that it should be checked already _before_ calling this function,
+// whether it is actually possible to find an unused identifier anymore.
+// ---------------------------------------------------------------------------
+//
+TUint CTouchFeedbackImpl::GenerateUniqueIdL()
+    {
+    // First check that there actually is an identifier that we can find
+    // (i.e. check that maximum number of areas has not been reached)
+    if ( iNbOfFeedbackAreas >= KTouchMaxFeedbackAreaIdentifier )
+        {
+        User::Leave( KErrNoMemory );
+        }
+    
+    iCurrentId++;
+    
+    if ( iCurrentId > KTouchMaxFeedbackAreaIdentifier )
+        {
+        iCurrentId = 1;
+        
+        iCurrentIdCounterRotated = ETrue;
+        }
+        
+    if ( iCurrentIdCounterRotated )
+        {
+        while ( FeedbackAreaExists( iCurrentId ) )
+            {
+            iCurrentId++;
+            
+            if ( iCurrentId > KTouchMaxFeedbackAreaIdentifier )
+                {
+                iCurrentId = 1;
+                }
+            }
+        
+        }
+    
+    return iCurrentId;
+    }
+    
+// ---------------------------------------------------------------------------
+// Scan through local registry in order to know whether the area with
+// given identifier exists.
+//
+// This function is only used when creating a new unique identifier.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::FeedbackAreaExists( TUint aAreaId )
+    {
+    TBool areaExists = EFalse;
+    
+    for ( TInt i=0; i < iRegistryArray.Count() && !areaExists; i++ )
+        {
+        RArray<TFeedbackEntry>* entryArray = 
+            iRegistryArray[i]->WindowRegistry(); 
+        
+        for ( TInt j=0; j < entryArray->Count() && !areaExists; j++ )
+            {
+            if ( (*entryArray)[j].iId == aAreaId )
+                {
+                areaExists = ETrue;
+                }
+            }
+        }   
+    
+    return areaExists;
+    }
+        
+// ---------------------------------------------------------------------------
+// Because we use the so called "client handle" for identifying windows on
+// client- and server sides, we must be able to generate a client handle
+// from CCoeControl -pointer.
+//
+// The algorithm:
+//
+// #1 Loop as long as we haven't reached the top-level control, and we still
+//    haven't found the first window-owning control.
+// 
+// #2 If this is a window-owning control, then it's address is the
+//    client-side handle
+//
+// #3 Otherwise move up to next parent
+//
+// #4 If this control doesn't have paren't pointer, then try to get
+//    a pointer to this control's window.
+//
+// #5 If we got the window, then use the ClientHandle -function for 
+//    retrieving the pointer from server side
+//
+// #6 If we don't have parent- or window pointers, then give up.
+// ---------------------------------------------------------------------------
+//
+TUint32 CTouchFeedbackImpl::ClientHandle( const CCoeControl* aControl )
+    {
+    TUint32 clientHandle = 0;
+    
+    const CCoeControl* parent = aControl;
+    
+    // #1
+    while ( clientHandle == 0 && parent )
+        {
+        if ( parent->OwnsWindow() )
+            {
+            // #2
+            clientHandle = reinterpret_cast<TUint32>( parent );            
+            }
+        else
+            {
+            // #3
+            parent = parent->Parent();
+            
+            if ( !parent )
+                {      
+                // #4          
+                RDrawableWindow* window = aControl->DrawableWindow();
+                
+                if ( window )
+                    {
+                    // #5
+                    TRACE("CTouchFeedbackImpl::ClientHandle - Ask handle from wserv - begin" );
+                    clientHandle = window->ClientHandle();
+                    TRACE("CTouchFeedbackImpl::ClientHandle - Ask handle from wserv - end" );
+                    }
+                else
+                    {
+                    // #6
+                    TRACE("CTouchFeedbackImpl::ClientHandle - Error: No window defined, not possible to get handle!!");
+                    }
+                
+                }
+            }        
+        }
+        
+    return clientHandle;
+    }
+    
+// ---------------------------------------------------------------------------
+// We could optimize this search in case we get very many controls to the
+// array, but so far it hasn't been necessary.
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackImpl::FindControlFromCache( 
+    const CCoeControl* aControl )
+    {
+    TInt position = KErrNotFound;
+    
+    for ( TInt i=0; i < iControlCache.Count(); i++ )
+        {
+        if ( iControlCache[i].iControl == aControl )
+            {
+            position = i;
+            break;
+            }
+        }
+        
+    return position;    
+    }
+        
+// ---------------------------------------------------------------------------
+// If this search is starting to take too long time, then the best 
+// optimization would be to optimize the FindControlFromCache -function,
+// as there can potentially be very many controls, but not likely very many
+// ares per each control.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::FindAreaFromCache( 
+    const CCoeControl* aControl, 
+    TUint32 aIndex, 
+    TInt& aCacheIndex, 
+    TInt& aAreaIndex )
+    {
+    aAreaIndex  = KErrNotFound;
+
+    aCacheIndex = FindControlFromCache( aControl );
+        
+    if ( aCacheIndex >= 0 )
+        {
+        TControlCacheEntry& entry (iControlCache[aCacheIndex]);
+        
+        for ( TInt i=0; i < entry.iAreaArray.Count(); i++ )
+            {
+            if ( entry.iAreaArray[i].iIndex == aIndex )
+                {
+                aAreaIndex = i;
+                break;
+                }
+            } 
+        }
+    }   
+   
+// ---------------------------------------------------------------------------
+// Here we remove the control from the cache. It is assumed that
+// corresponding feedback areas have been removed from registry
+// already.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::RemoveControlFromCache( TInt aControlIndex )
+    {
+    __ASSERT_ALWAYS(  
+        aControlIndex >= 0 && aControlIndex < iControlCache.Count(),
+        Panic( ETouchClientPanicArrayAccess ) );
+        
+    iControlCache[aControlIndex].iAreaArray.Reset();
+    iControlCache[aControlIndex].iAreaArray.Close();
+    
+    iControlCache.Remove( aControlIndex );
+    }
+         
+// ---------------------------------------------------------------------------
+// We have a separate function for knowing if control's feedback areas
+// should be active or not, because determining this is not so simple, and
+// because this part can still change.
+// 
+// Control's areas are NOT active in case
+//
+//  #1 Its feedback has been explicitely disabled for audio and vibra
+//
+// OR
+//
+//  #2 It is not visible 
+//
+// OR 
+//
+//  #3 It is dimmed.
+//
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackImpl::ControlsAreasActive( TInt aControlIndex )
+    {
+    __ASSERT_ALWAYS(  
+        aControlIndex >= 0 && aControlIndex < iControlCache.Count(),
+        Panic( ETouchClientPanicArrayAccess ) );
+
+    TBool ret = ETrue;
+    
+    if ( ( iControlCache[aControlIndex].iVibraDisabled &&     // #1
+           iControlCache[aControlIndex].iAudioDisabled ) ||   
+          !iControlCache[aControlIndex].iVisible || // #2
+          iControlCache[aControlIndex].iDimmed )    // #3
+        {
+        ret = EFalse;
+        }
+        
+    return ret;
+    }   
+   
+// ---------------------------------------------------------------------------
+// This function can be used for disabling or enabling all control's 
+// feedback areas in the registry.
+//
+// #1 Find out the registry index.
+// #2 In a loop, disable / enable each feedback area for this control
+// #3 Maintain bookkeeping, so that we will know in the end if anything 
+//    changed or not (so that we won't make unnecessary updates to server)
+// #4 Make a pending update request if registry really changed.
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackImpl::DoEnableControlsAreasInRegistry( 
+    TInt aControlIndex,
+    TBool aEnableVibra,
+    TBool aEnableAudio,
+    TBool aVisible )
+    {
+    __ASSERT_ALWAYS(  
+        aControlIndex >= 0 && aControlIndex < iControlCache.Count(),
+        Panic( ETouchClientPanicArrayAccess ) );
+
+    TBool registryChanged = EFalse;
+    
+    TControlCacheEntry& entry ( iControlCache[aControlIndex] );
+    
+    // #1
+    TInt registryIndex = FindWindowFromRegistry ( entry.iClientHandle );
+
+    if ( registryIndex != KErrNotFound )
+        {
+        for ( TInt i=0; i < entry.iAreaArray.Count(); i++ )
+            {
+            TInt id = entry.iAreaArray[i].iAreaId;
+            
+            // #2
+            TBool changedNow = 
+                iRegistryArray[registryIndex]->SetFeedbackEnabled( 
+                    id, aEnableVibra, aEnableAudio, aVisible );
+                    
+            // #3       
+            registryChanged = registryChanged || changedNow;
+            }
+        }
+    
+    // #4
+    if ( registryChanged )
+        {
+        iClient->RegistryChanged();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CFeedbackSpec* CFeedbackSpec::New()
+    {
+    return new CFeedbackSpec;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CFeedbackSpec::~CFeedbackSpec()
+    {
+    iFbArray.Close();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFeedbackSpec::AddFeedback( TTouchEventType aEventType, 
+                                          TTouchLogicalFeedback aFeedback )
+    {
+    // Vibra feedback is enabled by default for every event type.
+    TInt fbType( ETouchFeedbackVibra | ETouchFeedbackAudio );
+    
+    return AddFeedback( aEventType, 
+                        aFeedback, 
+                        static_cast<TTouchFeedbackType>( fbType ) );
+    }
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFeedbackSpec::AddFeedback( TTouchEventType aEventType, 
+                                          TTouchLogicalFeedback aFeedback,
+                                          TTouchFeedbackType aFeedbackType )
+    {
+    TTactileFbItem item;
+    if ( !(aEventType >= ETouchEventStylusDown && aEventType <= ETouchEventStylusPressUp ) )
+        {
+        return KErrArgument;
+        }
+    item.iEventType = aEventType;        
+    
+	// range check. update when logical feedback types are changed.
+    if (! ( aFeedback >= ETouchFeedbackNone || aFeedback <= ETouchFeedbackSensitive) 
+     || ! ( aFeedback >= ETouchFeedbackBasicButton || 
+            aFeedback <= ETouchFeedbackMultiTouchRecognized ) )
+        {
+        return KErrArgument;
+        }
+    item.iFeedback = aFeedback;        
+    item.iFeedbackType = aFeedbackType;
+        
+    iFbArray.Append(item);
+    return KErrNone;
+    }    
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFeedbackSpec::GetFeedbackSpec( RArray<TTactileFbItem>& aArray )
+    {
+    // copy values from one array to another
+    TInt count = iFbArray.Count();
+    aArray.Reset(); // remove records from array if any
+    
+    for ( TInt i=0 ; i < count ; i++ )
+        {
+        TTactileFbItem item;
+        item.iFeedback  = iFbArray[i].iFeedback;
+        item.iEventType = iFbArray[i].iEventType;
+        item.iFeedbackType = iFbArray[i].iFeedbackType;
+        aArray.Append(item);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CFeedbackSpec::CFeedbackSpec()
+    {
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackregistry.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,294 @@
+/*
+* Copyright (c) 2007-2009 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:  Local area registry management in client's process.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <eikenv.h>
+
+#include "touchfeedbackregistry.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackRegistry::CTouchFeedbackRegistry( TUint aWindowHandle ): 
+    iWindowHandle( aWindowHandle )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackRegistry* CTouchFeedbackRegistry::NewL(
+    TUint aWindowHandle )
+    {
+    CTouchFeedbackRegistry* self = 
+        new( ELeave ) CTouchFeedbackRegistry ( aWindowHandle );
+
+    // ConstructL not needed on the moment
+    // --> Just return created instance right away
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTouchFeedbackRegistry::~CTouchFeedbackRegistry()
+    {
+    iAreaArray.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// #1 If area exists already, then update it
+// #2 Otherwise add it to the beginning of registry
+//
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackRegistry::AddFeedbackAreaL( 
+    TRect aRect,
+    TTouchLogicalFeedback aFeedbackTypeDown, 
+    TTouchFeedbackType aFeedbackDown,
+    TTouchLogicalFeedback aFeedbackTypeUp, 
+    TTouchFeedbackType aFeedbackUp,
+    TTouchEventType aEventType,
+    TUint aId,
+    TBool aVibraEnabled,
+    TBool aAudioEnabled,
+    TBool aVisible )
+    {
+    TBool update = EFalse;
+    
+    // #1
+    for ( TInt i = 0; i < iAreaArray.Count() && !update; i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            iAreaArray[i].iRect         = aRect;
+            iAreaArray[i].iFeedbackTypeDown = aFeedbackTypeDown;
+            iAreaArray[i].iFeedbackDown     = aFeedbackDown;
+            iAreaArray[i].iFeedbackTypeUp   = aFeedbackTypeUp;
+            iAreaArray[i].iFeedbackUp       = aFeedbackUp;
+            iAreaArray[i].iEventType    = aEventType;
+            iAreaArray[i].iVibraEnabled = aVibraEnabled;
+            iAreaArray[i].iAudioEnabled = aAudioEnabled;
+            iAreaArray[i].iVisible      = aVisible;
+            
+            update = ETrue;
+            }
+        }
+
+    // #2
+    if ( !update )
+        {
+        TFeedbackEntry newEntry;
+        
+        newEntry.iRect         = aRect;
+        newEntry.iFeedbackTypeDown = aFeedbackTypeDown;
+        newEntry.iFeedbackDown     = aFeedbackDown;
+        newEntry.iFeedbackTypeUp   = aFeedbackTypeUp;
+        newEntry.iFeedbackUp       = aFeedbackUp;
+        newEntry.iEventType    = aEventType;
+        newEntry.iId           = aId;
+        newEntry.iVibraEnabled = aVibraEnabled;
+        newEntry.iAudioEnabled = aAudioEnabled;
+        newEntry.iVisible      = aVisible;
+        
+        iAreaArray.AppendL( newEntry );        
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CTouchFeedbackRegistry::RemoveFeedbackArea( TUint aId )
+    {
+    for ( TInt i = 0; i < iAreaArray.Count(); i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            iAreaArray.Remove( i );
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackRegistry::ChangeFeedbackArea(
+    TUint aId, 
+    TRect aNewRect )
+    {
+    TBool changed = EFalse;
+    
+    for ( TInt i = 0; i < iAreaArray.Count(); i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            // Check if we really have to change something
+            if ( iAreaArray[i].iRect != aNewRect )
+                {
+                iAreaArray[i].iRect = aNewRect;
+                
+                changed = ETrue;                
+                }
+            
+            // Anyway break out from the loop, as we found the area
+            // already
+            break;
+            }
+        }
+    
+    return changed;
+    }
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackRegistry::ChangeFeedbackType(
+    TUint aId, 
+    TTouchLogicalFeedback aNewFeedbackTypeDown,
+    TTouchLogicalFeedback aNewFeedbackTypeUp )
+    {
+    TBool changed = EFalse;
+    
+    for ( TInt i = 0; i < iAreaArray.Count(); i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            // Check if we really have to change something
+            if ( iAreaArray[i].iFeedbackTypeDown != aNewFeedbackTypeDown )
+                {
+                iAreaArray[i].iFeedbackTypeDown = aNewFeedbackTypeDown;
+                changed = ETrue;               
+                }
+            if ( aNewFeedbackTypeUp != 0xFFFFFFFF && 
+                 iAreaArray[i].iFeedbackTypeUp != aNewFeedbackTypeUp )
+                {
+                iAreaArray[i].iFeedbackTypeUp = aNewFeedbackTypeUp;
+                changed = ETrue;               
+                }
+            
+            // Anyway break out from the loop, as we found the area
+            // already
+            break;
+            }
+        }
+    
+    return changed;
+    }
+    
+// ---------------------------------------------------------------------------
+// Areas are moved to server side starting from last position
+// --> We need to make the desired area the last one in the array.
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackRegistry::MoveFeedbackAreaToFirstPriority( TUint aId )
+    {
+    TInt ret = KErrNotFound;
+    
+    for ( TInt i = 0; i < iAreaArray.Count(); i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            TFeedbackEntry tmpEntry = iAreaArray[i];
+            
+            TInt lastPosition = iAreaArray.Count()-1;
+            
+            iAreaArray[i]            = iAreaArray[lastPosition];
+            iAreaArray[lastPosition] = tmpEntry;
+            
+            ret = KErrNone;
+            
+            break;
+            }
+        }
+    
+    return ret;    
+    }
+    
+// ---------------------------------------------------------------------------
+// Here we set the new enabled / disabled state for this area.
+//
+// We also return ETrue if the status really changed. This way caller of this
+// function can know if any updates to server side have to be done or not.
+// ---------------------------------------------------------------------------
+//
+TBool CTouchFeedbackRegistry::SetFeedbackEnabled( TUint aId, 
+                                                  TBool aVibraEnabled, 
+                                                  TBool aAudioEnabled,
+                                                  TBool aVisible )
+    {
+    TInt changed = EFalse;
+    
+    for ( TInt i = 0; i < iAreaArray.Count(); i++ )
+        {
+        if ( iAreaArray[i].iId == aId )
+            {
+            // Check if the status really changes
+            if ( ( iAreaArray[i].iVibraEnabled != aVibraEnabled ) || 
+                  (iAreaArray[i].iAudioEnabled != aAudioEnabled ) ||
+                  (iAreaArray[i].iVisible      != aVisible ))
+                {
+                changed = ETrue;
+                
+                iAreaArray[i].iVibraEnabled = aVibraEnabled;
+                iAreaArray[i].iAudioEnabled = aAudioEnabled;
+                iAreaArray[i].iVisible      = aVisible;
+                }
+             
+            break;
+            }
+        }
+        
+    return changed;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TUint CTouchFeedbackRegistry::WindowHandle() const
+    {
+    return iWindowHandle;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTouchFeedbackRegistry::CTouchFeedbackRegistry::AreaCount()
+    {
+    return iAreaArray.Count();
+    }
+    
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+RArray<TFeedbackEntry>* CTouchFeedbackRegistry::WindowRegistry()
+    {
+    return &iAreaArray;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLIENT_INSTANT_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_CLIENT_INSTANT_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/traces/touchfeedbackclientTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TOUCHFEEDBACKCLIENTTRACES_H__
+#define __TOUCHFEEDBACKCLIENTTRACES_H__
+
+#define KOstTraceComponentID 0x2000b491
+
+#define TACTILE_CLIENT_INSTANT_FEEDBACK_1 0x400001
+#define TACTILE_CLIENT_INSTANT_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+<model>
+  <id>536917137</id>
+  <name>touchfeedback</name>
+  <group>
+    <id>64</id>
+    <name>TACTILE_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTILE_CLIENT_INSTANT_FEEDBACK 1</text>
+      <id>1</id>
+      <name>TACTILE_CLIENT_INSTANT_FEEDBACK_1</name>
+      <location>
+        <file>../src/touchfeedbackclient.cpp</file>
+        <line>502</line>
+        <class>CTouchFeedbackClient</class>
+        <function>ImmediateFeedback</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_CLIENT_INSTANT_FEEDBACK 0</text>
+      <id>2</id>
+      <name>TACTILE_CLIENT_INSTANT_FEEDBACK_0</name>
+      <location>
+        <file>../src/touchfeedbackclient.cpp</file>
+        <line>509</line>
+        <class>CTouchFeedbackClient</class>
+        <function>ImmediateFeedback</function>
+      </location>
+    </trace>
+  </group>
+</model>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/bwins/tactilefeedbackresolveru.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+EXPORTS
+	??0RTactileFeedback@@QAE@XZ @ 1 NONAME ; RTactileFeedback::RTactileFeedback(void)
+	??1CTactilePlayer@@UAE@XZ @ 2 NONAME ; CTactilePlayer::~CTactilePlayer(void)
+	?Close@RTactileFeedback@@QAEXXZ @ 3 NONAME ; void RTactileFeedback::Close(void)
+	?Connect@RTactileFeedback@@QAEHXZ @ 4 NONAME ; int RTactileFeedback::Connect(void)
+	?FeedbackEnabledForDevice@RTactileFeedback@@QAEXAAW4TTouchFeedbackType@@@Z @ 5 NONAME ; void RTactileFeedback::FeedbackEnabledForDevice(enum TTouchFeedbackType &)
+	?MaxLevel@CTactilePlayer@@UAEHXZ @ 6 NONAME ; int CTactilePlayer::MaxLevel(void)
+	?ModifyFeedback@CTactilePlayer@@UAEHH@Z @ 7 NONAME ; int CTactilePlayer::ModifyFeedback(int)
+	?ModifyFeedback@RTactileFeedback@@QAEXH@Z @ 8 NONAME ; void RTactileFeedback::ModifyFeedback(int)
+	?ModifyPreviewFeedback@RTactileFeedback@@QAEXH@Z @ 9 NONAME ; void RTactileFeedback::ModifyPreviewFeedback(int)
+	?PlayFeedback@RTactileFeedback@@QAEXW4TTouchLogicalFeedback@@HH@Z @ 10 NONAME ; void RTactileFeedback::PlayFeedback(enum TTouchLogicalFeedback, int, int)
+	?PlayPreviewFeedback@CTactilePlayer@@UAEHHW4TTouchLogicalFeedback@@@Z @ 11 NONAME ; int CTactilePlayer::PlayPreviewFeedback(int, enum TTouchLogicalFeedback)
+	?PlayPreviewFeedback@RTactileFeedback@@QAEXHW4TTouchLogicalFeedback@@W4TTouchFeedbackType@@@Z @ 12 NONAME ; void RTactileFeedback::PlayPreviewFeedback(int, enum TTouchLogicalFeedback, enum TTouchFeedbackType)
+	?SetFeedbackEnabledForDevice@RTactileFeedback@@QAEHW4TTouchFeedbackType@@@Z @ 13 NONAME ; int RTactileFeedback::SetFeedbackEnabledForDevice(enum TTouchFeedbackType)
+	?StartFeedback@CTactilePlayer@@UAEHW4TTouchContinuousFeedback@@H@Z @ 14 NONAME ; int CTactilePlayer::StartFeedback(enum TTouchContinuousFeedback, int)
+	?StartFeedback@RTactileFeedback@@QAEXW4TTouchContinuousFeedback@@H@Z @ 15 NONAME ; void RTactileFeedback::StartFeedback(enum TTouchContinuousFeedback, int)
+	?StartPreviewFeedback@CTactilePlayer@@UAEHHW4TTouchContinuousFeedback@@H@Z @ 16 NONAME ; int CTactilePlayer::StartPreviewFeedback(int, enum TTouchContinuousFeedback, int)
+	?StartPreviewFeedback@RTactileFeedback@@QAEXHW4TTouchContinuousFeedback@@HW4TTouchFeedbackType@@@Z @ 17 NONAME ; void RTactileFeedback::StartPreviewFeedback(int, enum TTouchContinuousFeedback, int, enum TTouchFeedbackType)
+	?StopFeedback@CTactilePlayer@@UAEXXZ @ 18 NONAME ; void CTactilePlayer::StopFeedback(void)
+	?StopFeedback@RTactileFeedback@@QAEXXZ @ 19 NONAME ; void RTactileFeedback::StopFeedback(void)
+	?StopPreviewFeedback@CTactilePlayer@@UAEXXZ @ 20 NONAME ; void CTactilePlayer::StopPreviewFeedback(void)
+	?StopPreviewFeedback@RTactileFeedback@@QAEXXZ @ 21 NONAME ; void RTactileFeedback::StopPreviewFeedback(void)
+
Binary file tactilefeedback/tactilefeedbackresolver/data/tactilefeedbackeffects.ivt has changed
Binary file tactilefeedback/tactilefeedbackresolver/data/ui-pen_down04.wav has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/eabi/tactilefeedbackresolveru.def	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,34 @@
+EXPORTS
+	_ZN14CTactilePlayer12StopFeedbackEv @ 1 NONAME
+	_ZN14CTactilePlayer13StartFeedbackE24TTouchContinuousFeedbacki @ 2 NONAME
+	_ZN14CTactilePlayer14ModifyFeedbackEi @ 3 NONAME
+	_ZN14CTactilePlayer19PlayPreviewFeedbackEi21TTouchLogicalFeedback @ 4 NONAME
+	_ZN14CTactilePlayer19StopPreviewFeedbackEv @ 5 NONAME
+	_ZN14CTactilePlayer20StartPreviewFeedbackEi24TTouchContinuousFeedbacki @ 6 NONAME
+	_ZN14CTactilePlayer8MaxLevelEv @ 7 NONAME
+	_ZN14CTactilePlayerD0Ev @ 8 NONAME
+	_ZN14CTactilePlayerD1Ev @ 9 NONAME
+	_ZN14CTactilePlayerD2Ev @ 10 NONAME
+	_ZN16RTactileFeedback12PlayFeedbackE21TTouchLogicalFeedbackii @ 11 NONAME
+	_ZN16RTactileFeedback12StopFeedbackEv @ 12 NONAME
+	_ZN16RTactileFeedback13StartFeedbackE24TTouchContinuousFeedbacki @ 13 NONAME
+	_ZN16RTactileFeedback14ModifyFeedbackEi @ 14 NONAME
+	_ZN16RTactileFeedback19PlayPreviewFeedbackEi21TTouchLogicalFeedback18TTouchFeedbackType @ 15 NONAME
+	_ZN16RTactileFeedback19StopPreviewFeedbackEv @ 16 NONAME
+	_ZN16RTactileFeedback20StartPreviewFeedbackEi24TTouchContinuousFeedbacki18TTouchFeedbackType @ 17 NONAME
+	_ZN16RTactileFeedback21ModifyPreviewFeedbackEi @ 18 NONAME
+	_ZN16RTactileFeedback24FeedbackEnabledForDeviceER18TTouchFeedbackType @ 19 NONAME
+	_ZN16RTactileFeedback27SetFeedbackEnabledForDeviceE18TTouchFeedbackType @ 20 NONAME
+	_ZN16RTactileFeedback5CloseEv @ 21 NONAME
+	_ZN16RTactileFeedback7ConnectEv @ 22 NONAME
+	_ZN16RTactileFeedbackC1Ev @ 23 NONAME
+	_ZN16RTactileFeedbackC2Ev @ 24 NONAME
+	_ZTI14CTactilePlayer @ 25 NONAME ; #<TI>#
+	_ZTI19CTactileFeedbackSrv @ 26 NONAME ; #<TI>#
+	_ZTI23CTactileFeedbackSession @ 27 NONAME ; #<TI>#
+	_ZTI24CTactileFeedbackResolver @ 28 NONAME ; #<TI>#
+	_ZTV14CTactilePlayer @ 29 NONAME ; #<VT>#
+	_ZTV19CTactileFeedbackSrv @ 30 NONAME ; #<VT>#
+	_ZTV23CTactileFeedbackSession @ 31 NONAME ; #<VT>#
+	_ZTV24CTactileFeedbackResolver @ 32 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* Copyright (c) 2007-2009 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:  This component maps logical feedback types to physical
+*                feedback effects, and plays the correct effect according
+*                to current settings and system state.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../data/TactileFeedbackEffects.ivt         /epoc32/data/z/private/10003B20/TactileFeedbackEffects.ivt
+../data/TactileFeedbackEffects.ivt         /epoc32/release/winscw/udeb/Z/private/10003B20/TactileFeedbackEffects.ivt
+
+// IBY file
+../rom/tactilefeedbackresolver.iby  CORE_IBY_EXPORT_PATH(mw, tactilefeedbackresolver.iby)
+
+// Private interfaces
+../inc/tactilefeedbackresolver.h           |../../inc/tactilefeedbackresolver.h
+../inc/tactilefeedbackinternalpskeys.h     |../../inc/tactilefeedbackinternalpskeys.h
+../inc/tactilefeedbackprivatecrkeys.h      |../../inc/tactilefeedbackprivatecrkeys.h
+../inc/tactilefeedbackdomaincrkeys.h       |../../inc/tactilefeedbackdomaincrkeys.h
+../inc/tactilepropertyobserver.h           |../../inc/tactilepropertyobserver.h
+../inc/tactilepropertywatcher.h            |../../inc/tactilepropertywatcher.h
+
+
+#ifndef TOOLS
+
+PRJ_MMPFILES
+../group/tactilefeedbackresolver.mmp
+
+#endif // TOOLS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/group/tactilefeedbackresolver.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2007-2009 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:  This component maps logical feedback types to physical
+*                feedback effects, and plays the correct effect according
+*                to current settings and system state.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactilefeedbackresolver.dll
+TARGETTYPE              DLL
+UID                     0x1000008d 0x2000B494
+
+CAPABILITY              CAP_GENERAL_DLL
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+
+SOURCE                  tactileplayer.cpp
+SOURCE                  tactilefeedbackresolver.cpp
+SOURCE                  tactilepropertywatcher.cpp
+SOURCE                  tactilefeedbacksession.cpp
+SOURCE                  tactilefeedbacksrv.cpp
+SOURCE                  tactilefeedback.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../inc
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 ecom.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackdefs.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* 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:  Tactile Feedback server constants definitions.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILEFEEDBACKDEFS_H
+#define TACTILEFEEDBACKDEFS_H
+
+_LIT( KTactileThreadName, "FeedbackPlayerThread");
+_LIT( KTactileFeedbackServer, "TactileFeedbackServer" );
+
+const TInt KTactileFeedbackServerMinor = 0;
+const TInt KTactileFeedbackServerMajor = 1;
+const TInt KTactileFeedbackServerBuild = 0;
+
+const TInt KPlayerThreadStackSize   = 0x4000;   // 16kB
+const TInt KPlayerThreadHeapMinSize = 0x1000;   // 4kB
+const TInt KPlayerThreadHeapMaxSize = 0x100000; // 1MB
+
+
+enum TTactileFeedbackCmd // Server commands.
+    {
+    EPlayFeedback,
+    EStartFeedback,
+    EModifyFeedback,
+    EStopFeedback,
+    ESetFBEnabledDevice,
+    EFBEnabledForDevice,
+    EPlayPreviewFeedback,
+    EStartPreviewFeedback,
+    EModifyPreviewFeedback,
+    EStopPreviewFeedback
+    };
+
+#endif // TACTILEFEEDBACKDEFS_H
+
+// End of file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackdomaincrkeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2009 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:  CR Keys for the configurable parameters related to physical 
+*                vibrator and audio feedback effects played by 
+*                Tactile Feedback Resolver
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILEFEEDBACKDOMAINCRKEYS_H
+#define TACTILEFEEDBACKDOMAINCRKEYS_H
+
+#include <e32std.h>
+
+
+// =============================================================================
+// General Tactile feedback -related configuration options
+//
+// These settings are customizable but not changeable by end user
+// =============================================================================
+const TUid KCRUidTactileFeedback = {0x2000B494};
+
+
+/**
+* Base level of vibra feedback strength
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 50
+**/
+const TUint32 KTactileFeedbackHapticsStrength       = 0x00000013;
+
+/**
+* Base level of audio feedback volume
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 2
+**/
+const TUint32 KTactileFeedbackAudioVolume           = 0x00000014;
+
+/**
+* Full path of the IVT file, which is used to play haptics effects. 
+*
+* Possible values are:
+* Valid path to IVT file. 
+*
+* Default value: "z:\\private\\10003B20\\tactilefeedbackeffects.ivt"
+**/
+const TUint32 KTactileHapticsIVTFile                = 0x00000015;
+
+/**
+* Number of steps used to adjust vibra feedback strength
+*
+* Possible values are:
+* 1-100
+*
+* Default value: 10
+**/
+const TUint32 KTactileFeedbackVibraLevels           = 0x00000016;
+
+/**
+* Number of steps used to adjust audio feedback volume
+*
+* Possible values are:
+* 1-100
+*
+* Default value: 3
+**/
+const TUint32 KTactileFeedbackAudioLevels           = 0x00000017;
+
+#endif  // TACTILEFEEDBACKDOMAINCRKEYS_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackinternalpskeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,59 @@
+/*
+* 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:  Private Publish & Subscribe keys of Tactile Feedback
+*                subsystem
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#ifndef TACTILEFEEDBACKINTERNALPSKEYS_H
+#define TACTILEFEEDBACKINTERNALPSKEYS_H
+
+#include <e32property.h>
+
+/**
+ * We are using the system category value, because it is below
+ * KUidSecurityThresholdCategoryValue, and thus the property can be defined
+ * from any process with WriteDeviceData -capability, regardless of 
+ * whether the process' SID matches this category.
+ */
+const TUid KPSUidTactileFeedback = { KUidSystemCategoryValue }; 
+
+/**
+ * KTactileFeedbackEnabled
+ * Can be used for temporarily disabling tactile feedback in whole
+ * system. Should be used in situations such as a telephone call,
+ * where tactile feedback can cause disturbing noice on the other
+ * end of the telephone call.
+ *
+ * Writing to this property is protected by WriteDeviceData
+ * capability.
+ *
+ * Audio- and vibra feedback can be disabled separately.
+ * Vibra is controlled by bit 0 and audio by bit 1 in the key.
+ *
+ * The Id used is the UID of Tactile Feedback Resolver
+ *
+ * Possible values:
+ * 0x00: Tactile feedback is currently disabled
+ * 0x01: Tactile vibra feedback is enabled, audio disabled
+ * 0x02: Tactile vibra feedback is disabled and audio enabled.
+ * 0x03: Both Tactile vibra- and audio feedback are enabled. 
+ */
+const TUint32 KTactileFeedbackEnabled = 0x2000B494;
+
+
+#endif // TACTILEFEEDBACKINTERNALPSKEYS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackprivatecrkeys.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,699 @@
+/*
+* Copyright (c) 2007-2009 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:  CR Keys for the configurable parameters related to physical 
+*                vibrator and audio feedback effects played by 
+*                Tactile Feedback Resolver
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILEFEEDBACKPRIVATECRKEYS_H
+#define TACTILEFEEDBACKPRIVATECRKEYS_H
+
+#include <e32std.h>
+#include "tactilefeedbackdomaincrkeys.h"
+
+
+/**
+* Minimun allowed interval of physical feedback effects
+*
+* This key can be used for filtering the feedback requests in case that is
+* required by device HW. For example: When painting text in editors, it is
+* possible to generate dozens of feedback requests in a second. This may feel
+* very unpleasant to end user.
+*
+* This key defines the minimum time that must have passed since previous
+* feedback request, or otherwise feedback request is ignored.
+* 
+* If this key value is defined to zero, then this feature is disabled (i.e.
+* all feedbacks are played no matter how fast they come).
+*
+* Possible values are:
+* Integer value that represents the minimum interval in milliseconds, or
+* zero for disabling the feature.
+*
+* Default value: 50ms
+**/
+const TUint32 KTactileFeedbackMinimumInterval       = 0x0000001F;
+
+// =============================================================================
+// Configuration options related to vibrator parameters
+//
+// These settings are customizable but not changeable by end user
+// =============================================================================
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel1.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 10
+**/
+const TUint32 KTactileVibraIntensityBasicLevel1      = 0x00000020;
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel2.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 40
+**/
+const TUint32 KTactileVibraIntensityBasicLevel2      = 0x00000021;
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel3.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 40
+**/
+const TUint32 KTactileVibraIntensityBasicLevel3      = 0x00000022;
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel1.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 15
+**/
+const TUint32 KTactileVibraDurationBasicLevel1       = 0x00000023;
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel2.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 20
+**/
+const TUint32 KTactileVibraDurationBasicLevel2       = 0x00000024;
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackBasic
+* and vibra effect level ETactileFeedbackVibraLevel3.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 30
+**/
+const TUint32 KTactileVibraDurationBasicLevel3       = 0x00000025;
+
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel1.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 50
+**/
+const TUint32 KTactileVibraIntensitySensitiveLevel1  = 0x00000026;
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel2.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 100
+**/
+const TUint32 KTactileVibraIntensitySensitiveLevel2  = 0x00000027;
+
+/**
+* Vibra intensity setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel3.
+*
+* Possible values are:
+* Integers from 0 to 100. See HWRMVibra.h for more information.
+* Zero intensity will disable this logical feedback type.
+*
+* Default value: 10
+**/
+const TUint32 KTactileVibraIntensitySensitiveLevel3  = 0x00000028;
+
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel1.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 5
+**/
+const TUint32 KTactileVibraDurationSensitiveLevel1  = 0x00000029;
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel2.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 10
+**/
+const TUint32 KTactileVibraDurationSensitiveLevel2  = 0x0000002a;
+
+/**
+* Vibra duration setting for logical feedback type ETouchFeedbackSensitive
+* and vibra effect level ETactileFeedbackVibraLevel3.
+*
+* Duration is given in milliseconds, and zero value will disable this
+* logical feedback type. 
+*
+* Possible values are:
+* Integer values from zero upwards.
+*
+* Default value: 15
+**/
+const TUint32 KTactileVibraDurationSensitiveLevel3  = 0x0000002b;
+
+
+
+// =============================================================================
+// Configuration options related to audio tone parameters
+//
+// These settings are customizable but not changeable by end user
+// =============================================================================
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqBasicLevel1      = 0x00000040;
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqBasicLevel2      = 0x00000041;
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqBasicLevel3      = 0x00000042;
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationBasicLevel1  = 0x00000043;
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationBasicLevel2  = 0x00000044;
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationBasicLevel3  = 0x00000045;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100 
+*
+* Default value: 20
+**/
+const TUint32 KTactileAudioToneVolumeBasicLevel1    = 0x00000046;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100 
+*
+* Default value: 40
+**/
+const TUint32 KTactileAudioToneVolumeBasicLevel2    = 0x00000047;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackBasic
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100 
+*
+* Default value: 60
+**/
+const TUint32 KTactileAudioToneVolumeBasicLevel3    = 0x00000048;
+
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqSensitiveLevel1  = 0x00000049;
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqSensitiveLevel2  = 0x0000004a;
+
+/**
+* Audio frequency setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Frequency is given in Hz.
+*
+* Possible values are:
+* Positive integer values.
+*
+* Default value: 1100
+**/
+const TUint32 KTactileAudioToneFreqSensitiveLevel3  = 0x0000004b;
+
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationSensitiveLevel1 = 0x0000004c;
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationSensitiveLevel2 = 0x0000004d;
+
+/**
+* Audio duration setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Duration is given in milliseconds.
+*
+* Possible values are:
+* Zero (disables this feedback type) or positive integers
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneDurationSensitiveLevel3 = 0x0000004e;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioToneVolumeSensitiveLevel1   = 0x0000004f;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100
+*
+* Default value: 25
+**/
+const TUint32 KTactileAudioToneVolumeSensitiveLevel2   = 0x00000050;
+
+/**
+* Audio volume setting for logical feedback type ETouchFeedbackSensitive
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioToneUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0 - 100
+*
+* Default value: 40
+**/
+const TUint32 KTactileAudioToneVolumeSensitiveLevel3   = 0x00000051;
+
+// =============================================================================
+// Configuration options related to audio .wav feedback
+//
+// These settings are customizable but not changeable by end user
+// =============================================================================
+
+/**
+* Full path of the .wav -file that is going to be used as basic feedback
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileBasicLevel1          = 0x00000080;
+
+/**
+* Full path of the .wav -file that is going to be used as basic feedback
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileBasicLevel2          = 0x00000081;
+
+/**
+* Full path of the .wav -file that is going to be used as basic feedback
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileBasicLevel3          = 0x00000082;
+
+/**
+* Sound volume to be used when playing the basic .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioWavVolumeBasicLevel1        = 0x00000083;
+
+/**
+* Sound volume to be used when playing the basic .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 30
+**/
+const TUint32 KTactileAudioWavVolumeBasicLevel2        = 0x00000084;
+
+/**
+* Sound volume to be used when playing the basic .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 50
+**/
+const TUint32 KTactileAudioWavVolumeBasicLevel3        = 0x00000085;
+
+/**
+* Full path of the .wav -file that is going to be used as sensitive feedback
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileSensitiveLevel1       = 0x00000086;
+
+/**
+* Full path of the .wav -file that is going to be used as sensitive feedback
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileSensitiveLevel2       = 0x00000087;
+
+/**
+* Full path of the .wav -file that is going to be used as sensitive feedback
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Possible values are:
+* Valid path to .wav -file. If invalid or empty path is given, then
+* no .wav feedback shall be generated for this logical feedback type.
+*
+* Default value: "z:\\System\\Sounds\\Digital\\ui-pen_down04.wav"
+**/
+const TUint32 KTactileAudioWavFileSensitiveLevel3       = 0x00000088;
+
+/**
+* Sound volume to be used when playing the sensitive .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel1.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 5
+**/
+const TUint32 KTactileAudioWavVolumeSensitiveLevel1     = 0x00000089;
+
+/**
+* Sound volume to be used when playing the sensitive .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel2.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 10
+**/
+const TUint32 KTactileAudioWavVolumeSensitiveLevel2     = 0x0000008a;
+
+/**
+* Sound volume to be used when playing the sensitive .wav feedback
+* and audio effect level ETactileFeedbackAudioLevel3.
+*
+* Volume level is given in percentages. 100% equals to 
+* CMdaAudioPlayerUtility::MaxVolume, and 0% will disable this feedback type.
+*
+* Possible values are:
+* 0-100
+*
+* Default value: 25
+**/
+const TUint32 KTactileAudioWavVolumeSensitiveLevel3     = 0x0000008b;
+
+// =============================================================================
+// Configuration options related to Tactile player plugins.
+//
+// These settings are customizable but not changeable by end user
+// =============================================================================
+
+/**
+* Implementation UID of the plugin, which is used to play haptics feedback.
+*
+* Possible values are:
+* Implementation UID of the plugin.
+*
+* Default value: 536988569 (0x2001CB99)
+**/
+const TUint32 KTactileHapticsPlugin                     = 0x00000090;
+
+/**
+* Implementation UID of the plugin, which is used to play audio feedback.
+*
+* Possible values are:
+* Implementation UID of the plugin.
+*
+* Default value: 536988573 (0x2001CB9D)
+**/
+const TUint32 KTactileAudioPlugin                       = 0x00000091;
+
+/**
+* Stores tactile flags bitmask:
+* Bit 1: Vibra disabled during call
+* Bit 2: Audio disabled during call
+* Bit 3: Vibra played first
+*/
+const TUint KTactileInternalSettings                    = 0x00000092;
+
+/**
+* Defines bit 1 in KTactileInternalSettings. 
+* If this bit is 1, ongoing call will disable vibra feedback.
+* If this bit is 0, ongoing call doesn't affect vibra feedback.
+* By default this is 1.
+*/
+const TInt KTactileInternalSettingsCallDisableVibra = 0x01;  // 2^0
+
+/**
+* Defines bit 2 in KTactileInternalSettings. 
+* If this bit is 1, ongoing call will disable audio feedback.
+* If this bit is 0, ongoing call doesn't affect audio feedback.
+* By default this is 1.
+*/
+const TInt KTactileInternalSettingsCallDisableAudio = 0x02;  // 2^1
+
+/**
+* Defines bit 3 in KTactileInternalSettings. 
+* If this bit is 1, vibra feedback is played the first and
+* audio feedback after that.
+* If this bit is 0, audio feedback is played the first and
+* vibra feedback after that.
+* By default this is 1.
+*/
+const TInt KTactileInternalSettingsVibraPlayedFirst = 0x04;  // 2^2
+
+
+/**
+* Logical actuator type in Tactile Haptics Player.
+*
+* Possible values are defined in enumeration THWRMLogicalActuators
+* in file hwrmlogicalactuators.h.
+* 
+* Default value: 1 (EHWRMLogicalActuatorAny)
+*/
+const TInt KTactileFeedbackHapticsActuator              = 0x00000093;
+
+#endif  // TACTILEFEEDBACKPRIVATECRKEYS_H
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackresolver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2007-2009 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:  Class for resolving physical feedback type based on 
+*                tactile feedback settings and current device state.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEFEEDBACKRESOLVER_H
+#define C_TACTILEFEEDBACKRESOLVER_H
+
+#include <e32base.h>
+#include <touchlogicalfeedback.h>
+#include <cenrepnotifyhandler.h>
+
+#include "tactilepropertyobserver.h"
+
+class CRepository;
+class CTactilePlayer;
+class CTactilePropertyWatcher;
+
+/**
+ *  Class for procuding physical feedback based on logical
+ *  feedback type.
+ *
+ *  Feedback is generated according to Tactile Feedback settings and
+ *  current device state, and it may be that feedback is not even generated
+ *  at all.
+ *
+ *  @lib tactilefeedbackresolver.lib
+ *  @since S60 5.2
+  */
+class CTactileFeedbackResolver: public CBase,
+                                public MTactilePropertyObserver,
+                                public MCenRepNotifyHandlerCallback
+    {
+public:
+
+    static CTactileFeedbackResolver* NewL();
+
+    virtual ~CTactileFeedbackResolver();
+
+    /**
+     * Produces immediately physical feedback according to given
+     * logical feedback type.
+     *
+     * Actual physical feedback type depends on settings of existing player 
+     * plugins and current device state.
+     *
+     * @param aFeedback  - Logical feedback type.
+     * @param aPlayVibra - If EFalse then vibra feedback is not played.
+     * @param aPlayAudio - If EFalse then audio feedback is not played.
+     */
+    void PlayFeedback( TTouchLogicalFeedback aFeedback,
+                       TBool aPlayVibra,
+                       TBool aPlayAudio );
+
+    /**
+     * Starts playing continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aType         - Type of continuous feedback to be played.
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range for intensity is 0-100%.
+     */ 
+    void StartFeedback( TTouchContinuousFeedback aType,
+                        TInt aIntensity );
+                        
+    /**
+     * Modifies the intensity of ongoing continuous feedback.
+     * @since S60 5.2
+     * @param aIntensity    - New intensity for continuous feedback. Value
+     *                        range for intensity is 0-100%. 
+     */                         
+    void ModifyFeedback( TInt aIntensity );
+    
+    /**
+     * Stops the ongoing continuous feedback.
+     *
+     * @since S60 5.2
+     */    
+    void StopFeedback();
+    
+    /**
+     * Produces immediate physical feedback according to given
+     * logical feedback type and given level. 
+     *
+     * @since S60 5.2
+     * @param aLevel        - Level value defines the strength of playing 
+     *                        effect. Maximum level value is player dependent.
+     * @param aFeedbackType - Logical feedback type.
+     * @param aType         - Type of feedback to be previewed. 
+     */    
+    void PlayPreviewFeedback( TInt aLevel,
+                              TTouchLogicalFeedback aFeedback,
+                              TTouchFeedbackType aType );
+
+    /**
+     * Starts playing continuous feedback of given type on given level.
+     *
+     * @since S60 5.2
+     * @param aLevel        - Level value defines the strength of playing 
+     *                        effect. Maximum level value is player dependent.     
+     * @param aFeedback     - Type of continuous feedback to be played.
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range for intensity is 0-100% from basic
+     *                        strength (aLevel).
+     * @param aType         - Type of feedback to be previewed.
+     */    
+    void StartPreviewFeedback( TInt aLevel,
+                               TTouchContinuousFeedback aFeedback,
+                               TInt aIntensity,
+                               TTouchFeedbackType aType );
+
+    /**
+     * Stops the ongoing preview of continuous feedback.
+     *
+     * @since S60 5.2
+     */
+    void StopPreviewFeedback();    
+
+private:
+    /**
+     * Constructor.
+     */
+    CTactileFeedbackResolver();
+
+    /**
+     * 2nd phase constructor..
+     */
+    void ConstructL();
+
+    /**
+     * Central repository related initializations.
+     */
+    void InitializeCrKeysL();
+
+    /**
+     * Publish & Subscribe related initializations.
+     */
+     void InitializePsKeysL();
+     
+    /**
+     * This function reads the feedback enabled/disabled value from
+     * the dedicated P&S key, and stores it into iFeedbackEnabled
+     * -member variable.
+     *
+     * Dedicated fuction used for avoiding duplicate code (in
+     * construction and when the P&S key changes)
+     */
+     void ReadFeedbackEnabledFromPS();
+     
+// from base class MTactilePropertyObserver
+
+    /**
+     * From MTactilePropertyObserver
+     *
+     * This is called when the property for temporary disabling feedback
+     * is updated.
+     *
+     * @param aCategory - The UID of the changed property
+     * @param aKey      - The key (i.e. identifier) of the changed property
+     */
+    void PropertyChangedL( const TUid aCategory, 
+                           const TUint aKey );
+                           
+    
+//from base class MCenRepNotifyHandlerCallback.
+
+    /**
+     * From MCenRepNotifyHandlerCallback.
+     *
+     * This is called when Tactile Feedback settings in Central Repository
+     * are changed.
+     *
+     * @param aId       - The id of the changed Central Repository value.
+     */        
+    void HandleNotifyGeneric( TUint32 aId );
+        
+private: 
+    /**
+     * Handle changes in tactile feedback settings.
+     */    
+    void DoHandleNotifyGenericL( TUint32 aId );
+    
+    /**
+     * Create haptics player. ECom implementation uid is used for selecting
+     * the player plugin. 
+     */    
+    void CreateHapticsPlayerL( TUid aHapticsUid );
+    
+    /**
+     * Create audio player. ECom implementation uid is used for selecting
+     * the player plugin.
+     */    
+    void CreateAudioPlayerL( TUid aAudioUid );
+     
+private: // data
+
+    /**
+     * Access to the P&S property, which is used for temporary disabling
+     * the feedback.
+     * Own.  
+     */
+    CTactilePropertyWatcher* iPropertyWatcher;
+    
+    /**
+     * Haptics player.
+     * Own.  
+     */
+    CTactilePlayer*       iHapticsPlayer;
+    
+    /**
+     * Audio player.
+     * Own.  
+     */    
+    CTactilePlayer*       iAudioPlayer;
+    
+    /**
+     * Central repository for reading tactile feedback settings.
+     * Own.
+     */
+    CRepository*          iRepository;
+    
+    /**
+     * Central repository notifier, which sends notification when tactile 
+     * feedback settings has been changed.
+     * Own.
+     */
+    CCenRepNotifyHandler* iCenRepNotifier; 
+    
+    /**
+     * This flag indicates the vibra feedback state according to the P&S key
+     * that can be used for globally disabling vibra and/or audio
+     * feedback.  
+     */    
+    TBool iVibraEnabled;
+    
+    /**
+     * This flag indicates the audio feedback state according to the P&S key
+     * that can be used for globally disabling vibra and/or audio
+     * feedback.  
+     */    
+    TBool iAudioEnabled;
+    
+    /**
+     * This flag indicates whether the continuous feedback is started or not.
+     * 
+     */
+    TBool iFeedbackStarted;
+    
+    /**
+     * Minimum interval between feedbacks.
+     * 
+     */
+    TTimeIntervalMicroSeconds iMinimumInterval;
+    
+    /**
+     * Timestamp of the last played feedback.
+     * 
+     */    
+    TTime iLastFeedbackTimeStamp;
+    
+    /**
+     * This flag determinates the playing order of feedback types.
+     * ETrue  - vibra feedback is played first.
+     * EFalse - audio feedback is played first.
+     */
+    TBool iVibraFirst;
+    };
+
+
+#endif // C_TACTILEFEEDBACKPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbacksession.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,132 @@
+/*
+* 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:  Session class for Tactile Feedback server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEFEEDBACKSESSION_H
+#define C_TACTILEFEEDBACKSESSION_H
+
+#include <e32base.h>
+
+class CTactileFeedbackSrv;
+
+/**
+ *  Session class for Tactile Feedback server.
+ *
+ *  @since S60 5.2
+ */
+class CTactileFeedbackSession : public CSession2
+    {
+public:
+    /**
+     * C++ constructor.
+     */
+    CTactileFeedbackSession();
+    
+    /**
+     * From CSession2, passes the request forward to DispatchMessageL.
+     * @since S60 5.2
+     * @param aMessage, a message from client.
+     */
+    void ServiceL( const RMessage2& aMessage );
+    
+    /**
+     * Handles the request from client.
+     * @since S60 5.2
+     * @param aMessage, a message from client.
+     */
+    void DispatchMessageL( const RMessage2& aMessage );
+    
+    /**
+     * From CSession2, adds session to server's counter.
+     * @since S60 5.2 
+     */
+    void CreateL();    
+
+private:
+    /**
+     * Play feedback.
+     */
+    void PlayFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Start continuous feedback.
+     */    
+    void StartFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Modify continuous feedback.
+     */    
+    void ModifyFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Stop continuous feedback.
+     */    
+    void StopFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Set feedback enabled/disabled for the device.
+     */    
+    void SetFBEnabledForDeviceL( const RMessage2& aMessage );
+    
+    /**
+     * Get feedback enabled/disabled state.
+     */    
+    void FeedbackEnabledForDeviceL( const RMessage2& aMessage );
+    
+    /**
+     * Play preview feedback.
+     */    
+    void PlayPreviewFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Start preview of continuous feedback.
+     */    
+    void StartPreviewFeedback( const RMessage2& aMessage );
+    
+    /**
+     * Modify preview of continuous feedback.
+     */    
+    void ModifyPreviewFeedback( const RMessage2& aMessage );
+
+    /**
+     * Stop preview of continuous feedback.
+     */
+    void StopPreviewFeedback( const RMessage2& aMessage );
+
+private:
+    /**
+    * C++ destructor.
+    */
+    virtual ~CTactileFeedbackSession(); 
+
+    /*
+    * Reference to Tactile Feedback Server.
+    */
+    CTactileFeedbackSrv& Server();
+        
+private:
+    /**
+     * This flag is used for making sure that continuous feedback 
+     * is stopped if the client, which started it, is closed.
+     */
+    TBool iFeedbackStarted;
+    };
+
+#endif // C_TACTILEFEEDBACKSESSION_H
+
+// End of file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbacksrv.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,230 @@
+/*
+* 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:  Header of tactile feedback server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEFEEDBACKSRV_H
+#define C_TACTILEFEEDBACKSRV_H
+
+#include <e32base.h>
+#include <f32file.h>
+
+#include "tactilefeedbackresolver.h"
+#include "tactilefeedbackdefs.h"
+
+// Total number of ranges
+const TUint KTactileFeedbackRangeCount = 1;
+
+// Definition of the ranges of IPC numbers
+const TInt KTactileFeedbackRanges[KTactileFeedbackRangeCount] = 
+    {
+    0,
+    }; 
+
+// Policy to implement for each of the above ranges        
+const TUint8 KTactileFeedbackElementsIndex[KTactileFeedbackRangeCount] = 
+    {
+    0,
+    };
+
+const CPolicyServer::TPolicyElement KTactileFeedbackPolicyElements[] = 
+    {
+    { _INIT_SECURITY_POLICY_C2(ECapability_None,
+                               ECapability_None),
+                               CPolicyServer::EFailClient }
+    };
+
+// Package all the above together into a policy
+const CPolicyServer::TPolicy KTactileFeedbackPolicy =
+    {
+    CPolicyServer::EAlwaysPass,     // all attempts should pass
+    KTactileFeedbackRangeCount,     // number of ranges
+    KTactileFeedbackRanges,         // ranges array
+    KTactileFeedbackElementsIndex,  // elements<->ranges index
+    KTactileFeedbackPolicyElements, // array of elements
+    };
+
+/**
+ *  Tactile feedback server.
+ *
+ *  @since S60 5.2
+ */
+class CTactileFeedbackSrv : public CPolicyServer
+    {
+public:
+    /**
+    * 2-phased constructor.
+    *
+    * @since S60 5.2
+    * @return Instance of CTactileFeedbackSrv.
+    */
+    static CTactileFeedbackSrv* NewL();
+    
+    /**
+    * C++ destructor.
+    */ 
+    virtual ~CTactileFeedbackSrv();
+  
+public:
+// from base class CServer2.
+    /**
+    * From CServer2, creates a new session.
+    */
+    CSession2* NewSessionL( const TVersion& aVersion, 
+                            const RMessage2& aMessage ) const;
+
+    /**
+     * Increase session count.
+     *
+     * @since S60 5.2
+     */
+    void AddSession();
+    
+    /**
+     * Decrease session count, close server if count is zero.
+     *
+     * @since S60 5.2
+     */
+    void RemoveSession();
+    
+public:    
+    /**
+     * Play feedback.
+     *
+     * @since S60 5.2
+     * @param aFeedback    - Logical feedback type.
+     * @param aPlayHaptics - Boolean value, which indicates if haptics 
+     *                       feedback is played.
+     * @param aPlayAudio   - Boolean value, which indicates if audio 
+     *                       feedback is played.
+     */
+    void PlayFeedback( TTouchLogicalFeedback aFeedback,
+                       TBool aPlayHaptics,
+                       TBool aPlayAudio );
+    
+    /**
+     * Start continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aType        - Type of continuous feedback.
+     * @param aIntensity   - Intensity of continuous feedback.
+     */
+    void StartFeedback( TTouchContinuousFeedback aType,
+                        TInt aIntensity );
+
+    /**
+     * Modify continuous feedback.
+     *
+     * @since S60 5.2     
+     * @param aIntensity   - Intensity of continuous feedback.
+     */                        
+    void ModifyFeedback( TInt aIntensity );
+    
+    /**
+     * Stop continuous feedback.
+     */    
+    void StopFeedback();
+    
+    /**
+     * Set feedback enabled/disabled for the device.
+     *
+     * @since S60 5.2     
+     * @param aFeedbackType - Bitmask, which tells which feedback types
+     *                        are enabled/disabled. 
+     */    
+    void EnableFeedbackForDevice(  TTouchFeedbackType aFeedbackType  );
+    
+    /**
+     * Get a bitmask of feedback type, which indicates what feedback types 
+     * are enabled/disabled in the device.
+     *
+     * @since S60 5.2
+     * @return Bitmask, which contains currently enabled feedback types.
+     */    
+    TTouchFeedbackType FeedbackEnabledForDevice();
+    
+    /**
+     * Play preview feedback.
+     *
+     * @since S60 5.2
+     * @param aLevel    - Level value defines the strength of playing 
+     *                    effect. Maximum level value is player dependent.
+     * @param aFeedback - Logical feedback type.
+     * @param aType     - Type of feedback to be previewed. 
+     */    
+    void PlayPreviewFeedback( TInt aLevel,
+                               TTouchLogicalFeedback aFeedback,
+                               TTouchFeedbackType aType );
+
+    /**
+     * Start preview of continuous feedback.
+     *
+     * @since S60 5.2
+     * @param aLevel        - Level value defines the strength of playing 
+     *                        effect. Maximum level value is player dependent.     
+     * @param aFeedback     - Type of continuous feedback to be played.
+     * @param aIntensity    - Intensity of continuous feedback. Value
+     *                        range for intensity is 0-100% from basic
+     *                        strength (aLevel).
+     * @param aType         - Type of feedback to be previewed. 
+     */    
+    void StartPreviewFeedback( TInt aLevel,
+                                TTouchContinuousFeedback aFeedback,
+                                TInt aIntensity,
+                                TTouchFeedbackType aType );
+                                
+    /**
+     * Stop preview of continuous feedback.
+     *
+     * @since S60 5.2
+     */
+    void StopPreviewFeedback();
+
+private:    
+    /**
+    * C++ constructor.
+    */
+    CTactileFeedbackSrv();
+    
+    /**
+    * 2nd phase constructor.
+    */
+    void ConstructL();
+
+private: // data
+    /**
+     * Instance of tactile feedback resolver.
+     * Own.
+     */
+    CTactileFeedbackResolver* iResolver;
+    
+    /**
+     * Count of open sessions.
+     */     
+    TInt iSessionCount;
+    
+    /**
+     * A bitmap, which contains information of currently enabled/disabled
+     * feedback types.
+     */
+    TInt iDeviceFeedbackEnabled;
+    };
+
+
+#endif // C_TACTILEFEEDBACKSRV_H
+
+// End of file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactileplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,242 @@
+/*
+* 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:  Tactile feedback player plugin interface.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef C_TACTILEPLAYER_H
+#define C_TACTILEPLAYER_H
+
+#include <e32base.h>
+#include <ecom/ecom.h>
+
+#include <touchlogicalfeedback.h>
+
+class CRepository;
+
+
+/**
+ * Types of tactile players. This enumeration is used for listing the 
+ * implementations of players of certain type.
+ * @since S60 5.2
+ */
+enum TTactilePlayerType
+    {
+    ETactilePlayerAny,
+    ETactilePlayerHaptics,
+    ETactilePlayerAudio
+    };
+
+/**
+ *  Tactile feedback player ECom plugin interface.
+ *
+ *  There are two basic types of tactile players, haptics and audio 
+ *  players. Each player must follow the player type specific settings 
+ *  from Central Repository to play feedback in the specified level. If
+ *  playing level for haptics or audio is set to zero, players of that type 
+ *  must not produce any feedback.
+ *
+ *  UID for tactile feedback settings is: 
+ *  KCRUidTactileFeedback = 0x2000B494;
+ *
+ *  Players are instantiated based on plugins' implementation UIDs, which
+ *  are read from Central Repository by feedback resolver. Player types 
+ *  are differentiated by using word "Haptics" or "Audio" in default_data  
+ *  field in plugin's implementation info resource file.
+ *
+ *  Preview functions for playing immediate and starting continuous feedback
+ *  are ment to use for example in settings view to get feedback played with 
+ *  different level without actually changing the level in settings. It is
+ *  feedback resolver's responsibility not to play regular feedbacks when
+ *  preview functions are used.
+ *
+ *  @lib tactilefeedbackresolver.lib
+ *  @since S60 5.2
+ */
+class CTactilePlayer : public CBase
+    {
+public:
+    /**
+     * Instantiates an object of this type.
+     *
+     * @since S60 5.2
+     * @param aImplementationUid - Implementation uid of the plugin
+     *                             to be created.
+     * @param aRepository        - Reference to Central Repository, which is
+     *                             used for reading Tactile Feedback 
+     *                             settings. CR Keys for Tactile Feedback are 
+     *                             defined in tactilefeedbackdomaincrkeys.h
+     *
+     * @return Instance of feedback player plugin.
+     */
+    static CTactilePlayer* NewL( TUid aImplementationUid, 
+                                 CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    IMPORT_C virtual ~CTactilePlayer();
+
+    /**
+     * Returns a list of available implementations for this 
+     * interface.
+     *
+     * @since S60 5.2
+     * @param aType          - Type of players to be listed.
+     * @param aImplInfoArray - Implementation information array of all
+     *                         available implementations.
+     */ 
+    static void ListImplementationsL( TTactilePlayerType aType,
+                                      RImplInfoPtrArray& aImplInfoArray );
+
+public:
+    /**
+     * Produces immediate physical feedback according to given
+     * logical feedback type. 
+     * 
+     * Haptics and audio players have onw level value, which is
+     * specified in Tactile Feedback settings in Central Repository.
+     * That value defines the strength of feedback produced by this function.
+     * When settings are changed, plugin implementation must change the 
+     * playing level according to that value. If feedback level for this 
+     * type of player in settings is set to zero, this function must not 
+     * produce any feedback.
+     *
+     * @since S60 5.2
+     * @param aFeedback - The logical feedback type, which is used to 
+     *                    select the physical response to feedback method.
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.     
+     */
+    virtual TInt PlayFeedback( TTouchLogicalFeedback aFeedback ) = 0;
+
+    /**
+     * Starts continuous feedback according to given logical 
+     * continuous feedback type. Continuous feedback is started with given
+     * intensity, which is a percentage value of maximum strength on current
+     * level. Ongoing continuous feedback can be modified using 
+     * ModifyFeedback() to change intensity of feedback.
+     *
+     * Continuous feedback is stopped using StopFeedback().
+     *
+     * @since S60 5.2
+     * @param aFeedback  - The logical feedback type of continuous feedback, 
+     *                     which is used to select the physical response to
+     *                     continuous feedback method.     
+     * @param aIntensity - The percentage value of continuous feedback's 
+     *                     maximum strength.
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.   
+     * @return TInt KErrNotSupported if player doesn't support continuous 
+     *              feedback.            
+     */
+    IMPORT_C virtual TInt StartFeedback( TTouchContinuousFeedback aFeedback,
+                                         TInt aIntensity );
+
+    /**
+     * Modifies the intensity of continuous feedback. 
+     *
+     * @since S60 5.2
+     * @param aIntensity - The percentage value of continuous feedback's 
+     *                     intensity.
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.          
+     * @return TInt KErrNotSupported if player doesn't support continuous 
+     *              feedback.
+     */
+    IMPORT_C virtual TInt ModifyFeedback( TInt aIntensity );
+    
+    /**
+     * Stops continuous feedback.
+     *
+     * @since S60 5.2
+     */    
+    IMPORT_C virtual void StopFeedback();
+    
+    /**
+     * Plugin's maximum feedback level, which defines the strength
+     * of played feedback. The amount of feedback levels is dependent on
+     * a plugin.
+     *
+     * Level values are used for playing preview of feedback. 
+     * 
+     * @since S60 5.2
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.          
+     */    
+    IMPORT_C virtual TInt MaxLevel();
+        
+    /**
+     * Produces preview of feedback according to given locigal feedback 
+     * type and given level value of feedback strength. 
+     *
+     * @since S60 5.2
+     * @param aLevel    - A value, which defines the strength of preview
+     *                    feedback. Preview level can be any positive 
+     *                    value up to value of MaxLevel().
+     * @param aFeedback - The logical feedback type, which is used to 
+     *                    select the physical response to feedback method.
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.          
+     * @return TInt KErrNotSupported if player doesn't support feedback
+     *              preview.
+     */
+    IMPORT_C virtual TInt PlayPreviewFeedback( TInt aLevel,
+                                      TTouchLogicalFeedback aFeedback );
+
+    /**
+     * Starts preview of continuous feedback according to given logical 
+     * continuous feedback type and given level value of feedback strength.
+     * Preview of continuous feedback is started with given intensity,
+     * which is a percentage value of maximum strength in given level. 
+     * Ongoing continuous feedback can be modified using ModifyFeedback() 
+     * to change intensity of feedback.
+     *
+     * Preview of continuous feedback is stopped using StopFeedback().
+     *
+     * @since S60 5.2
+     * @param aLevel     - A value, which defines the strength of preview
+     *                     feedback. Preview level can be any positive 
+     *                     value between zero and MaxLevel().
+     * @param aFeedback  - The logical feedback type of continuous feedback, 
+     *                     which is used to select the physical response to
+     *                     continuous feedback method.
+     * @param aIntensity - The percentage value of continuous feedback's 
+     *                     maximum strength.
+     * @return TInt KErrNone if successful, otherwise one of the other
+     *              system-wide error codes.   
+     * @return TInt KErrNotSupported if player doesn't support preview
+     *              for continuous feedback.
+     */
+    IMPORT_C virtual TInt StartPreviewFeedback( TInt aLevel,
+                                      TTouchContinuousFeedback aFeedback,
+                                      TInt aIntensity );
+
+    /**
+     * Stops preview of continuous feedback. Player must set the original 
+     * level value back in this function.
+     *
+     * @since S60 5.2
+     */                                          
+    IMPORT_C virtual void StopPreviewFeedback();
+
+private:
+    
+    // Unique instance identifier key.  
+    TUid iDtor_ID_Key;
+        
+    };
+    
+#endif // C_TACTILEPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilepropertyobserver.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,50 @@
+/*
+* 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:  Callback interface for getting a notification about
+*                property changes.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef M_TACTILEPROPERTYOBSERVER_H
+#define M_TACTILEPROPERTYOBSERVER_H
+
+
+
+#include <e32std.h>
+
+
+/**
+ *  Callback interface used from CTactilePropertyWatcher.
+ *
+ *  @lib N/A
+ *  @since S60 v5.0
+ */
+class MTactilePropertyObserver
+    {
+public:
+    /**
+     * This gets called when a subscribed property is changed.
+     *
+     * @param aCategory - The UID of the changed property
+     * @param aKey      - The key (i.e. identifier) of the changed property
+     */
+    virtual void PropertyChangedL( const TUid aCategory, 
+                                   const TUint aKey ) = 0;
+    };
+
+
+
+#endif // M_TACTILEPROPERTYOBSERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/inc/tactilepropertywatcher.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,178 @@
+/*
+* 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:  Class for monitoring changes in P&S keys.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILEPROPERTYWATCHER_H
+#define TACTILEPROPERTYWATCHER_H
+
+
+#include <e32base.h> 
+#include <e32std.h>
+#include <e32property.h>
+
+#include "tactilepropertyobserver.h"
+
+
+
+/** 
+ *  Observer class for accessing to P&S property values, and listening
+ *  to changes.
+ *
+ *  @lib tactilefeedbackresolver.lib
+ *  @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTactilePropertyWatcher ): public CActive
+    {
+public:
+
+    /**
+     * Intantiation method. 
+     * 
+     * This will create a property wather active
+     * object with given active object priority. 
+     *
+     * @param aObserver - Reference to observer interface.
+     * @param aCategory - P&S category, where the observed key is.
+     * @param aKey      - Observed P&S key.
+     * @param aPriority - Active object priority, which is given to
+     *                    this wather instance.
+     * @return New property watcher instance.
+     */
+    static CTactilePropertyWatcher* NewL( 
+        MTactilePropertyObserver& aObserver, 
+        const TUid aCategory, 
+        const TInt aKey,
+        CActive::TPriority aPriority );
+
+    ~CTactilePropertyWatcher();
+
+    
+    /**
+     * Retrieves an integer value associated with this property.
+     *
+     * Leaves with Standard Symbian OS error codes in case 
+     * retreving of the value fails. 
+     *
+     * @param aValue - The property value is returned here
+     */
+    void GetL( TInt& aValue );
+
+    /**
+     * Fills aValue with the buffer associated with this property.
+     *
+     * Leaves with Standard Symbian OS error codes in case 
+     * retreving of the value fails. 
+     *
+     * @param aValue - The property value is returned here
+     */
+    void GetL( TDes8& aValue );
+
+    /**
+     * Retrieves an integer value associated with this property.
+     *
+     * Does not leave in case reading of the property fails, but
+     * instead returns Standard Symbian OS error code.
+     *
+     * @param aValue the property value is returned here
+     * @return standard Symbian OS error code
+     */
+    TInt Get( TInt& aValue );
+
+    /**
+     * Fills aValue with the buffer associated with this property.
+     *
+     * Does not leave in case reading of the property fails, but
+     * instead returns Standard Symbian OS error code.
+     *
+     * @param aValue the property value is returned here
+     * @return standard Symbian OS error code
+     */
+    TInt Get( TDes8& aValue );
+            
+    /**
+     * Sets a P&S property to an integer value. The property must be
+     * already defined.
+     *
+     * @param aValue - The integer value to set to the property
+     */
+    void SetL( const TInt aValue );
+
+            
+    /**
+     * Sets a P&S property to a (large) bytearray value. The property
+     * must be already defined.
+     *
+     * @param aValue - The integer value to set to the property
+     */
+    void SetL( const TDesC8& aValue );
+                
+private:
+        
+    CTactilePropertyWatcher( 
+        MTactilePropertyObserver& aObserver, 
+        const TUid aCategory, 
+        const TInt aKey,
+        CActive::TPriority aPriority );
+
+    void ConstructL();
+
+    void Subscribe();
+
+
+ // from base class CActive
+
+    /**
+     * Standard DoCancel of an active object.
+     */
+    void DoCancel();
+
+    /**
+     * Standard RunL of an active object.
+     */
+    void RunL();
+
+private: // data
+
+    /**
+     * Access to observer interface
+     * Not own.
+     */
+    MTactilePropertyObserver& iObserver;
+
+    /**
+     * The UID of this property
+     */
+    TUid iCategory;
+
+    /**
+     * The key of this property
+     */
+    TUint iKey;
+
+    /**
+     * Handle to the attached property
+     * Own.
+     */
+    RProperty iProperty;
+    };
+
+
+#endif // TACTILEPROPERTYWATCHER_H
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,36 @@
+/*
+* 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:  Build information file for tactile player plug-ins.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// IBY files
+../tactileaudioplugin/rom/tactileaudioplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactileaudioplugin.iby)
+../tactilehapticsplugin/rom/tactilehapticsplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactilehapticsplugin.iby)
+../tactiletoneplugin/rom/tactiletoneplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactiletoneplugin.iby)
+../tactilevibraplugin/rom/tactilevibraplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactilevibraplugin.iby)
+
+PRJ_MMPFILES
+../tactilehapticsplugin/group/tactilehapticsplugin.mmp
+../tactiletoneplugin/group/tactiletoneplugin.mmp
+../tactilevibraplugin/group/tactilevibraplugin.mmp
+../tactileaudioplugin/group/tactileaudioplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/data/20021339.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:  ECom registration file for Tactile Audio player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    dll_uid = 20021339; 
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = 0x2001CBA7;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2002133A;
+                    version_no = 1; 
+                    display_name = "";
+                    default_data = "Audio";
+                    opaque_data = "";
+                    }
+                };
+            }
+        };
+    }
+
+// End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:  Build information file for tactile audio plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// IBY file
+../rom/tactileaudioplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactileaudioplugin.iby)
+
+PRJ_MMPFILES
+tactileaudioplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/group/tactileaudioplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:  Project definition file for Audio Feedback player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactileaudioplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x20021339
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactileaudioplayer.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../../inc
+USERINCLUDE             ../../../../inc 
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH              ../data
+START RESOURCE          20021339.rss
+TARGETPATH              ECOM_RESOURCE_DIR
+TARGET                  tactileaudioplugin.rsc
+END
+
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 efsrv.lib
+LIBRARY                 ecom.lib
+LIBRARY                 mediaclientaudiostream.lib
+LIBRARY                 tactilefeedbackresolver.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/inc/tactileaudioplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,220 @@
+/*
+* 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:  Class for producing audio feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEAUDIOPLAYER_H
+#define C_TACTILEAUDIOPLAYER_H
+
+
+#include <e32base.h>
+#include <cenrepnotifyhandler.h>
+#include <mdaaudiooutputstream.h> 
+#include <touchlogicalfeedback.h>
+
+#include "tactileplayer.h"
+
+
+/**
+ *  Class for procuding audio feedback based on logical
+ *  feedback type.
+ *
+ *  @lib tactileaudioplugin.lib
+ *  @since S60 5.2
+  */
+
+NONSHARABLE_CLASS( CTactileAudioPlayer ): public CTactilePlayer,
+                                          public MCenRepNotifyHandlerCallback,
+                                          public MMdaAudioOutputStreamCallback
+    {
+public:
+    /**  Possible states of this player */
+    enum TTactileAudioWavState
+        {
+        ETactileAudioInitialising,
+        ETactileAudioError,
+        ETactileAudioReady,
+        ETactileAudioPlaying
+        };
+
+    /**
+     * 2-phased constructor.
+     * @param aRepository - Reference to Central Repository.
+     * @return Instance of CTactileAudioPlayer.
+     */
+    static CTactileAudioPlayer* NewL( CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CTactileAudioPlayer();
+
+private:  // from base class CTactilePlayer
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt PlayFeedback( TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * @see CTactilePlayer.
+     */    
+    TInt PlayPreviewFeedback( TInt aLevel, TTouchLogicalFeedback aFeedback );
+    
+private: // From MMdaAudioOutputStreamCallback.
+
+    /**
+     * @see MMdaAudioOutputStreamCallback.
+     */    
+    void MaoscOpenComplete( TInt aError );
+    
+    /**
+     * @see MMdaAudioOutputStreamCallback.
+     */    
+    void MaoscBufferCopied( TInt aError, const TDesC8 &aBuffer );
+    
+    /**
+     * @see MMdaAudioOutputStreamCallback.
+     */    
+    void MaoscPlayComplete( TInt aError );
+
+private: // From MCenRepNotifyHandlerCallback.
+
+    /**
+     * @see MCenRepNotifyHandlerCallback.
+     */
+    void HandleNotifyInt( TUint32 aId, TInt aNewValue );
+
+private:
+    /**
+     * Read new settings values.
+     */   
+    void ReadSettingsL();
+
+    /**
+     * Scale volume.
+     */
+    TInt ScaledVolume();
+
+    /**
+     * Creation of the actual player is handled inside this function. It
+     * it assumed that current settings have been read to members 
+     * iFileName and iVolumeLevels before calling this function.
+     */
+    void CreateWavPlayerL();
+
+    /**
+     * Read audio sample.
+     */
+    void ReadSampleL( RFile& aFile, HBufC8*& aDes, TUint& aChannels, TUint& aSampleRate );
+
+private:
+    /**
+     * Constructor.
+     */
+    CTactileAudioPlayer( CRepository& aRepository );
+    
+    /**
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+    
+
+private: // data
+
+    /**
+    * Descriptor for wav file used for basic feedback.
+    * Own.
+    */
+    HBufC8* iBasicSample;
+    
+    /**
+    * Descriptor for wav file used for sensitive feedback.
+    * Own.    
+    */    
+    HBufC8* iSensitiveSample;
+
+    /**
+    * Maximum raw volume value supported by audio hardware
+    * interface. Stored to member variable to avoid MMFAudioClient:2
+    * panic. Possibly even increases performance, if ever so slightly.
+    */
+    TInt iMaxRawVolume;
+    
+    /**
+     * Audio channels.
+     */ 
+    TUint iChannels;
+    
+    /**
+     * Audio sample rate..
+     */     
+    TUint iSampleRate;
+    
+    /**
+     * Current state of this class
+     */
+    TTactileAudioWavState iState;
+
+    /**
+     * Access to audio player utility
+     * Own.  
+     */
+    CMdaAudioOutputStream* iAudioPlayer;
+    
+    /**
+     * Name of the .wav -file to be used as sensitive effect
+     * Own.  
+     */
+    HBufC* iSensitiveFileName;
+    
+    /**
+     * Name of the .wav -file to be used as basic effect
+     * Own.  
+     */    
+    HBufC* iBasicFileName;
+    
+    /**
+     * Current volume level
+     */
+    TInt iCurrentVolume;
+    
+    /**
+     * Original volume is saved here in preview playing.
+     */    
+    TInt iOriginalVolume;
+        
+    /**
+     * Volume levels for different logical feedbacks.
+     */
+    RArray<TInt> iVolumeLevels;
+    
+     /**
+     * Access to settings.
+     * Not own.
+     */    
+    CRepository& iRepository;
+    
+    /**
+     * Utility for listening to changes in configurable parameters.
+     * Own.  
+     */
+    CCenRepNotifyHandler* iCenRepNotifier;    
+    
+    };
+
+
+#endif // C_TACTILEAUDIOPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/rom/tactileaudioplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:  This is the IBY file for Tactile Audio plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILEAUDIOPLUGIN_IBY
+#define TACTILEAUDIOPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(tactileaudioplugin.dll,tactileaudioplugin.rsc)
+
+#endif // TACTILEAUDIOPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/src/tactileaudioplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,690 @@
+/*
+* 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:  Class for producing audio feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <e32debug.h>
+
+#include <centralrepository.h>
+#include <ecom/implementationproxy.h>
+
+#include <audiopreference.h>
+#include <mda/common/audio.h>
+#include <mdaaudiooutputstream.h>
+
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbacktrace.h"
+
+#include "tactileaudioplayer.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactileaudioplayerTraces.h"
+#endif
+
+const TInt KRiffHeaderSize = 44;
+_LIT8( KRiff, "RIFF" );
+_LIT8( KWave, "WAVE" );
+_LIT8( KFmt,  "fmt " );
+_LIT8( KData, "data" );
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileAudioPlayer::CTactileAudioPlayer( CRepository& aRepository ):
+    iRepository( aRepository )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTactileAudioPlayer::ConstructL()
+    {
+    TRACE("CTactileAudioPlayer::ConstructL()");
+    
+    ReadSettingsL();
+
+    CreateWavPlayerL();
+
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, 
+                                                  iRepository, 
+                                                  CCenRepNotifyHandler::EIntKey,
+                                                  KTactileFeedbackAudioVolume );
+    iCenRepNotifier->StartListeningL(); 
+
+    TRACE("CTactileAudioPlayer::ConstructL() - end");
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileAudioPlayer* CTactileAudioPlayer::NewL( CRepository& aRepository )
+    {
+    CTactileAudioPlayer* self = 
+        new ( ELeave ) CTactileAudioPlayer( aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileAudioPlayer::~CTactileAudioPlayer()
+    {
+    if ( iAudioPlayer )
+        {
+        iAudioPlayer->Stop();
+        delete iAudioPlayer;
+        }
+    
+    delete iCenRepNotifier;
+    delete iSensitiveSample;
+    delete iBasicSample;
+    delete iSensitiveFileName;
+    delete iBasicFileName;
+    
+    iVolumeLevels.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CTactilePlayer
+//
+// Currently we only select volume level according to logical feedback type
+// (i.e. the .wav -file cannot be selected separately for each logical
+// feedback type).
+//
+// We don't do anything in case volume level has been set to zero for the
+// given feedback type (this way e.g. dragging feedback can be disabled
+// totally if that is wanted).
+//
+// Notice that currently the ETouchFeedbackSensitive -feedback is a bit
+// troublesome: Even though we have our own thread for feedback playing,
+// it still lags behind when something is dragged on screen. Final solution
+// may be to configure audio .wav dragging feedback OFF, and use audio
+// tone for dragging instead.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileAudioPlayer::PlayFeedback( TTouchLogicalFeedback aFeedback )
+    {
+    TRACE2( "CTactileAudioPlayer::PlayFeedback( %d )", aFeedback );
+    TInt volumeIndex(0);
+    
+    switch ( aFeedback )
+        {
+        case ETouchFeedbackBasic:               // flow through
+        case ETouchFeedbackBasicButton:         // flow through
+        case ETouchFeedbackList:                // flow through
+        case ETouchFeedbackBoundaryList:        // flow through
+        case ETouchFeedbackSlider:              // flow through
+        case ETouchFeedbackEdit:                // flow through
+        case ETouchFeedbackSensitiveInput:
+        case ETouchFeedbackLineSelection:       // flow through
+        case ETouchFeedbackBlankSelection:      // flow through
+        case ETouchFeedbackTextSelection:       // flow through
+        case ETouchFeedbackEmptyLineSelection:  // flow through
+        case ETouchFeedbackTab:                 // flow through
+        case ETouchFeedbackPopUp:               // flow through
+        case ETouchFeedbackIncreasingPopUp:     // flow through
+        case ETouchFeedbackDecreasingPopUp:     // flow through
+        case ETouchFeedbackFlick:               // flow through
+        case ETouchFeedbackCheckbox:            // flow through
+        case ETouchFeedbackCharacterInputButton:
+        case ETouchFeedbackMultiTouchRecognized:
+            volumeIndex = 0;
+            break;
+        case ETouchFeedbackSensitive:           // flow through
+        case ETouchFeedbackSensitiveButton:     // flow through
+        case ETouchFeedbackSensitiveList:      
+            volumeIndex = 1;
+            break;
+        default:
+            // should not be there at all
+            TRACE2( "CTactileAudioPlayer::PlayFeedback - %d is not a feedback type - returning", aFeedback );
+            break;
+        }
+    
+    
+    if ( volumeIndex <= iVolumeLevels.Count() &&
+         iVolumeLevels[volumeIndex] > 0 &&
+         iAudioPlayer )
+        {
+        switch ( iState )
+            {
+            case ETactileAudioInitialising:
+                // can't play anything yet
+                break;
+            case ETactileAudioPlaying: // fall trough
+            case ETactileAudioReady:
+                OstTrace1( TACTILE_PERFORMANCE, TACTILE_PLAY_AUDIO_FEEDBACK_1,
+                                "e_TACTILE_PLAY_AUDIO_FEEDBACK 1 0x%x", aFeedback );
+
+                if ( aFeedback == ETouchFeedbackBasic )
+                    {
+                    TRAP_IGNORE( iAudioPlayer->WriteL( *iBasicSample ) );
+                    }
+                else
+                    {
+                    TRAP_IGNORE( iAudioPlayer->WriteL( *iSensitiveSample ) );
+                    }                    
+                OstTrace1( TACTILE_PERFORMANCE, TACTILE_PLAY_AUDIO_FEEDBACK_0,
+                                "e_TACTILE_PLAY_AUDIO_FEEDBACK 0 0x%x", aFeedback );
+                iState = ETactileAudioPlaying;
+                break;
+            case ETactileAudioError: 
+                break;
+            default:
+                // should not be here
+                TRACE("CTactileAudioPlayer::PlayFeedback - error with audio device");
+                break;
+                    
+            }
+
+        }
+    else 
+        {
+        if ( !iAudioPlayer )
+            {
+            TRACE("CTactileAudioPlayer::PlayFeedback - iAudioPlayer is NULL!");
+            }
+        else
+            {
+            TRACE("CTactileAudioPlayer::PlayFeedback - volume levels not ok");
+            }
+        }
+    TRACE2( "CTactileAudioPlayer::PlayFeedback( %d ) - end", aFeedback );
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//    
+TInt CTactileAudioPlayer::PlayPreviewFeedback( TInt aLevel, 
+                                             TTouchLogicalFeedback aFeedback )    
+    {
+    TRACE("CTactileAudioPlayer::PlayPreviewFeedback - Begin");
+    TInt ret( KErrArgument );
+    
+    iOriginalVolume = iCurrentVolume;
+    iCurrentVolume = aLevel;
+    iAudioPlayer->SetVolume( ScaledVolume() );
+    ret = PlayFeedback( aFeedback );
+    iCurrentVolume = iOriginalVolume;
+    iAudioPlayer->SetVolume( ScaledVolume() );
+    
+    TRACE("CTactileAudioPlayer::PlayPreviewFeedback - End");
+    return ret;    
+    }    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTactileAudioPlayer::MaoscOpenComplete( TInt aError )
+    {
+    if ( aError == KErrNone ) 
+        {
+        iCurrentVolume = iVolumeLevels[0];
+        iMaxRawVolume = iAudioPlayer->MaxVolume();
+        iRepository.Get( KTactileFeedbackAudioVolume, iCurrentVolume );
+        iAudioPlayer->SetVolume( ScaledVolume() );
+        TRAP_IGNORE( iAudioPlayer->SetDataTypeL( KMMFFourCCCodePCM16 ) );
+        iState = ETactileAudioReady;        
+        }
+    else 
+        {
+        TRACE2("CTactileAudioPlayer::MaoscOpenComplete( %d ) failed, will not play feedback", aError );
+        delete iAudioPlayer;
+        iAudioPlayer = NULL;
+        
+        iState = ETactileAudioError;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CTactileAudioPlayer::MaoscPlayComplete( TInt aError )
+    {
+    TRACE("CTactileAudioPlayer::MaoscPlayComplete - Begin");
+    iAudioPlayer->Stop();
+    if ( aError == KErrCorrupt )
+        {
+        TRACE2("CTactileAudioPlayer::MaoscPlayComplete( %d ) failed, will not play feedback", aError );
+        delete iAudioPlayer;
+        iAudioPlayer = NULL;
+        
+        iState = ETactileAudioError;        
+        }
+    else
+        {   
+        iState = ETactileAudioReady;
+        }            
+    TRACE("CTactileAudioPlayer::MaoscPlayComplete - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CTactileAudioPlayer::MaoscBufferCopied( TInt aError, const TDesC8& /*aBuffer*/ )
+    {
+    if ( !aError )
+        {
+        iState = ETactileAudioReady; // may write another sample
+        }
+    else
+        {
+        TRACE2("CTactileAudioPlayer::MaoscPlayComplete( %d ) failed", aError);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Settings are now not read completely, as only the .wav -file of basic
+// feedback is read, and same file is used for sensitive feedback. 
+// Using of separate files for basic and sensitive feedback 
+// can be added later in case necessary.
+// ---------------------------------------------------------------------------
+//
+void CTactileAudioPlayer::ReadSettingsL()
+    {
+    TRACE("CTactileAudioPlayer::ReadSettingsL - Begin");
+    
+    iVolumeLevels.Reset();
+    
+    delete iSensitiveFileName;
+    iSensitiveFileName = NULL;
+
+    delete iBasicFileName;
+    iBasicFileName = NULL;
+
+    iSensitiveFileName = HBufC::NewL( KMaxFileName );    
+    TPtr sensitiveFileName = iSensitiveFileName->Des();
+
+    iBasicFileName = HBufC::NewL( KMaxFileName );    
+    TPtr basicFileName = iBasicFileName->Des();
+
+    TInt basicVolumeLevel = 0;
+    TInt sensitiveVolumeLevel = 0;
+    
+    // Read volume values for level 2
+    iRepository.Get( KTactileAudioWavVolumeBasicLevel2, basicVolumeLevel );
+
+    
+    iRepository.Get( KTactileAudioWavVolumeSensitiveLevel2, sensitiveVolumeLevel );
+
+    // Read file names
+    iRepository.Get( KTactileAudioWavFileBasicLevel2, basicFileName );
+
+    iRepository.Get( KTactileAudioWavFileSensitiveLevel2, sensitiveFileName );
+    
+    iVolumeLevels.Append( basicVolumeLevel );
+    iVolumeLevels.Append( sensitiveVolumeLevel );
+    
+    TRACE("CTactileAudioPlayer::ReadSettingsL() - End");
+    }
+
+
+// ---------------------------------------------------------------------------
+// ScaledVolume()
+// return 100% scaled & sanity checked volume value
+// ---------------------------------------------------------------------------
+//
+TInt CTactileAudioPlayer::ScaledVolume()
+    {
+    if ( iMaxRawVolume == KErrNotFound )
+        {
+        TRACE( "CTactileAudioPlayer::ScaledVolume() Audio Hardware is not initialized properly" );
+        return 0;
+        }
+    
+    TInt volume = iMaxRawVolume * iCurrentVolume / 100;
+
+    if ( volume > iMaxRawVolume )
+        {
+        // sanity check, we might get anything from cenrep
+        volume = iMaxRawVolume;
+        }
+
+    TRACE4( "CTactileAudioPlayer::ScaledVolume() iCurrentVolume:%d scales volume to:%d out of iMaxRawVolume:%d",
+        iCurrentVolume, volume, iMaxRawVolume );
+        
+    return volume;
+    }
+
+/*
+* Wave file structure: Riff header + Wave format chunk + Wave data chunk
+* 
+* Riff header:
+* ==================================================
+* Offset Size Description      Value
+* 0x00      4 Chunk ID         "RIFF"
+* 0x04      4 Chunk Data Size  ( file size ) - 8
+* 0x08      4 RIFF Type        "WAVE"
+* 0x0c      *  Wave chunks *
+*
+* Wave Format Chunk:
+* ==================================================
+* Offset Size Description      Value
+* 0x00      4 Chunk ID         "fmt "
+* 0x04      4 Chunk Data Size  16 + extra format bytes ( 0 for normal wav files)
+* 0x08      2 Compression code 1...65535               ( 1 for PCM uncompressed)
+* 0x0a      2 Nbr of channels  1...65535
+* 0x0c      4 Sample rate      1...0xFFFFFFFF
+* 0x10      4 Average bytes per sec
+* 0x14      2 block align
+* 0x16      2 siginificant bits per sample
+* 0x18      2 extra format bytes 0...65535
+* 0x1a        * extra format bytes, if any *
+*
+* Wave Data Chunk:
+* ==================================================
+* Offset Size Description      Value
+* 0x00      4 Chunk ID         "data"
+* 0x04      4 Chunk data size  
+* 0x08        * sample data *
+*
+*/
+void CTactileAudioPlayer::ReadSampleL( RFile& aFile, 
+                                       HBufC8*& aDes, 
+                                       TUint& aChannels, 
+                                       TUint& aSampleRate )
+    {
+    TRACE("CTactileAudioPlayer::ReadSampleL - Start");
+    const TInt fmtOffset  = 0x0c;
+    const TInt dataOffset = fmtOffset + 0x18;
+    
+    TBuf8<KRiffHeaderSize> header;
+    TInt err = aFile.Read( header, KRiffHeaderSize );
+    if ( err )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL: reading from file failed, aborting");
+        User::Leave( err );
+        }
+
+    TPtr8 p = header.LeftTPtr( 4 );
+    
+    if ( p.Compare( KRiff ) )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL: no RIFF header found, aborting" );
+        User::Leave( KErrCorrupt );
+        }
+
+    p = header.MidTPtr( 0x08, 4 );
+    if ( p.Compare( KWave ) )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL:  not a WAVE file, aborting" );
+        User::Leave( KErrCorrupt );
+        }
+
+    p = header.MidTPtr( fmtOffset + 0x00, 4 );
+    if ( p.Compare( KFmt ) )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL:  no 'fmt ' chunk found, aborting" );
+        User::Leave( KErrCorrupt );
+        }
+
+    p = header.MidTPtr( dataOffset, 4 );
+    if ( p.Compare( KData ) )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL:  no 'data' chunk found, aborting" );
+        User::Leave( KErrCorrupt );
+        }
+
+    TUint8 lo = header[ fmtOffset + 0x08 ];
+    TUint8 hi = header[ fmtOffset + 0x08 + 1 ];
+    if ( !( lo == 1 && hi == 0) )
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL: non PCM wav not supported, aborting" );
+        User::Leave( KErrNotSupported );
+        }
+
+    lo = header[ fmtOffset + 0x0a ];
+    hi = header[ fmtOffset + 0x0a + 1 ];
+    aChannels = lo;
+    if ( !(aChannels == 1 || aChannels == 2 && hi == 0) )
+        {
+        TRACE2("CTactileAudioPlayer::ReadSampleL: unsupported number of channels ( %d ), aborting", aChannels );
+        User::Leave( KErrNotSupported );
+        }
+
+    aSampleRate = 0;
+    for ( TInt i = 0; i < 4; i++ )
+        {
+        lo = header[ fmtOffset + 0x0c + i ];
+        TUint32 tmp = lo;
+        tmp = tmp << i * 8;
+
+        aSampleRate = aSampleRate | tmp;
+        }
+
+    lo = header[ fmtOffset + 0x16 ];
+    hi = header[ fmtOffset + 0x16 + 1 ];
+    TUint16 bitsPerSample = hi;
+    bitsPerSample = bitsPerSample << 8;
+    bitsPerSample = bitsPerSample | lo;
+
+    if ( bitsPerSample != 16 )
+        {
+        TRACE2("CTactileAudioPlayer::ReadSampleL:  %d bits per sample not supported", bitsPerSample );
+        User::Leave( KErrNotSupported );
+        }
+
+    TUint32 bytesPerSample = bitsPerSample / 8;
+    
+    // how many bytes for 6 ms
+    TUint bytesNeeded = ( aSampleRate * aChannels * bytesPerSample * 6 ) / 1000;
+
+    TInt fsize( 0 );
+    if ( aFile.Size( fsize ) == KErrNone && fsize >= bytesNeeded + KRiffHeaderSize )
+        {
+        aDes = HBufC8::NewL( bytesNeeded );
+        TPtr8 des = aDes->Des();
+        aFile.Read( des, bytesNeeded );
+        }
+    else
+        {
+        TRACE("CTactileAudioPlayer::ReadSampleL: Less than 6ms content in file, aborting" );
+        User::Leave( KErrNotSupported );
+        }
+
+    TRACE3("CTactileAudioPlayer::ReadSampleL %dHz %dchannel sample read successfully - End", 
+        iSampleRate, iChannels);
+    }
+
+// ---------------------------------------------------------------------------
+// Audio data reading from file and creation of the actual player utility.
+//
+// Rest of the initializations are done in MapcInitComplete -function.
+//
+// Notice that CMdaAudioOutputStream usage is not a good idea, as it
+// buffers samples until buffer is full and flushes all in a row. Result is 
+// no feedback first, then a machine gun burst at some completely 
+// unrelated moment. 
+// ---------------------------------------------------------------------------
+//
+void CTactileAudioPlayer::CreateWavPlayerL()
+    {
+    TRACE("CTactileAudioPlayer::CreateWavPlayerL - Start");
+    iState = ETactileAudioInitialising;
+    delete iBasicSample;
+    iBasicSample = NULL;
+    delete iSensitiveSample;
+    iSensitiveSample = NULL;
+
+    if ( !( iBasicFileName && iBasicFileName->Length() > 0  && 
+            iSensitiveFileName && iSensitiveFileName->Length() > 0 ))
+        {
+        TRACE("CTactileAudioPlayer::CreateWavPlayerL filenames missing, aborting");
+        User::Leave( KErrBadName );
+        }
+
+    RFs fs;
+    User::LeaveIfError ( fs.Connect() ); 
+    CleanupClosePushL( fs );
+        
+    RFile file;
+    TInt err = file.Open( fs, *iBasicFileName, EFileRead );
+    if ( err )
+        {
+        TRACE2("CTactileAudioPlayer::CreateWavPlayerL could not open %S, aborting", iBasicFileName );
+        User::Leave( err );
+        }
+
+    CleanupClosePushL( file );
+    ReadSampleL( file, iBasicSample, iChannels, iSampleRate );
+    CleanupStack::PopAndDestroy(&file); 
+    
+    RFile file2; 
+    err = file2.Open( fs, *iSensitiveFileName, EFileRead );
+    if ( err )
+        {
+        TRACE2("CTactileAudioPlayer::CreateWavPlayerL could not open %S, aborting", iSensitiveFileName );
+        User::Leave( err );
+        }
+
+    CleanupClosePushL( file2 );
+    
+    TUint sampleRate(0);
+    TUint channels(0);
+    ReadSampleL( file2, iSensitiveSample, channels, sampleRate );
+    CleanupStack::PopAndDestroy( &file2 );  
+    CleanupStack::PopAndDestroy( &fs );
+    
+    if ( channels != iChannels || sampleRate != iSampleRate )
+        {
+        TRACE("CTactileAudioPlayer::CreateWavPlayerL Sample rates and number of channels must be same for both files, aborting");
+        User::Leave( KErrNotSupported );
+        }
+    
+    TInt priority = KAudioPriorityKeyPressNonDTMFWithFeedback; 
+    TMdaPriorityPreference pref = static_cast<TMdaPriorityPreference>(KAudioPrefKeyPressNonDTMFWithFeedback);
+    
+    iAudioPlayer = CMdaAudioOutputStream::NewL( *this ,priority, pref); 
+        
+    TMdaAudioDataSettings streamSettings;
+    switch ( iChannels )
+        {
+        case 1:
+            streamSettings.iChannels = TMdaAudioDataSettings::EChannelsMono;
+            break;
+        case 2:
+            streamSettings.iChannels = TMdaAudioDataSettings::EChannelsStereo;
+            TRACE("CTactileAudioPlayer::CreateWavPlayerL Warning: stereo wav for feedback");
+            break;
+        default:
+            TRACE2("CTactileAudioPlayer::CreateWavPlayerL: unsupported number of channels %d, aborting", iChannels );
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    
+    // there must be easier way to do this...
+    switch( iSampleRate )
+        {
+        case 48000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate48000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate48000Hz;
+            break;
+        case 44100:
+            TRACE2("CTactileAudioPlayer::CreateWavPlayerL: warning, samplerate %d causes performance problem", iSampleRate );
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate44100Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate44100Hz;
+            break;
+        case 32000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate32000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate32000Hz;
+            break;
+        case 24000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate24000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate24000Hz;
+            break;
+        case 16000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate16000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate16000Hz;
+            break;
+        case 12000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate12000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate12000Hz;
+            break;
+        case 11025:
+            TRACE2("CTactileAudioPlayer::CreateWavPlayerL: warning, samplerate %d causes performance problem",iSampleRate );
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate11025Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate11025Hz;
+            break;
+        case 8000:
+            streamSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate8000Hz;
+            streamSettings.iCaps = TMdaAudioDataSettings::ESampleRate8000Hz;
+            break;
+        default:
+            TRACE2("CTactileAudioPlayer::CreateWavPlayerL: unsupported samplerate %d, aborting",iSampleRate );
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    
+    iAudioPlayer->Open( &streamSettings );
+
+    TRACE("CTactileAudioPlayer::CreateWavPlayerL - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CTactileAudioPlayer::HandleNotifyInt( TUint32 aId, TInt aNewValue )    
+    {
+    TRACE("CTactileTonePlayer::HandleNotifyInt - Begin");
+    if ( aId == KTactileFeedbackAudioVolume )
+        {
+        iCurrentVolume = aNewValue;
+        iAudioPlayer->SetVolume( ScaledVolume() );
+        }
+    TRACE("CTactileTonePlayer::HandleNotifyInt - End");
+    }
+
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2002133A, CTactileAudioPlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }
+   
+
+   
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_AUDIO_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_AUDIO_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactileaudioplugin/traces/tactileaudioplayerTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILEAUDIOPLAYERTRACES_H__
+#define __TACTILEAUDIOPLAYERTRACES_H__
+
+#define KOstTraceComponentID 0x20021339
+
+#define TACTILE_PLAY_AUDIO_FEEDBACK_1 0x400001
+#define TACTILE_PLAY_AUDIO_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/data/2001CB98.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:  ECom registration file for Tactile Haptics player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    dll_uid = 0x2001CB98; 
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = 0x2001CBA7;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2001CB99;
+                    version_no = 1; 
+                    display_name = "";
+                    default_data = "Haptics";
+                    opaque_data = ""; 
+                    }
+                };
+            }
+        };
+    }
+
+// End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:  Build information file for tactile haptics plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// IBY file
+../rom/tactilehapticsplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactilehapticsplugin.iby)
+
+PRJ_MMPFILES
+tactilehapticsplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/group/tactilehapticsplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* 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:  Project definition file for Haptics Feedback player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactilehapticsplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x2001CB98
+
+CAPABILITY              CAP_ECOM_PLUGIN ReadDeviceData
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactilehapticsplayer.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../../inc
+USERINCLUDE             ../../../../inc 
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH              ../data
+START RESOURCE          2001CB98.rss
+TARGETPATH              ECOM_RESOURCE_DIR
+TARGET                  tactilehapticsplugin.rsc
+END
+
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 efsrv.lib
+LIBRARY                 ecom.lib
+LIBRARY                 hwrmhapticsclient.lib
+LIBRARY                 tactilefeedbackresolver.lib
+LIBRARY                 profileeng.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/inc/tactilehapticsplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,210 @@
+/*
+* 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:  Class for producing vibra feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef C_TACTILEHAPTICSPLAYER_H
+#define C_TACTILEHAPTICSPLAYER_H
+
+
+#include <e32base.h>
+#include <cenrepnotifyhandler.h>
+#include <touchlogicalfeedback.h>
+#include <MProfileChangeObserver.h>
+
+#include "tactileplayer.h"
+
+class CHWRMHaptics;
+
+class MProfileEngine;
+class CProfileChangeNotifyHandler;
+/**
+ *  Class for procuding haptics feedback based on logical
+ *  feedback type.
+ *
+ *  @lib tactilehapticsplugin.lib
+ *  @since S60 5.2
+  */
+
+NONSHARABLE_CLASS( CTactileHapticsPlayer ): public CTactilePlayer,
+                                            public MCenRepNotifyHandlerCallback,
+                                            public MProfileChangeObserver
+    {
+public:
+    /**
+     * 2-phased constructor.
+     * @param aRepository - Reference to Central Repository.
+     * @return Instance of CTactileHapticsPlayers.
+     */
+    static CTactileHapticsPlayer* NewL( CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CTactileHapticsPlayer();
+
+ // from base class CTactilePlayer
+
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt PlayFeedback( TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt StartFeedback( TTouchContinuousFeedback aFeedback,
+                        TInt aIntensity );
+
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt ModifyFeedback( TInt aIntensity );
+
+    /**
+     * @see CTactilePlayer.
+     */
+    void StopFeedback();    
+
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt PlayPreviewFeedback( TInt aLevel, TTouchLogicalFeedback aFeedback );
+
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt StartPreviewFeedback( TInt aLevel,
+                               TTouchContinuousFeedback aFeedback,
+                               TInt aIntensity );
+
+    /**
+     * @see CTactilePlayer.
+     */
+    void StopPreviewFeedback();                               
+
+private: // From MCenRepNotifyHandlerCallback.
+    /**
+     * @see MCenRepNotifyHandlerCallback.
+     */
+    void HandleNotifyGeneric( TUint32 aId );
+
+private: // From MProfileChangeObserver
+    /**
+     * @see MProfileChangeObserver.
+     */
+    void HandleActiveProfileEventL( TProfileEvent aProfileEvent, 
+                                    TInt aProfileId );
+
+private:
+    /**
+     * Plays haptics effect by logical feedback type.
+     * 
+     */
+    void DoPlayFeedbackL( TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * Reads IVT data from file to buffer. 
+     *
+     */    
+    HBufC8* IVTBufAllocL( const TDesC& aFileName );
+    
+    /**
+     * Get new settings value from Central Repository and 
+     * change haptics property.
+     */
+     void DoHandleNotifyGenericL( TUint32 aId );
+
+    /**
+     * Profiles engine -related initializations.
+     * (User changeable settings are stored in profiles)
+     */
+    void InitializeProfilesEngineL();
+    
+private:
+    /**
+     * Constructor.
+     */    
+    CTactileHapticsPlayer( CRepository& aRepository );
+
+    /**
+     * 2nd phase constructor.
+     */
+    void ConstructL();    
+
+private: // data
+
+    /**
+     * Access to haptics functionality
+     * Own.  
+     */
+    CHWRMHaptics* iHaptics;
+
+    /**
+     * Current effect handle.
+     */
+    TInt    iEffectHandle;
+    
+    /**
+     * Current effect index.
+     */    
+    TInt    iEffectIndex;
+
+    /**
+     * Handle to effect data file.
+     */
+    TInt iIVTHandle;
+
+    /**
+     * Multiplier, which is used for scaling the intenstiy of
+     * continuous feedback.
+     */
+    TInt iMultiplier;
+    
+    /**
+     * Haptics effect strength.
+     */
+    TInt iStrength;
+    
+    /**
+     * Access to settings.
+     * Not own.
+     */    
+    CRepository& iRepository;
+    
+    /**
+     * Utility for listening to changes in configurable parameters.
+     * Own.  
+     */
+    CCenRepNotifyHandler* iCenRepNotifier;    
+    
+    
+    /**
+     * Access to user changeable settings (stored into profiles)
+     * Own.
+     */
+     MProfileEngine* iProfileEng;
+
+    /**
+     * For listening to changes in profiles.
+     * Own.  
+     */
+    CProfileChangeNotifyHandler* iProfileHandler;
+    };
+
+
+#endif // C_TACTILEHAPTICSPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/rom/tactilehapticsplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:  This is the IBY file for Tactile Haptics plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILEHAPTICSPLUGIN_IBY
+#define TACTILEHAPTICSPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(tactilehapticsplugin.dll,tactilehapticsplugin.rsc)
+
+#endif // TACTILEHAPTICSPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/src/tactilehapticsplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,678 @@
+/*
+* 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:  Class for producing haptics feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <f32file.h>
+#include <e32debug.h>
+#include <hwrmhaptics.h>
+#include <centralrepository.h>
+#include <ecom/implementationproxy.h>
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include <MProfileExtraSettings.h>
+#include <MProfileFeedbackSettings.h>
+#include <CProfileChangeNotifyHandler.h>
+
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbacktrace.h"
+
+#include "tactilehapticsplayer.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactilehapticsplayerTraces.h"
+#endif
+
+// ======== MEMBER FUNCTIONS ========
+
+const TInt KMaxEffectNameLen = 128;
+
+// Pulse feedback's names
+_LIT8( KTFBasic,                "TFBasic");
+_LIT8( KTFSensitive,            "TFSensitive");
+_LIT8( KTFBasicButton,          "TFBasicButton");
+_LIT8( KTFSensitiveButton,      "TFSensitiveButton");
+_LIT8( KTFList,                 "TFList");
+_LIT8( KTFSensitiveList,        "TFSensitiveList");
+_LIT8( KTFBoundaryList,         "TFBoundaryList");
+_LIT8( KTFSlider,               "TFSlider");
+_LIT8( KTFEdit,                 "TFEdit");
+_LIT8( KTFLineSelection,        "TFLineSelection");
+_LIT8( KTFBlankSelection,       "TFBlankSelection");
+_LIT8( KTFTextSelection,        "TFTextSelection");
+_LIT8( KTFEmptyLineSelection,   "TFEmptyLineSelection");
+_LIT8( KTFTab,                  "TFTab");
+_LIT8( KTFPopUp,                "TFPopUp");
+_LIT8( KTFIncreasingPopUp,      "TFIncreasingPopUp");
+_LIT8( KTFDecreasingPopUp,      "TFDecreasingPopUp");
+_LIT8( KTFFlick,                "TFFlick");
+_LIT8( KTFCheckbox,             "TFCheckbox");
+_LIT8( KTFSensitiveInput,       "TFSensitiveInput");
+_LIT8( KTFCharacterInputButton, "TFCharacterInputButton");
+_LIT8( KTFMultiTouchRecognized, "TFMultiTouchRecognized");
+
+// Continuous feedback's names
+_LIT8( KTFContinuousSmooth,     "TFContinuousSmooth");
+_LIT8( KTFContinuousSlider,     "TFContinuousSlider");
+_LIT8( KTFContinuousInput,      "TFContinuousInput");
+_LIT8( KTFContinuousFlick,      "TFContinuousFlick");
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileHapticsPlayer::CTactileHapticsPlayer( CRepository& aRepository ) :
+    iRepository(aRepository)
+    {
+    
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTactileHapticsPlayer::ConstructL()
+    {
+    TRACE("CTactileHapticsPlayer::ConstructL - Begin");
+    iHaptics = CHWRMHaptics::NewL(NULL, NULL); 
+
+    TUint32 suppMask( 0 );
+    User::LeaveIfError( iHaptics->SupportedActuators( suppMask ) );
+
+    TInt actuatorType( EHWRMLogicalActuatorAny );    
+    iRepository.Get( KTactileFeedbackHapticsActuator, actuatorType );
+    
+    if ( actuatorType & suppMask )
+        {
+        iHaptics->OpenActuatorL( static_cast<THWRMLogicalActuators>(actuatorType) );    
+        }    
+
+    User::LeaveIfError( iHaptics->SetDeviceProperty( 
+                                        CHWRMHaptics::EHWRMHapticsLicensekey, 
+                                        KNullDesC8() ) );
+
+    TInt strength(0);
+    iRepository.Get( KTactileFeedbackHapticsStrength, strength );
+    
+    // Strength value in settings is multiplied by 100 to scale value 
+    // suitable for haptics (0-10000).    
+    iStrength = strength * 100;
+
+    // As a temporary fix to EAKH-7LKANT, the strength is (over)read from
+    // profiles engine
+    InitializeProfilesEngineL();
+
+    User::LeaveIfError( iHaptics->SetDeviceProperty( 
+                                        CHWRMHaptics::EHWRMHapticsStrength, 
+                                        iStrength ) );
+    TFileName ivtFile;
+    iRepository.Get( KTactileHapticsIVTFile, ivtFile );
+    HBufC8* ivtBuf = IVTBufAllocL( ivtFile );
+
+    CleanupStack::PushL( ivtBuf );
+    User::LeaveIfError( iHaptics->LoadEffectData( *ivtBuf, iIVTHandle ) );
+    CleanupStack::PopAndDestroy( ivtBuf );
+    
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, 
+                                                  iRepository );
+    iCenRepNotifier->StartListeningL();    
+    
+    TRACE("CTactileHapticsPlayer::ConstructL - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileHapticsPlayer* CTactileHapticsPlayer::NewL( CRepository& aRepository )
+    {
+    CTactileHapticsPlayer* self = 
+                        new ( ELeave ) CTactileHapticsPlayer( aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileHapticsPlayer::~CTactileHapticsPlayer()
+    {
+    if( iProfileEng )
+        {
+        iProfileEng->Release();
+        iProfileEng = NULL;
+        }
+    delete iProfileHandler;
+    delete iCenRepNotifier;
+    delete iHaptics;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CTactilePlayer
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTactileHapticsPlayer::PlayFeedback( TTouchLogicalFeedback aFeedback )
+    {
+    // TRACE("CTactileHapticsPlayer::PlayFeedback - Start");
+    
+    TRACE2("CTactileHapticsPlayer::PlayFeedback type: %d", aFeedback );
+    TRAPD( err, DoPlayFeedbackL( aFeedback )); 
+    if ( err != KErrNone )
+        {
+        TRACE2("CTactileHapticsPlayer::PlayFeedback error: %d", err );
+        }    
+
+    // TRACE("CTactileHapticsPlayer::PlayFeedback - End");
+    return err;
+    }
+    
+// ---------------------------------------------------------------------------
+// Actually play feedback.
+// ---------------------------------------------------------------------------
+//
+void CTactileHapticsPlayer::DoPlayFeedbackL( TTouchLogicalFeedback aFeedback )
+    {
+    // Check if hapticts strength is set to zero.
+    if ( !iStrength )
+        {
+        User::Leave(KErrNotReady);
+        }
+    
+    TBuf8<KMaxEffectNameLen> name;
+  
+    switch( aFeedback )
+        {
+        case ETouchFeedbackBasic:
+            name = KTFBasic;
+            break;
+        case ETouchFeedbackSensitive:
+            name = KTFSensitive;
+            break;
+        case ETouchFeedbackBasicButton:
+            name = KTFBasicButton;
+            break;
+        case ETouchFeedbackSensitiveButton:
+            name = KTFSensitiveButton;
+            break;
+        case ETouchFeedbackList:
+            name = KTFList;
+            break;
+        case ETouchFeedbackSensitiveList:
+            name = KTFSensitiveList;
+            break;
+        case ETouchFeedbackBoundaryList:
+            name = KTFBoundaryList;
+            break;
+        case ETouchFeedbackSlider:
+            name = KTFSlider;
+            break;
+        case ETouchFeedbackEdit:
+            name = KTFEdit;
+            break;
+        case ETouchFeedbackLineSelection:
+            name = KTFLineSelection;
+            break;
+        case ETouchFeedbackBlankSelection:
+            name = KTFBlankSelection;
+            break;
+        case ETouchFeedbackTextSelection:
+            name = KTFTextSelection;
+            break;
+        case ETouchFeedbackEmptyLineSelection:
+            name = KTFEmptyLineSelection;
+            break;                        
+        case ETouchFeedbackTab:
+            name = KTFTab;
+            break;
+        case ETouchFeedbackPopUp:  
+            name = KTFPopUp;
+            break; 
+       case ETouchFeedbackIncreasingPopUp:
+            name = KTFIncreasingPopUp;
+            break;     
+        case ETouchFeedbackDecreasingPopUp:
+            name = KTFDecreasingPopUp;
+            break;
+        case ETouchFeedbackFlick:
+            name = KTFFlick;
+            break;
+        case ETouchFeedbackCheckbox:
+            name = KTFCheckbox;
+            break;
+        case ETouchFeedbackSensitiveInput:
+            name = KTFSensitiveInput;
+            break;
+        case ETouchFeedbackCharacterInputButton:
+            name = KTFCharacterInputButton;
+            break;
+        case ETouchFeedbackMultiTouchRecognized:
+            name = KTFMultiTouchRecognized;
+            break;
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+    TInt effectIndex(0);
+    User::LeaveIfError( iHaptics->GetEffectIndexFromName( iIVTHandle, 
+                                                          name, 
+                                                          effectIndex ) );
+    TInt effectHandle(0);
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_HAPTICS_FEEDBACK_1, "e_TACTILE_PLAY_HAPTICS_FEEDBACK 1");
+    User::LeaveIfError( iHaptics->PlayEffect( iIVTHandle, 
+                                              effectIndex, 
+                                              effectHandle ) );
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_HAPTICS_FEEDBACK_0, "e_TACTILE_PLAY_HAPTICS_FEEDBACK 0");
+    }
+
+// ---------------------------------------------------------------------------
+// Load IVT file.
+// ---------------------------------------------------------------------------
+//
+HBufC8* CTactileHapticsPlayer::IVTBufAllocL( const TDesC& aFileName )
+    {
+    TRACE("CTactileHapticsPlayer::IVTBufAllocL - Begin");
+    
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );  
+    CleanupClosePushL( fs );
+    
+    RFile file;
+    User::LeaveIfError( file.Open( fs, aFileName, EFileRead ) );
+    CleanupClosePushL( file );
+    
+    TInt fileSize( 0 );
+    file.Size( fileSize );
+    
+    HBufC8* ivtFileBuf = HBufC8::NewLC( fileSize );
+    TPtr8 dataBufPtr = ivtFileBuf->Des();
+    
+    User::LeaveIfError( file.Read( dataBufPtr ) );
+
+    CleanupStack::Pop( ivtFileBuf );    
+    CleanupStack::PopAndDestroy( &file );
+    CleanupStack::PopAndDestroy( &fs );
+    TRACE("CTactileHapticsPlayer::IVTBufAllocL - End");
+    return ivtFileBuf;
+    }
+  
+// ---------------------------------------------------------------------------
+// Start feedback.
+// ---------------------------------------------------------------------------
+//   
+TInt CTactileHapticsPlayer::StartFeedback( TTouchContinuousFeedback aFeedback,
+                                           TInt aIntensity )
+    {
+    TRACE("CTactileHapticsPlayer::StartFeedback - Start");
+    TInt ret(KErrNone);
+
+    // If there's an ongoing feedback, stop it first.
+    if ( iEffectHandle )
+        {
+        StopFeedback();
+        }
+     
+    TBuf8<KMaxEffectNameLen> name;   
+    switch( aFeedback )
+        {
+        case ETouchContinuousSmooth:
+            name = KTFContinuousSmooth;
+            break;
+        case ETouchContinuousSlider:
+            name = KTFContinuousSlider;
+            break;               
+        case ETouchContinuousInput:
+            name = KTFContinuousInput;
+            break;
+        case ETouchContinuousFlick:
+            name = KTFContinuousFlick;
+            break;    
+        default:
+            ret = KErrArgument;
+            break;
+        }
+
+    if ( ret == KErrNone )
+        {
+        ret = iHaptics->GetEffectIndexFromName( iIVTHandle, 
+                                                name, 
+                                                iEffectIndex );        
+        }
+
+    TInt effectType(0);
+    if ( ret == KErrNone )
+        {    
+        ret = iHaptics->GetEffectType( iIVTHandle, 
+                                       iEffectIndex, 
+                                       effectType );
+        }           
+    
+    if ( ret == KErrNone )
+        {
+        switch ( effectType )                               
+            {
+            case CHWRMHaptics::EHWRMHapticsTypePeriodic:
+                {
+                CHWRMHaptics::THWRMHapticsPeriodicEffect periodicDef;
+
+                ret = iHaptics->GetPeriodicEffectDefinition( iIVTHandle,
+                                                             iEffectIndex,
+                                                             periodicDef );
+
+                // Effect's magnitude value in IVT file is used as max value for 
+                // continuous effects.                                        
+                iMultiplier = periodicDef.iMagnitude / 100;                   
+                periodicDef.iMagnitude = aIntensity * iMultiplier;
+
+                if ( ret == KErrNone )
+                    {
+                    ret = iHaptics->PlayPeriodicEffect( periodicDef,
+                                                        iEffectHandle );
+                    }
+                }
+                break;
+            case CHWRMHaptics::EHWRMHapticsTypeMagSweep:
+                {
+                CHWRMHaptics::THWRMHapticsMagSweepEffect magSweepDef;
+
+                ret =iHaptics->GetMagSweepEffectDefinition( iIVTHandle,
+                                                            iEffectIndex,
+                                                            magSweepDef );
+                 
+                // Effect's magnitude value in IVT file is used as max value for 
+                // continuous effects.                                        
+                iMultiplier = magSweepDef.iMagnitude / 100;                   
+                magSweepDef.iMagnitude = aIntensity * iMultiplier;
+                
+                if ( ret == KErrNone )
+                    {
+                    ret =iHaptics->PlayMagSweepEffect( magSweepDef,
+                                                       iEffectHandle );  
+                    }
+                }
+                break;            
+            default:
+                TRACE("CTactileHapticsPlayer::StartFeedback - Playing effect not found");
+                ret = KErrArgument;
+                break;
+            }            
+        }  
+
+    TRACE("CTactileHapticsPlayer::StartFeedback - End");
+    return ret;     
+    }
+        
+// ---------------------------------------------------------------------------
+// Modify feedback.
+// ---------------------------------------------------------------------------
+//                        
+TInt CTactileHapticsPlayer::ModifyFeedback( TInt aIntensity )
+    {
+    TRACE("CTactileHapticsPlayer::ModifyFeedback - Start");
+    TInt ret(KErrNotReady);
+    
+    // Check if there's feedback started, do nothing if not.
+    if ( iEffectHandle )
+        {
+        TInt effectType(0);
+
+        ret = iHaptics->GetEffectType( iIVTHandle, 
+                                       iEffectIndex, 
+                                       effectType );
+
+        TRACE2("CTactileHapticsPlayer::ModifyFeedback - effect type %d", effectType );
+        
+        if ( ret == KErrNone )
+            {
+            TInt intensity = aIntensity * iMultiplier;
+                 
+            switch ( effectType )                               
+                {
+                case CHWRMHaptics::EHWRMHapticsTypePeriodic:
+                    {
+                    CHWRMHaptics::THWRMHapticsPeriodicEffect periodicDef;
+
+                    iHaptics->GetPeriodicEffectDefinition( iIVTHandle,
+                                                           iEffectIndex,
+                                                           periodicDef );
+                                                              
+                    periodicDef.iMagnitude = intensity;
+                    
+                    iHaptics->ModifyPlayingPeriodicEffect( iEffectHandle, 
+                                                           periodicDef );            
+                    }
+                    break;
+                case CHWRMHaptics::EHWRMHapticsTypeMagSweep:
+                    {
+                    CHWRMHaptics::THWRMHapticsMagSweepEffect magSweepDef;
+
+                    iHaptics->GetMagSweepEffectDefinition( iIVTHandle,
+                                                           iEffectIndex,
+                                                           magSweepDef );
+                                                              
+                    magSweepDef.iMagnitude = intensity;
+                    
+                    iHaptics->ModifyPlayingMagSweepEffect( iEffectHandle, 
+                                                           magSweepDef );
+                    
+                    }
+                    break;            
+                default:
+                    ret = KErrArgument;    
+                    break;
+                }            
+            }             
+        }    
+   
+    TRACE("CTactileHapticsPlayer::ModifyFeedback - End");     
+    return ret;                        
+    }
+    
+// ---------------------------------------------------------------------------
+// Stop feedback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileHapticsPlayer::StopFeedback()
+    {
+    TRACE("CTactileHapticsPlayer::StopFeedback - Start");
+    iHaptics->StopAllPlayingEffects();
+    iEffectHandle = 0;    
+    TRACE("CTactileHapticsPlayer::StopFeedback - End");
+    }    
+
+// ---------------------------------------------------------------------------
+// Check if there's a change in haptics settings and set new values if needed.
+// ---------------------------------------------------------------------------
+//  
+void CTactileHapticsPlayer::DoHandleNotifyGenericL( TUint32 aId )
+    {
+    TRACE("CTactileHapticsPlayer::DoHandleNotifyGenericL - Begin");
+    switch ( aId )
+        {
+        case KTactileFeedbackHapticsStrength:
+            {
+            // Strength value in settings is multiplied by 100 to scale value 
+            // suitable for haptics.
+            TInt strength(0);
+            iRepository.Get( KTactileFeedbackHapticsStrength, strength );
+            
+            iStrength = strength * 100;
+            iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                         iStrength );        
+            }
+            break;
+        case KTactileHapticsIVTFile:
+            {
+            TFileName ivtFile;
+            iRepository.Get( KTactileHapticsIVTFile, ivtFile );
+            
+            HBufC8* ivtBuf = IVTBufAllocL( ivtFile );
+            if ( ivtBuf )
+                {
+                TInt ret = iHaptics->DeleteEffectData( iIVTHandle );
+                if ( ret == KErrNone )
+                    {
+                    iHaptics->LoadEffectData( *ivtBuf, iIVTHandle );
+                    }
+                delete ivtBuf;
+                }
+            }
+            break;            
+        default:
+            break;
+        }    
+    TRACE("CTactileHapticsPlayer::DoHandleNotifyGenericL - End");
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//                              
+TInt CTactileHapticsPlayer::PlayPreviewFeedback( TInt aLevel, 
+                                            TTouchLogicalFeedback aFeedback )
+    {
+    TRACE("CTactileHapticsPlayer::PlayPreviewFeedback - Begin");
+    // Set preview level (scaled to haptics - multiplied by 100).
+    TInt ret = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                 aLevel * 100 );
+    if ( ret == KErrNone )
+        {
+        ret = PlayFeedback( aFeedback );    
+        }
+        
+    iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                 iStrength );
+                                 
+    TRACE("CTactileHapticsPlayer::PlayPreviewFeedback - End");
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//                              
+TInt CTactileHapticsPlayer::StartPreviewFeedback( TInt aLevel,
+                           TTouchContinuousFeedback aFeedback,
+                           TInt aIntensity )
+    {
+    TRACE("CTactileHapticsPlayer::StartPreviewFeedback - Begin");
+    // Set preview level (scaled to haptics - multiplied by 100).
+    TInt ret = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                            aLevel * 100 );
+    if ( ret == KErrNone )
+        {
+        ret = StartFeedback( aFeedback, aIntensity );
+        }
+    TRACE("CTactileHapticsPlayer::StartPreviewFeedback - End");
+    return ret;
+    }
+ 
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//                              
+void CTactileHapticsPlayer::StopPreviewFeedback()
+    {
+    TRACE("CTactileHapticsPlayer::StopPreviewFeedback - Begin");
+    StopFeedback();
+    
+    iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, 
+                                 iStrength );
+    TRACE("CTactileHapticsPlayer::StopPreviewFeedback - Begin");
+    }
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileHapticsPlayer::HandleNotifyGeneric( TUint32 aId )
+    {
+    TRACE("CTactileHapticsPlayer::HandleNotifyGeneric - Begin");
+    TRAP_IGNORE( DoHandleNotifyGenericL( aId ) );
+    TRACE("CTactileHapticsPlayer::HandleNotifyGeneric - End");
+    }
+
+// ---------------------------------------------------------------------------
+// From MProfileChangeObserver.
+// ---------------------------------------------------------------------------
+//
+void CTactileHapticsPlayer::HandleActiveProfileEventL( 
+    TProfileEvent /*aProfileEvent*/, 
+    TInt /*aProfileId*/ )
+    {
+    InitializeProfilesEngineL();
+    iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, iStrength ); 
+    }
+
+// ---------------------------------------------------------------------------
+// Profiles engine -related initializations
+// ---------------------------------------------------------------------------
+//
+void CTactileHapticsPlayer::InitializeProfilesEngineL()
+    {
+    // Create profiles engine, if it does not yet exist
+    if ( !iProfileEng )
+        {
+        iProfileEng = CreateProfileEngineL();        
+        }
+        
+    MProfile* activeProfile  = iProfileEng->ActiveProfileL();
+ 
+    const MProfileExtraSettings& extraSettings = 
+     activeProfile->ProfileExtraSettings();
+    
+    const MProfileFeedbackSettings& feedbackSettings = 
+     extraSettings.ProfileFeedbackSettings();
+ 
+    TProfileTactileFeedback strength = feedbackSettings.TactileFeedback();
+    iStrength = 100 * ( EProfileTactileFeedbackLevel3 == strength ? 100 :
+                        EProfileTactileFeedbackLevel2 == strength ? 60 :
+                        EProfileTactileFeedbackLevel1 == strength ? 30 : 0 );
+ 
+    activeProfile->Release();
+    
+    // Create listener for profiles changes, if it does not yet exist
+    if ( !iProfileHandler ) 
+        {
+        iProfileHandler = CProfileChangeNotifyHandler::NewL( this );
+        }
+    }
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2001CB99, CTactileHapticsPlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }
+   
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_HAPTICS_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_HAPTICS_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilehapticsplugin/traces/tactilehapticsplayerTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILEHAPTICSPLAYERTRACES_H__
+#define __TACTILEHAPTICSPLAYERTRACES_H__
+
+#define KOstTraceComponentID 0x2001cb98
+
+#define TACTILE_PLAY_HAPTICS_FEEDBACK_1 0x400001
+#define TACTILE_PLAY_HAPTICS_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/data/2001CB9C.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:  ECom registration file for Tactile Audio Tone player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    dll_uid = 0x2001CB9C; 
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = 0x2001CBA7;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2001CB9D;
+                    version_no = 1; 
+                    display_name = "";
+                    default_data = "Audio";
+                    opaque_data = ""; 
+                    }
+                };
+            }
+        };
+    }
+
+// End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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:  Build information file for tactile tone plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+// IBY file
+../rom/tactiletoneplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactiletoneplugin.iby)
+
+PRJ_MMPFILES
+tactiletoneplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/group/tactiletoneplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* 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:  Project definition file for Audio Tone Feedback player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactiletoneplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x2001CB9C
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactiletoneplayer.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../../inc
+USERINCLUDE             ../../../../inc 
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH              ../data
+START RESOURCE          2001CB9C.rss
+TARGETPATH              ECOM_RESOURCE_DIR
+TARGET                  tactiletoneplugin.rsc
+END
+
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 efsrv.lib
+LIBRARY                 ecom.lib
+LIBRARY                 mediaclientaudio.lib
+LIBRARY                 tactilefeedbackresolver.lib
+LIBRARY                 profileeng.lib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/inc/tactiletoneplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,213 @@
+/*
+* 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:  Class for producing audio tone feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef C_TACTILETONEPLAYER_H
+#define C_TACTILETONEPLAYER_H
+
+#include <e32base.h>
+#include <mdaaudiotoneplayer.h> 
+#include <cenrepnotifyhandler.h>
+#include <touchlogicalfeedback.h>
+#include <MProfileChangeObserver.h>
+
+#include "tactileplayer.h"
+
+class CRepository;
+class MProfileEngine;
+class CProfileChangeNotifyHandler;
+/**
+ *  Class for procuding audio tone feedback based on logical
+ *  feedback type.
+ *
+ *  @since S60 5.2
+ */
+NONSHARABLE_CLASS( CTactileTonePlayer ): public CTactilePlayer, 
+                                         public MMdaAudioToneObserver,
+                                         public MCenRepNotifyHandlerCallback,
+                                         public MProfileChangeObserver
+    {
+    /**
+     * Sound params for tone feedback. 
+     */
+    struct TTactileSoundParams
+        {
+        TInt iFrequency;
+        TTimeIntervalMicroSeconds iDuration;
+        TInt iVolume; // 0 = No physical feedback.
+        };
+        
+    /**
+     * State of tone playing.
+     */
+    enum TTactileToneState
+        {
+        ETactileTonePreparing,
+        ETactileToneReady,
+        ETactileTonePlaying,
+        ETactileTonePlayPending,
+        ETactileToneError
+        };
+
+public:
+
+    static CTactileTonePlayer* NewL( CRepository& aRepository );
+
+
+    virtual ~CTactileTonePlayer();
+
+ // from base class CTactilePlayer
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt PlayFeedback( TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * @see CTactilePlayer.
+     */
+    TInt PlayPreviewFeedback( TInt aLevel, TTouchLogicalFeedback aFeedback );
+    
+private: // From MMdaAudioToneObserver
+
+    /**
+     * From MMdaAudioToneObserver
+     * Called when audio tone player utility has been configured.
+     *
+     * @param aError - KErrNone if operation was succesful. Otherwise one of
+     *                 the standard Symbian OS error codes.
+     */
+    void MatoPrepareComplete( TInt aError );
+    
+    /**
+     * From MMdaAudioToneObserver
+     * Called when audio tone playing operation has completed.
+     *
+     * @param aError - KErrNone if operation was succesful. Otherwise one of
+     *                 the standard Symbian OS error codes.
+     */
+    void MatoPlayComplete( TInt aError );
+
+private: // From MCenRepNotifyHandlerCallback.
+
+    /**
+     * @see MCenRepNotifyHandlerCallback.
+     */
+    void HandleNotifyInt( TUint32 aId, TInt aNewValue );
+
+private: // From MProfileChangeObserver
+    /**
+     * @see MProfileChangeObserver.
+     */
+    void HandleActiveProfileEventL( TProfileEvent aProfileEvent, 
+                                    TInt aProfileId );
+
+private:
+    /**
+     * Constructror.
+     */
+    CTactileTonePlayer( CRepository& aRepository );
+
+    /**
+     * 2nd phase constructror.
+     */
+    void ConstructL();
+    
+    /**
+     * Read settings values.
+     */    
+    void ReadSettings();
+    
+    /**
+     * Scales given volume percentage to 0 - CMdaAudioToneUtility::MaxVolume.
+     *
+     * @param aPercentages - Volume level in percentages
+     * @return Volume level that can be set to audio tone player.
+     */
+    TInt ScaleVolume( TInt aPercentages );
+
+    /**
+     * Profiles engine -related initializations.
+     * (User changeable settings are stored in profiles)
+     */
+    void InitializeProfilesEngineL();
+
+private: // data
+
+    /**
+     * Current state of the player.
+     */
+    TTactileToneState iState;
+
+    /**
+     * Audio tone player utility used for producing sound feedback.
+     * Own. 
+     */
+    CMdaAudioToneUtility* iMdaAudioToneUtility;
+    
+    /**
+     * Physical feedback definitions
+     */
+    RArray<TTactileSoundParams> iSoundParams;
+    
+    /**
+     * Currently loaded sound parameters (index is to iSoundParams array)
+     */
+    TInt iCurrentEffectIndex;
+
+    /**
+     * Reference to CenRep session
+     * Not own
+     */
+    CRepository& iRepository;
+    
+    /**
+     * Utility for listening to changes in configurable parameters.
+     * Own.  
+     */
+    CCenRepNotifyHandler* iCenRepNotifier;    
+    
+    /**
+     * Current audio volume level.
+     */
+    TInt iAudioLevel;
+
+    /**
+     * Original audio volume level is saved here in preview playing.
+     */    
+    TInt iOriginalLevel;
+    
+    /**
+     * This flag indicates if preview is played. This is needed because original 
+     * settings have to be returned after preview.
+     */    
+    TBool iPlayPreview;
+    
+    /**
+     * Access to user changeable settings (stored into profiles)
+     * Own.
+     */
+     MProfileEngine* iProfileEng;
+
+    /**
+     * For listening to changes in profiles.
+     * Own.  
+     */
+    CProfileChangeNotifyHandler* iProfileHandler;
+    };
+
+
+#endif // C_TACTILETONEPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/rom/tactiletoneplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:  This is the IBY file for Tactile Tone plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILETONEPLUGIN_IBY
+#define TACTILETONEPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(tactiletoneplugin.dll,tactiletoneplugin.rsc)
+
+#endif // TACTILETONEPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/src/tactiletoneplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,489 @@
+/*
+* 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:  Class for producing audio tone feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <ecom/implementationproxy.h>
+#include <centralrepository.h>
+#include <audiopreference.h>
+#include <profileinternal.hrh>
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include <MProfileExtraSettings.h>
+#include <MProfileFeedbackSettings.h>
+#include <CProfileChangeNotifyHandler.h>
+
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbacktrace.h"
+
+#include "tactiletoneplayer.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactiletoneplayerTraces.h"
+#endif
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//  Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileTonePlayer::CTactileTonePlayer( CRepository& aRepository ):
+    iRepository(aRepository)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::ConstructL()
+    {
+    TRACE("CTactileTonePlayer::ConstructL - Begin");    
+    iMdaAudioToneUtility = CMdaAudioToneUtility::NewL( 
+        *this,
+        NULL,
+        KAudioPriorityKeyPress,
+        TMdaPriorityPreference( KAudioPrefKeyPressNonDTMF ) );
+
+    User::LeaveIfError( iRepository.Get( KTactileFeedbackAudioVolume, 
+                                         iAudioLevel ) );
+
+    // As a fix to EAKH-7LKANT, we're temporarily reading volume level
+    // settings from profiles engine
+    InitializeProfilesEngineL();
+                                         
+    if ( iAudioLevel > EProfileAudioFeedbackLevel3 )
+        {
+        User::Leave( KErrGeneral );
+        }
+  
+    ReadSettings();
+    
+    iMdaAudioToneUtility->PrepareToPlayTone(
+        iSoundParams[0].iFrequency,
+        iSoundParams[0].iDuration );
+        
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, 
+                                                  iRepository, 
+                                                  CCenRepNotifyHandler::EIntKey,
+                                                  KTactileFeedbackAudioVolume );
+    iCenRepNotifier->StartListeningL();         
+    TRACE("CTactileTonePlayer::ConstructL - End");        
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileTonePlayer* CTactileTonePlayer::NewL( CRepository& aRepository )
+    {
+    TRACE("CTactileTonePlayer::NewL - Begin");    
+    CTactileTonePlayer* self = new ( ELeave ) CTactileTonePlayer(aRepository);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    TRACE("CTactileTonePlayer::NewL - End");    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileTonePlayer::~CTactileTonePlayer()
+    {
+    if( iProfileEng )
+        {
+        iProfileEng->Release();
+        iProfileEng = NULL;
+        }
+    delete iProfileHandler;
+    delete iCenRepNotifier;
+    delete iMdaAudioToneUtility;
+    iSoundParams.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CTactilePlayer
+//
+// Here we first check if we are ready to play, and then either play
+// sound immediately (if loaded parameters are correct), or then load
+// the proper parameters in case this feedback type is different than
+// the previously played one.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileTonePlayer::PlayFeedback( TTouchLogicalFeedback aFeedback )
+    {
+    TRACE("CTactileTonePlayer::PlayFeedback- Begin");
+    if ( iState == ETactileToneReady )
+        {
+        TInt effectIndex(0);
+        
+        switch ( aFeedback )
+            {
+            case ETouchFeedbackBasic:               // flow through
+            case ETouchFeedbackBasicButton:         // flow through
+            case ETouchFeedbackList:                // flow through
+            case ETouchFeedbackBoundaryList:        // flow through
+            case ETouchFeedbackSlider:              // flow through
+            case ETouchFeedbackEdit:                // flow through
+            case ETouchFeedbackSensitiveInput:
+            case ETouchFeedbackLineSelection:       // flow through
+            case ETouchFeedbackBlankSelection:      // flow through
+            case ETouchFeedbackTextSelection:       // flow through
+            case ETouchFeedbackEmptyLineSelection:  // flow through
+            case ETouchFeedbackTab:                 // flow through
+            case ETouchFeedbackPopUp:               // flow through
+            case ETouchFeedbackIncreasingPopUp:     // flow through
+            case ETouchFeedbackDecreasingPopUp:     // flow through
+            case ETouchFeedbackFlick:               // flow through
+            case ETouchFeedbackCheckbox:            // flow through
+            case ETouchFeedbackCharacterInputButton:
+            case ETouchFeedbackMultiTouchRecognized:
+                effectIndex = 0;
+                break;
+            case ETouchFeedbackSensitive:           // flow through
+            case ETouchFeedbackSensitiveButton:     // flow through
+            case ETouchFeedbackSensitiveList:      
+                effectIndex = 1;                    
+                break;                              
+            default:                                
+                effectIndex = 0;                    
+                break;                              
+            }                                       
+                                                    
+        // Check that we have valid effect index    
+        if ( effectIndex < iSoundParams.Count() &&
+             iAudioLevel != EProfileAudioFeedbackOff )
+            {
+            if ( effectIndex == iCurrentEffectIndex )
+                {
+                // Play the sound immediately.
+                OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_AUDIO_TONE_FEEDBACK_1, "e_TACTILE_PLAY_AUDIO_TONE_FEEDBACK 1");
+                                
+                iMdaAudioToneUtility->Play(); 
+
+                OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_AUDIO_TONE_FEEDBACK_0, "e_TACTILE_PLAY_AUDIO_TONE_FEEDBACK 0");
+        
+                iState = ETactileTonePlaying;
+                }
+            else
+                {      
+                // Load new parameters.          
+                iMdaAudioToneUtility->PrepareToPlayTone(
+                    iSoundParams[effectIndex].iFrequency,
+                    iSoundParams[effectIndex].iDuration );
+
+                iCurrentEffectIndex = effectIndex;
+
+                iState = ETactileTonePlayPending;
+                }
+            }
+        }
+    TRACE("CTactileTonePlayer::PlayFeedback- End");
+    return KErrNone;
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// 
+// ---------------------------------------------------------------------------
+//    
+TInt CTactileTonePlayer::PlayPreviewFeedback( TInt aLevel, 
+                                             TTouchLogicalFeedback aFeedback )
+    {
+    TRACE("CTactileTonePlayer::PlayPreviewFeedback - Begin");
+    TInt ret( KErrArgument );
+    
+    if ( aLevel > EProfileAudioFeedbackOff  &&
+         aLevel <= EProfileAudioFeedbackLevel3 )
+        {
+        iOriginalLevel = iAudioLevel;
+        iAudioLevel = aLevel;
+        ReadSettings();    
+        iCurrentEffectIndex = KErrNotFound;
+        iPlayPreview = ETrue;
+        ret = PlayFeedback( aFeedback );
+        }    
+    
+    TRACE("CTactileTonePlayer::PlayPreviewFeedback - End");
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MMdaAudioToneObserver.
+// 
+// If initialization was succesfull, then we set the volume according
+// to current effect, and after that either start to play (in case we
+// have a pending play request), or just set ourselves to ready state.
+//
+// If initialization failed, then we set ourselves to error state. 
+// In practice this means that no sounds will be played at all.
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::MatoPrepareComplete( TInt aError )
+    {
+    if ( aError == KErrNone )
+        {      
+        if ( iCurrentEffectIndex < iSoundParams.Count() )
+            {
+            iMdaAudioToneUtility->SetVolume( 
+                    iSoundParams[iCurrentEffectIndex].iVolume ); 
+            }
+        if ( iState == ETactileTonePlayPending )
+            {
+            iMdaAudioToneUtility->Play(); 
+            
+            if ( iPlayPreview )
+                {
+                iPlayPreview = EFalse;
+                iAudioLevel = iOriginalLevel;
+                ReadSettings();    
+                iCurrentEffectIndex = KErrNotFound;                
+                }
+            iState = ETactileTonePlaying;            
+            }
+        else
+            {
+            iState = ETactileToneReady;                    
+            }        
+        }
+    else
+        {
+        iState = ETactileToneError;
+        }    
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MMdaAudioToneObserver.
+// 
+// Any errors are ignored, because they are most likely caused by
+// override of higher priority client.
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::MatoPlayComplete( TInt /*aError*/ )
+    {
+    iState = ETactileToneReady;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Read all audio configuration options (frequency, duration and volume)
+// for each logical feedback into array according to current feedback level, 
+// so that they can conveniently be used when feedback needs to be played.
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::ReadSettings()
+    {
+    TRACE("CTactileTonePlayer::ReadSettingsL- Begin");    
+    TTactileSoundParams basicParams;
+    basicParams.iFrequency = 0;
+    basicParams.iDuration   = TTimeIntervalMicroSeconds( 0 );
+    basicParams.iVolume    = 0;
+    
+    TTactileSoundParams sensitiveParams = basicParams;
+    
+    TInt basicDuration = 0;
+    TInt sensitiveDuration = 0;
+    
+    if ( iAudioLevel == EProfileAudioFeedbackLevel1 )
+        {
+        // Read settings for ETouchFeedbackBasic, level 1
+        iRepository.Get( KTactileAudioToneFreqBasicLevel1,     
+                         basicParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationBasicLevel1, 
+                         basicDuration );
+        iRepository.Get( KTactileAudioToneVolumeBasicLevel1,   
+                         basicParams.iVolume );
+        
+        // Read settings for ETouchFeedbackSensitive, level 1
+        iRepository.Get( KTactileAudioToneFreqSensitiveLevel1, 
+                         sensitiveParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationSensitiveLevel1,  
+                         sensitiveDuration );
+        iRepository.Get( KTactileAudioToneVolumeSensitiveLevel1,  
+                         sensitiveParams.iVolume );
+        }
+    else if ( iAudioLevel == EProfileAudioFeedbackLevel2  )
+        {
+        // Read settings for ETouchFeedbackBasic, level 2
+        iRepository.Get( KTactileAudioToneFreqBasicLevel2,     
+                         basicParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationBasicLevel2, 
+                         basicDuration );
+        iRepository.Get( KTactileAudioToneVolumeBasicLevel2,   
+                         basicParams.iVolume );
+        
+        // Read settings for ETouchFeedbackSensitive, level 2
+        iRepository.Get( KTactileAudioToneFreqSensitiveLevel2, 
+                         sensitiveParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationSensitiveLevel2,  
+                         sensitiveDuration );
+        iRepository.Get( KTactileAudioToneVolumeSensitiveLevel2,  
+                         sensitiveParams.iVolume );        
+        }
+    else if ( iAudioLevel == EProfileAudioFeedbackLevel3  )
+        {
+        // Read settings for ETouchFeedbackBasic, level 3
+        iRepository.Get( KTactileAudioToneFreqBasicLevel3,     
+                         basicParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationBasicLevel3, 
+                         basicDuration );
+        iRepository.Get( KTactileAudioToneVolumeBasicLevel3,   
+                         basicParams.iVolume );
+        
+        // Read settings for ETouchFeedbackSensitive, level 3
+        iRepository.Get( KTactileAudioToneFreqSensitiveLevel3, 
+                         sensitiveParams.iFrequency );
+        iRepository.Get( KTactileAudioToneDurationSensitiveLevel3,  
+                         sensitiveDuration );
+        iRepository.Get( KTactileAudioToneVolumeSensitiveLevel3,  
+                         sensitiveParams.iVolume );        
+        }
+     
+    // Clear old parameters. Only do it at end, so that we still have the
+    // old settings in case something fails when reading these from 
+    // Central Repository.
+    iSoundParams.Reset();
+    
+    
+    // Duration is in milliseconds in central repository
+    // --> Convert to microseconds
+    basicParams.iDuration = 
+        TTimeIntervalMicroSeconds( basicDuration * 1000 );
+    sensitiveParams.iDuration = 
+        TTimeIntervalMicroSeconds( sensitiveDuration * 1000 );
+        
+    // Volume is in precentages in central repository
+    // --> Convert to 0-CMdaAudioToneUtility::MaxVolume    
+    basicParams.iVolume     = ScaleVolume( basicParams.iVolume );
+    sensitiveParams.iVolume = ScaleVolume( sensitiveParams.iVolume );
+    
+    // Store parameters for different feedback types
+    iSoundParams.Append( basicParams );
+    iSoundParams.Append( sensitiveParams );
+    TRACE("CTactileTonePlayer::ReadSettingsL - End");        
+    }
+
+// ---------------------------------------------------------------------------
+// Scale the volume, and perform sanity check.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileTonePlayer::ScaleVolume( TInt aPercentages )
+    {
+    TInt maxVolume = iMdaAudioToneUtility->MaxVolume();
+
+    TInt scaledVolume = ( maxVolume * aPercentages ) / 100;
+    
+    if ( scaledVolume > maxVolume )
+        {
+        scaledVolume = maxVolume;
+        }
+    
+    return scaledVolume;    
+    }
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileTonePlayer::HandleNotifyInt( TUint32 aId, TInt aNewValue )    
+    {
+    TRACE("CTactileTonePlayer::HandleNotifyInt - Begin");
+    if ( aId == KTactileFeedbackAudioVolume )
+        {
+        iAudioLevel = aNewValue;
+        
+        // No need to read settings if audio feedback is set off.
+        if ( iAudioLevel != EProfileAudioFeedbackOff )
+            {
+            ReadSettings();    
+            iCurrentEffectIndex = KErrNotFound;        
+            }
+        }
+    TRACE("CTactileTonePlayer::HandleNotifyInt - End");
+    }
+
+// ---------------------------------------------------------------------------
+// From MProfileChangeObserver.
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::HandleActiveProfileEventL( 
+    TProfileEvent /*aProfileEvent*/, 
+    TInt /*aProfileId*/ )
+    {
+    InitializeProfilesEngineL();
+    ReadSettings();    
+    iCurrentEffectIndex = KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// Profiles engine -related initializations
+// ---------------------------------------------------------------------------
+//
+void CTactileTonePlayer::InitializeProfilesEngineL()
+    {
+    // Create profiles engine, if it does not yet exist
+    if ( !iProfileEng )
+        {
+        iProfileEng = CreateProfileEngineL();        
+        }
+        
+    MProfile* activeProfile  = iProfileEng->ActiveProfileL();
+ 
+    const MProfileExtraSettings& extraSettings = 
+     activeProfile->ProfileExtraSettings();
+    
+    const MProfileFeedbackSettings& feedbackSettings = 
+     extraSettings.ProfileFeedbackSettings();
+ 
+    iAudioLevel = feedbackSettings.AudioFeedback();
+ 
+    activeProfile->Release();
+    
+    // Create listener for profiles changes, if it does not yet exist
+    if ( !iProfileHandler ) 
+        {
+        iProfileHandler = CProfileChangeNotifyHandler::NewL( this );
+        }
+    }
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2001CB9D, CTactileTonePlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }
+   
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_AUDIO_TONE_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_AUDIO_TONE_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactiletoneplugin/traces/tactiletoneplayerTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILETONEPLAYERTRACES_H__
+#define __TACTILETONEPLAYERTRACES_H__
+
+#define KOstTraceComponentID 0x2001cb9c
+
+#define TACTILE_PLAY_AUDIO_TONE_FEEDBACK_1 0x400001
+#define TACTILE_PLAY_AUDIO_TONE_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/data/2001CB9A.rss	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,45 @@
+/*
+* 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:  ECom registration file for Tactile Legacy Vibra player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+    {
+    dll_uid = 0x2001CB9A; 
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = 0x2001CBA7;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2001CB9B;
+                    version_no = 1; 
+                    display_name = "";
+                    default_data = "Haptics";
+                    opaque_data = "";
+                    }
+                };
+            }
+        };
+    }
+
+// End of file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/group/bld.inf	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:  Build information file for tactile vibra plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+// IBY file
+../rom/tactilevibraplugin.iby  CORE_IBY_EXPORT_PATH(mw, tactilevibraplugin.iby)
+
+
+PRJ_MMPFILES
+tactilevibraplugin.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/group/tactilevibraplugin.mmp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,53 @@
+/*
+* 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:  Project definition file for Legacy Vibra Feedback player plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+TARGET                  tactilevibraplugin.dll
+TARGETTYPE              PLUGIN
+UID                     0x10009D8D 0x2001CB9A
+
+CAPABILITY              CAP_ECOM_PLUGIN
+VENDORID                VID_DEFAULT
+
+SOURCEPATH              ../src
+SOURCE                  tactilevibraplayer.cpp
+
+USERINCLUDE             ../inc
+USERINCLUDE             ../../../inc
+USERINCLUDE             ../../../../inc 
+USERINCLUDE             ../traces
+
+// Default system include paths for middleware layer modules.
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH              ../data
+START RESOURCE          2001CB9A.rss
+TARGETPATH              ECOM_RESOURCE_DIR
+TARGET                  tactilevibraplugin.rsc
+END
+
+
+LIBRARY                 euser.lib
+LIBRARY                 centralrepository.lib
+LIBRARY                 cenrepnotifhandler.lib
+LIBRARY                 efsrv.lib
+LIBRARY                 ecom.lib
+LIBRARY                 hwrmvibraclient.lib
+LIBRARY                 tactilefeedbackresolver.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/inc/tactilevibraplayer.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* 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:  Class for producing vibra feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef C_TACTILEVIBRAPLAYER_H
+#define C_TACTILEVIBRAPLAYER_H
+
+
+#include <e32base.h>
+#include <cenrepnotifyhandler.h>
+#include <touchlogicalfeedback.h>
+
+#include "tactileplayer.h"
+
+class CHWRMVibra;
+
+/**
+ *  Class for procuding vibra feedback based on logical
+ *  feedback type.
+ *
+ *  @lib tactilevibraplugin.lib
+ *  @since S60 5.2
+  */
+
+NONSHARABLE_CLASS( CTactileVibraPlayer ): public CTactilePlayer,
+                                          public MCenRepNotifyHandlerCallback
+    {
+public:
+    /**  
+     * Parameters of one vibrator effect 
+     */
+    struct TTactileVibraParams
+        {
+        TInt iTime;
+        TInt iIntensity;
+        };
+
+    /**
+     * 2-phased constructor.
+     * @param aRepository - Reference to Central Repository.
+     * @return Instance of CTactileVibraPlayer.
+     */
+    static CTactileVibraPlayer* NewL( CRepository& aRepository );
+
+    /**
+     * Destructor.
+     */
+    virtual ~CTactileVibraPlayer();
+
+ // from base class CTactilePlayer
+ 
+    /**
+     * @see CTactilePlayer.
+     */ 
+    TInt PlayFeedback( TTouchLogicalFeedback aFeedback );
+    
+    /**
+     * @see CTactilePlayer.
+     */     
+    TInt StartFeedback( TTouchContinuousFeedback aFeedback,
+                        TInt aIntensity );
+
+    /**
+     * @see CTactilePlayer.
+     */ 
+    TInt ModifyFeedback( TInt aIntensity );
+
+    /**
+     * @see CTactilePlayer.
+     */ 
+    void StopFeedback();    
+    
+    /**
+     * @see CTactilePlayer.
+     */    
+    TInt PlayPreviewFeedback( TInt aLevel, TTouchLogicalFeedback aFeedback );
+        
+
+private: // From MCenRepNotifyHandlerCallback.
+    /**
+     * @see MCenRepNotifyHandlerCallback.
+     */ 
+    void HandleNotifyInt( TUint32 aId, TInt aNewValue );
+
+private:
+    /**
+     * Plays vibra effect by logical feedback type.
+     */
+    void DoPlayFeedbackL( TInt aTime, TInt aIntensity );
+
+    /**
+     * Starts continuous vibra effect by logical feedback type.
+     */
+    void DoStartFeedbackL( TTouchContinuousFeedback aType,
+                           TInt aIntensity );
+    /**
+     * Read settings values.
+     */ 
+    void ReadSettings();
+
+private:
+    /**
+     * Constructor.
+     */
+    CTactileVibraPlayer( CRepository& aRepository );
+
+    /**
+     * 2nd phase constructor.
+     */
+    void ConstructL();
+    
+
+private: // data
+
+    /**
+     * Array for storing vibrator parameters for each
+     * different physical feedback type.
+     */
+    RArray<TTactileVibraParams> iVibraParams;
+
+    /**
+     * Access to vibra functionality
+     * Own.  
+     */
+    CHWRMVibra* iVibra;
+    
+     /**
+     * Access to settings.
+     * Not own.
+     */    
+    CRepository& iRepository;
+    
+    /**
+     * Utility for listening to changes in configurable parameters.
+     * Own.  
+     */
+    CCenRepNotifyHandler* iCenRepNotifier;    
+    
+    /**
+     * Current vibra level.
+     */
+    TInt iVibraLevel;
+    
+    /**
+     * Original vibra level is saved here when preview is played.
+     */    
+    TInt iOriginalLevel;
+    
+    };
+
+
+#endif // C_TACTILEVIBRAPLAYER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/rom/tactilevibraplugin.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:  This is the IBY file for Tactile Vibra plugin.
+* Part of:      Tactile Feedback.
+*
+*/
+
+
+#ifndef TACTILEVIBRAPLUGIN_IBY
+#define TACTILEVIBRAPLUGIN_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(tactilevibraplugin.dll,tactilevibraplugin.rsc)
+
+#endif // TACTILEVIBRAPLUGIN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/src/tactilevibraplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,373 @@
+/*
+* 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:  Class for producing vibra feedback.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32debug.h>
+#include <hwrmvibra.h>
+#include <centralrepository.h>
+#include <ecom/implementationproxy.h>
+#include <profileinternal.hrh>
+
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbacktrace.h"
+
+#include "tactilevibraplayer.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactilevibraplayerTraces.h"
+#endif
+
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileVibraPlayer::CTactileVibraPlayer( CRepository& aRepository ):
+        iRepository ( aRepository )
+    {    
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTactileVibraPlayer::ConstructL()
+    {
+    TRACE("CTactileVibraPlayer::ConstructL - Begin");
+
+    User::LeaveIfError( iRepository.Get( KTactileFeedbackHapticsStrength, 
+                                         iVibraLevel ) );
+                                         
+    if ( iVibraLevel > EProfileTactileFeedbackLevel3 )
+        {
+        User::Leave( KErrGeneral );
+        }
+        
+    ReadSettings();
+
+    iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, 
+                                                  iRepository, 
+                                                  CCenRepNotifyHandler::EIntKey,
+                                                  KTactileFeedbackHapticsStrength );
+    iCenRepNotifier->StartListeningL();     
+
+    TRACE("CTactileVibraPlayer::ConstructL - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileVibraPlayer* CTactileVibraPlayer::NewL( CRepository& aRepository )
+    {
+    CTactileVibraPlayer* self = 
+        new ( ELeave ) CTactileVibraPlayer ( aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileVibraPlayer::~CTactileVibraPlayer()
+    {
+    delete iCenRepNotifier;
+    delete iVibra;
+    iVibraParams.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CTactilePlayer
+//
+// Duration and intensity for the vibra are selected from the array
+// according to logical feedback type.
+//
+// Feedback is not produced in case duration or intensity is zero.
+// ---------------------------------------------------------------------------
+//
+TInt CTactileVibraPlayer::PlayFeedback( TTouchLogicalFeedback aFeedback )
+    {
+    TInt ret(KErrNotReady);
+    if ( iVibraLevel != EProfileTactileFeedbackOff )
+        {
+        TInt effectIndex = KErrNotFound;
+        
+        switch ( aFeedback )
+            {
+            case ETouchFeedbackBasic:               // flow through
+            case ETouchFeedbackBasicButton:         // flow through
+            case ETouchFeedbackList:                // flow through
+            case ETouchFeedbackBoundaryList:        // flow through
+            case ETouchFeedbackSlider:              // flow through
+            case ETouchFeedbackEdit:                // flow through
+            case ETouchFeedbackSensitiveInput:
+            case ETouchFeedbackLineSelection:       // flow through
+            case ETouchFeedbackBlankSelection:      // flow through
+            case ETouchFeedbackTextSelection:       // flow through
+            case ETouchFeedbackEmptyLineSelection:  // flow through
+            case ETouchFeedbackTab:                 // flow through
+            case ETouchFeedbackPopUp:               // flow through
+            case ETouchFeedbackIncreasingPopUp:     // flow through
+            case ETouchFeedbackDecreasingPopUp:     // flow through
+            case ETouchFeedbackFlick:               // flow through
+            case ETouchFeedbackCheckbox:            // flow through
+            case ETouchFeedbackCharacterInputButton:
+            case ETouchFeedbackMultiTouchRecognized:
+                effectIndex = 0;
+                break;
+            case ETouchFeedbackSensitive:           // flow through
+            case ETouchFeedbackSensitiveButton:     // flow through
+            case ETouchFeedbackSensitiveList:      
+                effectIndex = 1;                    
+                break;                              
+            default:                                
+                effectIndex = 0;                    
+                break;                              
+            }
+        
+        if ( effectIndex < iVibraParams.Count() && 
+             iVibraParams[effectIndex].iTime > 0 &&
+             iVibraParams[effectIndex].iIntensity != 0)
+            {
+            TRACE2("CTactileVibraPlayer::PlayFeedback %d", aFeedback);  
+            TRAP( ret, DoPlayFeedbackL( 
+                iVibraParams[effectIndex].iTime, 
+                iVibraParams[effectIndex].iIntensity ) ); 
+
+            if (!ret)    
+                {
+                TRACE2("CTactileVibraPlayer: Vibra playing leave code: %d", ret);  
+                }
+            }        
+        }
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// Start feedback.
+// ---------------------------------------------------------------------------
+//   
+TInt CTactileVibraPlayer::StartFeedback( TTouchContinuousFeedback aType,
+                                         TInt aIntensity )
+    {
+    TRACE("CTactileVibraPlayer::StartFeedback - Begin");
+    TRAPD( ret, DoStartFeedbackL( aType, aIntensity ) );
+    TRACE("CTactileVibraPlayer::StartFeedback - End");
+    return ret;
+    }
+        
+// ---------------------------------------------------------------------------
+// Modify feedback.
+// ---------------------------------------------------------------------------
+//                        
+TInt CTactileVibraPlayer::ModifyFeedback( TInt /*aIntensity*/ )
+    {
+    return KErrNotSupported;
+    }
+    
+// ---------------------------------------------------------------------------
+// Stop feedback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileVibraPlayer::StopFeedback()
+    {
+    TRACE("CTactileVibraPlayer::StopFeedback - Begin");
+    if ( iVibra )
+        {
+        TRAP_IGNORE( iVibra->StopVibraL() );
+        }    
+    TRACE("CTactileVibraPlayer::StopFeedback - End");
+    }
+  
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//    
+TInt CTactileVibraPlayer::PlayPreviewFeedback( TInt aLevel, 
+                                             TTouchLogicalFeedback aFeedback )    
+    {
+    TRACE("CTactileVibraPlayer::PlayPreviewFeedback - Begin");
+    TInt ret( KErrArgument );
+    
+    if ( aLevel > EProfileTactileFeedbackOff  &&
+         aLevel <= EProfileTactileFeedbackLevel3 )
+        {
+        iOriginalLevel = iVibraLevel;
+        iVibraLevel = aLevel;
+        ReadSettings();    
+        ret = PlayFeedback( aFeedback );
+        iVibraLevel = iOriginalLevel;
+        ReadSettings();
+        }    
+    
+    TRACE("CTactileVibraPlayer::PlayPreviewFeedback - End");
+    return ret;    
+    }
+
+// ---------------------------------------------------------------------------
+// Read vibra effects from central repository.
+// ---------------------------------------------------------------------------
+//
+void CTactileVibraPlayer::ReadSettings()
+    {    
+    TRACE("CTactileVibraPlayer::ReadSettings - Begin");
+    TTactileVibraParams basicParams;
+    
+    basicParams.iTime = 0;
+    basicParams.iIntensity = 0;
+
+    TTactileVibraParams sensitiveParams = basicParams;
+        
+    if ( iVibraLevel == EProfileTactileFeedbackLevel1 )
+        {
+        // Read settings for ETouchFeedbackBasic
+        iRepository.Get( KTactileVibraIntensityBasicLevel1, 
+                          basicParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationBasicLevel1,  
+                          basicParams.iTime );
+        
+        // Read settings for ETouchFeedbackSensitive
+        iRepository.Get( KTactileVibraIntensitySensitiveLevel1, 
+                          sensitiveParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationSensitiveLevel1,  
+                          sensitiveParams.iTime );
+        }
+    else if ( iVibraLevel == EProfileTactileFeedbackLevel2 )
+        {
+        // Read settings for ETouchFeedbackBasic
+        iRepository.Get( KTactileVibraIntensityBasicLevel2, 
+                          basicParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationBasicLevel2,  
+                          basicParams.iTime );
+        
+        // Read settings for ETouchFeedbackSensitive
+        iRepository.Get( KTactileVibraIntensitySensitiveLevel2, 
+                          sensitiveParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationSensitiveLevel2,  
+                          sensitiveParams.iTime );
+        }
+    else if ( iVibraLevel == EProfileTactileFeedbackLevel3 )
+        {
+        // Read settings for ETouchFeedbackBasic
+        iRepository.Get( KTactileVibraIntensityBasicLevel3, 
+                          basicParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationBasicLevel3,  
+                          basicParams.iTime );
+        
+        // Read settings for ETouchFeedbackSensitive
+        iRepository.Get( KTactileVibraIntensitySensitiveLevel3, 
+                          sensitiveParams.iIntensity );
+        iRepository.Get( KTactileVibraDurationSensitiveLevel3,  
+                          sensitiveParams.iTime );
+        }
+    
+    iVibraParams.Reset();
+
+    iVibraParams.Append( basicParams );        
+    iVibraParams.Append( sensitiveParams );         
+    TRACE("CTactileVibraPlayer::ReadSettings - End");      
+    }    
+    
+// ---------------------------------------------------------------------------
+// Actually play feedback.
+// ---------------------------------------------------------------------------
+//
+void CTactileVibraPlayer::DoPlayFeedbackL( TInt aTime, TInt aIntensity )
+    {
+    TRACE("CTactileVibraPlayer::DoPlayFeedbackL - Begin");
+    if ( !iVibra )
+        {
+        // Construct iVibra at first feedback request.
+        iVibra = CHWRMVibra::NewL();
+        }
+    
+    TRACE("CTactileVibraPlayer::DoPlayFeedbackL - Starting Vibra");
+    
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_VIBRA_FEEDBACK_1, "e_TACTILE_PLAY_VIBRA_FEEDBACK 1");
+    
+    iVibra->PulseVibraL( aTime, aIntensity ); 
+
+    OstTrace0( TACTILE_PERFORMANCE, TACTILE_PLAY_VIBRA_FEEDBACK_0, "e_TACTILE_PLAY_VIBRA_FEEDBACK 0");
+    TRACE("CTactileVibraPlayer::DoPlayFeedbackL - End");
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//    
+void CTactileVibraPlayer::DoStartFeedbackL( TTouchContinuousFeedback /*aType*/,
+                                            TInt /*aIntensity*/ )
+    {
+    if ( !iVibra )
+        {
+        // Construct iVibra at first feedback request.
+        iVibra = CHWRMVibra::NewL();
+        }    
+
+    if ( iVibraParams.Count() )
+        {
+        TRACE2("CTactileVibraPlayer: StartVibraL  Duration: %d", KHWRMVibraMaxDuration ); 
+        TRACE2("CTactileVibraPlayer: StartVibraL  Intensity: %d", iVibraParams[0].iIntensity );
+        iVibra->StartVibraL( KHWRMVibraMaxDuration, 
+                             iVibraParams[0].iIntensity );
+        }    
+    }                                            
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileVibraPlayer::HandleNotifyInt( TUint32 aId, TInt aNewValue )    
+    {
+    TRACE("CTactileVibraPlayer::HandleNotifyInt - Begin");
+    if ( aId == KTactileFeedbackHapticsStrength )
+        {
+        iVibraLevel = aNewValue;
+        if ( iVibraLevel != EProfileTactileFeedbackOff )
+            {
+            ReadSettings();    
+            }
+        }
+    TRACE("CTactileVibraPlayer::HandleNotifyInt - End");
+    }
+
+//---------------------------------------------------------------------------
+// ImplementationTable[]
+//
+//---------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    IMPLEMENTATION_PROXY_ENTRY( 0x2001CB9B, CTactileVibraPlayer::NewL )
+    };
+
+//---------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//
+//---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }
+   
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_VIBRA_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_PLAY_VIBRA_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/plugins/tactilevibraplugin/traces/tactilevibraplayerTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILEVIBRAPLAYERTRACES_H__
+#define __TACTILEVIBRAPLAYERTRACES_H__
+
+#define KOstTraceComponentID 0x2001cb9a
+
+#define TACTILE_PLAY_VIBRA_FEEDBACK_1 0x400001
+#define TACTILE_PLAY_VIBRA_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/rom/tactilefeedbackresolver.iby	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* 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:  This is the IBY file for Tactile Feedback Resolver.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#ifndef TACTILEFEEDBACKRESOLVER_IBY
+#define TACTILEFEEDBACKRESOLVER_IBY
+
+#include <data_caging_paths_for_iby.hrh>
+
+// =============================================================================
+// Tactile Feedback Resolver
+// =============================================================================
+file=ABI_DIR\BUILD_DIR\tactilefeedbackresolver.dll SHARED_LIB_DIR\tactilefeedbackresolver.dll
+
+// audio file(s) used for wav feed back    
+data=ZPRIVATE\10003B20\TactileFeedbackEffects.ivt  private\10003B20\TactileFeedbackEffects.ivt
+
+#endif // TACTILEFEEDBACKRESOLVER_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactilefeedback.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2007-2009 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:  Client side of Tactile Feedback server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32base.h>
+#include <e32std.h>
+#include <ecom/ecom.h>
+#include <e32debug.h>
+
+#include <tactilefeedback.h>
+
+#include "tactilefeedbacktrace.h"
+#include "tactilefeedbacksrv.h"
+#include "tactilefeedbackdefs.h"
+
+/**
+ * Own active scheduler class. We need this so that we can override the
+ * CActiveScheduler::Error -function and avoid panic in case something
+ * leaves.
+ */
+NONSHARABLE_CLASS( CTactileScheduler ): public CActiveScheduler
+    {
+public:   
+
+    /**
+     * This is called when something leaves in our Feedback Player
+     * thread.
+     */
+    void Error( TInt aError ) const;
+    };
+
+
+void CTactileScheduler::Error( TInt aError ) const
+    {
+    (void) aError; // Remove compiler warning in armv5 urel
+    
+    TRACE2( "CTactileScheduler::Error, aError = %d", aError );
+    }
+
+/**
+ * Structure for the parameters, that are passed to Feedback Player Thread
+ * when it is created.
+ */
+struct TTactileThreadParams
+    {
+    RThread* iOwningThread;
+    TInt iQueueHandle;
+    };
+    
+/**
+ * Class for creating new thread for Tactile Feedback playing, and
+ * for passing feedback requests to the thread via a message queue.
+ */
+NONSHARABLE_CLASS( CThreadPlayer ): public CBase
+    {
+public:
+    static CThreadPlayer* NewL();
+    ~CThreadPlayer();
+
+private:
+    CThreadPlayer() {};
+    
+    void ConstructL();
+    
+    static void RunThreadL( TAny* aParam );
+
+    static TInt ThreadEntryPoint( TAny* aParam );
+
+    RThread                 iThread;
+    };    
+
+// ---------------------------------------------------------------------------
+// Here we create and start new thread for Tactile Feedback Playing.
+//
+// If this function returns succesfully, then the new thread was created ok
+// and is now running. Otherwise we leave from here.
+//
+// ---------------------------------------------------------------------------
+//
+void CThreadPlayer::ConstructL()
+    {
+    TRACE("CThreadPlayer::ConstructL - Begin");
+    
+    RThread thisThread;
+
+    CleanupClosePushL( thisThread );
+    
+    TTactileThreadParams params;
+    params.iOwningThread = &thisThread;
+ 
+    User::LeaveIfError( 
+        iThread.Create( 
+            KTactileThreadName, 
+            ThreadEntryPoint,
+            KPlayerThreadStackSize, 
+            KPlayerThreadHeapMinSize, 
+            KPlayerThreadHeapMaxSize,
+            &params, 
+            EOwnerProcess ) );       
+                        
+    // With EPriorityMore feedback player thread operates with the same
+    // priority as window server main thread. This seems to be the best
+    // choice for now, as this way neither drawing or feedback can cause
+    // significant delay for each other.
+    iThread.SetPriority( EPriorityMore );
+    iThread.Resume();
+    
+    // We have to wait so that our thread has read the parameters
+    TRequestStatus status;
+    iThread.Rendezvous( status );
+    User::WaitForRequest( status );
+    
+    // Store thread exit type while we still have handles open
+    TExitType exitType = iThread.ExitType(); 
+
+    // Close thread handle to ourself.  
+    CleanupStack::PopAndDestroy( &thisThread ); 
+    
+    // Check that rendezvouz succeeded, and that thread is still alive
+    if ( exitType != EExitPending || status != KErrNone )
+        {
+        TRACE3("CThreadPlayer::ConstructL - Thread creation failed, %d, %d", exitType, status.Int() );
+        
+        User::Leave( KErrGeneral );
+        }
+    
+    TRACE("CThreadPlayer::ConstructL - End");
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CThreadPlayer* CThreadPlayer::NewL()
+    {
+    CThreadPlayer* self = new( ELeave ) CThreadPlayer();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// We close our player thread by sending an exit request and waiting for
+// the thread to close itself. This way all resources get closed cleanly.
+//
+// In case message queue is full, then we'll just kill the thread.
+// ---------------------------------------------------------------------------
+//
+CThreadPlayer::~CThreadPlayer()
+    {
+    if ( iThread.Handle() )
+        {
+        TExitType exitType = iThread.ExitType(); 
+        
+        if ( exitType == EExitPending )
+            {
+            iThread.Kill( KErrAbort );
+            }
+            
+        iThread.Close();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// Rest of the actions required for setting Tactile Feedback Player thread
+// up and running (this is called from ThreadEntryPoint)
+//
+// #1 Create and install an active scheduler
+// #2 Create server instance.
+// #3 Notify main thread that we are ready to run (this allows main thread 
+//    to continue).
+// #4 Start the scheduler. Excecution will halt here in this functio until
+//    somebody stops the scheduler.
+//
+// #5 Delete server and scheduler (at this point we are exiting our thread 
+//    already).
+//
+// #6 Close ECom session, as we are now exiting the thread (this is on our
+//    responsibility even though we are not directly using Ecom).
+// ---------------------------------------------------------------------------
+//
+void CThreadPlayer::RunThreadL( TAny* /*aParam*/ )
+    {
+    // #1
+    CTactileScheduler* s = new(ELeave) CTactileScheduler;
+    CleanupStack::PushL(s);
+    CActiveScheduler::Install(s);
+
+    // #2
+    CTactileFeedbackSrv* svr = CTactileFeedbackSrv::NewL();
+
+    // #3
+    RThread me;
+    me.Rendezvous( KErrNone ); 
+    
+    // #4    
+    CActiveScheduler::Start();
+
+    // #5
+    delete svr;
+    CleanupStack::PopAndDestroy( s );
+
+    // #6
+    REComSession::FinalClose();
+    }
+        
+// ---------------------------------------------------------------------------
+// This is the entry point of Tactile feedback player thread.
+//
+// Standard operation: Create cleanup stack and call rest of the code under
+// trap harness.
+// ---------------------------------------------------------------------------
+//
+TInt CThreadPlayer::ThreadEntryPoint( TAny* aParam )
+    {
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    TInt err( KErrNoMemory );
+    if ( cleanup )
+        {
+        TRAP( err, CThreadPlayer::RunThreadL( aParam ) );
+        delete cleanup;
+        }
+    __UHEAP_MARKEND;
+    return err;
+    }    
+    
+// --------------------------------------------------------------------------
+// Default constructor.
+// 
+// --------------------------------------------------------------------------
+//       
+EXPORT_C RTactileFeedback::RTactileFeedback() 
+    {
+    }
+
+// --------------------------------------------------------------------------
+// 
+// Creates connection to server
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt RTactileFeedback::Connect()
+    {
+    TInt ret = CreateSession( KTactileFeedbackServer, Version() );
+    if (  ret != KErrNone )
+        {
+        TRAP( ret, iThread = CThreadPlayer::NewL() );
+        if ( ret == KErrNone )
+            {
+            ret = CreateSession( KTactileFeedbackServer, Version() );    
+            }        
+        }
+    
+    return ret; 
+    }
+    
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//      
+EXPORT_C void RTactileFeedback::Close()
+    {
+    delete iThread;
+    iThread = NULL;
+    // close session    
+    RSessionBase::Close();
+    }    
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTactileFeedback::PlayFeedback( TTouchLogicalFeedback aFeedbackType,
+                                              TBool aPlayVibra,
+                                              TBool aPlayAudio )
+    {
+    SendReceive( EPlayFeedback, TIpcArgs( aFeedbackType, 
+                                          aPlayVibra, 
+                                          aPlayAudio ) );    
+    }
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//    
+EXPORT_C void RTactileFeedback::StartFeedback( TTouchContinuousFeedback aType,
+                                              TInt aIntensity )
+    {
+    TRACE("RTactileFeedback::StartFeedback");
+    SendReceive( EStartFeedback, TIpcArgs( aType, aIntensity ) );
+    }
+        
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//                        
+EXPORT_C void RTactileFeedback::ModifyFeedback( TInt aIntensity )
+    {
+    TRACE("RTactileFeedback::ModifyFeedback");
+    SendReceive( EModifyFeedback, TIpcArgs( aIntensity ) );
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void RTactileFeedback::StopFeedback()
+    {
+    TRACE("RTactileFeedback::StopFeedback");
+    SendReceive( EStopFeedback );   
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C TInt RTactileFeedback::SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType )
+    {
+    TRACE("RTactileFeedback::StopFeedback");
+    return SendReceive( ESetFBEnabledDevice, TIpcArgs( aFeedbackType ) );   
+    }    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//        
+EXPORT_C void RTactileFeedback::FeedbackEnabledForDevice( TTouchFeedbackType& aFeedbackEnabled )
+    {
+    TPckg<TTouchFeedbackType> enabled( aFeedbackEnabled );
+    SendReceive( EFBEnabledForDevice, TIpcArgs( &enabled ) );
+    }
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTactileFeedback::PlayPreviewFeedback( TInt aLevel,
+                                 TTouchLogicalFeedback aFeedback,
+                                 TTouchFeedbackType aType )
+    {
+    SendReceive( EPlayPreviewFeedback, TIpcArgs( aLevel, 
+                                                 aFeedback, 
+                                                 aType ) );    
+    }
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTactileFeedback::StartPreviewFeedback( TInt aLevel,
+                                  TTouchContinuousFeedback aFeedback,
+                                  TInt aIntensity,
+                                  TTouchFeedbackType aType )
+    {
+    SendReceive( EStartPreviewFeedback, TIpcArgs( aLevel, aFeedback, 
+                                                  aIntensity, aType ) );
+    }
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//     
+EXPORT_C void RTactileFeedback::ModifyPreviewFeedback( TInt aIntensity )
+    {
+    SendReceive( EModifyPreviewFeedback, TIpcArgs( aIntensity ) );
+    }
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+// 
+EXPORT_C void RTactileFeedback::StopPreviewFeedback()
+    {
+    SendReceive( EStopPreviewFeedback );    
+    }
+
+
+// --------------------------------------------------------------------------
+// 
+// --------------------------------------------------------------------------
+//      
+TVersion RTactileFeedback::Version() const
+    {
+    return TVersion( KTactileFeedbackServerMajor, 
+                     KTactileFeedbackServerMinor, 
+                     KTactileFeedbackServerBuild );
+    }    
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactilefeedbackresolver.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,520 @@
+/*
+* Copyright (c) 2007-2009 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:  Class for resolving physical feedback type based on 
+*                tactile feedback settings and current device state.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32debug.h>
+
+#include <centralrepository.h>
+#include <ecom/implementationinformation.h>
+
+#include "tactilefeedbackprivatecrkeys.h"
+#include "tactilefeedbackinternalpskeys.h"
+#include "tactilefeedbacktrace.h"
+
+#include "tactilefeedbackresolver.h"
+#include "tactilepropertywatcher.h"
+#include "tactileplayer.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tactilefeedbackresolverTraces.h"
+#endif
+
+
+// Security policies for reading and writing to our P&S property
+_LIT_SECURITY_POLICY_PASS( KTactileReadPolicy );
+_LIT_SECURITY_POLICY_C1(   KTactileWritePolicy, ECapabilityWriteDeviceData );
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Consructor.
+// ---------------------------------------------------------------------------
+//
+CTactileFeedbackResolver::CTactileFeedbackResolver() : 
+    iFeedbackStarted( EFalse )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase costructor.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::ConstructL()
+    {
+    TRACE("CTactileFeedbackResolver::ConstructL - Begin");
+
+    InitializeCrKeysL();
+
+    TInt hapticsUid(0);  
+    TInt audioUid(0);    
+    User::LeaveIfError( iRepository->Get( KTactileHapticsPlugin, hapticsUid ) );
+    User::LeaveIfError( iRepository->Get( KTactileAudioPlugin, audioUid ) );
+
+    if ( hapticsUid )
+        {
+        CreateHapticsPlayerL( TUid::Uid( hapticsUid ) );
+        }
+
+    if ( audioUid )
+        {
+        CreateAudioPlayerL( TUid::Uid( audioUid ) );
+        }    
+
+    InitializePsKeysL();
+    
+    TRACE("CTactileFeedbackResolver::ConstructL - End");
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactileFeedbackResolver* CTactileFeedbackResolver::NewL()
+    {
+    CTactileFeedbackResolver* self = new ( ELeave ) CTactileFeedbackResolver;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactileFeedbackResolver::~CTactileFeedbackResolver()
+    {
+    delete iCenRepNotifier;
+    delete iRepository;
+    delete iPropertyWatcher;
+    delete iHapticsPlayer;
+    delete iAudioPlayer;
+    REComSession::FinalClose();
+    }
+    
+// ---------------------------------------------------------------------------
+// We play feedback in case all three conditions are met:
+// 
+// #1 Either vibra or audio feedback is requested and globally enabled
+// #2 Given feedback type is different than "None"
+// #3 Player instance exists
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::PlayFeedback( 
+    TTouchLogicalFeedback aFeedback,
+    TBool aPlayVibra,
+    TBool aPlayAudio )
+    {
+    // TRACE("CTactileFeedbackResolver::PlayFeedback - Begin");
+    // Feedback filtering in order to prevent too many feedbacks
+    // in a short time (e.g. when doing text selection).    
+    TTime now;
+    now.UniversalTime();
+    
+    TTimeIntervalMicroSeconds interval = 
+        now.MicroSecondsFrom( iLastFeedbackTimeStamp );
+    
+     if ( iMinimumInterval == TTimeIntervalMicroSeconds( 0 ) || 
+          now < iLastFeedbackTimeStamp ||                       
+          iMinimumInterval <= interval )                        
+        {
+        // First store the timestamp of this feedback playing moment.
+        // This really needs to be done when 
+        // actually playing feedback (not when feedback was requested
+        // but filtered out).
+        iLastFeedbackTimeStamp = now;      
+    
+    
+        // Force vibra- and audio feedback off if those are globally disabled
+        if ( !iVibraEnabled )
+            {
+            aPlayVibra = EFalse;
+            }
+            
+        if ( !iAudioEnabled )
+            {
+            aPlayAudio = EFalse;
+            }
+        
+        if ( ( aPlayVibra || aPlayAudio ) &&        // #1
+               aFeedback != ETouchFeedbackNone )    // #2
+            {
+            OstTrace0( TACTILE_PERFORMANCE, TACTILE_RESOLVER_PLAY_FEEDBACK_1, "e_TACTILE_RESOLVER_PLAY_FEEDBACK 1");
+            
+            if ( iVibraFirst )   
+                {
+                if ( aPlayVibra && iHapticsPlayer )
+                    {
+                    iHapticsPlayer->PlayFeedback( aFeedback );    
+                    }
+                if ( aPlayAudio && iAudioPlayer )
+                    {
+                    iAudioPlayer->PlayFeedback( aFeedback );    
+                    }                
+                }
+            else
+                {
+                if ( aPlayAudio && iAudioPlayer )
+                    {
+                    iAudioPlayer->PlayFeedback( aFeedback );    
+                    }                
+                if ( aPlayVibra && iHapticsPlayer )
+                    {
+                    iHapticsPlayer->PlayFeedback( aFeedback );    
+                    }
+                }
+
+            OstTrace0( TACTILE_PERFORMANCE, TACTILE_RESOLVER_PLAY_FEEDBACK_0, "e_TACTILE_RESOLVER_PLAY_FEEDBACK 0");
+            }
+        }
+    // TRACE("CTactileFeedbackResolver::PlayFeedback - End");
+    }
+    
+// ---------------------------------------------------------------------------
+// Central Repository related initializations.
+// 
+// ---------------------------------------------------------------------------
+//   
+void CTactileFeedbackResolver::InitializeCrKeysL()    
+    {
+    if ( !iRepository )
+        {
+        iRepository = CRepository::NewL( KCRUidTactileFeedback );    
+        }    
+    
+    TInt minInterval(0);
+    // Read and store minimun feedback interfal
+    User::LeaveIfError( iRepository->Get( KTactileFeedbackMinimumInterval, 
+                                          minInterval ) );
+                                          
+    // Time is in milliseconds in Central Repository
+    iMinimumInterval = TTimeIntervalMicroSeconds( 1000*minInterval );
+    
+    
+    TInt internalSettings(0); 
+    
+    User::LeaveIfError( iRepository->Get( KTactileInternalSettings, 
+                                          internalSettings ) );
+
+    iVibraFirst = internalSettings & KTactileInternalSettingsVibraPlayedFirst;
+
+    // Notifier for Central Repository changes.
+    if ( !iCenRepNotifier )
+        {
+        iCenRepNotifier = CCenRepNotifyHandler::NewL( *this, 
+                                                      *iRepository );
+        iCenRepNotifier->StartListeningL();             
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// P&S -related initializations have been moved here for making
+// ConstructL more clear.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::InitializePsKeysL()
+    {
+    TInt err = RProperty::Define( 
+                KPSUidTactileFeedback,
+                KTactileFeedbackEnabled,
+                RProperty::EInt,
+                KTactileReadPolicy,
+                KTactileWritePolicy );
+
+    if ( err != KErrNone && err != KErrAlreadyExists )
+        {
+        User::Leave( err );
+        }
+        
+    // Enable feedback by default.
+    TInt playerType(0);
+    playerType |= ETouchFeedbackVibra;
+    playerType |= ETouchFeedbackAudio;    
+    
+    RProperty::Set( KPSUidTactileFeedback, KTactileFeedbackEnabled, playerType );    
+    
+    // Watcher will start monitoring immediately, i.e. we don't have to
+    // start it separately.
+    iPropertyWatcher = CTactilePropertyWatcher::NewL(
+        *this,
+        KPSUidTactileFeedback,
+        KTactileFeedbackEnabled,
+        CActive::EPriorityStandard );
+                
+    ReadFeedbackEnabledFromPS();    
+    }
+
+// ---------------------------------------------------------------------------
+// We only change our bookkeeping in case we succeed in reading the P&S
+// property
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::ReadFeedbackEnabledFromPS()
+    {
+    TInt tmpVal = 0;
+    TInt err = iPropertyWatcher->Get( tmpVal );
+    
+    if ( err == KErrNone )
+        {
+        iVibraEnabled = EFalse;
+        iAudioEnabled = EFalse;
+        
+        // Check if vibra feedback is enabled (bit 0x01).
+        if ( (tmpVal & 0x01) )
+            {
+            iVibraEnabled = ETrue;
+            }
+        // Check if audio feedback is enabled (bit 0x02).            
+        if ( (tmpVal & 0x02) )
+            {
+            iAudioEnabled = ETrue;            
+            }
+        }
+    }   
+    
+// ---------------------------------------------------------------------------
+// From class MTactilePropertyObserver
+// Called when the property for globally enabling or disabling feedback
+// changes
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::PropertyChangedL( const TUid aCategory, 
+                                                 const TUint aKey )
+    {
+    if ( aCategory == KPSUidTactileFeedback && 
+         aKey == KTactileFeedbackEnabled )
+        {
+        ReadFeedbackEnabledFromPS();
+        }
+    }    
+    
+// ---------------------------------------------------------------------------
+// Start continuous feedback.
+// ---------------------------------------------------------------------------
+//   
+void CTactileFeedbackResolver::StartFeedback( TTouchContinuousFeedback aType,
+                                              TInt aIntensity )
+    {
+    if ( iHapticsPlayer && !iFeedbackStarted && iVibraEnabled )
+        {
+        iHapticsPlayer->StartFeedback( aType, aIntensity );
+        iFeedbackStarted = ETrue;
+        }
+    }
+        
+// ---------------------------------------------------------------------------
+// Modify continuous feedback.
+// ---------------------------------------------------------------------------
+//                        
+void CTactileFeedbackResolver::ModifyFeedback( TInt aIntensity )
+    {
+    if ( iHapticsPlayer )
+        {
+        iHapticsPlayer->ModifyFeedback( aIntensity );
+        }    
+    }
+    
+// ---------------------------------------------------------------------------
+// Stop continuous feedback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileFeedbackResolver::StopFeedback()
+    {
+    if ( iHapticsPlayer )
+        {
+        iHapticsPlayer->StopFeedback();
+        iFeedbackStarted = EFalse;
+        }  
+    }
+
+// ---------------------------------------------------------------------------
+// Play preview feedback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileFeedbackResolver::PlayPreviewFeedback( TInt aLevel,
+                          TTouchLogicalFeedback aFeedback,
+                          TTouchFeedbackType aType )
+    {
+    if ( aType & ETouchFeedbackVibra && iHapticsPlayer )
+        {
+        iHapticsPlayer->PlayPreviewFeedback( aLevel, aFeedback );
+        }
+    if ( aType & ETouchFeedbackAudio && iAudioPlayer )
+        {
+        iAudioPlayer->PlayPreviewFeedback( aLevel, aFeedback );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// Start preview of continuous feedback.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::StartPreviewFeedback( TInt aLevel,
+                           TTouchContinuousFeedback aFeedback,
+                           TInt aIntensity,
+                           TTouchFeedbackType aType )
+    {
+    if ( aType & ETouchFeedbackVibra && iHapticsPlayer )
+        {
+        iHapticsPlayer->StartPreviewFeedback( aLevel, aFeedback, aIntensity );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// Stop preview of continuous feedback.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::StopPreviewFeedback()
+    {
+    if ( iHapticsPlayer )
+        {
+        iHapticsPlayer->StopPreviewFeedback();
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// Create haptics player.
+// ---------------------------------------------------------------------------
+//    
+void CTactileFeedbackResolver::CreateHapticsPlayerL( TUid aHapticsUid )
+    {
+    RImplInfoPtrArray implArray;
+    CleanupClosePushL( implArray );
+    CTactilePlayer::ListImplementationsL( ETactilePlayerHaptics, implArray );
+    
+    if (!implArray.Count())
+        {
+        TRACE( "CTactileFeedbackResolver::ConstructL - No Haptics plugins found" );
+        }
+    for ( TInt i(0) ; i < implArray.Count() && !iHapticsPlayer; i++ )
+        {
+        // Create haptics player. 
+        if ( !iHapticsPlayer &&
+           ( implArray[i]->ImplementationUid() == aHapticsUid ) )
+            {
+            TUid pluginUid = implArray[i]->ImplementationUid();
+        
+            // delete implementation info list contents
+            implArray.ResetAndDestroy();
+            
+            iHapticsPlayer = CTactilePlayer::NewL( pluginUid, *iRepository );
+            }
+        }
+    
+    // Make sure that implArray is reseted also if plugin wasn't found.    
+    if ( !iHapticsPlayer ) 
+        {
+        implArray.ResetAndDestroy();
+        }
+        
+    CleanupStack::PopAndDestroy( &implArray );            
+    }
+
+// ---------------------------------------------------------------------------
+// Create audio player.
+// ---------------------------------------------------------------------------
+//        
+void CTactileFeedbackResolver::CreateAudioPlayerL( TUid aAudioUid )
+    {
+    RImplInfoPtrArray implArray;
+    CleanupClosePushL( implArray );    
+    CTactilePlayer::ListImplementationsL( ETactilePlayerAudio, implArray );
+    
+    if (!implArray.Count())
+        {
+        TRACE( "CTactileFeedbackResolver::ConstructL - No Audio plugins found" );
+        }
+    for ( TInt i(0) ; i < implArray.Count() && !iAudioPlayer; i++ )
+        {            
+        // Create audio player.           
+        if ( !iAudioPlayer &&
+             ( implArray[i]->ImplementationUid() == aAudioUid ) )
+            {
+            TUid pluginUid = implArray[i]->ImplementationUid();
+        
+            // delete implementation info list contents
+            implArray.ResetAndDestroy();     
+                   
+            iAudioPlayer = CTactilePlayer::NewL( pluginUid, *iRepository );
+            }                
+        }
+        
+    // Make sure that implArray is reseted also if plugin wasn't found.
+    if ( !iAudioPlayer ) 
+        {
+        implArray.ResetAndDestroy();
+        }        
+        
+    CleanupStack::PopAndDestroy( &implArray );    
+    }
+
+// ---------------------------------------------------------------------------
+// From MCenRepNotifyHandlerCallback.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::HandleNotifyGeneric( TUint32 aId )
+    {
+    TRAP_IGNORE( DoHandleNotifyGenericL(aId ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Handle changes in tactile feedback settings.
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackResolver::DoHandleNotifyGenericL( TUint32 aId )
+    {
+    switch ( aId )
+        {
+        case KTactileFeedbackMinimumInterval:
+            InitializeCrKeysL();
+            break;
+        case KTactileHapticsPlugin:
+            {
+            TInt hapticsUid(0);
+            iRepository->Get( KTactileHapticsPlugin, hapticsUid );
+            if ( iHapticsPlayer )
+                {
+                delete iHapticsPlayer;
+                iHapticsPlayer = NULL;
+                }
+            if ( hapticsUid )
+                {
+                CreateHapticsPlayerL( TUid::Uid( hapticsUid ) );    
+                }                    
+            }
+            break;
+        case KTactileAudioPlugin:
+            {
+            TInt audioUid(0);
+            iRepository->Get( KTactileAudioPlugin, audioUid );
+            if ( iAudioPlayer )
+                {
+                delete iAudioPlayer;
+                iAudioPlayer = NULL;
+                }
+            if ( audioUid )
+                {
+                CreateAudioPlayerL( TUid::Uid( audioUid ) );
+                }
+            }            
+            break;
+        default:
+            break;
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactilefeedbacksession.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,277 @@
+/*
+* 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:  Session class of Tactile Feedback server.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <s32mem.h>
+
+// #include "tactilefeedbacktrace.h"
+#include "tactilefeedbacksrv.h"
+#include "tactilefeedbacksession.h"
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::CTactileFeedbackSession
+// C++ constructor.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSession::CTactileFeedbackSession() 
+    {
+    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::~CTactileFeedbackSession
+// C++ destructor.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSession::~CTactileFeedbackSession()
+    {
+    // Stop continuous feedback, if it is started in this session. 
+    if ( iFeedbackStarted )
+        {
+        Server().StopFeedback();
+        }
+    Server().RemoveSession();
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::CreateL
+// From CSession2, used to increase server's session count.
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::CreateL()
+    {
+    // TRACE("CTactileFeedbackSession::CreateL - Begin");
+    Server().AddSession();
+    // TRACE("CTactileFeedbackSession::CreateL - End");    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::Server
+// Reference to server.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSrv& CTactileFeedbackSession::Server()
+    {   
+    return *static_cast<CTactileFeedbackSrv*>
+           ( const_cast<CServer2*>( CSession2::Server() ) );
+    }
+    
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::ServiceL
+// From CSession2, passes the request forward to DispatchMessageL.
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::ServiceL( const RMessage2& aMessage )
+    {
+    TRAPD(err,DispatchMessageL(aMessage));
+    if ( err != KErrNone )
+        {
+        aMessage.Complete( err );
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::DispatchMessageL
+// Handles the request from client.
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::DispatchMessageL( const RMessage2& aMessage )
+    {
+    switch( aMessage.Function() )
+        {
+        case EPlayFeedback:
+            PlayFeedback( aMessage );
+            break;
+        case EStartFeedback:
+            StartFeedback( aMessage );
+            break;
+        case EModifyFeedback:
+            ModifyFeedback( aMessage );
+            break;
+        case EStopFeedback:            
+            StopFeedback( aMessage );
+            break;            
+        case ESetFBEnabledDevice:            
+            SetFBEnabledForDeviceL( aMessage );
+            break;
+        case EFBEnabledForDevice:
+            FeedbackEnabledForDeviceL( aMessage );
+            break;
+        case  EPlayPreviewFeedback:
+            PlayPreviewFeedback( aMessage );
+            break;
+        case  EStartPreviewFeedback:
+            StartPreviewFeedback( aMessage );
+            break;
+        case  EModifyPreviewFeedback:
+            ModifyPreviewFeedback( aMessage );
+            break;
+        case  EStopPreviewFeedback:
+            StopPreviewFeedback( aMessage );
+            break;            
+        default:
+            aMessage.Complete( KErrArgument );
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::PlayFeedbackL
+//
+// --------------------------------------------------------------------------
+//     
+void CTactileFeedbackSession::PlayFeedback( const RMessage2& aMessage )
+    {
+    Server().PlayFeedback( static_cast<TTouchLogicalFeedback>(aMessage.Int0()),
+                           aMessage.Int1(),
+                           aMessage.Int2() );
+
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::StartFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::StartFeedback( const RMessage2& aMessage )
+    {
+    // TRACE("CTactileFeedbackSession::StartFeedbackL - Begin");
+    Server().StartFeedback( 
+                     static_cast<TTouchContinuousFeedback>( aMessage.Int0() ),
+                     aMessage.Int1() );
+    iFeedbackStarted = ETrue;
+    aMessage.Complete( KErrNone );
+    // TRACE("CTactileFeedbackSession::StartFeedbackL - End");
+    }
+    
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::ModifyFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::ModifyFeedback( const RMessage2& aMessage )
+    {
+    // TRACE("CTactileFeedbackSession::ModifyFeedbackL - Begin");
+    Server().ModifyFeedback( aMessage.Int0() );
+    aMessage.Complete( KErrNone );
+    // TRACE("CTactileFeedbackSession::ModifyFeedbackL - End");
+    }
+    
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::StopFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::StopFeedback( const RMessage2& aMessage )
+    {
+    // TRACE("CTactileFeedbackSession::StopFeedbackL - Begin");
+    Server().StopFeedback();
+    iFeedbackStarted = EFalse;
+    aMessage.Complete( KErrNone );
+    // TRACE("CTactileFeedbackSession::StopFeedbackL - End");
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::SetFBEnabledForDeviceL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::SetFBEnabledForDeviceL( const RMessage2& aMessage )
+    {
+    if ( aMessage.HasCapability( ECapabilityWriteDeviceData ) )
+        {
+        Server().EnableFeedbackForDevice( 
+                        static_cast<TTouchFeedbackType>( aMessage.Int0() )  );
+        aMessage.Complete( KErrNone );
+        }
+    else
+        {
+        User::Leave( KErrPermissionDenied );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::FeedbackEnabledForDeviceL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::FeedbackEnabledForDeviceL( const RMessage2& aMessage )
+    {
+    TTouchFeedbackType feedbackEnabled = Server().FeedbackEnabledForDevice();
+    
+    TPckg<TTouchFeedbackType> enabled(feedbackEnabled);
+    
+    aMessage.WriteL( 0, enabled );
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::PlayPreviewFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::PlayPreviewFeedback( const RMessage2& aMessage )
+    {
+    Server().PlayPreviewFeedback( aMessage.Int0(),
+                         static_cast<TTouchLogicalFeedback>(aMessage.Int1() ),
+                         static_cast<TTouchFeedbackType>(aMessage.Int2() ) );
+    aMessage.Complete( KErrNone );    
+    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::StartPreviewFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::StartPreviewFeedback( const RMessage2& aMessage )
+    {
+    Server().StartPreviewFeedback( 
+                     aMessage.Int0(),
+                     static_cast<TTouchContinuousFeedback>( aMessage.Int1() ),
+                     aMessage.Int2(),
+                     static_cast<TTouchFeedbackType>( aMessage.Int3() ) );
+    iFeedbackStarted = ETrue;                                   
+    aMessage.Complete( KErrNone );    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::ModifyPreviewFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::ModifyPreviewFeedback( const RMessage2& aMessage )
+    {
+    // Normal ModifyFeedback function is used also for preview.
+    Server().ModifyFeedback( aMessage.Int0() );
+    aMessage.Complete( KErrNone );    
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSession::StopPreviewFeedbackL
+//
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSession::StopPreviewFeedback( const RMessage2& aMessage )
+    {
+    Server().StopPreviewFeedback();
+    iFeedbackStarted = EFalse;
+    aMessage.Complete( KErrNone );    
+    }
+    
+// End of file 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactilefeedbacksrv.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,223 @@
+/*
+* 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:  Tactile feedback server implementation.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32debug.h>
+#include <touchlogicalfeedback.h>
+
+#include "tactilefeedbacksrv.h"
+#include "tactilefeedbacksession.h"
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::NewLC
+// 2-phased constructor.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSrv* CTactileFeedbackSrv::NewL()
+    {
+    CTactileFeedbackSrv* self = new (ELeave) CTactileFeedbackSrv();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::CTactileFeedbackSrv()
+// C++ constructor.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSrv::CTactileFeedbackSrv() 
+    : CPolicyServer( EPriorityNormal, 
+                     KTactileFeedbackPolicy, 
+                     ESharableSessions ),
+      iSessionCount(0)
+    {
+    // Vibra and audio feedbacks are enabled by default.
+    iDeviceFeedbackEnabled |= ETouchFeedbackAudio;
+    iDeviceFeedbackEnabled |= ETouchFeedbackVibra;
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::ConstructL
+// 2nd phase constructor.
+// --------------------------------------------------------------------------
+//
+void CTactileFeedbackSrv::ConstructL()
+    {
+    StartL( KTactileFeedbackServer );
+    iResolver = CTactileFeedbackResolver::NewL();
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::~CTactileFeedbackSrv()
+// C++ destructor.
+// --------------------------------------------------------------------------
+//
+CTactileFeedbackSrv::~CTactileFeedbackSrv()
+    {
+    delete iResolver;
+    }
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::NewSessionL
+// from CServer2, creates a new session.
+// --------------------------------------------------------------------------
+//
+CSession2* CTactileFeedbackSrv::NewSessionL( const TVersion& aVersion, 
+                                             const RMessage2& /*aMsg*/ ) const
+    {
+    TBool supported = User::QueryVersionSupported( TVersion( 
+                                                KTactileFeedbackServerMajor,
+                                                KTactileFeedbackServerMinor,
+                                                KTactileFeedbackServerBuild ),
+                                                aVersion ); 
+    if ( !supported )
+        {
+        User::Leave( KErrNotSupported );
+        }
+        
+    return new (ELeave) CTactileFeedbackSession();  
+    }   
+    
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::AddSession
+// --------------------------------------------------------------------------
+//  
+void CTactileFeedbackSrv::AddSession()  
+    {
+    iSessionCount++;
+    }
+  
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::RemoveSession
+// --------------------------------------------------------------------------
+//    
+void CTactileFeedbackSrv::RemoveSession()
+    {
+    iSessionCount--;
+    if ( !iSessionCount )
+        {
+        CActiveScheduler::Stop();
+        }
+    }    
+    
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::PlayFeedback
+// --------------------------------------------------------------------------
+//    
+void CTactileFeedbackSrv::PlayFeedback( TTouchLogicalFeedback aFeedback,
+                                        TBool aPlayHaptics,
+                                        TBool aPlayAudio )
+    {
+    TBool playHaptics(EFalse);
+    TBool playAudio(EFalse);    
+    
+    if ( (iDeviceFeedbackEnabled & ETouchFeedbackVibra) && aPlayHaptics )
+        {
+        playHaptics = ETrue;
+        }    
+    if ( (iDeviceFeedbackEnabled & ETouchFeedbackAudio) && aPlayAudio )
+        {
+        playAudio = ETrue;
+        }
+
+    if ( playHaptics || playAudio )
+        {
+        iResolver->PlayFeedback( aFeedback, playHaptics, playAudio );
+        }        
+    }        
+
+// --------------------------------------------------------------------------
+// CTactileFeedbackSrv::StartFeedback
+// --------------------------------------------------------------------------
+//    
+void CTactileFeedbackSrv::StartFeedback( TTouchContinuousFeedback aType,
+                                         TInt aIntensity )
+    {
+    iResolver->StartFeedback( aType, aIntensity );    
+    }
+        
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::ModifyFeedback.
+// ---------------------------------------------------------------------------
+//                        
+void CTactileFeedbackSrv::ModifyFeedback( TInt aIntensity )
+    {
+    iResolver->ModifyFeedback( aIntensity );    
+    }
+    
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::StopFeedback.
+// ---------------------------------------------------------------------------
+//    
+void CTactileFeedbackSrv::StopFeedback()
+    {
+    iResolver->StopFeedback();   
+    }
+
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::EnableFeedbackForDevice
+// ---------------------------------------------------------------------------
+//    
+void CTactileFeedbackSrv::EnableFeedbackForDevice( TTouchFeedbackType aFeedbackType )
+    {
+    iDeviceFeedbackEnabled = aFeedbackType;
+    }
+
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::FeedbackEnabledForDeviceL
+// ---------------------------------------------------------------------------
+//
+TTouchFeedbackType CTactileFeedbackSrv::FeedbackEnabledForDevice()
+    {
+    return static_cast<TTouchFeedbackType>( iDeviceFeedbackEnabled );
+    }
+
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::PlayPreviewFeedbackL
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackSrv::PlayPreviewFeedback( TInt aLevel,
+                                              TTouchLogicalFeedback aFeedback,
+                                              TTouchFeedbackType aType )
+    {
+    iResolver->PlayPreviewFeedback( aLevel, aFeedback, aType );
+    }
+
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::StartPreviewFeedbackL
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackSrv::StartPreviewFeedback( TInt aLevel,
+                                          TTouchContinuousFeedback aFeedback,
+                                          TInt aIntensity,
+                                          TTouchFeedbackType aType )
+    {
+    iResolver->StartPreviewFeedback( aLevel, aFeedback, aIntensity, aType );
+    }
+
+// ---------------------------------------------------------------------------
+// CTactileFeedbackSrv::StopPreviewFeedbackL
+// ---------------------------------------------------------------------------
+//
+void CTactileFeedbackSrv::StopPreviewFeedback()
+    {
+    iResolver->StopPreviewFeedback();
+    }
+
+// End of file 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactileplayer.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,163 @@
+/*
+* 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:  Interface class for tactile feedback players.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include "tactileplayer.h"
+
+const TUid KTactilePlayerIFUid   = {0x2001CBA7};
+
+_LIT8( KTactileHaptics, "Haptics" );
+_LIT8( KTactileAudio,   "Audio"   );
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactilePlayer* CTactilePlayer::NewL( TUid aImplementationUid, 
+                                      CRepository& aRepository )
+    {
+    return static_cast<CTactilePlayer*> ( REComSession::CreateImplementationL( 
+            aImplementationUid, 
+            _FOFF(CTactilePlayer, iDtor_ID_Key ), 
+            &aRepository ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Lists the available plugin implementations for this interface.
+// ---------------------------------------------------------------------------
+// 
+void CTactilePlayer::ListImplementationsL( TTactilePlayerType aType,
+                                           RImplInfoPtrArray& aImplInfoArray )
+    {
+    if ( aType == ETactilePlayerAny )
+        {
+        REComSession::ListImplementationsL( KTactilePlayerIFUid, 
+                                            aImplInfoArray );
+        }
+    else
+        {
+        RImplInfoPtrArray implInfoArray;
+        CleanupClosePushL( implInfoArray );
+        REComSession::ListImplementationsL( KTactilePlayerIFUid, 
+                                            implInfoArray );
+        for( TInt i(0) ; i < implInfoArray.Count() ; i++ )
+            {
+            switch( aType )
+                {
+                case ETactilePlayerHaptics:
+                    if ( !implInfoArray[i]->DataType().Compare( KTactileHaptics ) )
+                        {
+                        aImplInfoArray.AppendL( implInfoArray[i] );
+                        }
+                    break;
+                case ETactilePlayerAudio:
+                    if ( !implInfoArray[i]->DataType().Compare( KTactileAudio ) )
+                        {
+                        aImplInfoArray.AppendL( implInfoArray[i] );
+                        } 
+                    break;
+                default:
+                    break;                       
+                }
+            }
+        CleanupStack::PopAndDestroy( &implInfoArray );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C CTactilePlayer::~CTactilePlayer()
+    {
+    REComSession::DestroyedImplementation( iDtor_ID_Key );
+    }
+
+// ---------------------------------------------------------------------------
+// Start feedback.
+// ---------------------------------------------------------------------------
+//   
+EXPORT_C TInt CTactilePlayer::StartFeedback( TTouchContinuousFeedback /*aFeedback*/,
+                                             TInt /*aIntensity*/ )
+    {
+    // Empty implementation for plugins, which don't support 
+    // continuous feedback.
+    return KErrNotSupported;
+    }
+        
+// ---------------------------------------------------------------------------
+// Modify feedback.
+// ---------------------------------------------------------------------------
+//                        
+EXPORT_C TInt CTactilePlayer::ModifyFeedback( TInt /*aIntensity*/ )
+    {
+    // Empty implementation for plugins, which don't support 
+    // continuous feedback.
+    return KErrNotSupported;    
+    }
+    
+// ---------------------------------------------------------------------------
+// Stop feedback.
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CTactilePlayer::StopFeedback()
+    {
+    // Empty implementation for plugins, which don't support 
+    // continuous feedback.
+    }
+    
+// ---------------------------------------------------------------------------
+// Maximum level.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TInt CTactilePlayer::MaxLevel()
+    {
+    // Default implementation returns 1 as maximum level, which means that
+    // player has only one level.
+    return 1; 
+    }
+
+// ---------------------------------------------------------------------------
+// Play preview.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TInt CTactilePlayer::PlayPreviewFeedback( TInt /*aLevel*/,
+                                         TTouchLogicalFeedback /*aFeedback*/ )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// Start preview.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TInt CTactilePlayer::StartPreviewFeedback( TInt /*aLevel*/,
+                                       TTouchContinuousFeedback /*aFeedback*/,
+                                       TInt /*aIntensity*/ )
+    {
+    return KErrNotSupported;
+    }
+
+// ---------------------------------------------------------------------------
+// Stop preview.
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CTactilePlayer::StopPreviewFeedback()
+    {    
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/src/tactilepropertywatcher.cpp	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,184 @@
+/*
+* 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:  Class for monitoring P&S property changes.
+* Part of:      Tactile Feedback.
+*
+*/
+
+#include <e32std.h>
+#include <e32cmn.h> 
+
+#include "tactilepropertywatcher.h"
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CTactilePropertyWatcher::CTactilePropertyWatcher( 
+        MTactilePropertyObserver& aObserver, 
+        const TUid aCategory, 
+        const TInt aKey,
+        CActive::TPriority aPriority ) : 
+            CActive( aPriority ), 
+            iObserver( aObserver ), 
+            iCategory( aCategory ), 
+            iKey( aKey )
+      
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CTactilePropertyWatcher::ConstructL()
+    {
+    User::LeaveIfError( iProperty.Attach( iCategory, iKey ) );
+
+    Subscribe();
+    }
+
+// ---------------------------------------------------------------------------
+// 2-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CTactilePropertyWatcher* CTactilePropertyWatcher::NewL( 
+        MTactilePropertyObserver& aObserver, 
+        const TUid aCategory, 
+        const TInt aKey,
+        CActive::TPriority aPriority )
+    {
+    CTactilePropertyWatcher* self = new (ELeave) 
+        CTactilePropertyWatcher( aObserver, aCategory, aKey, aPriority );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CTactilePropertyWatcher::~CTactilePropertyWatcher()
+    {
+    Cancel(); 
+    iProperty.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Retrieves an integer value associated with this property.
+// ---------------------------------------------------------------------------
+//       
+void CTactilePropertyWatcher::GetL( TInt& aValue )
+    {
+    User::LeaveIfError( iProperty.Get( aValue ) );
+    }
+
+    
+// ---------------------------------------------------------------------------
+// Retrieves a buffer associated with this property.
+// ---------------------------------------------------------------------------
+//       
+void CTactilePropertyWatcher::GetL( TDes8& aValue )
+    {
+    User::LeaveIfError( iProperty.Get( aValue ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Retrieves an integer value associated with this property.
+// ---------------------------------------------------------------------------
+//       
+TInt CTactilePropertyWatcher::Get( TInt& aValue )
+    {
+    return iProperty.Get( aValue );
+    }
+    
+// ---------------------------------------------------------------------------
+// Retrieves a buffer associated with this property.
+// ---------------------------------------------------------------------------
+//       
+TInt CTactilePropertyWatcher::Get( TDes8& aValue )
+    {
+    return iProperty.Get( aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a P&S property to an integer value. The attached version of
+// RProperty::Set is used which is faster than using RProperty::Set
+// directly without attach.
+// ---------------------------------------------------------------------------
+//       
+void CTactilePropertyWatcher::SetL( const TInt aValue )
+    {
+    User::LeaveIfError( iProperty.Set( aValue ) );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a P&S property to a (large)bytearray value. The attached version of
+// RProperty::Set is used which is faster than using RProperty::Set
+// directly without attach.
+// ---------------------------------------------------------------------------
+//       
+void CTactilePropertyWatcher::SetL( const TDesC8& aValue )
+    {
+    User::LeaveIfError( iProperty.Set( aValue ) );        
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CTactilePropertyWatcher::Subscribe()
+    {
+    if ( !IsActive() )
+        {
+        iProperty.Subscribe( iStatus );
+
+        SetActive();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CActive
+// ---------------------------------------------------------------------------
+//
+void CTactilePropertyWatcher::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// From class CActive
+// ---------------------------------------------------------------------------
+//
+void CTactilePropertyWatcher::RunL()
+    {
+    if ( iStatus.Int() == KErrNone )
+        {
+        // Subscribe first, then notify the observer that a property
+        //  has changed. 
+        Subscribe();
+        iObserver.PropertyChangedL( iCategory, iKey );
+        }
+    else if ( iStatus.Int() == KErrNotFound )
+        {
+        // We get here if a property gets deleted. We still need to subscribe
+        // to it because it might get redefined later.
+        Subscribe();        
+        }
+    }
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/traces/OstTraceDefinitions.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+#define OST_TRACE_COMPILER_IN_USE
+#include <OpenSystemTrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/traces/fixed_id.definitions	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,4 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TACTILE_PERFORMANCE=0x40
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_RESOLVER_PLAY_FEEDBACK_0=0x2
+[TRACE]TACTILE_PERFORMANCE[0x40]_TACTILE_RESOLVER_PLAY_FEEDBACK_1=0x1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/traces/tactilefeedbackresolverTraces.h	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,16 @@
+// Created by TraceCompiler1.1.6
+// DO NOT EDIT, CHANGES WILL BE LOST
+
+#ifndef __TACTILEFEEDBACKRESOLVERTRACES_H__
+#define __TACTILEFEEDBACKRESOLVERTRACES_H__
+
+#define KOstTraceComponentID 0x2000b494
+
+#define TACTILE_RESOLVER_PLAY_FEEDBACK_1 0x400001
+#define TACTILE_RESOLVER_PLAY_FEEDBACK_0 0x400002
+
+
+#endif
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackresolver/traces/tracebuilder.cache	Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,30 @@
+<model>
+  <id>536917140</id>
+  <name>tactilefeedbackresolver</name>
+  <group>
+    <id>64</id>
+    <name>TACTILE_PERFORMANCE</name>
+    <trace>
+      <text>e_TACTILE_RESOLVER_PLAY_FEEDBACK 1</text>
+      <id>1</id>
+      <name>TACTILE_RESOLVER_PLAY_FEEDBACK_1</name>
+      <location>
+        <file>../src/tactilefeedbackresolver.cpp</file>
+        <line>158</line>
+        <class>CTactileFeedbackResolver</class>
+        <function>PlayFeedback</function>
+      </location>
+    </trace>
+    <trace>
+      <text>e_TACTILE_RESOLVER_PLAY_FEEDBACK 0</text>
+      <id>2</id>
+      <name>TACTILE_RESOLVER_PLAY_FEEDBACK_0</name>
+      <location>
+        <file>../src/tactilefeedbackresolver.cpp</file>
+        <line>183</line>
+        <class>CTactileFeedbackResolver</class>
+        <function>PlayFeedback</function>
+      </location>
+    </trace>
+  </group>
+</model>